using LBPUnion.ProjectLighthouse.Database; using LBPUnion.ProjectLighthouse.Filter; using LBPUnion.ProjectLighthouse.Filter.Filters; using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Servers.API.Responses; using LBPUnion.ProjectLighthouse.Types.Users; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace LBPUnion.ProjectLighthouse.Servers.API.Controllers; /// /// A collection of endpoints relating to statistics. /// public class StatisticsEndpoints : ApiEndpointController { private readonly DatabaseContext database; public StatisticsEndpoints(DatabaseContext database) { this.database = database; } /// /// Gets everything that StatisticsHelper provides. /// /// An instance of StatisticsResponse [HttpGet("statistics")] [ProducesResponseType(typeof(StatisticsResponse), StatusCodes.Status200OK)] public async Task GetStatistics() => this.Ok ( new StatisticsResponse { Photos = await StatisticsHelper.PhotoCount(this.database), Slots = await StatisticsHelper.SlotCount(this.database, new SlotQueryBuilder()), Users = await StatisticsHelper.UserCount(this.database), RecentMatches = await StatisticsHelper.RecentMatches(this.database), TeamPicks = await StatisticsHelper.SlotCount(this.database, new SlotQueryBuilder().AddFilter(new TeamPickFilter())), } ); private static readonly List gameVersions = new() { GameVersion.LittleBigPlanet1, GameVersion.LittleBigPlanet2, GameVersion.LittleBigPlanet3, GameVersion.LittleBigPlanetVita, GameVersion.LittleBigPlanetPSP, }; private static readonly List platforms = new() { Platform.PS3, Platform.RPCS3, Platform.Vita, Platform.PSP, }; /// /// Get player counts for each individual title /// /// An instance of PlayerCountByGameResponse [HttpGet("playerCount")] [HttpGet("playerCount/game")] [ProducesResponseType(typeof(PlayerCountByGameResponse), StatusCodes.Status200OK)] public async Task GetPlayerCounts() { List gameList = new(); foreach (GameVersion version in gameVersions) { gameList.Add(new PlayerCountByGameObject { Game = version.ToString(), PlayerCount = await StatisticsHelper.RecentMatches(this.database, l => l.GameVersion == version), }); } PlayerCountByGameResponse response = new() { TotalPlayerCount = await StatisticsHelper.RecentMatches(this.database), Games = gameList, }; return this.Ok(response); } /// /// Get player counts for each individual platform /// /// An instance of PlayerCountByPlatformResponse [HttpGet("playerCount/platform")] [ProducesResponseType(typeof(PlayerCountByPlatformResponse), StatusCodes.Status200OK)] public async Task GetPlayerCountsByPlatform() { List platformList = new(); foreach (Platform platform in platforms) { platformList.Add(new PlayerCountByPlatformObject { Platform = platform.ToString(), PlayerCount = await StatisticsHelper.RecentMatches(this.database, l => l.Platform == platform), }); } PlayerCountByPlatformResponse response = new() { TotalPlayerCount = await StatisticsHelper.RecentMatches(this.database), Platforms = platformList, }; return this.Ok(response); } /// /// Gets a list of online players /// /// An instance of PlayerListResponse [HttpGet("players")] [ProducesResponseType(typeof(PlayerListResponse), StatusCodes.Status200OK)] public async Task GetPlayerList() { List players = await this.database.LastContacts.Where(l => TimeHelper.Timestamp - l.Timestamp < 300) .Select(l => new PlayerListObject { Username = l.User!.Username, Game = l.GameVersion.ToString(), Platform = l.Platform.ToString(), }) .ToListAsync(); PlayerListResponse response = new() { Players = players, }; return this.Ok(response); } }