Revise the message handler system, and partially the command system

This commit is contained in:
Zontreck 2020-06-28 03:27:04 -07:00
parent 57dcc685df
commit 59c62e62e2
19 changed files with 350 additions and 209 deletions

View file

@ -6,7 +6,7 @@ using System.Reflection;
[assembly: AssemblyCompany("ZNI")]
[assembly: AssemblyAlgorithmId(System.Configuration.Assemblies.AssemblyHashAlgorithm.MD5)]
[assembly: AssemblyCopyright("© 2020 Tara Piccari")]
[assembly: AssemblyFileVersion("5.2.112")]
[assembly: AssemblyFileVersion("5.3.091")]
[assembly: AssemblyDescription("Second Life Bot - BotCore5")]
@ -15,7 +15,7 @@ namespace Bot.Assemble
public class ASMInfo
{
public static string BotName = "ZBotCore";
public static string BotVer = "5.2.112";
public static string BotVer = "5.3.091";
public static string GitPassword
{
get

View file

@ -35,8 +35,6 @@ namespace Bot
public GridClient grid { get; set; }
public Logger Logger { get; set; }
public MessageHandler.MessageHandleEvent MHE;
public MessageHandler MH;
public MainConfiguration ConfigurationHandle {
get {
@ -47,5 +45,6 @@ namespace Bot
public DateTime LaunchTime { get; set; } = DateTime.Now;
public bool WaitForFiveMinutes = false;
public MessageService MSGSVC { get; set; } = new MessageService();
}
}

View file

@ -6,7 +6,7 @@ using System.Text;
namespace Bot
{
public sealed class ChatLogger
public sealed class ChatLogger : BaseCommands
{
private static readonly object writelock = new object();
private static ChatLogger inst = null;
@ -42,8 +42,8 @@ namespace Bot
/// <param name="registry"></param>
/// <param name="agentKey"></param>
/// <param name="agentName"></param>
[CommandGroup("log_chat", 5, 0, "log_chat - Toggles chat and IM logging", MessageHandler.Destinations.DEST_AGENT | MessageHandler.Destinations.DEST_LOCAL | MessageHandler.Destinations.DEST_CONSOLE_INFO)]
public void toggleChatLog(UUID client, int level, GridClient grid, string[] additionalArgs, MessageHandler.MessageHandleEvent MHE, MessageHandler.Destinations source, CommandRegistry registry, UUID agentKey, string agentName)
[CommandGroup("log_chat", 5, 0, "log_chat - Toggles chat and IM logging", Destinations.DEST_AGENT | Destinations.DEST_LOCAL )]
public void toggleChatLog(UUID client, int level, string[] additionalArgs, Destinations source, UUID agentKey, string agentName)
{
MHE(source, client, "Toggling");

View file

@ -0,0 +1,20 @@
using OpenMetaverse;
using System;
using System.Collections.Generic;
using System.Text;
namespace Bot.CommandSystem
{
public class BaseCommands
{
public void MHE(Destinations dest, UUID client, string msg)
{
MessageFactory.Post(dest, msg, client);
}
public static void MH(Destinations dest, UUID client, string msg)
{
MessageFactory.Post(dest, msg, client);
}
}
}

View file

@ -10,7 +10,7 @@ using System.Text;
namespace Bot.CommandSystem
{
class BaseHooks
class BaseHooks : BaseCommands
{
[WebhookAttribs("/help")]
@ -94,28 +94,27 @@ namespace Bot.CommandSystem
[CommandGroup("show_level", 0, 0, "This command shows your current auth level if any.", MessageHandler.Destinations.DEST_AGENT | MessageHandler.Destinations.DEST_LOCAL | MessageHandler.Destinations.DEST_GROUP)]
[CommandGroup("show_level", 0, 0, "This command shows your current auth level if any.", Destinations.DEST_AGENT | Destinations.DEST_LOCAL | Destinations.DEST_GROUP)]
public void show_level(UUID client, int level, GridClient grid, string[] additionalArgs,
MessageHandler.MessageHandleEvent MHE, MessageHandler.Destinations source,
CommandRegistry registry, UUID agentKey, string agentName)
Destinations source,
UUID agentKey, string agentName)
{
MHE(source, client, "Hi secondlife:///app/agent/" + agentKey.ToString() + "/about !! Your authorization level is " + level.ToString());
}
[CommandGroup("show_version", 0, 0, "Outputs the bot version", MessageHandler.Destinations.DEST_AGENT | MessageHandler.Destinations.DEST_LOCAL)]
public void show_version(UUID client, int level, GridClient grid, string[] additionalArgs,
MessageHandler.MessageHandleEvent MHE, MessageHandler.Destinations source,
CommandRegistry registry, UUID agentKey, string agentName)
[CommandGroup("show_version", 0, 0, "Outputs the bot version", Destinations.DEST_AGENT | Destinations.DEST_LOCAL)]
public void show_version(UUID client, int level, string[] additionalArgs,
Destinations source,
UUID agentKey, string agentName)
{
MHE(source, client, "Version " + ASMInfo.BotVer.ToString());
}
[CommandGroup("show_admins", 4, 0, "Outputs all admin users", MessageHandler.Destinations.DEST_AGENT | MessageHandler.Destinations.DEST_LOCAL)]
public void show_admins(UUID client, int level, GridClient grid, string[] additionalArgs,
MessageHandler.MessageHandleEvent MHE, MessageHandler.Destinations source,
CommandRegistry registry, UUID agentKey, string agentName)
[CommandGroup("show_admins", 4, 0, "Outputs all admin users", Destinations.DEST_AGENT | Destinations.DEST_LOCAL)]
public void show_admins(UUID client, int level, string[] additionalArgs, Destinations source,
UUID agentKey, string agentName)
{
for (int i = 0; i < MainConfiguration.Instance.BotAdmins.Count; i++)
@ -125,16 +124,16 @@ namespace Bot.CommandSystem
}
[CommandGroup("terminate_bot", 5, 0, "", MessageHandler.Destinations.DEST_LOCAL | MessageHandler.Destinations.DEST_AGENT | MessageHandler.Destinations.DEST_CONSOLE_INFO | MessageHandler.Destinations.DEST_DISCORD)]
public void PerformExit(UUID client, int level, GridClient grid, string[] additionalArgs, MessageHandler.MessageHandleEvent MHE, MessageHandler.Destinations source, CommandRegistry registry, UUID agentKey, string agentName)
[CommandGroup("terminate_bot", 5, 0, "", Destinations.DEST_LOCAL | Destinations.DEST_AGENT | Destinations.DEST_DISCORD)]
public void PerformExit(UUID client, int level, string[] additionalArgs, Destinations source, UUID agentKey, string agentName)
{
MHE(source, client, "Bot exit initiated.");
MHE(MessageHandler.Destinations.DEST_ACTION, UUID.Zero, "{'type':'exit'}");
BotSession.Instance.LaunchTime = new DateTime(); // zero out date time to force a relog
}
// !!help
[CommandGroup("!help", 1, 0, "Prints the entire help registry", MessageHandler.Destinations.DEST_AGENT | MessageHandler.Destinations.DEST_LOCAL | MessageHandler.Destinations.DEST_GROUP | MessageHandler.Destinations.DEST_CONSOLE_INFO)]
[CommandGroup("bot.help", 1, 0, "Alias to !help", MessageHandler.Destinations.DEST_AGENT | MessageHandler.Destinations.DEST_LOCAL | MessageHandler.Destinations.DEST_GROUP)]
public void PrintAllHelp(UUID client, int level, GridClient grid, string[] additionalArgs, MessageHandler.MessageHandleEvent MHE, MessageHandler.Destinations source, CommandRegistry registry, UUID agentKey, string agentName)
[CommandGroup("!help", 1, 0, "Prints the entire help registry", Destinations.DEST_AGENT |Destinations.DEST_LOCAL | Destinations.DEST_GROUP)]
[CommandGroup("bot.help", 1, 0, "Alias to !help", Destinations.DEST_AGENT | Destinations.DEST_LOCAL | Destinations.DEST_GROUP)]
public void PrintAllHelp(UUID client, int level, string[] additionalArgs, Destinations source, UUID agentKey, string agentName)
{
if (MainConfiguration.Instance.UseSSL)
MHE(source, client, $"All commands viewable at: https://{MainConfiguration.Instance.WebServerIP}:{MainConfiguration.Instance.WebServerPort}/help");
@ -142,10 +141,10 @@ namespace Bot.CommandSystem
MHE(source, client, $"All commands viewable at: http://{MainConfiguration.Instance.WebServerIP}:{MainConfiguration.Instance.WebServerPort}/help");
}
// !help "command"
[CommandGroup("help", 0, 1, "Prints help for one command", MessageHandler.Destinations.DEST_AGENT | MessageHandler.Destinations.DEST_LOCAL | MessageHandler.Destinations.DEST_GROUP | MessageHandler.Destinations.DEST_CONSOLE_INFO)]
public void PrintHelp(UUID client, int level, GridClient grid, string[] additionalArgs, MessageHandler.MessageHandleEvent MHE, MessageHandler.Destinations source, CommandRegistry registry, UUID agentKey, string agentName)
[CommandGroup("help", 0, 1, "Prints help for one command", Destinations.DEST_AGENT | Destinations.DEST_LOCAL | Destinations.DEST_GROUP )]
public void PrintHelp(UUID client, int level, string[] additionalArgs, Destinations source, UUID agentKey, string agentName)
{
registry.PrintHelp(source, additionalArgs[0], client);
CommandRegistry.Instance.PrintHelp(source, additionalArgs[0], client);
}
}
}

View file

@ -13,9 +13,9 @@ namespace Bot.CommandSystem
public MethodInfo AssignedMethod;
public int arguments = 0;
public CommandHelp cmdUsage;
public MessageHandler.Destinations CommandSource;
public Destinations CommandSource;
public CommandGroup(string Command, int minLevel, int argCount, string HelpText, MessageHandler.Destinations SourceType)
public CommandGroup(string Command, int minLevel, int argCount, string HelpText, Destinations SourceType)
{
this.Command = Command;
this.minLevel = minLevel;

View file

@ -16,7 +16,7 @@ namespace Bot.CommandSystem
public bool hasGroupFlag()
{
if ((h.dests_allowed & MessageHandler.Destinations.DEST_GROUP) == MessageHandler.Destinations.DEST_GROUP) return true;
if ((h.dests_allowed & Destinations.DEST_GROUP) == Destinations.DEST_GROUP) return true;
else return false;
}
@ -28,7 +28,7 @@ namespace Bot.CommandSystem
public int args;
public string Text;
public string sources;
public MessageHandler.Destinations dests_allowed;
public Destinations dests_allowed;
}
public string GetUsage()
{
@ -39,14 +39,14 @@ namespace Bot.CommandSystem
{
return "Usage: " + h.Text;
}
public CommandHelp(string CmdName, int minLevel, int argCount, string HelpText, MessageHandler.Destinations DESTS)
public CommandHelp(string CmdName, int minLevel, int argCount, string HelpText, Destinations DESTS)
{
h = new Help();
string Applicable = "Command can be used in [";
if ((DESTS & MessageHandler.Destinations.DEST_LOCAL) == MessageHandler.Destinations.DEST_LOCAL) Applicable += "Local, ";
if ((DESTS & MessageHandler.Destinations.DEST_AGENT) == MessageHandler.Destinations.DEST_AGENT) Applicable += "IM, ";
if ((DESTS & MessageHandler.Destinations.DEST_GROUP) == MessageHandler.Destinations.DEST_GROUP) Applicable += "Group, ";
if ((DESTS & MessageHandler.Destinations.DEST_DISCORD) == MessageHandler.Destinations.DEST_DISCORD) Applicable += "Discord, ";
if ((DESTS & Destinations.DEST_LOCAL) == Destinations.DEST_LOCAL) Applicable += "Local, ";
if ((DESTS & Destinations.DEST_AGENT) == Destinations.DEST_AGENT) Applicable += "IM, ";
if ((DESTS & Destinations.DEST_GROUP) == Destinations.DEST_GROUP) Applicable += "Group, ";
if ((DESTS & Destinations.DEST_DISCORD) == Destinations.DEST_DISCORD) Applicable += "Discord, ";
if (Applicable.Substring(Applicable.Length - 1, 1) == " ") Applicable = Applicable.Substring(0, Applicable.Length - 2) + "]";

View file

@ -22,9 +22,9 @@ namespace Bot.CommandSystem
public GridClient cl;
public Logger Log = BotSession.Instance.Logger;
public string newReply;
public unsafe bool RunChatCommand(string cmdData, GridClient client, MessageHandler.MessageHandleEvent MHE, CommandRegistry registry)
public unsafe bool RunChatCommand(string cmdData)
{
register = registry;
register = CommandRegistry.Instance;
Dictionary<UUID, int> BotAdmins = MainConfiguration.Instance.BotAdmins;
dynamic parameters = JsonConvert.DeserializeObject(cmdData);
string request = parameters.request;
@ -55,46 +55,41 @@ namespace Bot.CommandSystem
}
cl = client;
cl = BotSession.Instance.grid;
MessageHandler.Destinations sourceLoc = new MessageHandler.Destinations();
if (parameters.type == "chat") sourceLoc = MessageHandler.Destinations.DEST_LOCAL;
else if (parameters.type == "group") sourceLoc = MessageHandler.Destinations.DEST_GROUP;
else if (parameters.type == "im") sourceLoc = MessageHandler.Destinations.DEST_AGENT;
else if (parameters.type == "console")
{
userLevel = 5000;
sourceLoc = MessageHandler.Destinations.DEST_CONSOLE_INFO;
}
else sourceLoc = MessageHandler.Destinations.DEST_LOCAL;
Destinations sourceLoc = new Destinations();
if (parameters.type == "chat") sourceLoc = Destinations.DEST_LOCAL;
else if (parameters.type == "group") sourceLoc = Destinations.DEST_GROUP;
else if (parameters.type == "im") sourceLoc = Destinations.DEST_AGENT;
else sourceLoc = Destinations.DEST_LOCAL;
string agentName = parameters.fromName;
if(sourceLoc == MessageHandler.Destinations.DEST_LOCAL)
if(sourceLoc == Destinations.DEST_LOCAL)
{
GroupLog.Instance.WriteLogEntry(true, false, agentName, agentKey, request);
}else if (sourceLoc == MessageHandler.Destinations.DEST_AGENT)
}else if (sourceLoc == Destinations.DEST_AGENT)
{
GroupLog.Instance.WriteLogEntry(false, true, agentName, agentKey, request);
}
if (sourceLoc == MessageHandler.Destinations.DEST_GROUP)
if (sourceLoc == Destinations.DEST_GROUP)
{
agentKey = fromID;
fromID = sessID;
// Initiate group log saver
string GroupName = client.Groups.GroupName2KeyCache[fromID];
string GroupName = cl.Groups.GroupName2KeyCache[fromID];
GroupLog.Instance.WriteLogEntry(GroupName, "secondlife:///app/agent/" + agentKey.ToString() + "/about (" + agentName + ") : " + request);
if (agentKey == client.Self.AgentID) return false;
if (agentKey == cl.Self.AgentID) return false;
}
else {
agentKey = fromID;
if (agentKey == client.Self.AgentID) return false;
if (agentKey == cl.Self.AgentID) return false;
}
if (request.Substring(0, 1) != "!")
@ -155,7 +150,7 @@ namespace Bot.CommandSystem
try
{
register.RunCommand(request, fromID, userLevel, MHE, sourceLoc, agentKey, agentName);
register.RunCommand(request, fromID, userLevel, sourceLoc, agentKey, agentName);
}
catch (Exception e)
{
@ -164,17 +159,17 @@ namespace Bot.CommandSystem
int i;
int* ptr = &i;
IntPtr addr = (IntPtr)ptr;
MHE(MessageHandler.Destinations.DEST_LOCAL, UUID.Zero, "Exception caught: [" + Msg + "]\n \n[STACK] " + e.StackTrace.Replace("ZNI", "")+"\nMemory Position: 0x"+addr.ToString("x")+"\nCommand: "+request+$"\nMisc Details: {fromID}, {userLevel}, {sourceLoc}, {agentKey}, {agentName}");
MessageFactory.Post(Destinations.DEST_LOCAL, "Exception caught: [" + Msg + "]\n \n[STACK] " + e.StackTrace.Replace("ZNI", "") + "\nMemory Position: 0x" + addr.ToString("x") + "\nCommand: " + request + $"\nMisc Details: {fromID}, {userLevel}, {sourceLoc}, {agentKey}, {agentName}", UUID.Zero);
// do nothing here.
}
Log.info(log:"Leaving command parser");
return false;
}
public CommandManager(Logger _Log, GridClient cl, MessageHandler.MessageHandleEvent MHE)
public CommandManager()
{
this.cl = cl;
Log = _Log;
Log = BotSession.Instance.Logger;
}
}
}

View file

@ -37,7 +37,6 @@ namespace Bot.CommandSystem
_instance.client = bs.grid;
_instance.config = bs.ConfigurationHandle;
_instance.Log = bs.Logger;
_instance.MHEx = bs.MHE;
_instance.LocateCommands();
}
return _instance;
@ -59,7 +58,6 @@ namespace Bot.CommandSystem
public GridClient client;
public Logger Log;
public IConfig config;
public MessageHandler.MessageHandleEvent MHEx;
public void LocateCommands()
{
try
@ -127,16 +125,17 @@ namespace Bot.CommandSystem
}
catch (ReflectionTypeLoadException e)
{
MHEx(MessageHandler.Destinations.DEST_LOCAL, UUID.Zero, "FAILURE!!!\n \n[Assembly load failure]");
MessageFactory.Post(Destinations.DEST_LOCAL, "FAILURE!!!\n\n[Assembly load failure]", UUID.Zero);
foreach (Exception X in e.LoaderExceptions)
{
MHEx(MessageHandler.Destinations.DEST_LOCAL, UUID.Zero, X.Message + "\n \nSTACK: " + X.StackTrace);
MessageFactory.Post(Destinations.DEST_LOCAL, X.Message + "\n \nSTACK: " + X.StackTrace, UUID.Zero);
}
}
}
public void PrintHelpAll(MessageHandler.Destinations dest, UUID uid)
public void PrintHelpAll(Destinations dest, UUID uid)
{
for (int i = 0; i < Cmds.Count; i++)
@ -146,7 +145,7 @@ namespace Bot.CommandSystem
KeyValuePair<string, CommandGroup> kvp = Cmds.ElementAt(i);
CommandHelp HE = kvp.Value.cmdUsage;
if (dest == MessageHandler.Destinations.DEST_GROUP)
if (dest == Destinations.DEST_GROUP)
{
if (!HE.hasGroupFlag())
{
@ -154,13 +153,14 @@ namespace Bot.CommandSystem
}
else
{
MHEx(dest, uid, HE.GetUsage());
MessageFactory.Post(dest, HE.GetUsage(), uid);
}
}
else
{
MessageFactory.Post(dest, HE.GetUsage(), uid);
MHEx(dest, uid, HE.GetUsage());
}
// MHEx(dest, uid, kvp.Value.cmdUsage.GetUsage());
@ -168,30 +168,31 @@ namespace Bot.CommandSystem
}
}
public void PrintHelp(MessageHandler.Destinations dest, string cmd, UUID uid)
public void PrintHelp(Destinations dest, string cmd, UUID uid)
{
try
{
CommandHelp HE = Cmds[cmd].cmdUsage;
if (dest == MessageHandler.Destinations.DEST_GROUP)
if (dest == Destinations.DEST_GROUP)
{
if (!HE.hasGroupFlag())
{
//return; // DO NOT SCHEDULE THIS HELP INFO FOR GROUP!!!
}
}
MHEx(dest, uid, Cmds[cmd].cmdUsage.GetUsage());
MessageFactory.Post(dest, Cmds[cmd].cmdUsage.GetUsage(), uid);
}
catch (Exception e)
{
MHEx(dest, uid, "Error: Unrecognized command");
MessageFactory.Post(dest, "Error: Unknown command", uid);
}
}
public void RunCommand(string cmdString, UUID user, int level, MessageHandler.MessageHandleEvent MHE, MessageHandler.Destinations source, UUID agentKey, string agentName)
public void RunCommand(string cmdString, UUID user, int level, Destinations source, UUID agentKey, string agentName)
{
MHEx = MHE;
int pos = 0;
string[] cmdStruct = cmdString.Split(' ');
int IgnoreCount = 0;
@ -213,11 +214,11 @@ namespace Bot.CommandSystem
{
// Check that the destination is allowed.
// If not then skip this command entirely
MessageHandler.Destinations dests = cgX.CommandSource;
Destinations dests = cgX.CommandSource;
bool Allowed = false;
if ((dests & MessageHandler.Destinations.DEST_AGENT) == source) Allowed = true;
if ((dests & MessageHandler.Destinations.DEST_GROUP) == source) Allowed = true;
if ((dests & MessageHandler.Destinations.DEST_LOCAL) == source) Allowed = true;
if ((dests & Destinations.DEST_AGENT) == source) Allowed = true;
if ((dests & Destinations.DEST_GROUP) == source) Allowed = true;
if ((dests & Destinations.DEST_LOCAL) == source) Allowed = true;
if (!Allowed)
{
@ -235,10 +236,10 @@ namespace Bot.CommandSystem
additionalArgs[i - 1] = cmdStruct[pos + i];
}
pos++;
//(UUID client, int level, GridClient grid, string[] additionalArgs,
//MessageHandler.MessageHandleEvent MHE, MessageHandler.Destinations source,
//CommandRegistry registry, UUID agentKey, string agentName)
Thread CommandThread = new Thread(() => cgX.AssignedMethod.Invoke(ovj, new object[] { user, level, client, additionalArgs, MHE, source, this, agentKey, agentName }));
//(UUID client, int level, string[] additionalArgs,
//Destinations source,
//UUID agentKey, string agentName)
Thread CommandThread = new Thread(() => cgX.AssignedMethod.Invoke(ovj, new object[] { user, level, additionalArgs, source, agentKey, agentName }));
CommandThread.Start();
}
}

View file

@ -9,7 +9,7 @@ using System.Collections.Specialized;
namespace Bot
{
public sealed class GroupLog
public sealed class GroupLog : BaseCommands
{
private static readonly object _lock = new object();
@ -80,10 +80,10 @@ namespace Bot
private static readonly object _fileRead = new object();
[CommandGroupMaster("Logging")]
[CommandGroup("search_log", 5, 2, "search_log [groupName] [search_term] - Searches for the search term in all logs relating to the group name (Use a underscore to show where spaces are!). The search term may also include the pipe (|) delimiter to include more than 1 word.", Bot.MessageHandler.Destinations.DEST_AGENT | Bot.MessageHandler.Destinations.DEST_LOCAL | MessageHandler.Destinations.DEST_GROUP | MessageHandler.Destinations.DEST_DISCORD)]
public void search_log(UUID client, int level, GridClient grid, string[] additionalArgs,
MessageHandler.MessageHandleEvent MHE, MessageHandler.Destinations source,
CommandRegistry registry, UUID agentKey, string agentName)
[CommandGroup("search_log", 5, 2, "search_log [groupName] [search_term] - Searches for the search term in all logs relating to the group name (Use a underscore to show where spaces are!). The search term may also include the pipe (|) delimiter to include more than 1 word.", Destinations.DEST_AGENT | Destinations.DEST_LOCAL | Destinations.DEST_GROUP | Destinations.DEST_DISCORD)]
public void search_log(UUID client, int level, string[] additionalArgs,
Destinations source,
UUID agentKey, string agentName)
{
string GrpName = additionalArgs[0].Replace('_', ' ');
string[] search = additionalArgs[1].Split('|');

View file

@ -9,7 +9,7 @@ namespace Bot
{
public interface IProgram
{
void run(GridClient client, MessageHandler MH, CommandSystem.CommandRegistry registry); // Define the run command since a thread needs a entry point
void run(); // Define the run command since a thread needs a entry point
string getTick(); // Run every second to check for queued data. If queue exists, then it will be returned as a JSON string.
// getTick can reply with data for the serializer for instance.

View file

@ -13,13 +13,13 @@ using Bot.CommandSystem;
namespace Bot
{
class Auth
class Auth : BaseCommands
{
[CommandGroup("auth_user", 5, 2, "Authorizes a user to have command access. Arguments are user (UUID), and Level (int)", MessageHandler.Destinations.DEST_AGENT | MessageHandler.Destinations.DEST_LOCAL)]
public void set_auth(UUID client, int level, GridClient grid, string[] additionalArgs,
MessageHandler.MessageHandleEvent MHE, MessageHandler.Destinations source,
CommandRegistry registry, UUID agentKey, string agentName)
[CommandGroup("auth_user", 5, 2, "Authorizes a user to have command access. Arguments are user (UUID), and Level (int)", Destinations.DEST_AGENT | Destinations.DEST_LOCAL)]
public void set_auth(UUID client, int level, string[] additionalArgs,
Destinations source,
UUID agentKey, string agentName)
{
MainConfiguration mem = MainConfiguration.Instance;
BotSession.Instance.Logger.info(log:"Existing Admins: " + mem.BotAdmins.Count.ToString());
@ -36,8 +36,8 @@ namespace Bot
if (NewLevel <= 0)
{
mem.BotAdmins.Remove(user);
MHE(MessageHandler.Destinations.DEST_AGENT, user, "Your access to the main bot has been removed. You will still have access to any command that does not require a access level higher than 0");
MHE(MessageHandler.Destinations.DEST_LOCAL, UUID.Zero, "Access Removed");
MHE(Destinations.DEST_AGENT, user, "Your access to the main bot has been removed. You will still have access to any command that does not require a access level higher than 0");
MHE(Destinations.DEST_LOCAL, UUID.Zero, "Access Removed");
mem.Save();
return;
}
@ -53,7 +53,7 @@ namespace Bot
mem.BotAdmins.Add(user, NewLevel);
else
mem.BotAdmins[user] = NewLevel;
MHE(MessageHandler.Destinations.DEST_AGENT, user, "You have been granted authorization level " + NewLevel.ToString());
MHE(Destinations.DEST_AGENT, user, "You have been granted authorization level " + NewLevel.ToString());
MHE(source, UUID.Zero, "Authorized");
mem.Save();

View file

@ -11,7 +11,178 @@ using System.Threading;
namespace Bot
{
public class MessageHandler
/// <summary>
/// Message stuff!
/// </summary>
[Flags]
public enum Destinations
{
DEST_AGENT = 1,
DEST_GROUP = 2,
DEST_LOCAL = 4,
//DEST_CONSOLE_INFO = 8,
//DEST_ACTION = 16, // DEPRECATED
DEST_DISCORD = 32
};
/// <summary>
/// Message stuffs
/// </summary>
public abstract class Message
{
public abstract Destinations GetMessageSource();
public abstract string GetMessage();
public abstract UUID GetSender();
public abstract UUID GetTarget();
public abstract string GetSenderName();
public abstract int GetChannel();
internal abstract void set(Destinations dest, string msg, UUID agentID,string senderName, int channel);
}
/// <summary>
/// IM, local, whatever
/// </summary>
public class ChatMessage : Message
{
private string Msg;
private Destinations dest;
private UUID sender;
private UUID target;
private string senderName;
private int Chn;
public override UUID GetTarget()
{
return target;
}
public override int GetChannel()
{
return Chn;
}
public override string GetMessage()
{
return Msg;
}
public override Destinations GetMessageSource()
{
return dest;
}
public override UUID GetSender()
{
return sender;
}
public override string GetSenderName()
{
return senderName;
}
internal override void set(Destinations dest, string msg, UUID agentID,string senderName, int channel)
{
this.dest = dest;
Msg = msg;
sender = agentID;
this.senderName = senderName;
Chn = channel;
}
public ChatMessage(UUID targetID)
{
target = targetID;
}
}
/// <summary>
/// Includes methods specific to the Group
/// </summary>
public class GroupMessage : ChatMessage
{
private UUID GroupID;
private string groupName;
public UUID GetGroupID()
{
return GroupID;
}
public string GetGroupName()
{
return groupName;
}
public GroupMessage(UUID ID) : base(ID)
{
GroupID = ID;
}
}
public class MessageFactory
{
public static void Post(Destinations dest, string Msg, UUID destID, int chn = 0)
{
Message m = null;
switch (dest)
{
case Destinations.DEST_GROUP:
m = new GroupMessage(destID);
break;
case Destinations.DEST_DISCORD:
m = new ChatMessage(UUID.Zero);
break;
default:
m = new ChatMessage(destID);
break;
}
m.set(dest, Msg, BotSession.Instance.grid.Self.AgentID, BotSession.Instance.grid.Self.Name, chn);
MessageService.Dispatch(m);
}
}
/// <summary>
/// Basic messaging factory
/// </summary>
public class MessageService
{
public MessageService()
{
}
public static void Dispatch(Message M)
{
MessageEventArgs MEA = new MessageEventArgs();
MEA.Timestamp = DateTime.Now;
MEA.Msg = M;
BotSession.Instance.MSGSVC.OnMessageEvent(MEA);
}
protected virtual void OnMessageEvent(MessageEventArgs e)
{
EventHandler<MessageEventArgs> handler = MessageEvent;
if (handler != null)
{
handler(this, e);
}
}
public event EventHandler<MessageEventArgs> MessageEvent;
}
public class MessageEventArgs : EventArgs
{
public DateTime Timestamp { get; set; }
public Message Msg { get; set; }
}
public class MessageHandler_old // keep the old structure for now
{
private List<MessageQueuePacket> MSGQueue = new List<MessageQueuePacket>();
private List<ActionPacket> ActionQueue = new List<ActionPacket>();
@ -20,17 +191,6 @@ namespace Bot
private Logger Log = BotSession.Instance.Logger;
[Flags]
public enum Destinations
{
DEST_AGENT = 1,
DEST_GROUP = 2,
DEST_LOCAL = 4,
DEST_CONSOLE_INFO = 8,
DEST_ACTION = 16,
DEST_DISCORD = 32
};
public struct MessageQueuePacket
{
public Destinations Dest;
@ -50,24 +210,11 @@ namespace Bot
public string Action;
}
public delegate void MessageHandleEvent(MessageHandler.Destinations DType, UUID AgentOrSession, string MSG, int channel = 0);
public delegate void MessageHandleEvent(Destinations DType, UUID AgentOrSession, string MSG, int channel = 0);
public volatile MessageHandleEvent callbacks;
public void MessageHandle(Destinations DType, UUID AgentOrSession, string MSG, int channel = 0)
{
if (DType == Destinations.DEST_ACTION)
{
if (MSG == "RESET_QUEUE")
{
ClearQueues();
return;
}
ActionPacket PKT = new ActionPacket();
PKT.Dest = DType;
PKT.ActionStr = MSG;
ActionQueue.Add(PKT);
return;
}
else if (DType == Destinations.DEST_DISCORD)
if (DType == Destinations.DEST_DISCORD)
{
DiscordAction DA = new DiscordAction();
DA.Action = MSG;
@ -101,10 +248,6 @@ namespace Bot
{
client.Self.InstantMessage(pkt.DestID, "[" + MSGQueue.Count.ToString() + "] " + pkt.Msg);
}
else if (pkt.Dest == Destinations.DEST_CONSOLE_INFO)
{
Log.info(Restore:true, "[" + MSGQueue.Count.ToString() + "] " + pkt.Msg);
}
else if (pkt.Dest == Destinations.DEST_GROUP)
{
if (client.Self.GroupChatSessions.ContainsKey(pkt.DestID))

View file

@ -10,7 +10,7 @@ namespace Bot.NonCommands
/// <summary>
/// Defaults to all except action
/// </summary>
public MessageHandler.Destinations SourceType = MessageHandler.Destinations.DEST_AGENT | MessageHandler.Destinations.DEST_CONSOLE_INFO | MessageHandler.Destinations.DEST_DISCORD | MessageHandler.Destinations.DEST_GROUP | MessageHandler.Destinations.DEST_LOCAL;
public Destinations SourceType = Destinations.DEST_AGENT | Destinations.DEST_DISCORD | Destinations.DEST_GROUP | Destinations.DEST_LOCAL;
public NotCommand()
{
// Not Command, this just marks a class

View file

@ -9,6 +9,6 @@ namespace Bot.NonCommands
{
public interface nCMD
{
public void handle(string text, UUID User, string agentName, MessageHandler.Destinations src, UUID originator);
public void handle(string text, UUID User, string agentName, Destinations src, UUID originator);
}
}

View file

@ -10,7 +10,7 @@ namespace Bot.NonCommands
{
public class nRegistry
{
public static void Dispatch(string request, UUID agentKey, string agentName, MessageHandler.Destinations sourceLoc, UUID originator)
public static void Dispatch(string request, UUID agentKey, string agentName, Destinations sourceLoc, UUID originator)
{
foreach(Assembly a in AppDomain.CurrentDomain.GetAssemblies())

View file

@ -16,7 +16,7 @@ using System.Reflection;
namespace Bot
{
public class Program
public class Program : BaseCommands
{
public static Logger Log;
public static string BotVer = ASMInfo.BotVer;
@ -25,7 +25,6 @@ namespace Bot
public static SerialManager SM = new SerialManager();
public static GridClient client = new GridClient();
public static bool g_iIsRunning = true;
public static MessageHandler MH;
public static CommandRegistry registry;
public static List<IProgram> g_ZPrograms = new List<IProgram>();
public static CommandManager CM = null;
@ -33,16 +32,16 @@ namespace Bot
static readonly object _CacheLock = new object();
//public static License LicenseKey; // Not to be used yet
public static void msg(MessageHandler.Destinations D, UUID x, string m)
public static void msg(Destinations D, UUID x, string m)
{
MH.callbacks(D, x, m);
MessageFactory.Post(D, m, x);
}
public static void passArguments(string data)
{
CM.RunChatCommand(data, client, MH.callbacks, registry);
CM.RunChatCommand(data);
}
public static unsafe void Main(string[] args)
@ -154,8 +153,9 @@ namespace Bot
return;
}
*/
MH = new MessageHandler();
MH.callbacks += MH.MessageHandle;
BotSession.Instance.MSGSVC.MessageEvent += MSGSVC_onChat;
BotSession.Instance.MSGSVC.MessageEvent += MSGSVC_onIM;
BotSession.Instance.MSGSVC.MessageEvent += MSGSVC_onGroupMessage;
string fna = null;
@ -250,22 +250,21 @@ namespace Bot
if (File.Exists("XUP"))
{
File.Delete("XUP");
MH.callbacks(MessageHandler.Destinations.DEST_LOCAL, UUID.Zero, "Updated to version " + BotStr + " - "+BotVer.ToString());
MessageFactory.Post(Destinations.DEST_LOCAL, $"Updated to version {BotStr} - {BotVer}", UUID.Zero);
}
// Setup BotSession Singleton!
BotSession.Instance.grid = client;
BotSession.Instance.Logger = Log;
BotSession.Instance.MHE = MH.callbacks;
BotSession.Instance.MH = MH;
Thread prompter = new Thread(() => {
BotSession.Instance.Logger.DoPrompt();
});
prompter.Start();
CM = new CommandManager(BotSession.Instance.Logger, client, MH.callbacks);
CM = new CommandManager();
MainConfiguration.Instance.Save(); // Flush the config, to update the file format
@ -290,7 +289,7 @@ namespace Bot
{
Console.WriteLine("Plugin [" + prog.ProgramName + "] found (" + fi.FullName + ") loaded and activated");
prog.run(client, MH, CommandRegistry.Instance);
prog.run();
g_ZPrograms.Add(prog);
}
}
@ -345,7 +344,8 @@ namespace Bot
if (conf.ConfigFor == "Main")
{
msg(MessageHandler.Destinations.DEST_LOCAL, UUID.Zero, "Alert: Main.json is not fully initialized. Setting default values");
MessageFactory.Post(Destinations.DEST_LOCAL, "Alert: Main.json is not fully initialized. Setting default values", UUID.Zero);
conf.ConfigFor = "BOT";
conf.ConfigVersion = 1.0f;
// data contains nothing at the moment.
@ -355,12 +355,11 @@ namespace Bot
if (conf.ConfigFor == "BOT")
{
msg(MessageHandler.Destinations.DEST_LOCAL, UUID.Zero, "Main.json has been created");
msg(MessageHandler.Destinations.DEST_LOCAL, UUID.Zero, "Continuing with startup");
MessageFactory.Post(Destinations.DEST_LOCAL, "Main.json has been created", UUID.Zero);
}
else
{
msg(MessageHandler.Destinations.DEST_LOCAL, UUID.Zero, "Main.json does not contain all memory. FAILURE.");
MessageFactory.Post(Destinations.DEST_LOCAL, "Main.json is invalid. Cannot continue", UUID.Zero);
g_iIsRunning = false;
}
}
@ -400,7 +399,7 @@ namespace Bot
int i;
int* ptr = &i;
IntPtr addr = (IntPtr)ptr;
msg(MessageHandler.Destinations.DEST_LOCAL, UUID.Zero, "Generic Exception Caught: " + Msg + " [0x0A, 0x" + addr.ToString("x") + "]\nSTACK: " + STACK);
MessageFactory.Post(Destinations.DEST_LOCAL, "Generic Exception Caught: " + Msg + " [0x0A, 0x" + addr.ToString("x") + "]\nSTACK: " + STACK, UUID.Zero);
}
}
@ -411,45 +410,6 @@ namespace Bot
string jsonReply = MH.CheckActions();
if (jsonReply == "NONE") jsonReply = "";
if (jsonReply == "" || jsonReply == null)
{
//Log.debug("TICK NULL");
}
else
{
dynamic jsonObj = JsonConvert.DeserializeObject(jsonReply);
string tp = jsonObj.type;
switch (tp)
{
case "exit":
{
Log.info(false, "Logging off!");
g_iIsRunning = false;
break;
}
case "reload_groups":
{
ReloadGroupsCache();
break;
}
default:
{
Log.info(true, "Unknown response code");
break;
}
}
}
MH.run(client);
//MasterObjectCaches.Save();
if (startupSeq) startupSeq = false;
@ -491,11 +451,37 @@ namespace Bot
//System.Console.WriteLine("PAUSING. PRESS ANY KEY TO EXIT");
//System.Console.ReadKey();
}
private static ManualResetEvent GroupJoinWaiter = new ManualResetEvent(false);
private static void MSGSVC_onGroupMessage(object sender, MessageEventArgs e)
{
throw new NotImplementedException();
}
private static void MSGSVC_onIM(object sender, MessageEventArgs e)
{
throw new NotImplementedException();
}
private static void MSGSVC_onChat(object sender, MessageEventArgs e)
{
switch (e.Msg.GetMessageSource())
{
case Destinations.DEST_AGENT:
// send as IM
BotSession.Instance.grid.Self.InstantMessage(e.Msg.GetTarget(), e.Msg.GetMessage());
break;
case Destinations.DEST_LOCAL:
BotSession.Instance.grid.Self.Chat(e.Msg.GetMessage(), e.Msg.GetChannel(), ChatType.Normal);
break;
default:
return;
}
}
private static void onJoinGroupChat(object sender, GroupChatJoinedEventArgs e)
{
if (e.Success)
MH.GroupJoinWaiter.Set();
GroupJoinWaiter.Set();
}
private static AutoResetEvent ReqObjProperties = new AutoResetEvent(false);
@ -574,8 +560,8 @@ namespace Bot
private ManualResetEvent profile_get = new ManualResetEvent(false);
private Avatar.AvatarProperties Properties_AV;
[CommandGroup("set_profile_text", 75, 1, "set_profile_text [text:Base64] - Sets the profile text", MessageHandler.Destinations.DEST_AGENT | MessageHandler.Destinations.DEST_LOCAL | MessageHandler.Destinations.DEST_CONSOLE_INFO)]
public void setProfileText(UUID client, int level, GridClient grid, string[] additionalArgs, MessageHandler.MessageHandleEvent MHE, MessageHandler.Destinations source, CommandRegistry registry, UUID agentKey, string agentName)
[CommandGroup("set_profile_text", 75, 1, "set_profile_text [text:Base64] - Sets the profile text", Destinations.DEST_AGENT | Destinations.DEST_LOCAL)]
public void setProfileText(UUID client, int level, string[] additionalArgs, Destinations source, UUID agentKey, string agentName)
{
MHE(source, client, "Setting...");
@ -707,7 +693,7 @@ namespace Bot
else
{
client.Self.GroupInviteRespond(e.IM.FromAgentID, e.IM.IMSessionID, false);
MH.callbacks(MessageHandler.Destinations.DEST_AGENT, e.IM.FromAgentID, "You lack the proper permissions to perform this action");
MH(Destinations.DEST_AGENT, e.IM.FromAgentID, "You lack the proper permissions to perform this action");
}
}
else if (e.IM.Dialog == InstantMessageDialog.FriendshipOffered)
@ -715,11 +701,11 @@ namespace Bot
if (Level >= 4)
{
client.Friends.AcceptFriendship(e.IM.FromAgentID, e.IM.IMSessionID);
MH.callbacks(MessageHandler.Destinations.DEST_AGENT, e.IM.FromAgentID, "Welcome to my friends list!");
MH(Destinations.DEST_AGENT, e.IM.FromAgentID, "Welcome to my friends list!");
}
else
{
MH.callbacks(MessageHandler.Destinations.DEST_AGENT, e.IM.FromAgentID, "You lack proper permission");
MH(Destinations.DEST_AGENT, e.IM.FromAgentID, "You lack proper permission");
}
}
else if (e.IM.Dialog == InstantMessageDialog.RequestTeleport)
@ -727,12 +713,12 @@ namespace Bot
if (Level >= 3)
{
client.Self.TeleportLureRespond(e.IM.FromAgentID, e.IM.IMSessionID, true);
MH.callbacks(MessageHandler.Destinations.DEST_AGENT, e.IM.FromAgentID, "Teleporting...");
MH(Destinations.DEST_AGENT, e.IM.FromAgentID, "Teleporting...");
}
else
{
client.Self.TeleportLureRespond(e.IM.FromAgentID, e.IM.IMSessionID, false);
MH.callbacks(MessageHandler.Destinations.DEST_AGENT, e.IM.FromAgentID, "You lack permission");
MH(Destinations.DEST_AGENT, e.IM.FromAgentID, "You lack permission");
}
}
else if (e.IM.Dialog == InstantMessageDialog.MessageFromObject)
@ -842,14 +828,12 @@ namespace Bot
if(count >= 5)
{
MH.callbacks(MessageHandler.Destinations.DEST_LOCAL, UUID.Zero, "Aborting group refresh attempt. Too many errors - Resetting cache and retrying");
MH(Destinations.DEST_LOCAL, UUID.Zero, "Aborting group refresh attempt. Too many errors - Resetting cache and retrying");
GroupsEvent.Reset();
GroupsCache = new Dictionary<UUID, Group>();
client.Groups.CurrentGroups -= Groups_CurrentGroups;
Dictionary<string, string> act = new Dictionary<string, string>();
act.Add("type", "reload_groups");
MH.callbacks(MessageHandler.Destinations.DEST_ACTION, UUID.Zero, JsonConvert.SerializeObject(act));
ReloadGroupsCache();
return;
}

View file

@ -8,7 +8,7 @@ using System.Text;
namespace Bot.WebHookServer
{
class HookCmds
class HookCmds : BaseCommands
{
public HttpListener listener;
@ -58,13 +58,14 @@ namespace Bot.WebHookServer
}
[CommandGroup("webhook_auth", 4, 2, "webhook_auth [github_name] [y/n]", MessageHandler.Destinations.DEST_AGENT | MessageHandler.Destinations.DEST_LOCAL | MessageHandler.Destinations.DEST_GROUP)]
public void WebHookAuthMgr(UUID client, int level, GridClient grid, string[] additionalArgs, MessageHandler.MessageHandleEvent MHE, MessageHandler.Destinations source, CommandRegistry registry, UUID agentKey, string agentName)
[CommandGroup("webhook_auth", 4, 2, "webhook_auth [github_name] [y/n]", Destinations.DEST_AGENT | Destinations.DEST_LOCAL | Destinations.DEST_GROUP)]
public void WebHookAuthMgr(UUID client, int level, string[] additionalArgs, Destinations source, UUID agentKey, string agentName)
{
MainConfiguration cfg = MainConfiguration.Instance;
MHE(source, client, "Checking..");
if (cfg.Authed(additionalArgs[0]))
{
if (additionalArgs[1] == "y")

View file

@ -25,7 +25,6 @@ namespace Bot.WebHookServer
class GitServer : IProgram
{
public HttpListener listener;
public MessageHandler.MessageHandleEvent MHEx;
public string ProgramName
{
get { return "GitServer"; }
@ -33,7 +32,7 @@ namespace Bot.WebHookServer
public float ProgramVersion
{
get { return 1.6f; }
get { return 1.7f; }
}
public string getTick()
@ -55,7 +54,7 @@ namespace Bot.WebHookServer
public void onIMEvent(object sender, InstantMessageEventArgs e)
{
}
public void run(GridClient client, MessageHandler MH, CommandRegistry registry)
public void run()
{
if (listener != null) return;// Already had run triggered
try
@ -79,7 +78,6 @@ namespace Bot.WebHookServer
listener.Prefixes.Add($"http://*:{MainConfiguration.Instance.WebServerPort}/");
MHEx = MH.callbacks;
listener.Start();
var hc = new HookCmds();
@ -91,7 +89,8 @@ namespace Bot.WebHookServer
}catch(Exception e)
{
BotSession.Instance.MHE(MessageHandler.Destinations.DEST_LOCAL, UUID.Zero, "Error: Program could not escalate to Admin Privileges. WebHook engine not running\n\n"+e.Message+"\n"+e.StackTrace);
MessageFactory.Post(Destinations.DEST_LOCAL, "Error: Program could not escalate to Admin Privileges. WebHook engine not running\n\n" + e.Message + "\n" + e.StackTrace, UUID.Zero);
}
}