mirror of
https://github.com/MCCTeam/Minecraft-Console-Client
synced 2025-10-14 21:22:49 +00:00
Commands as separate classes
Each command is now in its own class in the 'Commands' namespace, and loaded through reflection.
This commit is contained in:
parent
715bc09872
commit
36690b8b34
12 changed files with 322 additions and 78 deletions
|
|
@ -8,7 +8,8 @@ namespace MinecraftClient
|
||||||
///
|
///
|
||||||
/// Welcome to the Bot API file !
|
/// Welcome to the Bot API file !
|
||||||
/// The virtual class "ChatBot" contains anything you need for creating chat bots
|
/// The virtual class "ChatBot" contains anything you need for creating chat bots
|
||||||
/// Inherit from this class while adding your bot class to the folder "Bots".
|
/// Inherit from this class while adding your bot class to the folder "ChatBots".
|
||||||
|
/// Override the methods you want for handling events: Initialize, Update, GetText.
|
||||||
/// Once your bot is created, read the explanations below to start using it in the MinecraftClient app.
|
/// Once your bot is created, read the explanations below to start using it in the MinecraftClient app.
|
||||||
///
|
///
|
||||||
/// Pieces of code to add in other parts of the program for your bot. Line numbers are approximative.
|
/// Pieces of code to add in other parts of the program for your bot. Line numbers are approximative.
|
||||||
|
|
|
||||||
78
MinecraftClient/Command.cs
Normal file
78
MinecraftClient/Command.cs
Normal file
|
|
@ -0,0 +1,78 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace MinecraftClient
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Represents an internal MCC command: Command name, source code and usage message
|
||||||
|
/// To add a new command, inherit from this class while adding the command class to the folder "Commands".
|
||||||
|
/// If inheriting from the 'Command' class and placed in the 'Commands' namespace, the command will be
|
||||||
|
/// automatically loaded and available in main chat prompt, scripts, remote control and command help.
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
public abstract class Command
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The command name
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
public abstract string CMDName { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Usage message, eg: 'name [args]: do something'
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
public abstract string CMDDesc { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Perform the command
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="command">The full command, eg: 'mycommand arg1 arg2'</param>
|
||||||
|
/// <returns>A confirmation/error message, or "" if no message</returns>
|
||||||
|
|
||||||
|
public abstract string Run(McTcpClient handler, string command);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return a list of aliases for this command.
|
||||||
|
/// Override this method if you wish to put aliases to the command
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
public virtual IEnumerable<string> getCMDAliases() { return new string[0]; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Check if at least one argument has been passed to the command
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
public static bool hasArg(string command)
|
||||||
|
{
|
||||||
|
int first_space = command.IndexOf(' ');
|
||||||
|
return (first_space > 0 && first_space < command.Length - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Extract the argument string from the command
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>Argument or "" if no argument</returns>
|
||||||
|
|
||||||
|
public static string getArg(string command)
|
||||||
|
{
|
||||||
|
if (hasArg(command))
|
||||||
|
{
|
||||||
|
return command.Substring(command.IndexOf(' ') + 1);
|
||||||
|
}
|
||||||
|
else return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Extract the arguments as a string array from the command
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>Argument array or empty array if no arguments</returns>
|
||||||
|
|
||||||
|
public static string[] getArgs(string command)
|
||||||
|
{
|
||||||
|
return getArg(command).Split(' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
24
MinecraftClient/Commands/Connect.cs
Normal file
24
MinecraftClient/Commands/Connect.cs
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace MinecraftClient.Commands
|
||||||
|
{
|
||||||
|
public class Connect : Command
|
||||||
|
{
|
||||||
|
public override string CMDName { get { return "connect"; } }
|
||||||
|
public override string CMDDesc { get { return "connect <serverip>: connect to the specified server."; } }
|
||||||
|
|
||||||
|
public override string Run(McTcpClient handler, string command)
|
||||||
|
{
|
||||||
|
if (hasArg(command))
|
||||||
|
{
|
||||||
|
Settings.setServerIP(getArgs(command)[0]);
|
||||||
|
Program.Restart();
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
else return CMDDesc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
24
MinecraftClient/Commands/Exit.cs
Normal file
24
MinecraftClient/Commands/Exit.cs
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace MinecraftClient.Commands
|
||||||
|
{
|
||||||
|
public class Exit : Command
|
||||||
|
{
|
||||||
|
public override string CMDName { get { return "exit"; } }
|
||||||
|
public override string CMDDesc { get { return "exit: disconnect from the server."; } }
|
||||||
|
|
||||||
|
public override string Run(McTcpClient handler, string command)
|
||||||
|
{
|
||||||
|
Program.Exit();
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public override IEnumerable<string> getCMDAliases()
|
||||||
|
{
|
||||||
|
return new string[] { "quit" };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
19
MinecraftClient/Commands/Reco.cs
Normal file
19
MinecraftClient/Commands/Reco.cs
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace MinecraftClient.Commands
|
||||||
|
{
|
||||||
|
public class Reco : Command
|
||||||
|
{
|
||||||
|
public override string CMDName { get { return "reco"; } }
|
||||||
|
public override string CMDDesc { get { return "reco: restart and reconnect to the server."; } }
|
||||||
|
|
||||||
|
public override string Run(McTcpClient handler, string command)
|
||||||
|
{
|
||||||
|
Program.Restart();
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
19
MinecraftClient/Commands/Respawn.cs
Normal file
19
MinecraftClient/Commands/Respawn.cs
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace MinecraftClient.Commands
|
||||||
|
{
|
||||||
|
public class Respawn : Command
|
||||||
|
{
|
||||||
|
public override string CMDName { get { return "respawn"; } }
|
||||||
|
public override string CMDDesc { get { return "respawn: respawn after death."; } }
|
||||||
|
|
||||||
|
public override string Run(McTcpClient handler, string command)
|
||||||
|
{
|
||||||
|
handler.SendRespawnPacket();
|
||||||
|
return "You have respawned.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
23
MinecraftClient/Commands/Script.cs
Normal file
23
MinecraftClient/Commands/Script.cs
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace MinecraftClient.Commands
|
||||||
|
{
|
||||||
|
public class Script : Command
|
||||||
|
{
|
||||||
|
public override string CMDName { get { return "script"; } }
|
||||||
|
public override string CMDDesc { get { return "script <scriptname>: run a script file."; } }
|
||||||
|
|
||||||
|
public override string Run(McTcpClient handler, string command)
|
||||||
|
{
|
||||||
|
if (hasArg(command))
|
||||||
|
{
|
||||||
|
handler.BotLoad(new ChatBots.Script(getArg(command)));
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
else return CMDDesc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
23
MinecraftClient/Commands/Send.cs
Normal file
23
MinecraftClient/Commands/Send.cs
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace MinecraftClient.Commands
|
||||||
|
{
|
||||||
|
public class Send : Command
|
||||||
|
{
|
||||||
|
public override string CMDName { get { return "send"; } }
|
||||||
|
public override string CMDDesc { get { return "send <text>: send a chat message or command."; } }
|
||||||
|
|
||||||
|
public override string Run(McTcpClient handler, string command)
|
||||||
|
{
|
||||||
|
if (hasArg(command))
|
||||||
|
{
|
||||||
|
handler.SendChatMessage(getArg(command));
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
else return CMDDesc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
31
MinecraftClient/Commands/Set.cs
Normal file
31
MinecraftClient/Commands/Set.cs
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace MinecraftClient.Commands
|
||||||
|
{
|
||||||
|
public class Set : Command
|
||||||
|
{
|
||||||
|
public override string CMDName { get { return "set"; } }
|
||||||
|
public override string CMDDesc { get { return "set varname=value: set a custom %variable%."; } }
|
||||||
|
|
||||||
|
public override string Run(McTcpClient handler, string command)
|
||||||
|
{
|
||||||
|
if (hasArg(command))
|
||||||
|
{
|
||||||
|
string[] temp = getArg(command).Split('=');
|
||||||
|
if (temp.Length > 1)
|
||||||
|
{
|
||||||
|
if (Settings.setVar(temp[0], getArg(command).Substring(temp[0].Length + 1)))
|
||||||
|
{
|
||||||
|
return ""; //Success
|
||||||
|
}
|
||||||
|
else return "variable name must be A-Za-z0-9.";
|
||||||
|
}
|
||||||
|
else return CMDDesc;
|
||||||
|
}
|
||||||
|
else return CMDDesc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -17,6 +17,8 @@ namespace MinecraftClient
|
||||||
|
|
||||||
public class McTcpClient : IMinecraftComHandler
|
public class McTcpClient : IMinecraftComHandler
|
||||||
{
|
{
|
||||||
|
private static List<string> cmd_names = new List<string>();
|
||||||
|
private static Dictionary<string, Command> cmds = new Dictionary<string, Command>();
|
||||||
private List<ChatBot> bots = new List<ChatBot>();
|
private List<ChatBot> bots = new List<ChatBot>();
|
||||||
private static List<ChatBots.Script> scripts_on_hold = new List<ChatBots.Script>();
|
private static List<ChatBots.Script> scripts_on_hold = new List<ChatBots.Script>();
|
||||||
public void BotLoad(ChatBot b) { b.SetHandler(this); bots.Add(b); b.Initialize(); Settings.SingleCommand = ""; }
|
public void BotLoad(ChatBot b) { b.SetHandler(this); bots.Add(b); b.Initialize(); Settings.SingleCommand = ""; }
|
||||||
|
|
@ -206,89 +208,57 @@ namespace MinecraftClient
|
||||||
|
|
||||||
public bool performInternalCommand(string command, ref string response_msg)
|
public bool performInternalCommand(string command, ref string response_msg)
|
||||||
{
|
{
|
||||||
response_msg = "";
|
/* Load commands from the 'Commands' namespace */
|
||||||
string[] command_args = command.Split(' ');
|
|
||||||
string command_name = command_args[0].ToLower();
|
if (cmds.Count == 0)
|
||||||
switch (command_name)
|
|
||||||
{
|
{
|
||||||
case "exit":
|
Type[] cmds_classes = Program.GetTypesInNamespace("MinecraftClient.Commands");
|
||||||
case "quit":
|
foreach (Type type in cmds_classes)
|
||||||
Program.Exit();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "reco":
|
|
||||||
Program.Restart();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "respawn":
|
|
||||||
handler.SendRespawnPacket();
|
|
||||||
response_msg = "You have respawned.";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "send":
|
|
||||||
if (command.Length > 5)
|
|
||||||
{
|
{
|
||||||
string text = command.Substring(5);
|
if (type.IsSubclassOf(typeof(Command)))
|
||||||
SendChatMessage(text);
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Command cmd = (Command)Activator.CreateInstance(type);
|
||||||
|
cmds[cmd.CMDName.ToLower()] = cmd;
|
||||||
|
cmd_names.Add(cmd.CMDName.ToLower());
|
||||||
|
foreach (string alias in cmd.getCMDAliases())
|
||||||
|
cmds[alias.ToLower()] = cmd;
|
||||||
}
|
}
|
||||||
else response_msg = "send <text>: send a chat message or command.";
|
catch (Exception e)
|
||||||
break;
|
|
||||||
|
|
||||||
case "set":
|
|
||||||
if (command.Length > 3)
|
|
||||||
{
|
{
|
||||||
string[] temp = command.Substring(4).Split('=');
|
ConsoleIO.WriteLine(e.Message);
|
||||||
if (temp.Length > 1)
|
}
|
||||||
{
|
|
||||||
if (!Settings.setVar(temp[0], command.Substring(temp[0].Length + 5)))
|
|
||||||
{
|
|
||||||
response_msg = "variable name must be A-Za-z0-9.";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else response_msg = "set varname=value: set a custom %variable%.";
|
|
||||||
}
|
}
|
||||||
else response_msg = "set varname=value: set a custom %variable%.";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "script":
|
/* Process the provided command */
|
||||||
if (command.Length > 8)
|
|
||||||
{
|
|
||||||
BotLoad(new ChatBots.Script(command.Substring(8)));
|
|
||||||
}
|
|
||||||
else response_msg = "script <scriptname>: run a script file.";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "connect":
|
string command_name = command.Split(' ')[0].ToLower();
|
||||||
if (command_args.Length > 1)
|
if (command_name == "help")
|
||||||
{
|
{
|
||||||
Settings.setServerIP(command_args[1]);
|
if (Command.hasArg(command))
|
||||||
Program.Restart();
|
|
||||||
}
|
|
||||||
else response_msg = "connect <serverip>: connect to the specified server.";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "help":
|
|
||||||
if (command.Length >= 6)
|
|
||||||
{
|
{
|
||||||
string help_cmd_name = command.Substring(5).ToLower();
|
string help_cmdname = Command.getArgs(command)[0].ToLower();
|
||||||
switch (help_cmd_name)
|
if (help_cmdname == "help")
|
||||||
{
|
{
|
||||||
case "quit": response_msg = "quit: disconnect from the server."; break;
|
response_msg = "help <cmdname>: show brief help about a command.";
|
||||||
case "exit": response_msg = "exit: disconnect from the server."; break;
|
|
||||||
case "reco": response_msg = "reco: restart and reconnct to the server."; break;
|
|
||||||
case "respawn": response_msg = "respawn: respawn after death."; break;
|
|
||||||
case "send": response_msg = "send <text>: send a chat message or command."; break;
|
|
||||||
case "set": response_msg = "set varname=value: set a custom %variable%."; break;
|
|
||||||
case "script": response_msg = "script <scriptname>: run a script file."; break;
|
|
||||||
case "connect": response_msg = "connect <serverip>: connect to the specified server."; break;
|
|
||||||
case "help": response_msg = "help <cmdname>: show brief help about a command."; break;
|
|
||||||
default: response_msg = "help: unknown command '" + help_cmd_name + "'."; break;
|
|
||||||
}
|
}
|
||||||
|
else if (cmds.ContainsKey(help_cmdname))
|
||||||
|
{
|
||||||
|
response_msg = cmds[help_cmdname].CMDDesc;
|
||||||
}
|
}
|
||||||
else response_msg = "help <cmdname>. Available commands: exit, reco, script, send, connect.";
|
else response_msg = "Unknown command '" + command_name + "'. Use 'help' for command list.";
|
||||||
break;
|
}
|
||||||
|
else response_msg = "help <cmdname>. Available commands: " + String.Join(", ", cmd_names.ToArray());
|
||||||
default:
|
}
|
||||||
|
else if (cmds.ContainsKey(command_name))
|
||||||
|
{
|
||||||
|
response_msg = cmds[command_name].Run(this, command);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
response_msg = "Unknown command '" + command_name + "'. Use 'help' for help.";
|
response_msg = "Unknown command '" + command_name + "'. Use 'help' for help.";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
@ -404,5 +374,15 @@ namespace MinecraftClient
|
||||||
}
|
}
|
||||||
else return handler.SendChatMessage(text);
|
else return handler.SendChatMessage(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Allow to respawn after death
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>True if packet successfully sent</returns>
|
||||||
|
|
||||||
|
public bool SendRespawnPacket()
|
||||||
|
{
|
||||||
|
return handler.SendRespawnPacket();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -81,6 +81,14 @@
|
||||||
<Compile Include="ChatBots\ScriptScheduler.cs" />
|
<Compile Include="ChatBots\ScriptScheduler.cs" />
|
||||||
<Compile Include="ChatBots\TestBot.cs" />
|
<Compile Include="ChatBots\TestBot.cs" />
|
||||||
<Compile Include="ChatBot.cs" />
|
<Compile Include="ChatBot.cs" />
|
||||||
|
<Compile Include="Command.cs" />
|
||||||
|
<Compile Include="Commands\Connect.cs" />
|
||||||
|
<Compile Include="Commands\Exit.cs" />
|
||||||
|
<Compile Include="Commands\Reco.cs" />
|
||||||
|
<Compile Include="Commands\Respawn.cs" />
|
||||||
|
<Compile Include="Commands\Script.cs" />
|
||||||
|
<Compile Include="Commands\Send.cs" />
|
||||||
|
<Compile Include="Commands\Set.cs" />
|
||||||
<Compile Include="ConsoleIO.cs" />
|
<Compile Include="ConsoleIO.cs" />
|
||||||
<Compile Include="Crypto\Streams\MonoAesStream.cs" />
|
<Compile Include="Crypto\Streams\MonoAesStream.cs" />
|
||||||
<Compile Include="Crypto\Streams\RegularAesStream.cs" />
|
<Compile Include="Crypto\Streams\RegularAesStream.cs" />
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using MinecraftClient.Protocol;
|
using MinecraftClient.Protocol;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
namespace MinecraftClient
|
namespace MinecraftClient
|
||||||
{
|
{
|
||||||
|
|
@ -285,5 +286,18 @@ namespace MinecraftClient
|
||||||
if (Client != null) { Client.Disconnect(); ConsoleIO.Reset(); }
|
if (Client != null) { Client.Disconnect(); ConsoleIO.Reset(); }
|
||||||
Environment.Exit(0);
|
Environment.Exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Enumerate types in namespace through reflection
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="nameSpace">Namespace to process</param>
|
||||||
|
/// <param name="assembly">Assembly to use. Default is Assembly.GetExecutingAssembly()</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
|
||||||
|
public static Type[] GetTypesInNamespace(string nameSpace, Assembly assembly = null)
|
||||||
|
{
|
||||||
|
if (assembly == null) { assembly = Assembly.GetExecutingAssembly(); }
|
||||||
|
return assembly.GetTypes().Where(t => String.Equals(t.Namespace, nameSpace, StringComparison.Ordinal)).ToArray();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue