BirthdayBot/BackgroundServices/AutoUserDownload.cs

34 lines
1.6 KiB
C#
Raw Permalink Normal View History

using BirthdayBot.Data;
namespace BirthdayBot.BackgroundServices;
/// <summary>
/// Proactively fills the user cache for guilds in which any birthday data already exists.
/// </summary>
class AutoUserDownload : BackgroundService {
public AutoUserDownload(ShardInstance instance) : base(instance) { }
public override async Task OnTick(int tickCount, CancellationToken token) {
2022-03-21 19:11:30 +00:00
using var db = new BotDatabaseContext();
// Take action if a guild's cache is incomplete...
var incompleteCaches = ShardInstance.DiscordClient.Guilds.Where(g => !g.HasAllMembers).Select(g => (long)g.Id).ToHashSet();
// ...and if the guild contains any user data
var mustFetch = db.UserEntries.Where(e => incompleteCaches.Contains(e.GuildId)).Select(e => e.GuildId).Distinct();
2022-03-22 06:33:24 +00:00
int processed = 0;
2022-03-21 19:11:30 +00:00
foreach (var item in mustFetch) {
// May cause a disconnect in certain situations. Cancel all further attempts until the next pass if it happens.
2022-03-22 06:33:24 +00:00
if (ShardInstance.DiscordClient.ConnectionState != ConnectionState.Connected) break;
2022-03-21 19:11:30 +00:00
var guild = ShardInstance.DiscordClient.GetGuild((ulong)item);
if (guild == null) continue; // A guild disappeared...?
await guild.DownloadUsersAsync().ConfigureAwait(false); // We're already on a seperate thread, no need to use Task.Run
await Task.Delay(200, CancellationToken.None).ConfigureAwait(false); // Must delay, or else it seems to hang...
2022-03-22 06:33:24 +00:00
processed++;
}
2022-03-22 06:33:24 +00:00
if (processed > 100) Log($"Explicit user list request processed for {processed} guild(s).");
}
}