using SPTarkov.DI.Annotations;
using SPTarkov.Server.Core.Controllers;
using SPTarkov.Server.Core.DI;
using SPTarkov.Server.Core.Models.Common;
using SPTarkov.Server.Core.Models.Eft.Common;
using SPTarkov.Server.Core.Models.Eft.Common.Request;
using SPTarkov.Server.Core.Models.Eft.Game;
using SPTarkov.Server.Core.Servers;
using SPTarkov.Server.Core.Utils;
namespace SPTarkov.Server.Core.Callbacks;
[Injectable(TypePriority = OnLoadOrder.GameCallbacks)]
public class GameCallbacks(
HttpResponseUtil httpResponseUtil,
Watermark watermark,
SaveServer saveServer,
GameController gameController,
TimeUtil timeUtil
) : IOnLoad
{
public Task OnLoad()
{
gameController.Load();
return Task.CompletedTask;
}
///
/// Handle client/game/version/validate
///
///
public ValueTask VersionValidate(string url, VersionValidateRequestData info, MongoId sessionID)
{
return new ValueTask(httpResponseUtil.NullResponse());
}
///
/// Handle client/game/start
///
///
public ValueTask GameStart(string url, EmptyRequestData _, MongoId sessionID)
{
var startTimestampSec = timeUtil.GetTimeStamp();
gameController.GameStart(url, sessionID, startTimestampSec);
return new ValueTask(httpResponseUtil.GetBody(new GameStartResponse { UtcTime = startTimestampSec }));
}
///
/// Handle client/game/logout
/// Save profiles on game close
///
///
public async ValueTask GameLogout(string url, EmptyRequestData _, MongoId sessionID)
{
await saveServer.SaveProfileAsync(sessionID);
return httpResponseUtil.GetBody(new GameLogoutResponseData { Status = "ok" });
}
///
/// Handle client/game/config
///
///
public ValueTask GetGameConfig(string url, GameEmptyCrcRequestData info, MongoId sessionID)
{
return new ValueTask(httpResponseUtil.GetBody(gameController.GetGameConfig(sessionID)));
}
///
/// Handle client/putHWMetrics
///
///
public ValueTask PutHwMetrics(string url, EmptyRequestData info, MongoId sessionID)
{
return new ValueTask(httpResponseUtil.GetBody(null!));
}
///
/// Handle client/game/mode
///
///
public ValueTask GetGameMode(string url, GameModeRequestData info, MongoId sessionID)
{
return new ValueTask(httpResponseUtil.GetBody(gameController.GetGameMode(sessionID, info)));
}
///
/// Handle client/server/list
///
///
public ValueTask GetServer(string url, EmptyRequestData _, MongoId sessionID)
{
return new ValueTask(httpResponseUtil.GetBody(gameController.GetServer(sessionID)));
}
///
/// Handle client/match/group/current
///
///
public ValueTask GetCurrentGroup(string url, EmptyRequestData _, MongoId sessionID)
{
return new ValueTask(httpResponseUtil.GetBody(gameController.GetCurrentGroup(sessionID)));
}
///
/// Handle client/checkVersion
///
///
public ValueTask ValidateGameVersion(string url, EmptyRequestData _, MongoId sessionID)
{
return new ValueTask(httpResponseUtil.GetBody(gameController.GetValidGameVersion(sessionID)));
}
///
/// Handle client/game/keepalive
///
///
public ValueTask GameKeepalive(string url, EmptyRequestData _, MongoId sessionID)
{
return new ValueTask(httpResponseUtil.GetBody(gameController.GetKeepAlive(sessionID)));
}
///
/// Handle singleplayer/settings/version
///
///
public ValueTask GetVersion(string url, EmptyRequestData _, MongoId sessionID)
{
// change to be a proper type
return new ValueTask(httpResponseUtil.NoBody(new { Version = watermark.GetInGameVersionLabel() }));
}
///
/// Handle /client/report/send & /client/reports/lobby/send
///
///
public ValueTask ReportNickname(string url, UIDRequestData request, MongoId sessionID)
{
return new ValueTask(httpResponseUtil.NullResponse());
}
///
/// Handle singleplayer/settings/getRaidTime
///
///
public ValueTask GetRaidTime(string url, GetRaidTimeRequest request, MongoId sessionID)
{
return new ValueTask(httpResponseUtil.NoBody(gameController.GetRaidTime(sessionID, request)));
}
///
/// Handle /client/survey
///
///
public ValueTask GetSurvey(string url, EmptyRequestData _, MongoId sessionID)
{
return new ValueTask(httpResponseUtil.GetBody(gameController.GetSurvey(sessionID)));
}
///
/// Handle client/survey/view
///
///
public ValueTask GetSurveyView(string url, SendSurveyOpinionRequest request, MongoId sessionID)
{
return new ValueTask(httpResponseUtil.NullResponse());
}
///
/// Handle client/survey/opinion
///
///
public ValueTask SendSurveyOpinion(string url, SendSurveyOpinionRequest request, MongoId sessionID)
{
return new ValueTask(httpResponseUtil.NullResponse());
}
}