LANCommander/LANCommander.Server/UI/Pages/Dashboard/Charts/TopGamesPlaytime.razor

77 lines
No EOL
2.1 KiB
Text

@using AntDesign.Charts
@inject PlaySessionService PlaySessionService
<Spin Spinning="Loading">
<div class="dashboard-chart">
<Pie Data="Data" Config="Config" JsConfig="@JsConfig" />
</div>
</Spin>
@code {
Settings Settings = SettingService.GetSettings();
object[] Data;
bool Loading = true;
ICollection<PlaySession> PlaySessions;
string JsConfig = @"{
meta: {
value: {
alias: 'Total Playtime',
formatter: (v) => Math.floor(v / 3600) > 0 ? `${Math.floor(v / 3600)}h ${Math.floor((v % 3600) / 60)}m` : `${Math.floor((v % 3600) / 60)}m`
}
},
label: {
visible: true,
type: 'outer-center',
style: {
fontSize: '1px'
}
}
}";
PieConfig Config = new PieConfig
{
Radius = 0.8,
AngleField = "value",
ColorField = "type",
};
protected override async Task OnInitializedAsync()
{
PlaySessions = await PlaySessionService
.AsNoTracking()
.Include(ps => ps.Game)
.Include(ps => ps.CreatedBy)
.Include(ps => ps.User)
.GetAsync(ps => ps.GameId.HasValue && ps.GameId.Value != Guid.Empty);
Config.Theme = Settings.Theme == LANCommanderTheme.Dark ? "dark" : "light";
Dictionary<string, TimeSpan> playtimes = new Dictionary<string, TimeSpan>();
foreach (var gameSessions in PlaySessions.GroupBy(s => s.GameId))
{
var total = new TimeSpan();
foreach (var session in gameSessions.Where(gs => gs.Start != null && gs.End != null))
{
total = total.Add(session.End.Value.Subtract(session.Start.Value));
}
playtimes[gameSessions.First().Game.Title] = total;
}
Data = playtimes.OrderByDescending(pt => pt.Value).Take(10).Select(pt => new
{
type = pt.Key,
value = (int)pt.Value.TotalSeconds
}).ToArray();
Loading = false;
StateHasChanged();
}
}