diff --git a/EpinelPS/Controllers/LauncherController.cs b/EpinelPS/Controllers/LauncherController.cs index 22b177f..495e4d8 100644 --- a/EpinelPS/Controllers/LauncherController.cs +++ b/EpinelPS/Controllers/LauncherController.cs @@ -96,7 +96,6 @@ namespace EpinelPS.Controllers return "{}"; } - Console.WriteLine("Requesting gameId: " + body.game_id); return System.IO.File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "gameversion.json")); } diff --git a/EpinelPS/Controllers/LobbyApiController.cs b/EpinelPS/Controllers/LobbyApiController.cs index 781d2b9..fc7d1e9 100644 --- a/EpinelPS/Controllers/LobbyApiController.cs +++ b/EpinelPS/Controllers/LobbyApiController.cs @@ -1,6 +1,7 @@ using EpinelPS.LobbyServer; using Microsoft.AspNetCore.Mvc; using System.Diagnostics; +using EpinelPS.Utils; namespace EpinelPS.Controllers { @@ -24,7 +25,7 @@ namespace EpinelPS.Controllers else Console.ForegroundColor = ConsoleColor.Red; - Console.WriteLine("POST " + HttpContext.Request.Path.Value + " completed in " + st.Elapsed + "with result " + HttpContext.Response.StatusCode); + Logging.WriteLine("POST " + HttpContext.Request.Path.Value + " completed in " + st.Elapsed + " with result " + HttpContext.Response.StatusCode, LogType.InfoSuccess); Console.ForegroundColor = fg; } diff --git a/EpinelPS/Data/GameData.cs b/EpinelPS/Data/GameData.cs index 3dad3b4..a1d9eca 100644 --- a/EpinelPS/Data/GameData.cs +++ b/EpinelPS/Data/GameData.cs @@ -168,13 +168,13 @@ namespace EpinelPS.Data { await Load(); - Console.WriteLine("Preparing"); + Logging.WriteLine("Preparing"); var stopWatch = new Stopwatch(); stopWatch.Start(); await Instance.Parse(); stopWatch.Stop(); - Console.WriteLine("Preparing took " + stopWatch.Elapsed); + Logging.WriteLine("Preparing took " + stopWatch.Elapsed); return Instance; } diff --git a/EpinelPS/Database/JsonDb.cs b/EpinelPS/Database/JsonDb.cs index 5052ae1..e8ecdd2 100644 --- a/EpinelPS/Database/JsonDb.cs +++ b/EpinelPS/Database/JsonDb.cs @@ -582,6 +582,7 @@ namespace EpinelPS.Database public string ServerName = "Private Server"; public byte[] LauncherTokenKey = []; public byte[] EncryptionTokenKey = []; + public LogType LogLevel = LogType.Debug; } internal class JsonDb { diff --git a/EpinelPS/LobbyServer/Campaign/ObtainItem.cs b/EpinelPS/LobbyServer/Campaign/ObtainItem.cs index 7afe983..dd8b4fa 100644 --- a/EpinelPS/LobbyServer/Campaign/ObtainItem.cs +++ b/EpinelPS/LobbyServer/Campaign/ObtainItem.cs @@ -21,7 +21,7 @@ namespace EpinelPS.LobbyServer.Campaign if (chapter == -1) { - Console.WriteLine("Warning: unknown chapter id for " + req.MapId); + Logging.WriteLine("Warning: unknown chapter id for " + req.MapId, LogType.Warning); key = req.MapId; } @@ -36,7 +36,7 @@ namespace EpinelPS.LobbyServer.Campaign { if (item.PositionId == req.FieldObject.PositionId) { - Console.WriteLine("attempted to collect campaign field object twice!"); + Logging.WriteLine("attempted to collect campaign field object twice!", LogType.WarningAntiCheat); return; } } diff --git a/EpinelPS/LobbyServer/Campaign/SaveFieldObject.cs b/EpinelPS/LobbyServer/Campaign/SaveFieldObject.cs index c9f6b86..2ad69fa 100644 --- a/EpinelPS/LobbyServer/Campaign/SaveFieldObject.cs +++ b/EpinelPS/LobbyServer/Campaign/SaveFieldObject.cs @@ -12,11 +12,9 @@ namespace EpinelPS.LobbyServer.Campaign var req = await ReadData(); var user = GetUser(); - Console.WriteLine("Map ID: " + req.MapId); - var response = new ResSaveCampaignFieldObject(); - Console.WriteLine($"save {req.MapId} with {req.FieldObject.PositionId}"); + Logging.WriteLine($"save {req.MapId} with {req.FieldObject.PositionId}", LogType.Debug); var chapter = GameData.Instance.GetNormalChapterNumberFromFieldName(req.MapId); var mod = req.MapId.Contains("hard") ? "Hard" : "Normal"; diff --git a/EpinelPS/LobbyServer/Character/LevelUp.cs b/EpinelPS/LobbyServer/Character/LevelUp.cs index b65e816..373dfa8 100644 --- a/EpinelPS/LobbyServer/Character/LevelUp.cs +++ b/EpinelPS/LobbyServer/Character/LevelUp.cs @@ -40,8 +40,7 @@ namespace EpinelPS.LobbyServer.Character } else { - // TOOD: log this - Console.WriteLine("ERROR: Not enough currency for upgrade"); + Logging.WriteLine("ERROR: Not enough currency for upgrade", LogType.WarningAntiCheat); return; } diff --git a/EpinelPS/LobbyServer/Character/ResetLevel.cs b/EpinelPS/LobbyServer/Character/ResetLevel.cs index e79eff9..0a98b65 100644 --- a/EpinelPS/LobbyServer/Character/ResetLevel.cs +++ b/EpinelPS/LobbyServer/Character/ResetLevel.cs @@ -20,12 +20,12 @@ namespace EpinelPS.LobbyServer.Character { if (item.Level == 1) { - Console.WriteLine("Character level is already 1 - cannot reset"); + Logging.WriteLine("Character level is already 1 - cannot reset", LogType.WarningAntiCheat); return; } if (item.Level == 200) { - Console.WriteLine("Character level is 200 - cannot reset"); + Logging.WriteLine("Character level is 200 - cannot reset", LogType.WarningAntiCheat); return; } diff --git a/EpinelPS/LobbyServer/Character/UnregisterSynchroDevice.cs b/EpinelPS/LobbyServer/Character/UnregisterSynchroDevice.cs index e65d075..8174b89 100644 --- a/EpinelPS/LobbyServer/Character/UnregisterSynchroDevice.cs +++ b/EpinelPS/LobbyServer/Character/UnregisterSynchroDevice.cs @@ -19,14 +19,13 @@ namespace EpinelPS.LobbyServer.Character { if (item.CharacterSerialNumber == 0) { - Console.WriteLine("must add character from synchrodevice first"); + Logging.WriteLine("must add character from synchrodevice first", LogType.Warning); } else { var oldCSN = item.CharacterSerialNumber; item.CharacterSerialNumber = 0; - var data = user.GetCharacterBySerialNumber(oldCSN); - if (data == null) throw new Exception("failed to lookup character"); + var data = user.GetCharacterBySerialNumber(oldCSN) ?? throw new Exception("failed to lookup character"); response.Character = new NetUserCharacterDefaultData() { diff --git a/EpinelPS/LobbyServer/EmptyHandler.cs b/EpinelPS/LobbyServer/EmptyHandler.cs new file mode 100644 index 0000000..c755a69 --- /dev/null +++ b/EpinelPS/LobbyServer/EmptyHandler.cs @@ -0,0 +1,16 @@ +using Google.Protobuf.WellKnownTypes; +using EpinelPS.Utils; + +namespace EpinelPS.LobbyServer +{ + public class EmptyHandler : LobbyMsgHandler + { + protected override async Task HandleAsync() + { + var req = await ReadData(); + var response = new ResGetNow(); + + await WriteDataAsync(response); + } + } +} diff --git a/EpinelPS/LobbyServer/Event/StoryEvent/EnterStage.cs b/EpinelPS/LobbyServer/Event/StoryEvent/EnterStage.cs new file mode 100644 index 0000000..d946c2b --- /dev/null +++ b/EpinelPS/LobbyServer/Event/StoryEvent/EnterStage.cs @@ -0,0 +1,18 @@ +using EpinelPS.Utils; +using EpinelPS.Database; + +namespace EpinelPS.LobbyServer.Event.EventStory +{ + [PacketPath("/event/storydungeon/enterstage")] + public class EnterEventStoryStage : LobbyMsgHandler + { + protected override async Task HandleAsync() + { + var req = await ReadData(); + var user = GetUser(); + var response = new ResEnterEventStage(); + + await WriteDataAsync(response); + } + } +} diff --git a/EpinelPS/LobbyServer/LobbyHandler.cs b/EpinelPS/LobbyServer/LobbyHandler.cs index 15a3bff..5720b6e 100644 --- a/EpinelPS/LobbyServer/LobbyHandler.cs +++ b/EpinelPS/LobbyServer/LobbyHandler.cs @@ -5,6 +5,8 @@ using Google.Protobuf; using Paseto.Builder; using Paseto; using Newtonsoft.Json; +using EpinelPS.LobbyServer.Stage; +using EpinelPS.LobbyServer.Event.EventStory; namespace EpinelPS.LobbyServer { @@ -20,7 +22,7 @@ namespace EpinelPS.LobbyServer var attrib = (PacketPathAttribute?)Attribute.GetCustomAttribute(type, typeof(PacketPathAttribute)); if (attrib == null) { - Console.WriteLine("WARNING: Failed to get attribute for " + type.FullName); + Logging.WriteLine("WARNING: Failed to get attribute for " + type.FullName, LogType.Warning); continue; } @@ -32,7 +34,7 @@ namespace EpinelPS.LobbyServer } else { - Console.WriteLine($"WARNING: Type {type.FullName} has PacketPathAttribute but does not implement LobbyMsgHandler"); + Logging.WriteLine($"WARNING: Type {type.FullName} has PacketPathAttribute but does not implement LobbyMsgHandler", LogType.Warning); } } } @@ -54,8 +56,13 @@ namespace EpinelPS.LobbyServer if (handler == null) { - Console.WriteLine("404: " + path); - ctx.Response.StatusCode = 404; + Logging.WriteLine("HANDLER NOT FOUND: " + path, LogType.Error); + //ctx.Response.StatusCode = 404; + + // to prevent "reloading" of the game for now, return empty response + // this may cause more problems later on + + await new EmptyHandler().HandleAsync(ctx); } else { diff --git a/EpinelPS/LobbyServer/LobbyMsgHandler.cs b/EpinelPS/LobbyServer/LobbyMsgHandler.cs index f8b89ca..a54029d 100644 --- a/EpinelPS/LobbyServer/LobbyMsgHandler.cs +++ b/EpinelPS/LobbyServer/LobbyMsgHandler.cs @@ -61,13 +61,13 @@ namespace EpinelPS.LobbyServer { var str = (string?)data.GetType().InvokeMember("ToString", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.InvokeMethod, null, data, null); if (str != null) - Console.WriteLine(str); + Logging.WriteLine(str, LogType.Debug); } protected async Task WriteDataAsync(T data) where T : IMessage, new() { - Console.WriteLine("Writing " + data.GetType().Name); + Logging.WriteLine("Writing " + data.GetType().Name, LogType.Debug); PrintMessage(data); - Console.WriteLine(); + Logging.WriteLine("", LogType.Debug); if (ctx == null) { @@ -110,13 +110,13 @@ namespace EpinelPS.LobbyServer { // return grpc IMessage from byte array with type T T msg = new(); - Console.WriteLine("Reading " + msg.GetType().Name); + Logging.WriteLine("Reading " + msg.GetType().Name, LogType.Debug); var bin = await PacketDecryption.DecryptOrReturnContentAsync(ctx); msg.MergeFrom(bin.Contents); PrintMessage(msg); - Console.WriteLine(); + Logging.WriteLine("", LogType.Debug); UserId = bin.UserId; UsedAuthToken = bin.UsedAuthToken; diff --git a/EpinelPS/LobbyServer/LobbyUser/GetUserScenarioExist.cs b/EpinelPS/LobbyServer/LobbyUser/GetUserScenarioExist.cs index a21dd97..86577cd 100644 --- a/EpinelPS/LobbyServer/LobbyUser/GetUserScenarioExist.cs +++ b/EpinelPS/LobbyServer/LobbyUser/GetUserScenarioExist.cs @@ -17,13 +17,11 @@ namespace EpinelPS.LobbyServer.LobbyUser foreach (var item in req.ScenarioGroupIds) { - Console.WriteLine("check scenario " + item); foreach (var completed in user.CompletedScenarios) { // story thingy was completed if (completed == item) { - Console.WriteLine(item + " is completed"); response.ExistGroupIds.Add(item); } } diff --git a/EpinelPS/LobbyServer/Messenger/ProceedMsg.cs b/EpinelPS/LobbyServer/Messenger/ProceedMsg.cs index 4c6dbe3..109863b 100644 --- a/EpinelPS/LobbyServer/Messenger/ProceedMsg.cs +++ b/EpinelPS/LobbyServer/Messenger/ProceedMsg.cs @@ -20,7 +20,7 @@ namespace EpinelPS.LobbyServer.Messenger if (msgToSave.Value.reward_id != 0) { - Console.WriteLine("TODO reward for messenger. Reward ID: " + msgToSave.Value.reward_id + " Message ID: " + req.MessageId); + Logging.WriteLine("TODO reward for messenger. Reward ID: " + msgToSave.Value.reward_id + " Message ID: " + req.MessageId, LogType.Warning); } JsonDb.Save(); diff --git a/EpinelPS/LobbyServer/Shop/GetProductList.cs b/EpinelPS/LobbyServer/Shop/GetProductList.cs index 0cddca0..16b6df9 100644 --- a/EpinelPS/LobbyServer/Shop/GetProductList.cs +++ b/EpinelPS/LobbyServer/Shop/GetProductList.cs @@ -28,7 +28,7 @@ namespace EpinelPS.LobbyServer.Shop if (!decimal.TryParse(normalizedCost, NumberStyles.Any, CultureInfo.InvariantCulture, out decimal price)) { - Console.WriteLine($"Failed to parse '{record.cost}' (normalized as '{normalizedCost}'). Cash shop will not work properly."); + Logging.WriteLine($"Failed to parse '{record.cost}' (normalized as '{normalizedCost}'). Cash shop will not work properly.", LogType.Error); continue; } diff --git a/EpinelPS/LobbyServer/Wallet/GetWallet.cs b/EpinelPS/LobbyServer/Wallet/GetWallet.cs index ae047c2..925eca6 100644 --- a/EpinelPS/LobbyServer/Wallet/GetWallet.cs +++ b/EpinelPS/LobbyServer/Wallet/GetWallet.cs @@ -11,10 +11,6 @@ namespace EpinelPS.LobbyServer.Wallet var user = GetUser(); var response = new ResGetCurrencyData(); - foreach (var item in req.Currencies) - { - Console.WriteLine("Request currency " + (CurrencyType)item); - } foreach (var currency in user.Currency) { diff --git a/EpinelPS/Program.cs b/EpinelPS/Program.cs index fef4a3c..f08e150 100644 --- a/EpinelPS/Program.cs +++ b/EpinelPS/Program.cs @@ -26,10 +26,10 @@ namespace EpinelPS GameData.Instance.GetAllCostumes(); // force static data to be loaded - Console.WriteLine("Register handlers"); + Logging.WriteLine("Register handlers"); LobbyHandler.Init(); - Console.WriteLine("Starting ASP.NET core on port 443"); + Logging.WriteLine("Starting ASP.NET core on port 443"); new Thread(() => { var builder = WebApplication.CreateBuilder(args); @@ -1063,7 +1063,7 @@ namespace EpinelPS url = url.Replace("/v1", ""); // find appropriate handler - Console.WriteLine("BATCH: /v1" + url); + Logging.WriteLine("BATCH: /v1" + url, LogType.Info); foreach (var item in LobbyHandler.Handlers) { @@ -1076,10 +1076,8 @@ namespace EpinelPS } } - var fg = Console.ForegroundColor; - Console.ForegroundColor = ConsoleColor.Red; - Console.WriteLine("HANDLER NOT FOUND: " + url); - Console.ForegroundColor = fg; + Logging.WriteLine("Handler not found: " + url, LogType.Error); + return null; } } diff --git a/EpinelPS/Utils/LogUtils.cs b/EpinelPS/Utils/LogUtils.cs deleted file mode 100644 index 9766383..0000000 --- a/EpinelPS/Utils/LogUtils.cs +++ /dev/null @@ -1,30 +0,0 @@ -using Google.Protobuf; -using System.Reflection; - -namespace EpinelPS.Utils -{ - public static class LogUtils - { - public static void LogMessageFields(IMessage message) - { - Type type = message.GetType(); - FieldInfo[] fields = type.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public); - - Console.ForegroundColor = ConsoleColor.Cyan; - - Console.WriteLine(type.Name + ":"); - - foreach (FieldInfo field in fields) - { - if (field.Name.ToLower().Contains("unknown")) - continue; - - object? value = field.GetValue(message); - - Console.WriteLine($"\t{field.Name}: {value}"); - } - - Console.ResetColor(); - } - } -} diff --git a/EpinelPS/Utils/Logging.cs b/EpinelPS/Utils/Logging.cs new file mode 100644 index 0000000..04f72d6 --- /dev/null +++ b/EpinelPS/Utils/Logging.cs @@ -0,0 +1,46 @@ +using EpinelPS.Database; + +namespace EpinelPS.Utils +{ + public class Logging + { + public static void WriteLine(string msg, LogType level = LogType.Info) + { + var originalFG = Console.ForegroundColor; + Console.ForegroundColor = GetColorForLevel(level); + + // todo write to some file + + + if (JsonDb.Instance.LogLevel <= level) + Console.WriteLine(msg); + + Console.ForegroundColor = originalFG; + + } + + private static ConsoleColor GetColorForLevel(LogType level) + { + switch (level) + { + case LogType.Debug: return ConsoleColor.DarkGray; + case LogType.Info: return ConsoleColor.Gray; + case LogType.InfoSuccess: return ConsoleColor.Green; + case LogType.Warning: return ConsoleColor.Yellow; + case LogType.WarningAntiCheat: return ConsoleColor.DarkMagenta; + case LogType.Error: return ConsoleColor.Red; + default: return ConsoleColor.White; + } + } + } + + public enum LogType + { + Debug, + InfoSuccess, + Info, + Warning, + WarningAntiCheat, + Error + } +} \ No newline at end of file diff --git a/EpinelPS/Utils/LoggingHttpHandler.cs b/EpinelPS/Utils/LoggingHttpHandler.cs deleted file mode 100644 index 01a6d96..0000000 --- a/EpinelPS/Utils/LoggingHttpHandler.cs +++ /dev/null @@ -1,28 +0,0 @@ -namespace EpinelPS.Utils -{ - public class LoggingHttpHandler(HttpMessageHandler innerHandler) : DelegatingHandler(innerHandler) - { - protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) - { - Console.WriteLine("Request:"); - Console.WriteLine(request.ToString()); - if (request.Content != null) - { - Console.WriteLine(await request.Content.ReadAsStringAsync(cancellationToken)); - } - Console.WriteLine(); - - HttpResponseMessage response = await base.SendAsync(request, cancellationToken); - - Console.WriteLine("Response:"); - Console.WriteLine(response.ToString()); - if (response.Content != null) - { - Console.WriteLine(await response.Content.ReadAsStringAsync(cancellationToken)); - } - Console.WriteLine(); - - return response; - } - } -} diff --git a/EpinelPS/Utils/NetUtils.cs b/EpinelPS/Utils/NetUtils.cs index 6161af5..a8b8e88 100644 --- a/EpinelPS/Utils/NetUtils.cs +++ b/EpinelPS/Utils/NetUtils.cs @@ -139,7 +139,7 @@ namespace EpinelPS.Utils foreach (var c in reward.Character) { - Console.WriteLine("MergeRewards - TODO Character"); + Logging.WriteLine("MergeRewards - TODO Character", LogType.Error); } if (reward.InfraCoreExp != null)