#nullable disable namespace EllieBot.Common; public class DownloadTracker : IEService { private ConcurrentDictionary LastDownloads { get; } = new(); private readonly SemaphoreSlim _downloadUsersSemaphore = new(1, 1); /// /// Ensures all users on the specified guild were downloaded within the last hour. /// /// Guild to check and potentially download users from /// Task representing download state public async Task EnsureUsersDownloadedAsync(IGuild guild) { #if GLOBAL_ELLIE 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(); } } }