@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; }
}
}