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.Services; using SPTarkov.Server.Core.Utils; namespace SPTarkov.Server.Core.Callbacks; [Injectable(TypePriority = OnLoadOrder.GameCallbacks)] public class GameCallbacks( HttpResponseUtil httpResponseUtil, Watermark watermark, SaveServer saveServer, BackupService backupService, GameController gameController, ProfileActivityService profileActivityService, 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) { if (saveServer.IsProfileInvalidOrUnloadable(sessionID)) { return new ValueTask( httpResponseUtil.GetBody( new GameStartResponse { UtcTime = 0 }, Models.Enums.BackendErrorCodes.PlayerProfileNotFound, "This profile cannot be loaded due to it being invalid or unloadable!" ) ); } 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); // Backup profiles on exit await backupService.Init(); return httpResponseUtil.GetBody(new GameLogoutResponseData { Status = "ok" }); } /// /// Handle client/game/config /// /// public ValueTask GetGameConfig(string url, EmptyRequestData 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 and handle /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()); } /// /// Handle singleplayer/clientmods /// /// public ValueTask ReceiveClientMods(string url, SendClientModsRequest request, MongoId sessionID) { profileActivityService.SetProfileActiveClientMods(sessionID, request.ActiveClientMods); return new ValueTask(httpResponseUtil.NullResponse()); } }