mirror of
https://github.com/EpinelPS/EpinelPS.git
synced 2025-12-12 23:14:34 +01:00
refactoring part 3, improve logging
This commit is contained in:
@@ -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"));
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -582,6 +582,7 @@ namespace EpinelPS.Database
|
||||
public string ServerName = "<color=\"green\">Private Server</color>";
|
||||
public byte[] LauncherTokenKey = [];
|
||||
public byte[] EncryptionTokenKey = [];
|
||||
public LogType LogLevel = LogType.Debug;
|
||||
}
|
||||
internal class JsonDb
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,11 +12,9 @@ namespace EpinelPS.LobbyServer.Campaign
|
||||
var req = await ReadData<ReqSaveCampaignFieldObject>();
|
||||
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";
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
16
EpinelPS/LobbyServer/EmptyHandler.cs
Normal file
16
EpinelPS/LobbyServer/EmptyHandler.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
18
EpinelPS/LobbyServer/Event/StoryEvent/EnterStage.cs
Normal file
18
EpinelPS/LobbyServer/Event/StoryEvent/EnterStage.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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>(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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
46
EpinelPS/Utils/Logging.cs
Normal 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
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user