private async Task GetEmoteStats(CommandContext ctx, TempEmote emote, string interval) { var guild = ctx.Guild; var isValidEmote = IsValidMessageEmote(emote.Id, guild); if (!isValidEmote) { await ctx.RespondAsync("Invalid emote"); return; } var parsed = TryGetDateFromInterval(IntervalValue.Parse(interval), out var fromDate); if (!parsed) { await ctx.RespondAsync("Invalid interval"); return; } var request = new GetEmoteStatsRequest(ctx) { Emote = emote, FromDate = fromDate }; _commandQueue.Enqueue(request); }
public async Task <EmoteUsageResult> GetSingleEmoteStats(ulong guildId, TempEmote emote, int userCount, DateTime?fromDate) { var emoteId = emote.Id; var query = _dbContext.Emotes .AsQueryable() .Where(e => e.GuildId == guildId && e.EmoteId == emoteId && (!fromDate.HasValue || e.DateTime > fromDate.Value)) .GroupBy( e => new { e.EmoteId, e.EmoteAnimated }, (key, value) => new EmoteStats() { EmoteId = key.EmoteId, IsAnimated = key.EmoteAnimated, Usage = value.Count() }); var emoteStatsResult = await query.SingleOrDefaultAsync(); var usersQuery = _dbContext.Emotes .AsQueryable() .Where(e => e.GuildId == guildId && e.EmoteId == emoteId && (!fromDate.HasValue || e.DateTime > fromDate.Value)) .GroupBy( e => new { e.UserId }, (key, value) => new EmoteUser() { UserId = key.UserId, Usage = value.Count() }) .OrderByDescending(e => e.Usage) .Take(userCount); var usersResult = await usersQuery.ToListAsync(); var result = new EmoteUsageResult() { EmoteStats = emoteStatsResult, EmoteUsers = usersResult }; return(result); }
public static TempEmote?Parse(string emoteString) { var match = EmoteRegexGrouped.Match(emoteString); if (!match.Success) { return(null); } var groups = match.Groups; var isAnimated = !string.IsNullOrWhiteSpace(groups[1].Value); var name = groups[2].Value; var id = ulong.Parse(groups[3].Value); var parsed = new TempEmote() { Id = id, Name = name, Animated = isAnimated }; return(parsed); }