Files
Sinmai-Assist/Common/NetworkLogger.cs
2025-10-13 18:18:47 +08:00

102 lines
3.0 KiB
C#

using HarmonyLib;
using MAI2.Util;
using Manager;
using MelonLoader;
using Net.Packet;
using Net.VO;
using System;
using System.IO;
namespace SinmaiAssist.Common;
public class NetworkLogger
{
private static readonly object logLock = new object();
private enum HttpMessageType
{
Request,
Response,
Null
}
private static bool isInsideProcImpl = false;
private static string NowApi = "";
[HarmonyPostfix]
[HarmonyPatch(typeof(Packet), "set_State")]
public static void RequestListener(Packet __instance)
{
if (__instance.State == PacketState.Ready)
{
string content = __instance.Query.GetRequest();
// string baseUrl = (string)AccessTools.Field(typeof(Packet), "BaseUrl").GetValue(__instance);
var baseUrl = Singleton<OperationManager>.Instance.GetBaseUri();
NowApi = baseUrl + __instance.Query.Api;
PrintNetworkLog(HttpMessageType.Request, NowApi, content);
}
}
[HarmonyPostfix]
[HarmonyPatch(typeof(NetQuery<VOSerializer, VOSerializer>), "SetResponse")]
public static void ResponseListener(ref string str)
{
if (isInsideProcImpl)
{
string ccontent = str;
PrintNetworkLog(HttpMessageType.Response, NowApi, ccontent);
}
}
/* Not available
[HarmonyPostfix]
[HarmonyPatch(typeof(Encoding), "GetString", new[] { typeof(byte[]) })]
public static void ResponseListener(Packet __instance, ref string __result)
{
if (isInsideProcImpl)
{
string ccontent = __result;
PrintNetworkLog(HttpMessageType.Response, NowApi, ccontent);
}
}
*/
[HarmonyPrefix]
[HarmonyPatch(typeof(Packet), "ProcImpl")]
public static void ProcImplPrefix()
{
isInsideProcImpl = true;
}
[HarmonyPostfix]
[HarmonyPatch(typeof(Packet), "ProcImpl")]
public static void ProcImplPostfix()
{
isInsideProcImpl = false;
}
private static void PrintNetworkLog(HttpMessageType httpMessageType, string api, string content)
{
if (httpMessageType == HttpMessageType.Null) return;
try
{
DateTime now = DateTime.Now;
string logText = now.ToString("[HH:mm:ss.fff] ");
logText += $"[{httpMessageType}] [{api}] -> {content}\n";
if (SinmaiAssist.MainConfig.Common.NetworkLogger.PrintToConsole)
MelonLogger.Msg($"[NetworkLogger] [{httpMessageType}] [{api}] -> {content}");
lock (logLock)
{
string logDir = Path.Combine($"{BuildInfo.Name}/NetworkLogs");
if (!Directory.Exists(logDir))
{
Directory.CreateDirectory(logDir);
}
File.AppendAllText(Path.Combine(logDir, now.ToString("yyyy-MM-dd") + ".log"), logText);
}
}
catch (Exception e)
{
MelonLogger.Error(e);
}
}
}