From a68a201c131f73899ddd9effd50507ad97d7734b Mon Sep 17 00:00:00 2001 From: Mikhail Date: Sat, 31 Aug 2024 12:39:47 -0400 Subject: [PATCH] improve logging, various qol fixes --- .../Controllers/LevelInfiniteControlller.cs | 23 +++++- EpinelPS/Controllers/LobbyApiController.cs | 10 +++ EpinelPS/GameData/GameData.cs | 3 +- .../LobbyServer/Msgs/User/AquireUserTitle.cs | 20 +++++ .../Msgs/User/UnmarkUsertitleBadge.cs | 20 +++++ EpinelPS/Program.cs | 23 +++++- EpinelPS/Properties/launchSettings.json | 4 +- .../Utils/ColorConsoleLoggerExtensions.cs | 32 ++++++++ EpinelPS/Utils/ColorConsoleLoggerProvider.cs | 82 +++++++++++++++++++ EpinelPS/wwwroot/nikke_launcher/index.html | 2 +- 10 files changed, 210 insertions(+), 9 deletions(-) create mode 100644 EpinelPS/LobbyServer/Msgs/User/AquireUserTitle.cs create mode 100644 EpinelPS/LobbyServer/Msgs/User/UnmarkUsertitleBadge.cs create mode 100644 EpinelPS/Utils/ColorConsoleLoggerExtensions.cs create mode 100644 EpinelPS/Utils/ColorConsoleLoggerProvider.cs diff --git a/EpinelPS/Controllers/LevelInfiniteControlller.cs b/EpinelPS/Controllers/LevelInfiniteControlller.cs index 5a74ec8..0462848 100644 --- a/EpinelPS/Controllers/LevelInfiniteControlller.cs +++ b/EpinelPS/Controllers/LevelInfiniteControlller.cs @@ -1,6 +1,7 @@ using EpinelPS.Database; using EpinelPS.Utils; using Microsoft.AspNetCore.Mvc; +using Org.BouncyCastle.Ocsp; namespace EpinelPS.Controllers { @@ -44,8 +45,12 @@ namespace EpinelPS.Controllers [HttpPost] [Route("auth/auto_login")] - public string AutoLogin(string seq) + public string AutoLogin(string seq, [FromBody] AuthPkt2 req) { + User? user; + if ((user = NetUtils.GetUser(req.token).Item1) == null) return BadAuthToken; + + return "{\"del_account_info\":\"{\\\"ret\\\":0,\\\"msg\\\":\\\"\\\",\\\"status\\\":0,\\\"created_at\\\":\\\"0\\\",\\\"target_destroy_at\\\":\\\"0\\\",\\\"destroyed_at\\\":\\\"0\\\",\\\"err_code\\\":0,\\\"seq\\\":\\\"" + seq + "\\\"}\",\"del_account_status\":0,\"del_li_account_status\":0,\"extra_json\":{\"del_li_account_info\":\"{\\\"ret\\\":0,\\\"msg\\\":\\\"\\\",\\\"status\\\":0,\\\"created_at\\\":\\\"0\\\",\\\"target_destroy_at\\\":\\\"0\\\",\\\"destroyed_at\\\":\\\"0\\\",\\\"err_code\\\":0,\\\"seq\\\":\\\"" + seq + "\\\"}\",\"get_status_msg\":\"success\",\"get_status_ret\":0,\"get_status_rsp\":{\"adult_age\":14,\"adult_age_map\":{},\"adult_check_status\":1,\"adult_check_status_expiration\":\"0\",\"adult_status_map\":{},\"certificate_type\":3,\"email\":\"\",\"eu_user_agree_status\":0,\"game_grade\":0,\"game_grade_map\":{},\"is_dma\":true,\"is_eea\":false,\"is_need_li_cert\":false,\"msg\":\"success\",\"need_parent_control\":0,\"need_realname_auth\":0,\"parent_certificate_status\":0,\"parent_certificate_status_expiration\":\"0\",\"parent_control_map\":{},\"qr_code_ret\":0,\"realname_auth_status\":0,\"region\":\"724\",\"ret\":0,\"ts\":\"" + DateTimeOffset.UtcNow.ToUnixTimeSeconds() + "\"},\"need_notify_msg\":\"success\",\"need_notify_ret\":0,\"need_notify_rsp\":{\"has_bind_li\":true,\"is_receive_email\":1,\"is_receive_email_in_night\":0,\"user_agreed_game_dma\":\"2\",\"user_agreed_game_pp\":\"1\",\"user_agreed_game_tos\":\"1\",\"user_agreed_li_dt\":\"\",\"user_agreed_li_pp\":\"1\",\"user_agreed_li_tos\":\"\"}},\"msg\":\"success\",\"ret\":0,\"seq\":\"" + seq + "\"}"; } @@ -118,12 +123,24 @@ namespace EpinelPS.Controllers [HttpPost] [Route("profile/get_bind_info")] - public string GetProfileBindInfo(string seq, [FromBody] AuthPkt req) + public string GetProfileBindInfo(string seq, [FromBody] AuthPkt2 req) { User? user; - if ((user = NetUtils.GetUser(req.channel_info.token).Item1) == null) return BadAuthToken; + if ((user = NetUtils.GetUser(req.token).Item1) == null) return BadAuthToken; return "{\"bind_list\":[{\"bind_ts\":1717783095,\"channel_info\":{\"birthday\":\"1970-01\",\"email\":\"" + user.Username + "\",\"is_receive_email\":1,\"lang_type\":\"en\",\"last_login_time\":171000000,\"nick_name\":\"\",\"phone\":\"\",\"phone_area_code\":\"\",\"region\":\"724\",\"register_account\":\"" + user.Username + "\",\"register_account_type\":1,\"register_time\":" + user.RegisterTime + ",\"seq\":\"" + seq + "\",\"uid\":\"2752409592679849\",\"user_name\":\"" + user.PlayerName + "\",\"username_pass_verify\":0},\"channelid\":131,\"email\":\"" + user.Username + "\",\"history_scopes\":[],\"is_primary\":1,\"picture_url\":\"\",\"user_name\":\"" + user.PlayerName + "\"}],\"create_ts\":" + user.RegisterTime + ",\"last_login_ts\":171000000,\"msg\":\"success\",\"ret\":0,\"seq\":\"" + seq + "\"}"; } + + [HttpPost] + [Route("auth/refresh_sacc_token")] + public string RefreshAuthToken(string seq, [FromBody] AuthPkt2 req) + { + // TODO redo auth token system + AccessToken? user; + if ((user = NetUtils.GetUser(req.token).Item2) == null) return BadAuthToken; + user.ExpirationTime = DateTimeOffset.UtcNow.AddYears(1).ToUnixTimeSeconds(); + + return "{\"msg\":\"success\",\"ret\":0,\"seq\":\"" + seq + "\"}"; + } } } diff --git a/EpinelPS/Controllers/LobbyApiController.cs b/EpinelPS/Controllers/LobbyApiController.cs index 55f5cf1..e598907 100644 --- a/EpinelPS/Controllers/LobbyApiController.cs +++ b/EpinelPS/Controllers/LobbyApiController.cs @@ -1,5 +1,6 @@ using EpinelPS.LobbyServer; using Microsoft.AspNetCore.Mvc; +using System.Diagnostics; namespace EpinelPS.Controllers { @@ -12,7 +13,16 @@ namespace EpinelPS.Controllers [Consumes("application/octet-stream+protobuf")] public async Task CatchAll(string all) { + Stopwatch st = Stopwatch.StartNew(); await LobbyHandler.DispatchSingle(HttpContext); + st.Stop(); + + var fg = Console.ForegroundColor; + Console.ForegroundColor = ConsoleColor.DarkGreen; + + Console.WriteLine("POST " + HttpContext.Request.Path.Value + " completed in " + st.Elapsed); + + Console.ForegroundColor = fg; } } } diff --git a/EpinelPS/GameData/GameData.cs b/EpinelPS/GameData/GameData.cs index 5c5058f..ce1a883 100644 --- a/EpinelPS/GameData/GameData.cs +++ b/EpinelPS/GameData/GameData.cs @@ -237,11 +237,12 @@ namespace EpinelPS.StaticInfo if (records == null) throw new Exception(entry + " is missing records element"); currentFile++; + bar.Report((double)currentFile / totalFiles); return records; } - int totalFiles = 14; + int totalFiles = 78; int currentFile = 0; public async Task Parse() diff --git a/EpinelPS/LobbyServer/Msgs/User/AquireUserTitle.cs b/EpinelPS/LobbyServer/Msgs/User/AquireUserTitle.cs new file mode 100644 index 0000000..efa2e87 --- /dev/null +++ b/EpinelPS/LobbyServer/Msgs/User/AquireUserTitle.cs @@ -0,0 +1,20 @@ +using EpinelPS.Utils; + +namespace EpinelPS.LobbyServer.Msgs.User +{ + [PacketPath("/lobby/usertitle/acquire")] + public class AquireUserTitle : LobbyMsgHandler + { + protected override async Task HandleAsync() + { + var req = await ReadData(); + var user = GetUser(); + + var response = new ResAcquireUserTitle(); + + // TODO + + await WriteDataAsync(response); + } + } +} diff --git a/EpinelPS/LobbyServer/Msgs/User/UnmarkUsertitleBadge.cs b/EpinelPS/LobbyServer/Msgs/User/UnmarkUsertitleBadge.cs new file mode 100644 index 0000000..721f632 --- /dev/null +++ b/EpinelPS/LobbyServer/Msgs/User/UnmarkUsertitleBadge.cs @@ -0,0 +1,20 @@ +using EpinelPS.Utils; + +namespace EpinelPS.LobbyServer.Msgs.User +{ + [PacketPath("/lobby/usertitle/unmark-badge")] + public class UnmarkUserTitleBase : LobbyMsgHandler + { + protected override async Task HandleAsync() + { + var req = await ReadData(); + var user = GetUser(); + + var response = new ResUnMarkUserTitleBadge(); + + // TODO + + await WriteDataAsync(response); + } + } +} diff --git a/EpinelPS/Program.cs b/EpinelPS/Program.cs index e00dc0b..eb99ce6 100644 --- a/EpinelPS/Program.cs +++ b/EpinelPS/Program.cs @@ -1,9 +1,13 @@ -using EpinelPS.Database; +using DnsClient; +using EpinelPS.Database; using EpinelPS.LobbyServer; using EpinelPS.LobbyServer.Msgs.Stage; using EpinelPS.StaticInfo; using EpinelPS.Utils; +using Google.Api; using Microsoft.AspNetCore.Server.Kestrel.Https; +using Microsoft.Extensions.Logging.EventLog; +using Microsoft.VisualBasic; using System.Net; using System.Net.Http.Headers; using System.Security.Cryptography.X509Certificates; @@ -50,6 +54,7 @@ namespace EpinelPS serverOptions.AllowSynchronousIO = true; }); + // Add services to the container. builder.Services.AddControllersWithViews(); @@ -57,6 +62,16 @@ namespace EpinelPS builder.Services.AddEndpointsApiExplorer(); builder.Services.AddRouting(); + builder.Logging.ClearProviders(); + builder.Logging.AddColorConsoleLogger(configuration => + { + // Replace warning value from appsettings.json of "Cyan" + configuration.LogLevelToColorMap[LogLevel.Warning] = ConsoleColor.Yellow; + // Replace warning value from appsettings.json of "Red" + configuration.LogLevelToColorMap[LogLevel.Error] = ConsoleColor.DarkRed; + }); + + var app = builder.Build(); app.UseDefaultFiles(); @@ -87,7 +102,7 @@ namespace EpinelPS // NOTE: pub prefixes shows public (production server), local is local server (does not have any effect), dev is development server, etc. // It does not have any effect, except for the publisher server, which adds a watermark? - app.MapGet("/route/*/route_config.json", () => @"{ + app.MapGet("/route/{**all}", () => @"{ ""Config"": [ { ""VersionRange"": { @@ -499,7 +514,11 @@ namespace EpinelPS return item.Value.ReturnBytes; } } + + var fg = Console.ForegroundColor; + Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("HANDLER NOT FOUND: " + url); + Console.ForegroundColor = fg; return null; } } diff --git a/EpinelPS/Properties/launchSettings.json b/EpinelPS/Properties/launchSettings.json index 1096c3b..27c1752 100644 --- a/EpinelPS/Properties/launchSettings.json +++ b/EpinelPS/Properties/launchSettings.json @@ -2,11 +2,11 @@ "profiles": { "EpinelPS": { "commandName": "Project", - "launchBrowser": true, + "launchBrowser": false, "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" }, - "applicationUrl": "https://localhost:64668;http://localhost:64669" + "applicationUrl": "" } } } \ No newline at end of file diff --git a/EpinelPS/Utils/ColorConsoleLoggerExtensions.cs b/EpinelPS/Utils/ColorConsoleLoggerExtensions.cs new file mode 100644 index 0000000..1546e84 --- /dev/null +++ b/EpinelPS/Utils/ColorConsoleLoggerExtensions.cs @@ -0,0 +1,32 @@ +using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.Extensions.Logging.Configuration; + +namespace EpinelPS.Utils +{ + public static class ColorConsoleLoggerExtensions + { + public static ILoggingBuilder AddColorConsoleLogger( + this ILoggingBuilder builder) + { + builder.AddConfiguration(); + + builder.Services.TryAddEnumerable( + ServiceDescriptor.Singleton()); + + LoggerProviderOptions.RegisterProviderOptions + (builder.Services); + + return builder; + } + + public static ILoggingBuilder AddColorConsoleLogger( + this ILoggingBuilder builder, + Action configure) + { + builder.AddColorConsoleLogger(); + builder.Services.Configure(configure); + + return builder; + } + } +} diff --git a/EpinelPS/Utils/ColorConsoleLoggerProvider.cs b/EpinelPS/Utils/ColorConsoleLoggerProvider.cs new file mode 100644 index 0000000..f672a27 --- /dev/null +++ b/EpinelPS/Utils/ColorConsoleLoggerProvider.cs @@ -0,0 +1,82 @@ +using Microsoft.Extensions.Options; +using System.Collections.Concurrent; +using System.Runtime.Versioning; + +namespace EpinelPS.Utils +{ + [UnsupportedOSPlatform("browser")] + [ProviderAlias("ColorConsole")] + public sealed class ColorConsoleLoggerProvider : ILoggerProvider + { + private readonly IDisposable? _onChangeToken; + private ColorConsoleLoggerConfiguration _currentConfig; + private readonly ConcurrentDictionary _loggers = + new(StringComparer.OrdinalIgnoreCase); + + public ColorConsoleLoggerProvider( + IOptionsMonitor config) + { + _currentConfig = config.CurrentValue; + _onChangeToken = config.OnChange(updatedConfig => _currentConfig = updatedConfig); + } + + public ILogger CreateLogger(string categoryName) => + _loggers.GetOrAdd(categoryName, name => new ColorConsoleLogger(name, GetCurrentConfig)); + + private ColorConsoleLoggerConfiguration GetCurrentConfig() => _currentConfig; + + public void Dispose() + { + _loggers.Clear(); + _onChangeToken?.Dispose(); + } + } + public sealed class ColorConsoleLoggerConfiguration + { + public int EventId { get; set; } + + public Dictionary LogLevelToColorMap { get; set; } = new() + { + [LogLevel.Information] = ConsoleColor.Green + }; + } + public sealed class ColorConsoleLogger( + string name, + Func getCurrentConfig) : ILogger + { + public IDisposable? BeginScope(TState state) where TState : notnull => default!; + + public bool IsEnabled(LogLevel logLevel) => + getCurrentConfig().LogLevelToColorMap.ContainsKey(logLevel); + + public void Log( + LogLevel logLevel, + EventId eventId, + TState state, + Exception? exception, + Func formatter) + { + if (!IsEnabled(logLevel)) + { + return; + } + + ColorConsoleLoggerConfiguration config = getCurrentConfig(); + if (config.EventId == 0 || config.EventId == eventId.Id) + { + ConsoleColor originalColor = Console.ForegroundColor; + + string msg = formatter(state, exception).Replace("Request reached the end of the middleware pipeline without being handled by application code. Request path: ", ""); + + if (msg.StartsWith("Executing ObjectResult") || msg.StartsWith("Executed endpoint") || msg.StartsWith("Route matched with ") || msg.Contains("CatchAll") || msg.Contains("$batch")) + return; + + Console.ForegroundColor = config.LogLevelToColorMap[logLevel]; + Console.Write($"{msg}"); + + Console.ForegroundColor = originalColor; + Console.WriteLine(); + } + } + } +} diff --git a/EpinelPS/wwwroot/nikke_launcher/index.html b/EpinelPS/wwwroot/nikke_launcher/index.html index 1fd15a3..77c6992 100644 --- a/EpinelPS/wwwroot/nikke_launcher/index.html +++ b/EpinelPS/wwwroot/nikke_launcher/index.html @@ -15,7 +15,7 @@
  • Updated game version to 124.6.10I
  • Improved server selector
  • Added ability to not download assets through the private server
  • -
  • ASP.NET is now used instead of EmbedIO (should provide better preformance)
  • +
  • ASP.NET is now used instead of EmbedIO (should provide better performance)
  • Rewrote admin panel