diff --git a/MinecraftClient/Commands/ExecIf.cs b/MinecraftClient/Commands/ExecIf.cs new file mode 100644 index 00000000..df2c9e37 --- /dev/null +++ b/MinecraftClient/Commands/ExecIf.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using DynamicExpresso; + +namespace MinecraftClient.Commands +{ + class ExecIf : Command + { + public override string CmdName { get { return "execif"; } } + public override string CmdUsage { get { return "execif ---> "; } } + public override string CmdDesc { get { return "cmd.execif.desc"; } } + + public override string Run(McClient handler, string command, Dictionary localVars) + { + if (hasArg(command)) + { + string commandsString = getArg(command); + + if (!commandsString.Contains("--->")) + return GetCmdDescTranslated(); + + string[] parts = commandsString.Split("--->", StringSplitOptions.TrimEntries) + .ToList() + .ConvertAll(command => command.Trim()) + .ToArray(); + + if (parts.Length == 0) + return GetCmdDescTranslated(); + + string expressionText = parts[0]; + string resultCommand = parts[1]; + + try + { + var interpreter = new Interpreter(); + interpreter.SetVariable("MCC", handler); + + foreach (KeyValuePair entry in Settings.GetVariables()) + interpreter.SetVariable(entry.Key, entry.Value); + + var result = interpreter.Eval(expressionText); + + if (result != null) + { + bool shouldExec = result; + + /*if (result is bool) + shouldExec = (bool)result; + else if (result is string) + shouldExec = !string.IsNullOrEmpty((string)result) && ((string)result).Trim().Contains("true", StringComparison.OrdinalIgnoreCase); + else if (result is int) + shouldExec = (int)result > 0; + else if (result is double) + shouldExec = (double)result > 0; + else if (result is float) + shouldExec = (float)result > 0; + else if (result is Int16) + shouldExec = (Int16)result > 0; + else if (result is Int32) + shouldExec = (Int32)result > 0; + else if (result is Int64) + shouldExec = (Int64)result > 0; + */ + + handler.Log.Debug("[Execif] Result Type: " + result.GetType().Name); + + if (shouldExec) + { + string output = ""; + handler.PerformInternalCommand(resultCommand, ref output); + + if (string.IsNullOrEmpty(output)) + handler.Log.Debug(Translations.TryGet("cmd.execif.executed_no_output", expressionText, resultCommand)); + else handler.Log.Debug(Translations.TryGet("cmd.execif.executed", expressionText, resultCommand, output)); + + return ""; + } + + return ""; + } + } + catch (Exception e) + { + handler.Log.Error(Translations.TryGet("cmd.execif.error_occured", command)); + handler.Log.Error(Translations.TryGet("cmd.execif.error", e.Message)); + return ""; + } + + return GetCmdDescTranslated(); + } + + return GetCmdDescTranslated(); + } + + + } +} diff --git a/MinecraftClient/Commands/ExecMulti.cs b/MinecraftClient/Commands/ExecMulti.cs new file mode 100644 index 00000000..a7ad217f --- /dev/null +++ b/MinecraftClient/Commands/ExecMulti.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace MinecraftClient.Commands +{ + class ExecMulti : Command + { + public override string CmdName { get { return "execmulti"; } } + public override string CmdUsage { get { return "execmulti -> -> -> ..."; } } + public override string CmdDesc { get { return "cmd.execmulti.desc"; } } + + public override string Run(McClient handler, string command, Dictionary localVars) + { + if (hasArg(command)) + { + string commandsString = getArg(command); + + if (commandsString.Contains("execmulti", StringComparison.OrdinalIgnoreCase) || commandsString.Contains("execif", StringComparison.OrdinalIgnoreCase)) + return Translations.TryGet("cmd.execmulti.prevent"); + + IEnumerable commands = commandsString.Split("->", StringSplitOptions.TrimEntries) + .ToList() + .FindAll(command => !string.IsNullOrEmpty(command)); + + foreach (string cmd in commands) + { + string output = ""; + handler.PerformInternalCommand(cmd, ref output); + + string log = Translations.TryGet( + "cmd.execmulti.executed", cmd, + string.IsNullOrEmpty(output) ? Translations.TryGet("cmd.execmulti.no_result") : Translations.TryGet("cmd.execmulti.result", output)); + + if (output.Contains("unknown command", StringComparison.OrdinalIgnoreCase)) + handler.Log.Error(log); + else handler.Log.Info(log); + } + + return ""; + } + + return GetCmdDescTranslated(); + } + } +} diff --git a/MinecraftClient/McClient.cs b/MinecraftClient/McClient.cs index 82e3c8fc..99913424 100644 --- a/MinecraftClient/McClient.cs +++ b/MinecraftClient/McClient.cs @@ -571,7 +571,7 @@ namespace MinecraftClient { string response_msg = ""; string command = Settings.internalCmdChar == ' ' ? text : text.Substring(1); - if (!PerformInternalCommand(Settings.ExpandVars(command), ref response_msg) && Settings.internalCmdChar == '/') + if (!PerformInternalCommand(Settings.ExpandVars(command), ref response_msg, Settings.GetVariables()) && Settings.internalCmdChar == '/') { SendText(text); } @@ -659,6 +659,7 @@ namespace MinecraftClient else if (cmds.ContainsKey(command_name)) { response_msg = cmds[command_name].Run(this, command, localVars); + foreach (ChatBot bot in bots.ToArray()) { try diff --git a/MinecraftClient/MinecraftClient.csproj b/MinecraftClient/MinecraftClient.csproj index 1d99f102..794364ff 100644 --- a/MinecraftClient/MinecraftClient.csproj +++ b/MinecraftClient/MinecraftClient.csproj @@ -29,6 +29,7 @@ + diff --git a/MinecraftClient/Resources/lang/en.ini b/MinecraftClient/Resources/lang/en.ini index cddecfca..32cd5b1d 100644 --- a/MinecraftClient/Resources/lang/en.ini +++ b/MinecraftClient/Resources/lang/en.ini @@ -273,6 +273,19 @@ cmd.entityCmd.distance=Distance cmd.entityCmd.location=Location cmd.entityCmd.type=Type +# Exec If +cmd.execif.desc=Allows you to execute a command if a condition is met. (You can use variables from MinecraftClient.ini and /set command, as well as CSharp expressions) +cmd.execif.executed=The condition '{0}' was met, executed command '{1}' with result '{2}'. +cmd.execif.executed_no_output=The condition '{0}' was met, executed command '{1}', no result was returned. +cmd.execif.error_occured=An error has occured while executing the command: {0} +cmd.execif.error=Error: {0} + +# Exec Multi +cmd.execmulti.desc=Execute multiple commands one after another +cmd.execmulti.executed=Executed the command '{0}' with {1} +cmd.execmulti.result=result '{0}'! +cmd.execmulti.no_result=no result! + # Exit cmd.exit.desc=disconnect from the server. diff --git a/MinecraftClient/Settings.cs b/MinecraftClient/Settings.cs index 9a6a376f..46c82a67 100644 --- a/MinecraftClient/Settings.cs +++ b/MinecraftClient/Settings.cs @@ -1096,6 +1096,15 @@ namespace MinecraftClient return null; } + /// + /// Get a dictionary containing variables (names and value) + /// + /// A IDictionary containing a name and a vlaue key pairs of variables + public static Dictionary GetVariables() + { + return AppVars; + } + /// /// Replace %variables% with their value from global AppVars ///