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)