IW4M-Admin/WebfrontCore/Controllers/API/Info.cs
2022-03-08 12:06:46 -06:00

54 lines
1.9 KiB
C#

using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using SharedLibraryCore;
using SharedLibraryCore.Interfaces;
using WebfrontCore.Controllers.API.Dtos;
namespace WebfrontCore.Controllers.API;
[ApiController]
[Route("api/[controller]")]
public class Info : BaseController
{
private readonly IServerDataViewer _serverDataViewer;
public Info(IManager manager, IServerDataViewer serverDataViewer) : base(manager)
{
_serverDataViewer = serverDataViewer;
}
[HttpGet]
public async Task<IActionResult> Get(int period = 24, CancellationToken token = default)
{
// todo: this is hardcoded currently because the cache doesn't take into consideration the duration, so
// we could impact the webfront usage too
var duration = TimeSpan.FromHours(24);
var (totalClients, totalRecentClients) =
await _serverDataViewer.ClientCountsAsync(duration, token);
var (maxConcurrent, maxConcurrentTime) = await _serverDataViewer.MaxConcurrentClientsAsync(overPeriod: duration, token: token);
var response = new InfoResponse
{
TotalTrackedClients = totalClients,
TotalConnectedClients = Manager.GetActiveClients().Count,
TotalClientSlots = Manager.GetServers().Sum(server => server.MaxClients),
MaxConcurrentClients = new MetricSnapshot<int?>
{
Value = maxConcurrent, Time = maxConcurrentTime,
EndAt = DateTime.UtcNow,
StartAt = DateTime.UtcNow - duration
},
TotalRecentClients = new MetricSnapshot<int>
{
Value = totalRecentClients,
EndAt = DateTime.UtcNow,
StartAt = DateTime.UtcNow - duration
}
};
return Json(response);
}
}