diff --git a/Modix.Web/Pages/Stats.razor b/Modix.Web/Pages/Stats.razor index 6630f932c..1798758f4 100644 --- a/Modix.Web/Pages/Stats.razor +++ b/Modix.Web/Pages/Stats.razor @@ -1,23 +1,128 @@ @page "/stats" +@using Modix.Data.Models.Core; +@using Modix.Services.GuildStats; +@using Modix.Web.Services; +@using MudBlazor - Stats -

Statistics for C#

-

Current count: @currentCount

- + @if(Data is not null) + { + + Statistics for C# + + + + + Role Distribution + + + + + + @foreach (var role in Data.GuildRoleCounts) + { + var channelColorStyle = $"border: 1px solid {role.Color}"; + + @($"{role.Name} ({role.Count})") + + } + + + + + + + + + + + Most Active Users + of the last 30 days + + + @foreach (var stat in Data.TopUserMessageCounts) + { + var rankSymbol = stat.Rank switch + { + 1 => "🥇", + 2 => "🥈", + 3 => "🥉", + _ => null + }; + + var username = stat.Username; + username += stat.Discriminator == "0000" ? string.Empty : $"#{stat.Discriminator}"; + + + @($"{rankSymbol ?? $"{stat.Rank}."} {username}") + + @($"{stat.MessageCount} messages") + + } + + + + + + + + }
+ + @code { - private int currentCount = 0; - private void IncrementCount() + public record GuildStatData(string GuildName, List GuildRoleCounts, IReadOnlyCollection TopUserMessageCounts); + + GuildStatData Data { get; set;} = null!; + List GuildRoleCountView { get; set; } = null!; + + [Inject] + IGuildStatService GuildStatService { get; set; } = null!; + + [Inject] + DiscordUserService DiscordUserService { get; set; } = null!; + + protected override async Task OnInitializedAsync() + { + var userGuild = DiscordUserService.GetUserGuild(); + var currentUser = await DiscordUserService.GetCurrentUserAsync(); + + if (currentUser is null) + throw new InvalidOperationException("Could not find currently logged in user."); + + var roleCounts = await GuildStatService.GetGuildMemberDistributionAsync(userGuild); + var messageCounts = await GuildStatService.GetTopMessageCounts(userGuild, currentUser.Id); + + Data = new GuildStatData(userGuild.Name, roleCounts, messageCounts); + GuildRoleCountView = roleCounts; + } + + private void SelectedChannelsChanged(MudChip[] chips) { - currentCount++; + var roles = chips.Select(x => x.Value).Cast(); + GuildRoleCountView = Data.GuildRoleCounts.Where(x => roles.Contains(x.Name)).ToList(); } }