CommandAttribute changed to Command. Usage and ArgsLength added to Command

This commit is contained in:
EntenKoeniq 2021-12-02 23:05:22 +01:00
parent 33cda5dcfb
commit f00bfa2526
2 changed files with 49 additions and 14 deletions

View File

@ -728,19 +728,40 @@ namespace CoopServer
if (MainResource != null) if (MainResource != null)
{ {
if (packet.Message.StartsWith("/")) if (packet.Message.StartsWith('/'))
{ {
string[] cmdArgs = packet.Message.Split(" "); string[] cmdArgs = packet.Message.Split(" ");
string cmdName = cmdArgs[0].Remove(0, 1); string cmdName = cmdArgs[0].Remove(0, 1);
if (Commands.Any(x => x.Key.Name == cmdName)) if (Commands.Any(x => x.Key.Name == cmdName))
{ {
string[] argsWithoutCmd = cmdArgs.Skip(1).ToArray();
CommandContext ctx = new() CommandContext ctx = new()
{ {
Client = Clients.First(x => x.Player.Username == packet.Username), Client = Clients.FirstOrDefault(x => x.Player.Username == packet.Username),
Args = cmdArgs.Skip(1).ToArray() Args = argsWithoutCmd
}; };
KeyValuePair<Command, Action<CommandContext>> command = Commands.First(x => x.Key.Name == cmdName); KeyValuePair<Command, Action<CommandContext>> command = Commands.First(x => x.Key.Name == cmdName);
if (command.Key.Usage != null && command.Key.ArgsLength != argsWithoutCmd.Length)
{
NetConnection userConnection = Util.GetConnectionByUsername(packet.Username);
if (userConnection == default)
{
return;
}
outgoingMessage = MainNetServer.CreateMessage();
new ChatMessagePacket()
{
Username = "Server",
Message = command.Key.Usage
}.PacketToNetOutGoingMessage(outgoingMessage);
MainNetServer.SendMessage(outgoingMessage, userConnection, NetDeliveryMethod.ReliableOrdered, 0);
return;
}
command.Value.Invoke(ctx); command.Value.Invoke(ctx);
} }
else else
@ -807,9 +828,20 @@ namespace CoopServer
} }
#endregion #endregion
public static void RegisterCommand(string name, string usage, short argsLength, Action<CommandContext> callback)
{
Command command = new(name) { Usage = usage, ArgsLength = argsLength };
if (Commands.ContainsKey(command))
{
throw new Exception("Command \"" + command.Name + "\" was already been registered!");
}
Commands.Add(command, callback);
}
public static void RegisterCommand(string name, Action<CommandContext> callback) public static void RegisterCommand(string name, Action<CommandContext> callback)
{ {
Command command = new() { Name = name }; Command command = new(name);
if (Commands.ContainsKey(command)) if (Commands.ContainsKey(command))
{ {
@ -821,13 +853,13 @@ namespace CoopServer
public static void RegisterCommands<T>() public static void RegisterCommands<T>()
{ {
IEnumerable<MethodInfo> commands = typeof(T).GetMethods().Where(method => method.GetCustomAttributes(typeof(CommandAttribute), false).Any()); IEnumerable<MethodInfo> commands = typeof(T).GetMethods().Where(method => method.GetCustomAttributes(typeof(Command), false).Any());
foreach (MethodInfo method in commands) foreach (MethodInfo method in commands)
{ {
CommandAttribute attribute = method.GetCustomAttribute<CommandAttribute>(true); Command attribute = method.GetCustomAttribute<Command>(true);
RegisterCommand(attribute.Name, (Action<CommandContext>)Delegate.CreateDelegate(typeof(Action<CommandContext>), method)); RegisterCommand(attribute.Name, attribute.Usage, attribute.ArgsLength, (Action<CommandContext>)Delegate.CreateDelegate(typeof(Action<CommandContext>), method));
} }
} }
} }

View File

@ -298,6 +298,10 @@ namespace CoopServer
} }
} }
public static void RegisterCommand(string name, string usage, short argsLength, Action<CommandContext> callback)
{
Server.RegisterCommand(name, usage, argsLength, callback);
}
public static void RegisterCommand(string name, Action<CommandContext> callback) public static void RegisterCommand(string name, Action<CommandContext> callback)
{ {
Server.RegisterCommand(name, callback); Server.RegisterCommand(name, callback);
@ -310,20 +314,19 @@ namespace CoopServer
#endregion #endregion
} }
public class Command
{
public string Name { get; set; }
}
[AttributeUsage(AttributeTargets.Method)] [AttributeUsage(AttributeTargets.Method)]
public class CommandAttribute : Attribute public class Command : Attribute
{ {
/// <summary> /// <summary>
/// Sets name of the command /// Sets name of the command
/// </summary> /// </summary>
public string Name { get; set; } public string Name { get; set; }
public CommandAttribute(string name) public string Usage { get; set; }
public short ArgsLength { get; set; }
public Command(string name)
{ {
Name = name; Name = name;
} }