11using System . Text . Json ;
22using API . Contexts ;
33using API . Contexts . Objects ;
4+ using API . Services ;
45using DotNetBungieAPI . Extensions ;
56using DotNetBungieAPI . Models . Destiny ;
67using DotNetBungieAPI . Models . Destiny . Definitions . Vendors ;
@@ -10,92 +11,107 @@ namespace API.Util;
1011
1112public static class VendorTools
1213{
13- public static async Task SingleVendorUpdate (
14+ public static async Task < bool > SingleVendorUpdate (
1415 IBungieClient bungieClient ,
1516 DbManager db ,
1617 BungieProfile vendorProfile ,
1718 uint vendorId ,
1819 int requiredResets ,
1920 CancellationToken stoppingToken )
2021 {
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" ) ;
2724
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
3526 {
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 ) ;
4033
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 ) ;
5736
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." ) ;
5939
60- if ( existingWeapons . Count == 0 )
40+ foreach ( var saleItemComponent in vendorQuery . Response . Sales . Data )
6141 {
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 ) ;
6846
69- foreach ( var existingWeapon in existingWeapons )
47+ var vendorItem = new WeaponSale
7048 {
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 ) ;
8662 }
8763
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
8970 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+ }
9096 }
91- }
9297
93- await db . SaveChangesAsync ( stoppingToken ) ;
98+ await db . SaveChangesAsync ( stoppingToken ) ;
9499
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+ }
98114
99- await db . SaveChangesAsync ( stoppingToken ) ;
115+ return success ;
100116 }
101117}
0 commit comments