refactoring part 3, improve logging

This commit is contained in:
Mikhail
2025-05-03 12:20:56 -04:00
parent 0b936fa6e5
commit 9304f86603
22 changed files with 117 additions and 99 deletions

View File

@@ -96,7 +96,6 @@ namespace EpinelPS.Controllers
return "{}"; return "{}";
} }
Console.WriteLine("Requesting gameId: " + body.game_id);
return System.IO.File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "gameversion.json")); return System.IO.File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "gameversion.json"));
} }

View File

@@ -1,6 +1,7 @@
using EpinelPS.LobbyServer; using EpinelPS.LobbyServer;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using System.Diagnostics; using System.Diagnostics;
using EpinelPS.Utils;
namespace EpinelPS.Controllers namespace EpinelPS.Controllers
{ {
@@ -24,7 +25,7 @@ namespace EpinelPS.Controllers
else else
Console.ForegroundColor = ConsoleColor.Red; 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; Console.ForegroundColor = fg;
} }

View File

@@ -168,13 +168,13 @@ namespace EpinelPS.Data
{ {
await Load(); await Load();
Console.WriteLine("Preparing"); Logging.WriteLine("Preparing");
var stopWatch = new Stopwatch(); var stopWatch = new Stopwatch();
stopWatch.Start(); stopWatch.Start();
await Instance.Parse(); await Instance.Parse();
stopWatch.Stop(); stopWatch.Stop();
Console.WriteLine("Preparing took " + stopWatch.Elapsed); Logging.WriteLine("Preparing took " + stopWatch.Elapsed);
return Instance; return Instance;
} }

View File

@@ -582,6 +582,7 @@ namespace EpinelPS.Database
public string ServerName = "<color=\"green\">Private Server</color>"; public string ServerName = "<color=\"green\">Private Server</color>";
public byte[] LauncherTokenKey = []; public byte[] LauncherTokenKey = [];
public byte[] EncryptionTokenKey = []; public byte[] EncryptionTokenKey = [];
public LogType LogLevel = LogType.Debug;
} }
internal class JsonDb internal class JsonDb
{ {

View File

@@ -21,7 +21,7 @@ namespace EpinelPS.LobbyServer.Campaign
if (chapter == -1) 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; key = req.MapId;
} }
@@ -36,7 +36,7 @@ namespace EpinelPS.LobbyServer.Campaign
{ {
if (item.PositionId == req.FieldObject.PositionId) 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; return;
} }
} }

View File

@@ -12,11 +12,9 @@ namespace EpinelPS.LobbyServer.Campaign
var req = await ReadData<ReqSaveCampaignFieldObject>(); var req = await ReadData<ReqSaveCampaignFieldObject>();
var user = GetUser(); var user = GetUser();
Console.WriteLine("Map ID: " + req.MapId);
var response = new ResSaveCampaignFieldObject(); 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 chapter = GameData.Instance.GetNormalChapterNumberFromFieldName(req.MapId);
var mod = req.MapId.Contains("hard") ? "Hard" : "Normal"; var mod = req.MapId.Contains("hard") ? "Hard" : "Normal";

View File

@@ -40,8 +40,7 @@ namespace EpinelPS.LobbyServer.Character
} }
else else
{ {
// TOOD: log this Logging.WriteLine("ERROR: Not enough currency for upgrade", LogType.WarningAntiCheat);
Console.WriteLine("ERROR: Not enough currency for upgrade");
return; return;
} }

View File

@@ -20,12 +20,12 @@ namespace EpinelPS.LobbyServer.Character
{ {
if (item.Level == 1) 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; return;
} }
if (item.Level == 200) if (item.Level == 200)
{ {
Console.WriteLine("Character level is 200 - cannot reset"); Logging.WriteLine("Character level is 200 - cannot reset", LogType.WarningAntiCheat);
return; return;
} }

View File

@@ -19,14 +19,13 @@ namespace EpinelPS.LobbyServer.Character
{ {
if (item.CharacterSerialNumber == 0) if (item.CharacterSerialNumber == 0)
{ {
Console.WriteLine("must add character from synchrodevice first"); Logging.WriteLine("must add character from synchrodevice first", LogType.Warning);
} }
else else
{ {
var oldCSN = item.CharacterSerialNumber; var oldCSN = item.CharacterSerialNumber;
item.CharacterSerialNumber = 0; item.CharacterSerialNumber = 0;
var data = user.GetCharacterBySerialNumber(oldCSN); var data = user.GetCharacterBySerialNumber(oldCSN) ?? throw new Exception("failed to lookup character");
if (data == null) throw new Exception("failed to lookup character");
response.Character = new NetUserCharacterDefaultData() response.Character = new NetUserCharacterDefaultData()
{ {

View File

@@ -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<ReqGetNow>();
var response = new ResGetNow();
await WriteDataAsync(response);
}
}
}

View File

@@ -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<ReqEnterEventStage>();
var user = GetUser();
var response = new ResEnterEventStage();
await WriteDataAsync(response);
}
}
}

View File

@@ -5,6 +5,8 @@ using Google.Protobuf;
using Paseto.Builder; using Paseto.Builder;
using Paseto; using Paseto;
using Newtonsoft.Json; using Newtonsoft.Json;
using EpinelPS.LobbyServer.Stage;
using EpinelPS.LobbyServer.Event.EventStory;
namespace EpinelPS.LobbyServer namespace EpinelPS.LobbyServer
{ {
@@ -20,7 +22,7 @@ namespace EpinelPS.LobbyServer
var attrib = (PacketPathAttribute?)Attribute.GetCustomAttribute(type, typeof(PacketPathAttribute)); var attrib = (PacketPathAttribute?)Attribute.GetCustomAttribute(type, typeof(PacketPathAttribute));
if (attrib == null) 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; continue;
} }
@@ -32,7 +34,7 @@ namespace EpinelPS.LobbyServer
} }
else 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) if (handler == null)
{ {
Console.WriteLine("404: " + path); Logging.WriteLine("HANDLER NOT FOUND: " + path, LogType.Error);
ctx.Response.StatusCode = 404; //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 else
{ {

View File

@@ -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); 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) if (str != null)
Console.WriteLine(str); Logging.WriteLine(str, LogType.Debug);
} }
protected async Task WriteDataAsync<T>(T data) where T : IMessage, new() protected async Task WriteDataAsync<T>(T data) where T : IMessage, new()
{ {
Console.WriteLine("Writing " + data.GetType().Name); Logging.WriteLine("Writing " + data.GetType().Name, LogType.Debug);
PrintMessage(data); PrintMessage(data);
Console.WriteLine(); Logging.WriteLine("", LogType.Debug);
if (ctx == null) if (ctx == null)
{ {
@@ -110,13 +110,13 @@ namespace EpinelPS.LobbyServer
{ {
// return grpc IMessage from byte array with type T // return grpc IMessage from byte array with type T
T msg = new(); T msg = new();
Console.WriteLine("Reading " + msg.GetType().Name); Logging.WriteLine("Reading " + msg.GetType().Name, LogType.Debug);
var bin = await PacketDecryption.DecryptOrReturnContentAsync(ctx); var bin = await PacketDecryption.DecryptOrReturnContentAsync(ctx);
msg.MergeFrom(bin.Contents); msg.MergeFrom(bin.Contents);
PrintMessage(msg); PrintMessage(msg);
Console.WriteLine(); Logging.WriteLine("", LogType.Debug);
UserId = bin.UserId; UserId = bin.UserId;
UsedAuthToken = bin.UsedAuthToken; UsedAuthToken = bin.UsedAuthToken;

View File

@@ -17,13 +17,11 @@ namespace EpinelPS.LobbyServer.LobbyUser
foreach (var item in req.ScenarioGroupIds) foreach (var item in req.ScenarioGroupIds)
{ {
Console.WriteLine("check scenario " + item);
foreach (var completed in user.CompletedScenarios) foreach (var completed in user.CompletedScenarios)
{ {
// story thingy was completed // story thingy was completed
if (completed == item) if (completed == item)
{ {
Console.WriteLine(item + " is completed");
response.ExistGroupIds.Add(item); response.ExistGroupIds.Add(item);
} }
} }

View File

@@ -20,7 +20,7 @@ namespace EpinelPS.LobbyServer.Messenger
if (msgToSave.Value.reward_id != 0) 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(); JsonDb.Save();

View File

@@ -28,7 +28,7 @@ namespace EpinelPS.LobbyServer.Shop
if (!decimal.TryParse(normalizedCost, NumberStyles.Any, CultureInfo.InvariantCulture, out decimal price)) 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; continue;
} }

View File

@@ -11,10 +11,6 @@ namespace EpinelPS.LobbyServer.Wallet
var user = GetUser(); var user = GetUser();
var response = new ResGetCurrencyData(); var response = new ResGetCurrencyData();
foreach (var item in req.Currencies)
{
Console.WriteLine("Request currency " + (CurrencyType)item);
}
foreach (var currency in user.Currency) foreach (var currency in user.Currency)
{ {

View File

@@ -26,10 +26,10 @@ namespace EpinelPS
GameData.Instance.GetAllCostumes(); // force static data to be loaded GameData.Instance.GetAllCostumes(); // force static data to be loaded
Console.WriteLine("Register handlers"); Logging.WriteLine("Register handlers");
LobbyHandler.Init(); LobbyHandler.Init();
Console.WriteLine("Starting ASP.NET core on port 443"); Logging.WriteLine("Starting ASP.NET core on port 443");
new Thread(() => new Thread(() =>
{ {
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
@@ -1063,7 +1063,7 @@ namespace EpinelPS
url = url.Replace("/v1", ""); url = url.Replace("/v1", "");
// find appropriate handler // find appropriate handler
Console.WriteLine("BATCH: /v1" + url); Logging.WriteLine("BATCH: /v1" + url, LogType.Info);
foreach (var item in LobbyHandler.Handlers) foreach (var item in LobbyHandler.Handlers)
{ {
@@ -1076,10 +1076,8 @@ namespace EpinelPS
} }
} }
var fg = Console.ForegroundColor; Logging.WriteLine("Handler not found: " + url, LogType.Error);
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("HANDLER NOT FOUND: " + url);
Console.ForegroundColor = fg;
return null; return null;
} }
} }

View File

@@ -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();
}
}
}

46
EpinelPS/Utils/Logging.cs Normal file
View File

@@ -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
}
}

View File

@@ -1,28 +0,0 @@
namespace EpinelPS.Utils
{
public class LoggingHttpHandler(HttpMessageHandler innerHandler) : DelegatingHandler(innerHandler)
{
protected override async Task<HttpResponseMessage> 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;
}
}
}

View File

@@ -139,7 +139,7 @@ namespace EpinelPS.Utils
foreach (var c in reward.Character) foreach (var c in reward.Character)
{ {
Console.WriteLine("MergeRewards - TODO Character"); Logging.WriteLine("MergeRewards - TODO Character", LogType.Error);
} }
if (reward.InfraCoreExp != null) if (reward.InfraCoreExp != null)