diff --git a/EpinelPS/Database/JsonDb.cs b/EpinelPS/Database/JsonDb.cs index d6eb9ac..6b62245 100644 --- a/EpinelPS/Database/JsonDb.cs +++ b/EpinelPS/Database/JsonDb.cs @@ -82,6 +82,12 @@ namespace EpinelPS.Database /// public long AvailableAt; } + public class SimroomData + { + public int CurrentDifficulty; + public int CurrentChapter; + public bool Entered = false; + } public class ResetableData { public int WipeoutCount = 0; @@ -89,6 +95,7 @@ namespace EpinelPS.Database public int InterceptionTickets = 3; public List CompletedDailyMissions = []; public int DailyMissionPoints; + public SimroomData SimRoomData = new(); } public class WeeklyResetableData { diff --git a/EpinelPS/LobbyServer/Event/GetChallengeStage.cs b/EpinelPS/LobbyServer/Event/GetChallengeStage.cs index 0520898..dadfed0 100644 --- a/EpinelPS/LobbyServer/Event/GetChallengeStage.cs +++ b/EpinelPS/LobbyServer/Event/GetChallengeStage.cs @@ -7,7 +7,7 @@ namespace EpinelPS.LobbyServer.Event { protected override async Task HandleAsync() { - var req = await ReadData(); + var req = await ReadData(); var user = GetUser(); var response = new ResChallengeEventStageData(); diff --git a/EpinelPS/LobbyServer/Event/Minigame/CE002/GetCe002Data.cs b/EpinelPS/LobbyServer/Event/Minigame/CE002/GetCe002Data.cs new file mode 100644 index 0000000..a48cc95 --- /dev/null +++ b/EpinelPS/LobbyServer/Event/Minigame/CE002/GetCe002Data.cs @@ -0,0 +1,26 @@ +using EpinelPS.Utils; + +namespace EpinelPS.LobbyServer.Event.Minigame.CE002 +{ + [PacketPath("/event/minigame/ce002/get")] + public class GetCe002Data : LobbyMsgHandler + { + protected override async Task HandleAsync() + { + var req = await ReadData(); + var user = GetUser(); + + var response = new ResGetMiniGameCe002Data + { + Data = new() + { + Ce002Id = req.Ce002Id + } + }; + + // TODO implement properly + + await WriteDataAsync(response); + } + } +} diff --git a/EpinelPS/LobbyServer/LobbyHandler.cs b/EpinelPS/LobbyServer/LobbyHandler.cs index 06cd49a..f292d3a 100644 --- a/EpinelPS/LobbyServer/LobbyHandler.cs +++ b/EpinelPS/LobbyServer/LobbyHandler.cs @@ -100,9 +100,10 @@ namespace EpinelPS.LobbyServer { var encryptionToken = new PasetoBuilder().Use(ProtocolVersion.V4, Purpose.Local) .WithKey(JsonDb.Instance.LauncherTokenKey, Encryption.SymmetricKey) - .Decode(token, new PasetoTokenValidationParameters() { ValidateLifetime = true }); + .Decode(token, new PasetoTokenValidationParameters() { ValidateLifetime = true }) ?? throw new Exception("failed to decrypt"); + var elem = (encryptionToken.Paseto.Payload["data"] as System.Text.Json.JsonElement?) ?? throw new Exception("expected data field in auth token"); - var p = ((System.Text.Json.JsonElement)encryptionToken.Paseto.Payload["data"]).GetString() ?? throw new Exception("auth token cannot be null"); + var p = elem.GetString() ?? throw new Exception("auth token cannot be null"); return JsonConvert.DeserializeObject(p ?? throw new Exception("data cannot be null")); } diff --git a/EpinelPS/LobbyServer/Simroom/GetSimRoomData.cs b/EpinelPS/LobbyServer/Simroom/GetSimRoomData.cs index d9a778a..29d7189 100644 --- a/EpinelPS/LobbyServer/Simroom/GetSimRoomData.cs +++ b/EpinelPS/LobbyServer/Simroom/GetSimRoomData.cs @@ -9,6 +9,7 @@ namespace EpinelPS.LobbyServer.Simroom protected override async Task HandleAsync() { var req = await ReadData(); + var user = GetUser(); var response = new ResGetSimRoom { @@ -55,6 +56,14 @@ namespace EpinelPS.LobbyServer.Simroom NextLegacyBuffResetDate = Timestamp.FromDateTimeOffset(DateTime.UtcNow.AddDays(7)) }; + if (user.ResetableData.SimRoomData.Entered) + { + response.Status = SimRoomStatus.Progress; + + response.CurrentDifficulty = user.ResetableData.SimRoomData.CurrentDifficulty; + } + + await WriteDataAsync(response); } } diff --git a/EpinelPS/LobbyServer/Simroom/Quit.cs b/EpinelPS/LobbyServer/Simroom/Quit.cs new file mode 100644 index 0000000..f2af279 --- /dev/null +++ b/EpinelPS/LobbyServer/Simroom/Quit.cs @@ -0,0 +1,26 @@ +using EpinelPS.Utils; +using EpinelPS.Database; + +namespace EpinelPS.LobbyServer.Simroom +{ + [PacketPath("/simroom/quit")] + public class Quit : LobbyMsgHandler + { + protected override async Task HandleAsync() + { + var req = await ReadData(); + var user = GetUser(); + + ResQuitSimRoom response = new() + { + Result = SimRoomResult.SimRoomResultSuccess, + }; + + user.ResetableData.SimRoomData.Entered = false; + + JsonDb.Save(); + + await WriteDataAsync(response); + } + } +} \ No newline at end of file diff --git a/EpinelPS/LobbyServer/Simroom/SelectDifficulty.cs b/EpinelPS/LobbyServer/Simroom/SelectDifficulty.cs index 479158c..8ee5089 100644 --- a/EpinelPS/LobbyServer/Simroom/SelectDifficulty.cs +++ b/EpinelPS/LobbyServer/Simroom/SelectDifficulty.cs @@ -1,4 +1,5 @@ using EpinelPS.Utils; +using EpinelPS.Database; namespace EpinelPS.LobbyServer.Simroom { @@ -8,12 +9,21 @@ namespace EpinelPS.LobbyServer.Simroom protected override async Task HandleAsync() { var req = await ReadData(); + var user = GetUser(); - ResSelectSimRoomDifficulty response = new ResSelectSimRoomDifficulty + ResSelectSimRoomDifficulty response = new() { Result = SimRoomResult.SimRoomResultSuccess, }; + user.ResetableData.SimRoomData.Entered = true; + user.ResetableData.SimRoomData.CurrentDifficulty = req.Difficulty; + user.ResetableData.SimRoomData.CurrentChapter = req.StartingChapter; + + // TODO: generate buffs + + JsonDb.Save(); + await WriteDataAsync(response); } }