protected override async Task Handle(GetEmoteStatsRequest request, CancellationToken cancellationToken) { var ctx = request.Ctx; var emote = request.Emote; var fromDate = request.FromDate; var guildId = ctx.Guild.Id; var emoteUsageResult = await _emoteStatsRepo.GetSingleEmoteStats(guildId, emote, MaxUserCount, fromDate); if (emoteUsageResult == null) { await ctx.RespondAsync("No stats yet"); return; } var emoteStats = emoteUsageResult.EmoteStats; var emoteUsers = emoteUsageResult.EmoteUsers; var emoteCode = EmoteHelper.BuildEmoteCode(emoteStats.EmoteId, emoteStats.IsAnimated); var totalUsage = emoteStats.Usage; var title = $"Stats for `{emoteCode}`"; if (fromDate != null) { title += $" from {fromDate.Value:yyyy-MM-dd}"; } var result = new StringBuilder(); result.AppendLine(title); result.AppendLine($"Total usage: {totalUsage}"); if (emoteUsers.Count > 0) { var extendedEmoteUsers = emoteUsers .Select(r => new ExtendedEmoteUser() { UserId = r.UserId, Usage = r.Usage, PercentageOfTotal = (double)r.Usage / totalUsage }) .ToList(); // Resolve display names foreach (var emoteUser in extendedEmoteUsers) { DiscordMember user; if (ctx.Guild.Members.ContainsKey(emoteUser.UserId)) { user = ctx.Guild.Members[emoteUser.UserId]; } else { try { user = await ctx.Guild.GetMemberAsync(emoteUser.UserId); } catch { user = null !; } } if (user != null) { emoteUser.DisplayName = user.GetNicknameOrUsername(); } else { emoteUser.DisplayName = "Unknown user"; } } result.AppendLine(); result.AppendLine("Top users"); var lines = FormattedResultHelper.FormatExtendedEmoteUsers(extendedEmoteUsers, 0); lines.ForEach(l => result.AppendLine(l)); } var formattedResultMessage = $"`{result}`"; await ctx.RespondAsync(formattedResultMessage); }
protected override async Task Handle(GetUserEmoteStatsRequest request, CancellationToken cancellationToken) { var ctx = request.Ctx; var page = request.Page; var fromDate = request.FromDate; var userId = request.UserId; var mention = request.Mention; var guildId = ctx.Guild.Id; int pageOffset = page - 1; var emoteUsageResult = await _emoteStatsRepo.GetBestEmotesForUser(guildId, userId, pageOffset, ResultsPerPage, fromDate); var emoteUsageItems = emoteUsageResult.Items; var safePageOffset = emoteUsageResult.PageOffset; var pageCount = emoteUsageResult.PageCount; var totalCount = emoteUsageResult.TotalCount; var emoteUsageList = emoteUsageItems .Select(r => new ExtendedEmoteStats() { EmoteCode = EmoteHelper.BuildEmoteCode(r.EmoteId, r.IsAnimated), Usage = r.Usage, PercentageOfTotal = (double)r.Usage / r.TotalUsage }) .ToList(); if (emoteUsageList.Count == 0) { await ctx.RespondAsync("No stats yet"); return; } string rangeText; if (safePageOffset == 0) { rangeText = ResultsPerPage.ToString(); } else { var rangeMin = ResultsPerPage * safePageOffset + 1; var rangeMax = Math.Min(ResultsPerPage * safePageOffset + ResultsPerPage, totalCount); rangeText = $"{rangeMin} - {rangeMax}"; } var title = $"Top {rangeText} emotes for {mention}"; if (fromDate != null) { title += $" from {fromDate.Value:yyyy-MM-dd}"; } var rankOffset = safePageOffset * ResultsPerPage; var lines = FormattedResultHelper.FormatExtendedEmoteStats(emoteUsageList, rankOffset); var body = FormattedResultHelper.BuildBody(lines); var result = new StringBuilder(); result.AppendLine(title); result.AppendLine(); result.AppendLine(body); if (pageCount > 1) { result.AppendLine(); var pagingText = $"Page {safePageOffset + 1}/{pageCount}"; if (safePageOffset + 1 < pageCount) { pagingText += $" (use -p {safePageOffset + 2} to view next page)"; } result.AppendLine(pagingText); } var formattedResultMessage = $"`{result}`"; await ctx.RespondAsync(formattedResultMessage); }
protected override async Task Handle(GetGuildEmoteStatsRequest request, CancellationToken cancellationToken) { var ctx = request.Ctx; var page = request.Page; var fromDate = request.FromDate; var guildEmotes = request.GuildEmojis; var direction = request.SortDirection; var guildId = ctx.Guild.Id; int pageOffset = page - 1; var mappedGuildEmotes = guildEmotes.Select(kv => new TempEmote() { Id = kv.Key, Name = kv.Value.Name, Animated = kv.Value.IsAnimated }).ToList(); var emoteUsageResult = await _emoteStatsRepo.GetGuildEmoteStats(guildId, direction, mappedGuildEmotes, pageOffset : pageOffset, perPage : ResultsPerPage, fromDate : fromDate); var emoteUsageItems = emoteUsageResult.Items; var safePageOffset = emoteUsageResult.PageOffset; var pageCount = emoteUsageResult.PageCount; var totalCount = emoteUsageResult.TotalCount; if (emoteUsageItems.Count == 0) { await ctx.RespondAsync("No stats yet"); return; } var bestOrWorst = direction == SortDirection.ASC ? "worst" : "best"; string rangeText; if (safePageOffset == 0) { rangeText = ResultsPerPage.ToString(); } else { var rangeMin = ResultsPerPage * safePageOffset + 1; var rangeMax = Math.Min(ResultsPerPage * safePageOffset + ResultsPerPage, totalCount); rangeText = $"{rangeMin} - {rangeMax}"; } var title = $"Top {rangeText} {bestOrWorst} emotes"; if (fromDate != null) { title += $" from {fromDate.Value:yyyy-MM-dd}"; } var rankOffset = safePageOffset * ResultsPerPage; var lines = FormattedResultHelper.FormatEmoteStats(emoteUsageItems, rankOffset); var body = FormattedResultHelper.BuildBody(lines); var result = new StringBuilder(); result.AppendLine(title); result.AppendLine(); result.AppendLine(body); if (pageCount > 1) { result.AppendLine(); var pagingText = $"Page {safePageOffset + 1}/{pageCount}"; if (safePageOffset + 1 < pageCount) { pagingText += $" (use -p {safePageOffset + 2} to view next page)"; } result.AppendLine(pagingText); } var formattedResultMessage = $"`{result}`"; await ctx.RespondAsync(formattedResultMessage); }