@page "/Dashboard/SessionPlaytime" @inject GameService GameService
@code { Dictionary Playtimes = new Dictionary(); ICollection Games { get; set; } = new List(); IEnumerable SessionData = new List(); bool Loading = true; protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender) await LoadData(); } private async Task LoadData() { Loading = true; Games = await GameService .Include(g => g.PlaySessions) .Include(g => g.Media.Where(m => m.Type == SDK.Enums.MediaType.Icon)) .GetAsync(); SessionData = Games.Select(g => { var data = new GameAverageSessionData() { Game = g, TotalTime = new TimeSpan() }; if (g.PlaySessions != null && g.PlaySessions.Any(g => g.End != null && g.Start != null)) { var playSessions = g.PlaySessions.Where(s => s.Start != null && s.End != null); data.LastPlayed = playSessions.OrderByDescending(s => s.End).First().End.Value; data.SessionCount = playSessions.Count(); foreach (var session in playSessions) { data.TotalTime = data.TotalTime.Add(session.End.Value.Subtract(session.Start.Value)); } data.AverageTime = TimeSpan.FromSeconds(data.TotalTime.TotalSeconds / data.SessionCount); } return data; }); Loading = false; await InvokeAsync(StateHasChanged); } private string GetIcon(Game game) { var media = game?.Media?.FirstOrDefault(m => m.Type == SDK.Enums.MediaType.Icon); if (media != null) return $"/api/Media/{media.Id}/Download?fileId={media.FileId}"; else return "/favicon.ico"; } public class GameAverageSessionData { public Game Game { get; set; } public DateTime LastPlayed { get; set; } public TimeSpan TotalTime { get; set; } public int SessionCount { get; set; } public TimeSpan AverageTime { get; set; } } }