diff --git a/Combot/Bot.cs b/Combot/Bot.cs index 934b29b..1912eac 100644 --- a/Combot/Bot.cs +++ b/Combot/Bot.cs @@ -19,6 +19,7 @@ namespace Combot { public event Action CommandReceivedEvent; public event Action ErrorEvent; + public event Action LogEvent; public ServerConfig ServerConfig; public IRC IRC; public Database Database; @@ -185,6 +186,7 @@ namespace Combot public void LoadModules() { + Log("Loading Modules"); // Get all config files from Module directory string[] moduleLocations = Directory.GetDirectories(ServerConfig.ModuleLocation); foreach (string location in moduleLocations) @@ -195,17 +197,20 @@ namespace Combot public bool LoadModule(string module) { + Log(string.Format("Loading Module from: {0}", module)); Module newModule = new Module(); newModule.ConfigPath = module; newModule.LoadConfig(); if (newModule.Enabled && !Modules.Exists(mod => mod.ClassName == newModule.ClassName)) { - if (File.Exists(string.Format(@"{0}\{1}.dll", module, newModule.Name))) + if (File.Exists(string.Format(Path.Combine(module, newModule.Name + ".dll")))) { + Log(string.Format("Creating instance of {0} module.", newModule.Name)); Module loadedModule = newModule.CreateInstance(this); if (loadedModule.Loaded) { + Log(string.Format("{0} module successfully loaded.", newModule.Name)); loadedModule.ModuleErrorEvent += HandleModuleErrorEvent; Modules.Add(loadedModule); return true; @@ -221,6 +226,7 @@ namespace Combot for (int i = 0; i < moduleList.Count; i++) { UnloadModule(moduleList[i].Name); + Log(string.Format("Unloaded {0} module.", moduleList[i].Name)); } } @@ -649,14 +655,18 @@ namespace Combot List argsOnly = msgArgs.ToList(); argsOnly.RemoveAt(0); + Log("Parsing Command " + command + " Now."); + // Find the module that contains the command Module module = Modules.Find(mod => mod.Commands.Exists(c => c.Triggers.Contains(command)) && mod.Loaded && mod.Enabled); if (module != null) { + Log("Found Module " + module.Name); // Find the command Command cmd = module.Commands.Find(c => c.Triggers.Contains(command)); if (cmd != null) { + Log("Found Command " + cmd.Name); CommandMessage newCommand = new CommandMessage(); newCommand.Nick.Copy(sender); bool nickFound = false; @@ -827,5 +837,13 @@ namespace Combot ErrorEvent(error); } } + + public void Log(string message) + { + if (LogEvent != null) + { + LogEvent(message); + } + } } } diff --git a/Combot/Modules/Module.cs b/Combot/Modules/Module.cs index c620f7b..130da82 100644 --- a/Combot/Modules/Module.cs +++ b/Combot/Modules/Module.cs @@ -68,6 +68,7 @@ namespace Combot.Modules ) ) { + Bot.Log("Checking Command " + command.Command); // Figure out access of the nick Command cmd = Commands.Find(c => c.Triggers.Contains(command.Command)); List nickAccessTypes = new List() { AccessType.User }; @@ -218,7 +219,7 @@ namespace Combot.Modules { ConfigFileRWLock.EnterReadLock(); string path = Path.Combine(ConfigPath, "Module.json"); - + if (!File.Exists(path)) { string defaultPath = Path.Combine(ConfigPath, "Module.Default.json"); diff --git a/Console Interface/Console_Interface.cs b/Console Interface/Console_Interface.cs index b728ca5..d83593b 100644 --- a/Console Interface/Console_Interface.cs +++ b/Console Interface/Console_Interface.cs @@ -28,6 +28,7 @@ namespace Console_Interface Bot Combot = new Bot(server); Combot.ErrorEvent += e => BotErrorHandler(e, Combot.ServerConfig.Name); + Combot.LogEvent += e => LogEventHandler(e, Combot.ServerConfig.Name); // Incoming Messages Combot.IRC.Message.RawMessageEvent += (sender, e) => RawMessageHandler(sender, e, Combot.ServerConfig.Name); @@ -60,6 +61,12 @@ namespace Console_Interface } } + private static void LogEventHandler(string message, string server) + { + string msg = string.Format("[{0}] [{1}] [LOG] {2}", DateTime.Now.ToString("HH:mm:ss"), server, message); + Console.WriteLine(msg); + } + private static void RawMessageHandler(object sender, string message, string server) { string msg = string.Format("[{0}] [{1}] {2}", DateTime.Now.ToString("HH:mm:ss"), server, message); diff --git a/IRCServices/IRC.cs b/IRCServices/IRC.cs index f4b8b9a..6d9af24 100644 --- a/IRCServices/IRC.cs +++ b/IRCServices/IRC.cs @@ -475,13 +475,15 @@ namespace Combot.IRCServices Nick changedNick = channel.GetNick(mode.Parameter); if (changedNick != null) { + PrivilegeMode priv; + Enum.TryParse(mode.Mode.ToString(), out priv); if (mode.Set) { - changedNick.AddPrivilege((PrivilegeMode) Enum.Parse(typeof (PrivilegeMode), mode.Mode.ToString())); + changedNick.AddPrivilege(priv); } else { - changedNick.RemovePrivilege((PrivilegeMode) Enum.Parse(typeof (PrivilegeMode), mode.Mode.ToString())); + changedNick.RemovePrivilege(priv); } } break; diff --git a/IRCServices/Messaging/Messages.cs b/IRCServices/Messaging/Messages.cs index be03bae..dc4be62 100644 --- a/IRCServices/Messaging/Messages.cs +++ b/IRCServices/Messaging/Messages.cs @@ -52,7 +52,7 @@ namespace Combot.IRCServices.Messaging Regex errorRegex = new Regex(@"^ERROR :(?.+)", RegexOptions.None); Regex CTCPRegex = new Regex(@"^\u0001(?[^\s]+)\s?(?.*)\u0001", RegexOptions.None); - string[] messages = tcpMessage.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); + string[] messages = tcpMessage.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); foreach (string message in messages) { @@ -244,10 +244,13 @@ namespace Combot.IRCServices.Messaging modeMsg.Channel = recipient; modeMsg.Nick = new Nick() { Nickname = senderNick, Realname = senderRealname, Host = senderHost }; - string[] modeArgs = args.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); - List argList = modeArgs.ToList(); - argList.RemoveAt(0); - modeMsg.Modes.AddRange(_IRC.ParseChannelModeString(modeArgs[0].TrimStart(':'), string.Join(" ", argList))); + if (!string.IsNullOrEmpty(args)) + { + string[] modeArgs = args.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries); + List argList = modeArgs.ToList(); + argList.RemoveAt(0); + modeMsg.Modes.AddRange(_IRC.ParseChannelModeString(modeArgs[0].TrimStart(':'), string.Join(" ", argList))); + } await Task.Run(() => { @@ -263,25 +266,30 @@ namespace Combot.IRCServices.Messaging modeMsg.Modes = new List(); modeMsg.Nick = new Nick() { Nickname = senderNick, Realname = senderRealname, Host = senderHost }; - string[] modeArgs = args.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); - char[] modeInfo = modeArgs[0].TrimStart(':').ToCharArray(); - bool set = true; - foreach (char mode in modeInfo) + if (!string.IsNullOrEmpty(args)) { - if (mode.Equals('-')) - { - set = false; - } - else if (mode.Equals('+')) - { - set = true; - } - else if (mode.ToString() != string.Empty) + string[] modeArgs = args.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries); + char[] modeInfo = modeArgs[0].TrimStart(':').ToCharArray(); + bool set = true; + foreach (char mode in modeInfo) { - UserModeInfo newMode = new UserModeInfo(); - newMode.Set = set; - newMode.Mode = (UserMode)Enum.Parse(typeof(UserMode), mode.ToString()); - modeMsg.Modes.Add(newMode); + if (mode.Equals('-')) + { + set = false; + } + else if (mode.Equals('+')) + { + set = true; + } + else if (!string.IsNullOrEmpty(mode.ToString())) + { + UserModeInfo newMode = new UserModeInfo(); + newMode.Set = set; + UserMode md; + Enum.TryParse(mode.ToString(), out md); + newMode.Mode = md; + modeMsg.Modes.Add(newMode); + } } } diff --git a/readme.md b/readme.md index 826870a..4e7305d 100644 --- a/readme.md +++ b/readme.md @@ -32,19 +32,21 @@ Combot is designed to provide an all-in-one solution for those who wish to run a ## Requirements * MySQL v5.5 or greater -* .NET Framework v4.5.1 +* .NET Framework v4.5.1 or Mono Runtime >3.2.8 * Git (If using the GitVersionTask Nuget Package) ## Installation - Windows -1) Download the Release.zip from the latest release in https://github.com/uncled1023/Combot/releases and extract the files to a directory of your choice.
-2) Edit Combot.Servers.json to configure the bot for the correct servers, channels, owner information, and MySQL database.
-3) If the database has not been created yet, import Database.sql from the master branch into the database.
-4) Run Combot-Interface.exe +1) Download the Release zip file from the latest release in https://git.teknik.io/Uncled1023/Combot/releases and extract the files to a directory of your choice.
+2) Copy Combot.Servers.Default.json to Combot.Servers.json and configure the bot for the correct servers, channels, owner information, and MySQL database.
+3) Run Combot-Interface.exe or Combot-CLI.exe -## Installation - Linux +## Installation - Linux (Ubuntu) -This is currently untested and not supported. If you would like to venture into the realm of unreliability and errors, you can try running the Console Interface in Mono. +1) Download the Release zip file from the latest release in https://git.teknik.io/Uncled1023/Combot/releases and extract the files to a directory of your choice.
+2) Copy Combot.Servers.Default.json to Combot.Servers.json and configure the bot for the correct servers, channels, owner information, and MySQL database.
+3) Install Mono-Complete: `sudo apt-get mono-complete` +4) Run Combot-CLI.exe: `mono Combot-CLI.exe` ## Building @@ -60,5 +62,5 @@ Please report all bugs you find to me so I can fix them as soon as possible. Al Email: admin@teknik.io
IRC: (irc.teknik.io)#Combot
-IRC: (irc.rizon.net)#/g/technology
+IRC: (irc.rizon.net)#Combot
Nick: Uncled1023