Added early concept of a status page

This commit is contained in:
Chomp
2025-07-17 12:54:40 +01:00
parent b94d625362
commit 2221c4e749
3 changed files with 67 additions and 0 deletions
@@ -56,6 +56,12 @@ public record CoreConfig : BaseConfig
[JsonPropertyName("buildTime")]
public string? BuildTime { get; set; }
/// <summary>
/// Timestamp of server start up
/// </summary>
[JsonPropertyName("serverStartTime")]
public long? ServerStartTime { get; set; }
/// <summary>
/// Server locale keys that will be added to the bottom of the startup watermark
/// </summary>
@@ -34,6 +34,8 @@ public class PostDbLoadService(
public void PerformPostDbLoadActions()
{
_coreConfig.ServerStartTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
// Regenerate base cache now mods are loaded and game is starting
// Mods that add items and use the baseClass service generate the cache including their items, the next mod that
// add items gets left out,causing warnings
@@ -0,0 +1,59 @@
using System.Text;
using SPTarkov.DI.Annotations;
using SPTarkov.Server.Core.Models.Spt.Config;
using SPTarkov.Server.Core.Servers;
using SPTarkov.Server.Core.Servers.Http;
using SPTarkov.Server.Core.Services;
using SPTarkov.Server.Core.Utils;
namespace SPTarkov.Server.Core.Status
{
[Injectable]
public class StatusPage(
TimeUtil timeUtil,
ProfileActivityService profileActivityService,
ConfigServer configServer
) : IHttpListener
{
protected readonly CoreConfig _coreConfig = configServer.GetConfig<CoreConfig>();
public bool CanHandle(string sessionId, HttpRequest req)
{
return req.Method == "GET" && req.Path.Value.Contains("/status");
}
public async Task Handle(string sessionId, HttpRequest req, HttpResponse resp)
{
var sptVersion = $"SPT version: {ProgramStatics.SPT_VERSION()}";
var debugEnabled = $"Debug enabled: {ProgramStatics.DEBUG()}";
var modsEnabled = $"Mods enabled: {ProgramStatics.MODS()}";
var timeStarted =
$"Started : {timeUtil.GetDateTimeFromTimeStamp(_coreConfig.ServerStartTime.Value)}";
var uptime =
$"Uptime: {DateTimeOffset.UtcNow.ToUnixTimeSeconds() - _coreConfig.ServerStartTime} seconds".ToArray();
var activeProfiles = profileActivityService.GetActiveProfileIdsWithinMinutes(30);
var activePlayerCount =
$"Profiles active in last 30 minutes: {activeProfiles.Count}. {string.Join(",", activeProfiles)}";
resp.StatusCode = 200;
resp.ContentType = "text/html";
await resp.Body.WriteAsync(Encoding.ASCII.GetBytes(sptVersion));
await resp.Body.WriteAsync(Encoding.ASCII.GetBytes("<br>"));
await resp.Body.WriteAsync(Encoding.ASCII.GetBytes(debugEnabled));
await resp.Body.WriteAsync(Encoding.ASCII.GetBytes("<br>"));
await resp.Body.WriteAsync(Encoding.ASCII.GetBytes(modsEnabled));
await resp.Body.WriteAsync(Encoding.ASCII.GetBytes("<br>"));
await resp.Body.WriteAsync(Encoding.ASCII.GetBytes(timeStarted));
await resp.Body.WriteAsync(Encoding.ASCII.GetBytes("<br>"));
await resp.Body.WriteAsync(Encoding.ASCII.GetBytes(uptime));
await resp.Body.WriteAsync(Encoding.ASCII.GetBytes("<br>"));
await resp.Body.WriteAsync(Encoding.ASCII.GetBytes(activePlayerCount));
await resp.Body.WriteAsync(Encoding.ASCII.GetBytes("<br>"));
await resp.StartAsync();
await resp.CompleteAsync();
}
}
}