mirror of
https://github.com/MikuLeaks/MikuSB.git
synced 2026-06-04 05:23:59 +00:00
CallGS
This commit is contained in:
7
GameServer/Server/CallGS/CallGSApiAttribute.cs
Normal file
7
GameServer/Server/CallGS/CallGSApiAttribute.cs
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
namespace MikuSB.GameServer.Server.CallGS;
|
||||||
|
|
||||||
|
[AttributeUsage(AttributeTargets.Class)]
|
||||||
|
public class CallGSApiAttribute(string api) : Attribute
|
||||||
|
{
|
||||||
|
public string Api { get; } = api;
|
||||||
|
}
|
||||||
46
GameServer/Server/CallGS/CallGSRouter.cs
Normal file
46
GameServer/Server/CallGS/CallGSRouter.cs
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
using MikuSB.Proto;
|
||||||
|
using MikuSB.Util;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
namespace MikuSB.GameServer.Server.CallGS;
|
||||||
|
|
||||||
|
public static class CallGSRouter
|
||||||
|
{
|
||||||
|
private static readonly Logger Logger = new("CallGS");
|
||||||
|
private static readonly Dictionary<string, ICallGSHandler> Handlers = [];
|
||||||
|
|
||||||
|
public static void Init()
|
||||||
|
{
|
||||||
|
foreach (var type in Assembly.GetExecutingAssembly().GetTypes())
|
||||||
|
{
|
||||||
|
var attr = type.GetCustomAttribute<CallGSApiAttribute>();
|
||||||
|
if (attr == null) continue;
|
||||||
|
Handlers[attr.Api] = (ICallGSHandler)Activator.CreateInstance(type)!;
|
||||||
|
}
|
||||||
|
Logger.Info($"Registered {Handlers.Count} CallGS handlers.");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async Task Route(Connection connection, ReqCallGS req, ushort seqNo)
|
||||||
|
{
|
||||||
|
if (Handlers.TryGetValue(req.Api, out var handler))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await handler.Handle(connection, req.Param, seqNo);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Logger.Error($"[{req.Api}] {e.Message}", e);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Logger.Error($"No handler for CallGS API: {req.Api}");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async Task SendScript(Connection connection, string api, string arg, ushort seqNo = 0)
|
||||||
|
{
|
||||||
|
var rsp = new NtfCallScript { Api = api, Arg = arg };
|
||||||
|
await connection.SendPacket(CmdIds.RspCallGS, rsp, seqNo);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
namespace MikuSB.GameServer.Server.CallGS.Handlers.Achievement;
|
||||||
|
|
||||||
|
[CallGSApi("Achievement_GetReward")]
|
||||||
|
public class Achievement_GetReward : ICallGSHandler
|
||||||
|
{
|
||||||
|
public async Task Handle(Connection connection, string param, ushort seqNo)
|
||||||
|
{
|
||||||
|
// param: json.encode({nId = nId})
|
||||||
|
// TODO: implement reward logic
|
||||||
|
|
||||||
|
await CallGSRouter.SendScript(connection, "Achievement_GetReward", "{}", seqNo);
|
||||||
|
}
|
||||||
|
}
|
||||||
6
GameServer/Server/CallGS/ICallGSHandler.cs
Normal file
6
GameServer/Server/CallGS/ICallGSHandler.cs
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
namespace MikuSB.GameServer.Server.CallGS;
|
||||||
|
|
||||||
|
public interface ICallGSHandler
|
||||||
|
{
|
||||||
|
Task Handle(Connection connection, string param, ushort seqNo);
|
||||||
|
}
|
||||||
14
GameServer/Server/Packet/Recv/Player/HandlerReqCallGS.cs
Normal file
14
GameServer/Server/Packet/Recv/Player/HandlerReqCallGS.cs
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
using MikuSB.GameServer.Server.CallGS;
|
||||||
|
using MikuSB.Proto;
|
||||||
|
|
||||||
|
namespace MikuSB.GameServer.Server.Packet.Recv.Player;
|
||||||
|
|
||||||
|
[Opcode(CmdIds.ReqCallGS)]
|
||||||
|
public class HandlerReqCallGS : Handler
|
||||||
|
{
|
||||||
|
public override async Task OnHandle(Connection connection, byte[] data, ushort seqNo)
|
||||||
|
{
|
||||||
|
var req = ReqCallGS.Parser.ParseFrom(data);
|
||||||
|
await CallGSRouter.Route(connection, req, seqNo);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,6 +3,7 @@ using MikuSB.Data;
|
|||||||
using MikuSB.Database;
|
using MikuSB.Database;
|
||||||
using MikuSB.GameServer.Command;
|
using MikuSB.GameServer.Command;
|
||||||
using MikuSB.GameServer.Server;
|
using MikuSB.GameServer.Server;
|
||||||
|
using MikuSB.GameServer.Server.CallGS;
|
||||||
using MikuSB.GameServer.Server.Packet;
|
using MikuSB.GameServer.Server.Packet;
|
||||||
using MikuSB.Internationalization;
|
using MikuSB.Internationalization;
|
||||||
using MikuSB.MikuSB.Tool;
|
using MikuSB.MikuSB.Tool;
|
||||||
@@ -121,7 +122,8 @@ public class LoaderManager : MikuSB
|
|||||||
SocketConnection.LogMap.TryAdd(value, name);
|
SocketConnection.LogMap.TryAdd(value, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
HandlerManager.Init();
|
HandlerManager.Init();
|
||||||
|
CallGSRouter.Init();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async Task InitResource()
|
public static async Task InitResource()
|
||||||
|
|||||||
Reference in New Issue
Block a user