private Task Bot_MessageReceived(MessageReceivedEventArgs e) { lock (GuildMessageTracker) { // TODO: Ensure the guild is tracked, use locally cached list? if (e.Message.Guild == null) { return(Task.CompletedTask); } if (SnapshotEnabledCache.Contains(e.Message.Guild.Id)) { if (!GuildMessageTracker.ContainsKey(e.Message.Guild.Id)) { GuildMessageTracker[e.Message.Guild.Id] = new Dictionary <ulong, int>(); } if (GuildMessageTracker[e.Message.Guild.Id].ContainsKey(e.Message.Channel.Id)) { GuildMessageTracker[e.Message.Guild.Id][e.Message.Channel.Id]++; } else { GuildMessageTracker[e.Message.Guild.Id].Add(e.Message.Channel.Id, 1); } } } return(Task.CompletedTask); }
private async void SnapshotCallback(object state) { try { SnapshotTimer.Change(Timeout.Infinite, Timeout.Infinite); using (var db = new DataContext()) { lock (GuildMessageTracker) { var time = DateTime.UtcNow; var configs = db.StatServers.Where(x => x.SnapshotsEnabled); SnapshotEnabledCache = configs.Select(x => x.GuildId).ToHashSet(); foreach (var config in configs) { if (!Bot.Guilds.TryGetValue(config.GuildId, out var guild)) { continue; } int messageCount = 0; if (GuildMessageTracker.TryGetValue(config.GuildId, out var channelDictionary)) { foreach (var channel in channelDictionary) { var chanelSnapshot = new ChannelSnapshot { GuildId = config.GuildId, ChannelId = channel.Key, MessageCount = channel.Value, SnapshotTime = time }; db.ChannelSnapshots.Add(chanelSnapshot); messageCount += channel.Value; } } var snapshot = new StatisticsSnapshot { GuildId = config.GuildId, MemberCount = guild.MemberCount, MembersDND = guild.Members .Count(x => x.Value?.Presence?.Status == Disqord.UserStatus.DoNotDisturb), MembersIdle = guild.Members .Count(x => x.Value?.Presence?.Status == Disqord.UserStatus.Idle), MembersOnline = guild.Members .Count(x => x.Value?.Presence?.Status == Disqord.UserStatus.Online), SnapshotTime = time, TotalMessageCount = messageCount }; db.StatSnapshots.Add(snapshot); } GuildMessageTracker.Clear(); } await db.SaveChangesAsync(); } } finally { #if DEBUG SnapshotTimer.Change(30 * 1000, Timeout.Infinite); #else SnapshotTimer.Change(shapshotCallbackInterval, Timeout.Infinite); #endif } }