diff --git a/MinecraftClient/ChatBots/Auto Respond.cs b/MinecraftClient/ChatBots/Auto Respond.cs new file mode 100644 index 00000000..c861241e --- /dev/null +++ b/MinecraftClient/ChatBots/Auto Respond.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.IO; + +namespace MinecraftClient.ChatBots +{ + class Auto_Respond : ChatBot + { + private String[] respondon = new String[0]; + private String[] torespond = new String[0]; + + private static string[] FromFile(string file) + { + if (File.Exists(file)) + { + //Read all lines from file, remove lines with no text, convert to lowercase, + //remove duplicate entries, convert to a string array, and return the result. + return File.ReadAllLines(file) + .Where(line => !String.IsNullOrWhiteSpace(line)) + .Select(line => line.ToLower()) + .Distinct().ToArray(); + } + else + { + LogToConsole("File not found: " + file); + return new string[0]; + } + } + + //Initalize the bot + public override void Initialize() + { + respondon = FromFile(Settings.Respond_MatchesFile); + torespond = FromFile(Settings.Respond_RespondFile); + ConsoleIO.WriteLine("Auto Respond Bot Sucessfully loaded!"); + } + + public override void GetText(string text) + { + //Remove colour codes + text = getVerbatim(text).ToLower(); + //Check text to see if bot should respond + foreach (string alert in respondon.Where(alert => text.Contains(alert))) + { + //Find what to respond with + for (int x = 0; x < respondon.Length; x++) + { + if (respondon[x].ToString().Contains(alert)) + { + //Respond + SendText(torespond[x].ToString()); + } + } + } + } + } +} diff --git a/MinecraftClient/McTcpClient.cs b/MinecraftClient/McTcpClient.cs index cf14046f..e3f792e1 100644 --- a/MinecraftClient/McTcpClient.cs +++ b/MinecraftClient/McTcpClient.cs @@ -20,7 +20,7 @@ namespace MinecraftClient private static List cmd_names = new List(); private static Dictionary cmds = new Dictionary(); private List bots = new List(); - private readonly Dictionary onlinePlayers = new Dictionary(); + private readonly Dictionary onlinePlayers = new Dictionary(); private static List scripts_on_hold = new List(); public void BotLoad(ChatBot b) { b.SetHandler(this); bots.Add(b); b.Initialize(); Settings.SingleCommand = ""; } public void BotUnLoad(ChatBot b) { bots.RemoveAll(item => object.ReferenceEquals(item, b)); } @@ -39,7 +39,7 @@ namespace MinecraftClient public string getUsername() { return username; } public string getUserUUID() { return uuid; } public string getSessionID() { return sessionid; } - + TcpClient client; IMinecraftCom handler; Thread cmdprompt; @@ -106,6 +106,7 @@ namespace MinecraftClient if (Settings.AutoRelog_Enabled) { BotLoad(new ChatBots.AutoRelog(Settings.AutoRelog_Delay, Settings.AutoRelog_Retries)); } if (Settings.ScriptScheduler_Enabled) { BotLoad(new ChatBots.ScriptScheduler(Settings.expandVars(Settings.ScriptScheduler_TasksFile))); } if (Settings.RemoteCtrl_Enabled) { BotLoad(new ChatBots.RemoteControl()); } + if (Settings.Respond_Enabled) { BotLoad(new ChatBots.Auto_Respond()); } } try @@ -454,7 +455,7 @@ namespace MinecraftClient onlinePlayers[uuid] = name; } } - + /// /// Triggered when a player has left the game /// diff --git a/MinecraftClient/MinecraftClient.csproj b/MinecraftClient/MinecraftClient.csproj index afbcb28b..9ae1ccdc 100644 --- a/MinecraftClient/MinecraftClient.csproj +++ b/MinecraftClient/MinecraftClient.csproj @@ -74,6 +74,7 @@ + diff --git a/MinecraftClient/Settings.cs b/MinecraftClient/Settings.cs index e074da88..d66bb17e 100644 --- a/MinecraftClient/Settings.cs +++ b/MinecraftClient/Settings.cs @@ -21,7 +21,7 @@ namespace MinecraftClient public static string Password = ""; public static string ServerIP = ""; public static ushort ServerPort = 25565; - public static string ServerVersion = ""; + public static string ServerVersion = ""; public static string SingleCommand = ""; public static string ConsoleTitle = ""; @@ -88,12 +88,17 @@ namespace MinecraftClient public static bool RemoteCtrl_AutoTpaccept = true; public static bool RemoteCtrl_AutoTpaccept_Everyone = false; + //Auto Respond + public static bool Respond_Enabled = false; + public static string Respond_MatchesFile = "detect.txt"; + public static string Respond_RespondFile = "respond.txt"; + //Custom app variables and Minecraft accounts private static Dictionary AppVars = new Dictionary(); private static Dictionary> Accounts = new Dictionary>(); private static Dictionary> Servers = new Dictionary>(); - private enum ParseMode { Default, Main, AppVars, Proxy, AntiAFK, Hangman, Alerts, ChatLog, AutoRelog, ScriptScheduler, RemoteControl }; + private enum ParseMode { Default, Main, AppVars, Proxy, AntiAFK, Hangman, Alerts, ChatLog, AutoRelog, ScriptScheduler, RemoteControl, Auto_Respond }; /// /// Load settings from the give INI file @@ -127,6 +132,7 @@ namespace MinecraftClient case "remotecontrol": pMode = ParseMode.RemoteControl; break; case "proxy": pMode = ParseMode.Proxy; break; case "appvars": pMode = ParseMode.AppVars; break; + case "auto respond": pMode = ParseMode.Auto_Respond; break; default: pMode = ParseMode.Default; break; } } @@ -201,7 +207,7 @@ namespace MinecraftClient Servers[server_data[0]] = new KeyValuePair(ServerIP, ServerPort); } - + //Restore current server info ServerIP = server_host_temp; ServerPort = server_port_temp; @@ -284,7 +290,7 @@ namespace MinecraftClient argValue = argValue.ToLower(); if (argValue == "http") { proxyType = Proxy.ProxyHandler.Type.HTTP; } else if (argValue == "socks4") { proxyType = Proxy.ProxyHandler.Type.SOCKS4; } - else if (argValue == "socks4a"){ proxyType = Proxy.ProxyHandler.Type.SOCKS4a;} + else if (argValue == "socks4a") { proxyType = Proxy.ProxyHandler.Type.SOCKS4a; } else if (argValue == "socks5") { proxyType = Proxy.ProxyHandler.Type.SOCKS5; } break; case "server": @@ -308,6 +314,15 @@ namespace MinecraftClient case ParseMode.AppVars: setVar(argName, argValue); break; + + case ParseMode.Auto_Respond: + switch (argName.ToLower()) + { + case "enabled": Respond_Enabled = str2bool(argValue); break; + case "matchfile": Respond_MatchesFile = argValue; break; + case "respondfile": Respond_RespondFile = argValue; break; + } + break; } } } @@ -402,7 +417,14 @@ namespace MinecraftClient + "[RemoteControl]\r\n" + "enabled=false\r\n" + "autotpaccept=true\r\n" - + "tpaccepteveryone=false\r\n", Encoding.UTF8); + + "tpaccepteveryone=false\r\n" + + "\r\n" + + "[Auto Respond]\r\n" + + "enabled=false\r\n" + + "matchfile=detect.txt\r\n" + + "respondfile=respond.txt\r\n" + + "#To use the bot, place the text to detect in the matchfile file and the text to respond with in the respondfile\r\n" + + "#Each line in each file is relevant to the same line in the other document, for example if the bot detects the text in line 1 of the first file, it will respond with line 1 of the second file.\r\n", Encoding.UTF8); } public static int str2int(string str) { try { return Convert.ToInt32(str); } catch { return 0; } } @@ -436,7 +458,7 @@ namespace MinecraftClient string[] sip = server.Split(':'); string host = sip[0]; ushort port = 25565; - + if (sip.Length > 1) { try @@ -458,7 +480,7 @@ namespace MinecraftClient ServerPort = Servers[server].Value; return true; } - + return false; }