예제 #1
0
            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);
            }