瀏覽代碼

Improve code style

akemimadoka 8 年之前
父節點
當前提交
a38b896c97

+ 1 - 1
src/MineCase.Server.Grains/Game/GameSession.cs

@@ -71,7 +71,7 @@ namespace MineCase.Server.Game
                 var command = message.Trim();
                 if (command[0] == '/')
                 {
-                    if (!_commandMap.Dispatch(await sender.GetPlayer(), message))
+                    if (!await _commandMap.Dispatch(await sender.GetPlayer(), message))
                     {
                         await sender.SendChatMessage(
                             await CreateStandardChatMessage(

+ 33 - 6
src/MineCase.Server.Interfaces/Game/Commands/CommandMap.cs

@@ -1,32 +1,59 @@
 using System;
 using System.Collections.Generic;
+using System.Diagnostics.Contracts;
 using System.Text;
+using System.Threading.Tasks;
 
 namespace MineCase.Server.Game.Commands
 {
+    /// <summary>
+    /// 命令 Map
+    /// </summary>
     public class CommandMap
     {
         private readonly Dictionary<string, ICommand> _commandMap = new Dictionary<string, ICommand>();
 
+        /// <summary>
+        /// 注册一个命令
+        /// </summary>
+        /// <param name="command">要注册的命令</param>
+        /// <exception cref="ArgumentNullException"><paramref name="command"/> 为 null</exception>
+        /// <exception cref="ArgumentException">已有重名的 command 被注册</exception>
         public void RegisterCommand(ICommand command)
         {
+            if (command == null)
+            {
+                throw new ArgumentNullException(nameof(command));
+            }
+
+            Contract.EndContractBlock();
+
             _commandMap.Add(command.Name, command);
         }
 
-        public bool Dispatch(ICommandSender sender, string commandContent)
+        /// <summary>
+        /// 分派命令
+        /// </summary>
+        /// <param name="sender">命令的发送者</param>
+        /// <param name="commandContent">命令的内容</param>
+        public Task<bool> Dispatch(ICommandSender sender, string commandContent)
         {
             var (commandName, args) = CommandParser.ParseCommand(commandContent);
 
             try
             {
-                return _commandMap.TryGetValue(commandName, out var command) &&
-                       (command.NeededPermission == null || sender.HasPermission(command.NeededPermission).Result) &&
-                       command.Execute(sender, args);
+                if (_commandMap.TryGetValue(commandName, out var command) &&
+                    (command.NeededPermission == null || sender.HasPermission(command.NeededPermission).Result))
+                {
+                    return command.Execute(sender, args);
+                }
+
+                return Task.FromResult(false);
             }
             catch (CommandException e)
             {
-                sender.SendMessage($"在执行指令 {commandName} 之时发生指令相关的异常 {e}");
-                return false;
+                sender.SendMessage($"在执行命令 {commandName} 之时发生命令相关的异常 {e}");
+                return Task.FromResult(false);
             }
         }
     }

+ 4 - 3
src/MineCase.Server.Interfaces/Game/Commands/CommandParser.cs

@@ -7,6 +7,7 @@ using System.Text;
 
 namespace MineCase.Server.Game.Commands
 {
+    /// <inheritdoc />
     /// <summary>
     /// 未解析参数
     /// </summary>
@@ -42,7 +43,7 @@ namespace MineCase.Server.Game.Commands
         /// <param name="input">输入,即作为命令被分析的文本,应当不为 null、经过 <see cref="string.Trim()"/> 处理且以 '/' 开头</param>
         /// <returns>命令名及命令的参数</returns>
         /// <exception cref="ArgumentException"><paramref name="input"/> 不合法</exception>
-        public static (string, IList<ICommandArgument>) ParseCommand(string input)
+        public static (string, IReadOnlyList<ICommandArgument>) ParseCommand(string input)
         {
             if (input == null || input.Length < 2 || input[0] != '/')
             {
@@ -58,8 +59,8 @@ namespace MineCase.Server.Game.Commands
             return (splitResult[0].Substring(1), ParseCommandArgument(splitResult.Skip(1)));
         }
 
-        // 参数必须保持原来的顺序,因此返回值使用 IList 而不是 IEnumerable
-        private static IList<ICommandArgument> ParseCommandArgument(IEnumerable<string> input)
+        // 参数必须保持原来的顺序,因此返回值使用 IReadOnlyList 而不是 IEnumerable
+        private static IReadOnlyList<ICommandArgument> ParseCommandArgument(IEnumerable<string> input)
         {
             var result = new List<ICommandArgument>();
 

+ 2 - 1
src/MineCase.Server.Interfaces/Game/Commands/DataTagArgument.cs

@@ -5,10 +5,11 @@ using MineCase.Nbt.Tags;
 
 namespace MineCase.Server.Game.Commands
 {
+    /// <inheritdoc />
     /// <summary>
     /// 数据标签参数
     /// </summary>
-    /// <remarks>表示一个 <see cref="NbtTag"/></remarks>
+    /// <remarks>表示一个 <see cref="NbtTag" /></remarks>
     public class DataTagArgument : UnresolvedArgument
     {
         internal const char PrefixToken = '{';

+ 5 - 2
src/MineCase.Server.Interfaces/Game/Commands/ICommand.cs

@@ -47,13 +47,14 @@ namespace MineCase.Server.Game.Commands
         /// <param name="args">命令的参数</param>
         /// <returns>执行是否成功,如果成功则返回 true</returns>
         /// <exception cref="CommandException">可能抛出派生自 <see cref="CommandException"/> 的异常</exception>
-        bool Execute(ICommandSender commandSender, IList<ICommandArgument> args);
+        Task<bool> Execute(ICommandSender commandSender, IReadOnlyList<ICommandArgument> args);
     }
 
+    /// <inheritdoc />
     /// <summary>
     /// 命令执行过程中可能发生的异常的基类
     /// </summary>
-    /// <remarks>派生自此类的异常在 <see cref="CommandMap.Dispatch(ICommandSender, string)"/> 中将会被吃掉,不会传播到外部</remarks>
+    /// <remarks>派生自此类的异常在 <see cref="M:MineCase.Server.Game.Commands.CommandMap.Dispatch(MineCase.Server.Game.Commands.ICommandSender,System.String)" /> 中将会被吃掉,不会传播到外部</remarks>
     public class CommandException : Exception
     {
         public ICommand Command { get; }
@@ -65,6 +66,7 @@ namespace MineCase.Server.Game.Commands
         }
     }
 
+    /// <inheritdoc />
     /// <summary>
     /// 表示命令的使用方式错误的异常
     /// </summary>
@@ -76,6 +78,7 @@ namespace MineCase.Server.Game.Commands
         }
     }
 
+    /// <inheritdoc />
     /// <summary>
     /// 可发送命令者接口
     /// </summary>

+ 3 - 1
src/MineCase.Server.Interfaces/Game/Commands/SimpleCommand.cs

@@ -1,8 +1,10 @@
 using System;
 using System.Collections.Generic;
+using System.Threading.Tasks;
 
 namespace MineCase.Server.Game.Commands
 {
+    /// <inheritdoc />
     /// <summary>
     /// 简单指令
     /// </summary>
@@ -30,6 +32,6 @@ namespace MineCase.Server.Game.Commands
             }
         }
 
-        public abstract bool Execute(ICommandSender commandSender, IList<ICommandArgument> args);
+        public abstract Task<bool> Execute(ICommandSender commandSender, IReadOnlyList<ICommandArgument> args);
     }
 }

+ 2 - 1
src/MineCase.Server.Interfaces/Game/Commands/TargetSelector.cs

@@ -52,8 +52,9 @@ namespace MineCase.Server.Game.Commands
         Executor
     }
 
+    /// <inheritdoc cref="UnresolvedArgument" />
     /// <summary>
-    /// 用于选择目标的 <see cref="ICommandArgument"/>
+    /// 用于选择目标的 <see cref="ICommandArgument" />
     /// </summary>
     public class TargetSelectorArgument : UnresolvedArgument, IEnumerable<KeyValuePair<string, string>>
     {

+ 1 - 0
src/MineCase.Server.Interfaces/Game/Commands/TildeNotationArgument.cs

@@ -4,6 +4,7 @@ using System.Text;
 
 namespace MineCase.Server.Game.Commands
 {
+    /// <inheritdoc />
     /// <summary>
     /// 波浪号记号参数
     /// </summary>

+ 3 - 3
tests/UnitTest/CommandTest.cs

@@ -36,14 +36,14 @@ namespace MineCase.UnitTest
         private class TestCommand : SimpleCommand
         {
             public TestCommand()
-                : base("test", null, null, null)
+                : base("test")
             {
             }
 
-            public override bool Execute(ICommandSender commandSender, IList<ICommandArgument> args)
+            public override Task<bool> Execute(ICommandSender commandSender, IReadOnlyList<ICommandArgument> args)
             {
                 commandSender.SendMessage(string.Join(", ", args.Select(arg => arg.ToString())));
-                return true;
+                return Task.FromResult(true);
             }
         }