forked from EllieBotDevs/elliebot
38 lines
1.2 KiB
C#
38 lines
1.2 KiB
C#
|
#nullable disable
|
||
|
namespace EllieBot.Common;
|
||
|
|
||
|
public class DownloadTracker : IEService
|
||
|
{
|
||
|
private ConcurrentDictionary<ulong, DateTime> LastDownloads { get; } = new();
|
||
|
private readonly SemaphoreSlim _downloadUsersSemaphore = new(1, 1);
|
||
|
|
||
|
/// <summary>
|
||
|
/// Ensures all users on the specified guild were downloaded within the last hour.
|
||
|
/// </summary>
|
||
|
/// <param name="guild">Guild to check and potentially download users from</param>
|
||
|
/// <returns>Task representing download state</returns>
|
||
|
public async Task EnsureUsersDownloadedAsync(IGuild guild)
|
||
|
{
|
||
|
#if GLOBAL_NADEKO
|
||
|
return;
|
||
|
#endif
|
||
|
await _downloadUsersSemaphore.WaitAsync();
|
||
|
try
|
||
|
{
|
||
|
var now = DateTime.UtcNow;
|
||
|
|
||
|
// download once per hour at most
|
||
|
var added = LastDownloads.AddOrUpdate(guild.Id,
|
||
|
now,
|
||
|
(_, old) => now - old > TimeSpan.FromHours(1) ? now : old);
|
||
|
|
||
|
// means that this entry was just added - download the users
|
||
|
if (added == now)
|
||
|
await guild.DownloadUsersAsync();
|
||
|
}
|
||
|
finally
|
||
|
{
|
||
|
_downloadUsersSemaphore.Release();
|
||
|
}
|
||
|
}
|
||
|
}
|