1
1
using System . Text . Json ;
2
2
using API . Contexts ;
3
3
using API . Contexts . Objects ;
4
+ using API . Services ;
4
5
using DotNetBungieAPI . Extensions ;
5
6
using DotNetBungieAPI . Models . Destiny ;
6
7
using DotNetBungieAPI . Models . Destiny . Definitions . Vendors ;
@@ -10,92 +11,107 @@ namespace API.Util;
10
11
11
12
public static class VendorTools
12
13
{
13
- public static async Task SingleVendorUpdate (
14
+ public static async Task < bool > SingleVendorUpdate (
14
15
IBungieClient bungieClient ,
15
16
DbManager db ,
16
17
BungieProfile vendorProfile ,
17
18
uint vendorId ,
18
19
int requiredResets ,
19
20
CancellationToken stoppingToken )
20
21
{
21
- var vendorQuery = await bungieClient . ApiAccess . Destiny2 . GetVendor ( vendorProfile . DestinyMembershipType ,
22
- vendorProfile . DestinyMembershipId , await vendorProfile . GetLatestCharacter ( bungieClient ) ,
23
- vendorId ,
24
- [
25
- DestinyComponentType . VendorSales , DestinyComponentType . ItemReusablePlugs
26
- ] , vendorProfile . GetTokenData ( ) , stoppingToken ) ;
22
+ var success = false ;
23
+ var logger = LogService . CreateLogger ( "SingleVendorUpdate" ) ;
27
24
28
- var queryTime = DateTime . UtcNow ;
29
- var vendorDefQuery = bungieClient . TryGetDefinition < DestinyVendorDefinition > ( vendorId , out var vendor ) ;
30
-
31
- if ( ! vendorDefQuery )
32
- return ;
33
-
34
- foreach ( var saleItemComponent in vendorQuery . Response . Sales . Data )
25
+ try
35
26
{
36
- if ( ! saleItemComponent . Value . Item . Select ( x => x . ItemType == DestinyItemType . Weapon ) )
37
- continue ;
38
-
39
- var itemId = saleItemComponent . Value . Item . Select ( x => x . Hash ) ;
27
+ var vendorQuery = await bungieClient . ApiAccess . Destiny2 . GetVendor ( vendorProfile . DestinyMembershipType ,
28
+ vendorProfile . DestinyMembershipId , await vendorProfile . GetLatestCharacter ( bungieClient ) ,
29
+ vendorId ,
30
+ [
31
+ DestinyComponentType . VendorSales , DestinyComponentType . ItemReusablePlugs
32
+ ] , vendorProfile . GetTokenData ( ) , stoppingToken ) ;
40
33
41
- var vendorItem = new WeaponSale
42
- {
43
- IsAvailable = true ,
44
- ItemPerks = JsonSerializer . Serialize ( WeaponTools . PopulatePerks ( vendorQuery , saleItemComponent . Key ) ) ,
45
- ItemId = itemId ,
46
- QueryTime = queryTime ,
47
- VendorId = vendorId ,
48
- RequiredResets = requiredResets
49
- } ;
50
-
51
- if ( saleItemComponent . Value . FailureIndexes . Count != 0 )
52
- {
53
- var failureString = vendor . FailureStrings [ saleItemComponent . Value . FailureIndexes . First ( ) ] ;
54
- failureString = failureString . Replace ( "Requires Rank " , "" ) ;
55
- vendorItem . RequiredRank = Convert . ToInt32 ( failureString ) ;
56
- }
34
+ var queryTime = DateTime . UtcNow ;
35
+ var vendorDefQuery = bungieClient . TryGetDefinition < DestinyVendorDefinition > ( vendorId , out var vendor ) ;
57
36
58
- var existingWeapons = db . WeaponSales . Where ( w => w . ItemId == vendorItem . Id && w . VendorId == vendorId ) . ToList ( ) ;
37
+ if ( ! vendorDefQuery )
38
+ throw new Exception ( "Failed to fetch definition." ) ;
59
39
60
- if ( existingWeapons . Count == 0 )
40
+ foreach ( var saleItemComponent in vendorQuery . Response . Sales . Data )
61
41
{
62
- // Case: Weapon isn't in the db, add it
63
- db . WeaponSales . Add ( vendorItem ) ;
64
- }
65
- else
66
- {
67
- var addWeapon = true ;
42
+ if ( ! saleItemComponent . Value . Item . Select ( x => x . ItemType == DestinyItemType . Weapon ) )
43
+ continue ;
44
+
45
+ var itemId = saleItemComponent . Value . Item . Select ( x => x . Hash ) ;
68
46
69
- foreach ( var existingWeapon in existingWeapons )
47
+ var vendorItem = new WeaponSale
70
48
{
71
- if ( existingWeapon . ItemPerks == vendorItem . ItemPerks )
72
- {
73
- // Case: Weapon is in the db with the same itemPerks, update querytime and isAvailable
74
- existingWeapon . QueryTime = queryTime ;
75
- existingWeapon . IsAvailable = true ;
76
-
77
- db . WeaponSales . Update ( existingWeapon ) ;
78
- addWeapon = false ;
79
- }
80
- else
81
- {
82
- // Case: Weapon is in the db with different itemPerks, set isAvailable to false for each entry
83
- existingWeapon . IsAvailable = false ;
84
- db . WeaponSales . Update ( existingWeapon ) ;
85
- }
49
+ IsAvailable = true ,
50
+ ItemPerks = JsonSerializer . Serialize ( WeaponTools . PopulatePerks ( vendorQuery , saleItemComponent . Key ) ) ,
51
+ ItemId = itemId ,
52
+ QueryTime = queryTime ,
53
+ VendorId = vendorId ,
54
+ RequiredResets = requiredResets
55
+ } ;
56
+
57
+ if ( saleItemComponent . Value . FailureIndexes . Count != 0 )
58
+ {
59
+ var failureString = vendor . FailureStrings [ saleItemComponent . Value . FailureIndexes . First ( ) ] ;
60
+ failureString = failureString . Replace ( "Requires Rank " , "" ) ;
61
+ vendorItem . RequiredRank = Convert . ToInt32 ( failureString ) ;
86
62
}
87
63
88
- if ( addWeapon )
64
+ var existingWeapons = db . WeaponSales . Where ( w => w . ItemId == vendorItem . Id && w . VendorId == vendorId )
65
+ . ToList ( ) ;
66
+
67
+ if ( existingWeapons . Count == 0 )
68
+ {
69
+ // Case: Weapon isn't in the db, add it
89
70
db . WeaponSales . Add ( vendorItem ) ;
71
+ }
72
+ else
73
+ {
74
+ var addWeapon = true ;
75
+
76
+ foreach ( var existingWeapon in existingWeapons )
77
+ if ( existingWeapon . ItemPerks == vendorItem . ItemPerks )
78
+ {
79
+ // Case: Weapon is in the db with the same itemPerks, update querytime and isAvailable
80
+ existingWeapon . QueryTime = queryTime ;
81
+ existingWeapon . IsAvailable = true ;
82
+
83
+ db . WeaponSales . Update ( existingWeapon ) ;
84
+ addWeapon = false ;
85
+ }
86
+ else
87
+ {
88
+ // Case: Weapon is in the db with different itemPerks, set isAvailable to false for each entry
89
+ existingWeapon . IsAvailable = false ;
90
+ db . WeaponSales . Update ( existingWeapon ) ;
91
+ }
92
+
93
+ if ( addWeapon )
94
+ db . WeaponSales . Add ( vendorItem ) ;
95
+ }
90
96
}
91
- }
92
97
93
- await db . SaveChangesAsync ( stoppingToken ) ;
98
+ await db . SaveChangesAsync ( stoppingToken ) ;
94
99
95
- foreach ( var sale in db . WeaponSales . Where ( x => x . VendorId == vendorId ) )
96
- if ( sale . QueryTime < queryTime && sale . ItemPerks != "[[0]]" )
97
- sale . IsAvailable = false ;
100
+ foreach ( var sale in db . WeaponSales . Where ( x => x . VendorId == vendorId ) )
101
+ if ( sale . QueryTime < queryTime && sale . ItemPerks != "[[0]]" )
102
+ sale . IsAvailable = false ;
103
+
104
+ await db . SaveChangesAsync ( stoppingToken ) ;
105
+
106
+ success = true ;
107
+ }
108
+ catch ( Exception e )
109
+ {
110
+ await DiscordTools . SendMessage ( DiscordTools . WebhookChannel . Logs ,
111
+ $ "**Exception in SingleVendorUpdate({ vendorId } ).**\n \n >>> **{ e . GetType ( ) } **: { e . Message } ") ;
112
+ logger . LogError ( e , "Exception in {service}" , "SingleVendorUpdate" ) ;
113
+ }
98
114
99
- await db . SaveChangesAsync ( stoppingToken ) ;
115
+ return success ;
100
116
}
101
117
}
0 commit comments