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