Beispiel #1
0
        private string GetParticipationEmoji(GuildUserParticipationStatistics stats)
        {
            if (stats.Percentile == 100 || stats.Rank == 1)
            {
                return("🥇");
            }
            else if (stats.Percentile == 99 || stats.Rank == 2)
            {
                return("🥈");
            }
            else if (stats.Percentile == 98 || stats.Rank == 3)
            {
                return("🥉");
            }
            else if (stats.Percentile >= 95 && stats.Percentile < 98)
            {
                return("🏆");
            }

            return(string.Empty);
        }
Beispiel #2
0
        private async Task AddParticipationToEmbedAsync(
            ulong userId,
            StringBuilder builder,
            GuildUserParticipationStatistics userRank,
            IReadOnlyList <MessageCountByDate> messagesByDate,
            IReadOnlyList <MessageCountPerChannel> messageCountsByChannel,
            IReadOnlyCollection <EmojiUsageStatistics> emojiCounts)
        {
            var lastWeek = _utcNow - TimeSpan.FromDays(7);

            var weekTotal  = 0;
            var monthTotal = 0;

            foreach (var kvp in messagesByDate.OrderByDescending(x => x.Date))
            {
                if (kvp.Date >= lastWeek)
                {
                    weekTotal += kvp.MessageCount;
                }

                monthTotal += kvp.MessageCount;
            }

            builder.AppendLine();
            builder.AppendLine("**\u276F Guild Participation**");

            if (userRank?.Rank > 0)
            {
                builder.AppendFormat("Rank: {0} {1}\n", userRank.Rank.Ordinalize(), GetParticipationEmoji(userRank));
            }

            var weekParticipation = "Last 7 days: " + weekTotal + " messages";

            if (weekTotal > 0 && monthTotal > 0)
            {
                var percentage = (int)((decimal)weekTotal / monthTotal * 100);
                weekParticipation += string.Format(" ({0}%)", percentage);
            }

            builder.AppendLine(weekParticipation);
            builder.AppendLine("Last 30 days: " + monthTotal + " messages");

            if (monthTotal > 0)
            {
                builder.AppendFormat(
                    "Avg. per day: {0} messages (top {1} percentile)\n",
                    decimal.Round(userRank.AveragePerDay, 3),
                    userRank.Percentile.Ordinalize());

                try
                {
                    foreach (var channelMessageCount in messageCountsByChannel.OrderByDescending(x => x.MessageCount))
                    {
                        var channel = await Context.Guild.GetChannelAsync(channelMessageCount.ChannelId);

                        if (channel.IsPublic())
                        {
                            builder.AppendLine($"Most active channel: {MentionUtils.MentionChannel(channel.Id)} ({channelMessageCount.MessageCount} messages)");
                            break;
                        }
                    }
                }
                catch (Exception ex)
                {
                    _log.LogDebug(ex, "Unable to get the most active channel for {UserId}.", userId);
                }
            }

            if (emojiCounts.Any())
            {
                var favoriteEmoji = emojiCounts.First();

                var emojiFormatted = ((SocketSelfUser)Context.Client.CurrentUser).CanAccessEmoji(favoriteEmoji.Emoji)
                    ? Format.Url(favoriteEmoji.Emoji.ToString(), favoriteEmoji.Emoji.Url)
                    : $"{Format.Url("❔", favoriteEmoji.Emoji.Url)} (`{favoriteEmoji.Emoji.Name}`)";

                builder.AppendLine($"Favorite emoji: {emojiFormatted} ({"time".ToQuantity(favoriteEmoji.Uses)})");
            }
        }