public async Task AppendGuildParticipationAsync(StringBuilder stringBuilder, SocketGuild guild) { var weekTotal = await MessageRepository.GetTotalMessageCountAsync(guild.Id, TimeSpan.FromDays(7)); var monthTotal = await MessageRepository.GetTotalMessageCountAsync(guild.Id, TimeSpan.FromDays(30)); var channelCounts = await MessageRepository.GetTotalMessageCountByChannelAsync(guild.Id, TimeSpan.FromDays(30)); var orderedChannelCounts = channelCounts.OrderByDescending(x => x.Value); var mostActiveChannel = orderedChannelCounts.First(); stringBuilder .AppendLine(Format.Bold("\u276F Guild Participation")) .AppendLine($"Last 7 days: {"message".ToQuantity(weekTotal, "n0")}") .AppendLine($"Last 30 days: {"message".ToQuantity(monthTotal, "n0")}") .AppendLine($"Avg. per day: {"message".ToQuantity(monthTotal / 30, "n0")}") .AppendLine($"Most active channel: {MentionUtils.MentionChannel(mostActiveChannel.Key)} ({"message".ToQuantity(mostActiveChannel.Value, "n0")} in 30 days)"); var emojiCounts = await EmojiRepository.GetEmojiStatsAsync(guild.Id, SortDirection.Ascending, 1); 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}`)"; stringBuilder.AppendLine($"Favorite reaction: {emojiFormatted} ({"time".ToQuantity(favoriteEmoji.Uses)})"); } stringBuilder.AppendLine(); }
private async Task AddParticipationToEmbedAsync(ulong userId, StringBuilder builder) { var userRank = await MessageRepository.GetGuildUserParticipationStatistics(Context.Guild.Id, userId); var messagesByDate = await MessageRepository.GetGuildUserMessageCountByDate(Context.Guild.Id, userId, TimeSpan.FromDays(30)); var lastWeek = _utcNow - TimeSpan.FromDays(7); var weekTotal = 0; var monthTotal = 0; foreach (var kvp in messagesByDate) { if (kvp.Key >= lastWeek) { weekTotal += kvp.Value; } monthTotal += kvp.Value; } 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 { var channels = await MessageRepository.GetGuildUserMessageCountByChannel(Context.Guild.Id, userId, TimeSpan.FromDays(30)); foreach (var kvp in channels.OrderByDescending(x => x.Value)) { var channel = await Context.Guild.GetChannelAsync(kvp.Key); if (channel.IsPublic()) { builder.AppendLine($"Most active channel: {MentionUtils.MentionChannel(channel.Id)} ({kvp.Value} messages)"); break; } } } catch (Exception ex) { Log.LogDebug(ex, "Unable to get the most active channel for {UserId}.", userId); } } var emojiCounts = await EmojiRepository.GetEmojiStatsAsync(Context.Guild.Id, SortDirection.Ascending, 1, 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)})"); } }