using Google.Protobuf; using RPG.Network.Proto; using RPG.Services.Core.Network; using RPG.Services.Core.Network.Command; namespace RPG.Services.MUIP.Handlers; internal static class ApiHandler { private const string LogCategoryName = "MuipHttpApi"; private const string GmTalkSessionIdQueryKey = "s_id"; private const string GmTalkCommandQueryKey = "cmd"; private static ILogger? _logger; public static IResult OnGmTalk(HttpContext ctx, ServiceBox services, ILoggerFactory loggerFactory) { _logger ??= loggerFactory.CreateLogger(LogCategoryName); IQueryCollection query = ctx.Request.Query; if (!query.ContainsKey(GmTalkSessionIdQueryKey) || !query.ContainsKey(GmTalkCommandQueryKey)) return Results.BadRequest(); string? sessionIdTxt = query[GmTalkSessionIdQueryKey]; string? cmd = query[GmTalkCommandQueryKey]; if (cmd == null || sessionIdTxt == null) return Results.BadRequest(); if (!ulong.TryParse(sessionIdTxt, out ulong sessionId)) return Results.BadRequest(); _logger.LogInformation("Received GM Talk request via HTTP, session id: {id}, cmd: {cmd}", sessionId, cmd); SendServiceCommand(services, ServiceCommandType.GmtalkByMuip, new CmdGmtalkByMuip { SessionId = sessionId, Msg = cmd }, RPGServiceType.Gameserver); return Results.Ok("Request forwarded to Gameserver"); } private static void SendServiceCommand(ServiceBox services, ServiceCommandType commandType, TBody body, RPGServiceType target) where TBody : IMessage { ServiceCommand command = new(services.CurrentType, commandType, body.ToByteArray()); byte[] buffer = GC.AllocateUninitializedArray(command.Body.Length + 7); ServiceCommandEncoder.EncodeCommand(command, buffer); services.SendToService(target, buffer); } }