Skip to content

Commit 484d9f9

Browse files
author
Moons
committed
fix(tasks): repeat tasks until successful
1 parent ee8ea26 commit 484d9f9

File tree

6 files changed

+121
-74
lines changed

6 files changed

+121
-74
lines changed

Tasks/VendorsAdepts.cs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using API.Contexts;
1+
using System.Diagnostics;
2+
using API.Contexts;
23
using API.Contexts.Objects;
34
using API.Services;
45
using API.Util;
@@ -181,20 +182,22 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
181182
}
182183
}
183184

184-
var oldWeapons = db.WeaponSales.Where(x => x.QueryTime < currentTime && x.ItemPerks == "[[0]]").ToList();
185+
var oldWeapons = db.WeaponSales.Where(x => x.QueryTime < currentTime && x.ItemPerks == "[[0]]")
186+
.ToList();
185187

186188
foreach (var weaponSale in oldWeapons)
187189
{
188-
if(weaponSale.IsAvailable)
190+
if (weaponSale.IsAvailable)
189191
weaponSale.IsAvailable = false;
190192

191193
db.WeaponSales.Update(weaponSale);
192194
}
193195

194196
await db.SaveChangesAsync(stoppingToken);
195197

196-
await DiscordTools.SendMessage(DiscordTools.WebhookChannel.Vendors,
197-
$"**Trials Adept:** {trialsAdept}\n**Nightfall Adept:** {nfAdept}");
198+
if (!Debugger.IsAttached)
199+
await DiscordTools.SendMessage(DiscordTools.WebhookChannel.Vendors,
200+
$"**Trials Adept:** {trialsAdept}\n**Nightfall Adept:** {nfAdept}");
198201
}
199202
}
200203
catch (Exception e)

Tasks/VendorsGunsmith.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,14 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
5151

5252
await db.SaveChangesAsync(stoppingToken);
5353

54-
await VendorTools.SingleVendorUpdate(bungieClient, db, vendorProfile, VendorId, 0, stoppingToken);
54+
var done = false;
55+
while(!done)
56+
{
57+
done = await VendorTools.SingleVendorUpdate(bungieClient, db, vendorProfile, VendorId, 0, stoppingToken);
58+
59+
if(!done)
60+
await Task.Delay(DateTimeExtensions.GetRoundTimeSpan(10), stoppingToken);
61+
}
5562
}
5663
catch (Exception e)
5764
{

Tasks/VendorsIronBanner.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,14 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
6868

6969
await db.SaveChangesAsync(stoppingToken);
7070

71-
await VendorTools.SingleVendorUpdate(bungieClient, db, vendorProfile, VendorId, i, stoppingToken);
71+
var done = false;
72+
while (!done)
73+
{
74+
done = await VendorTools.SingleVendorUpdate(bungieClient, db, vendorProfile, VendorId, i, stoppingToken);
75+
76+
if(!done)
77+
await Task.Delay(DateTimeExtensions.GetRoundTimeSpan(10), stoppingToken);
78+
}
7279
}
7380
}
7481
catch (Exception e)

Tasks/VendorsTrials.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,14 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
6868

6969
await db.SaveChangesAsync(stoppingToken);
7070

71-
await VendorTools.SingleVendorUpdate(bungieClient, db, vendorProfile, VendorId, i, stoppingToken);
71+
var done = false;
72+
while (!done)
73+
{
74+
done = await VendorTools.SingleVendorUpdate(bungieClient, db, vendorProfile, VendorId, i, stoppingToken);
75+
76+
if (!done)
77+
await Task.Delay(DateTimeExtensions.GetRoundTimeSpan(10), stoppingToken);
78+
}
7279
}
7380
}
7481
catch (Exception e)

Tasks/VendorsWarTable.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,14 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
5151

5252
await db.SaveChangesAsync(stoppingToken);
5353

54-
await VendorTools.SingleVendorUpdate(bungieClient, db, vendorProfile, VendorId, 0, stoppingToken);
54+
var done = false;
55+
while (!done)
56+
{
57+
done = await VendorTools.SingleVendorUpdate(bungieClient, db, vendorProfile, VendorId, 0, stoppingToken);
58+
59+
if (!done)
60+
await Task.Delay(DateTimeExtensions.GetRoundTimeSpan(10), stoppingToken);
61+
}
5562
}
5663
catch (Exception e)
5764
{

Util/VendorTools.cs

Lines changed: 81 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System.Text.Json;
22
using API.Contexts;
33
using API.Contexts.Objects;
4+
using API.Services;
45
using DotNetBungieAPI.Extensions;
56
using DotNetBungieAPI.Models.Destiny;
67
using DotNetBungieAPI.Models.Destiny.Definitions.Vendors;
@@ -10,92 +11,107 @@ namespace API.Util;
1011

1112
public 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

Comments
 (0)