diff --git a/Libraries/SPTarkov.Server.Core/Callbacks/GameCallbacks.cs b/Libraries/SPTarkov.Server.Core/Callbacks/GameCallbacks.cs index da8d1d9b..e949ab37 100644 --- a/Libraries/SPTarkov.Server.Core/Callbacks/GameCallbacks.cs +++ b/Libraries/SPTarkov.Server.Core/Callbacks/GameCallbacks.cs @@ -6,6 +6,7 @@ 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; @@ -16,6 +17,7 @@ public class GameCallbacks( Watermark watermark, SaveServer saveServer, GameController gameController, + ProfileActivityService profileActivityService, TimeUtil timeUtil ) : IOnLoad { @@ -173,4 +175,19 @@ public class GameCallbacks( { 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()); + } } diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Game/SendClientModsRequest.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Game/SendClientModsRequest.cs new file mode 100644 index 00000000..cc941809 --- /dev/null +++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Game/SendClientModsRequest.cs @@ -0,0 +1,11 @@ +using System.Text.Json.Serialization; +using SPTarkov.Server.Core.Models.Spt.Services; +using SPTarkov.Server.Core.Models.Utils; + +namespace SPTarkov.Server.Core.Models.Eft.Game; + +public record SendClientModsRequest : IRequestData +{ + [JsonPropertyName("activeClientMods")] + public List ActiveClientMods { get; set; } = []; +} diff --git a/Libraries/SPTarkov.Server.Core/Models/Spt/Services/ProfileActivityData.cs b/Libraries/SPTarkov.Server.Core/Models/Spt/Services/ProfileActivityData.cs index d7d4b139..99dc2834 100644 --- a/Libraries/SPTarkov.Server.Core/Models/Spt/Services/ProfileActivityData.cs +++ b/Libraries/SPTarkov.Server.Core/Models/Spt/Services/ProfileActivityData.cs @@ -1,3 +1,4 @@ +using System.Text.Json.Serialization; using SPTarkov.Server.Core.Models.Eft.Match; using SPTarkov.Server.Core.Models.Spt.Location; @@ -8,6 +9,7 @@ namespace SPTarkov.Server.Core.Models.Spt.Services public long ClientStartedTimestamp { get; set; } public long LastActive { get; set; } public ProfileActivityRaidData? RaidData { get; set; } = null; + public IReadOnlyList ActiveClientMods { get; set; } = []; } public class ProfileActivityRaidData @@ -16,4 +18,16 @@ namespace SPTarkov.Server.Core.Models.Spt.Services public RaidChanges? RaidAdjustments { get; set; } = null; public LocationTransit? LocationTransit { get; set; } = null; } + + public record ProfileActiveClientMods + { + [JsonPropertyName("modName")] + public required string Name { get; init; } + + [JsonPropertyName("modGUID")] + public required string GUID { get; init; } + + [JsonPropertyName("modVersion")] + public required Version Version { get; init; } + } } diff --git a/Libraries/SPTarkov.Server.Core/Routers/Static/GameStaticRouter.cs b/Libraries/SPTarkov.Server.Core/Routers/Static/GameStaticRouter.cs index 2819c4bb..3faf2ce7 100644 --- a/Libraries/SPTarkov.Server.Core/Routers/Static/GameStaticRouter.cs +++ b/Libraries/SPTarkov.Server.Core/Routers/Static/GameStaticRouter.cs @@ -97,6 +97,16 @@ public class GameStaticRouter : StaticRouter await gameCallbacks.SendSurveyOpinion(url, info as SendSurveyOpinionRequest, sessionID), typeof(SendSurveyOpinionRequest) ), + new RouteAction( + "/singleplayer/clientmods", + async (url, info, sessionID, output) => + await gameCallbacks.ReceiveClientMods( + url, + info as SendClientModsRequest, + sessionID + ), + typeof(SendClientModsRequest) + ), ] ) { } } diff --git a/Libraries/SPTarkov.Server.Core/Services/ProfileActivityService.cs b/Libraries/SPTarkov.Server.Core/Services/ProfileActivityService.cs index b38d18c4..7ebfa83a 100644 --- a/Libraries/SPTarkov.Server.Core/Services/ProfileActivityService.cs +++ b/Libraries/SPTarkov.Server.Core/Services/ProfileActivityService.cs @@ -117,4 +117,32 @@ public class ProfileActivityService(TimeUtil timeUtil) currentActiveProfile.LastActive = timeUtil.GetTimeStamp(); } } + + public IReadOnlyList GetProfileActiveClientMods(MongoId sessionId) + { + if (!ContainsActiveProfile(sessionId)) + { + return []; + } + + if (_activeProfiles.TryGetValue(sessionId, out var currentActiveProfile)) + { + return currentActiveProfile.ActiveClientMods; + } + + throw new Exception($"Unable to retrieve active client mods for session: {sessionId}"); + } + + public void SetProfileActiveClientMods(MongoId sessionId, IReadOnlyList activeClientMods) + { + if (!ContainsActiveProfile(sessionId)) + { + AddActiveProfile(sessionId, timeUtil.GetTimeStamp()); + } + + if (_activeProfiles.TryGetValue(sessionId, out var currentActiveProfile)) + { + currentActiveProfile.ActiveClientMods = activeClientMods; + } + } }