You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

commands.md 4.2 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. # The Command Service
  2. [Discord.Commands](xref:Discord.Commands) provides an Attribute-based Command Parser.
  3. ### Setup
  4. To use Commands, you must create a [Commands Service](xref:Discord.Commands.CommandService) and a Command Handler.
  5. Included below is a very bare-bones Command Handler. You can extend your Command Handler as much as you like, however the below is the bare minimum.
  6. [!code-csharp[Barebones Command Handler](samples/command_handler.cs)]
  7. ## Modules
  8. Modules serve as a host for commands you create.
  9. To create a module, create a class that you will place commands in. Flag this class with the `[Module]` attribute. You may optionally pass in a string to the `Module` attribute to set a prefix for all of the commands inside the module.
  10. ### Example Module
  11. [!code-csharp[Modules](samples/module.cs)]
  12. #### Loading Modules Automatically
  13. The Command Service can automatically discover all classes in an Assembly that are flagged with the `Module` attribute, and load them.
  14. To have a module opt-out of auto-loading, pass `autoload: false` in the Module attribute.
  15. Invoke [CommandService.LoadAssembly](xref:Discord.Commands.CommandService#Discord_Commands_CommandService_LoadAssembly) to discover modules and install them.
  16. #### Loading Modules Manually
  17. To manually load a module, invoke [CommandService.Load](xref:Discord.Commands.CommandService#Discord_Commands_CommandService_Load), and pass in an instance of your module.
  18. ### Module Constructors
  19. When automatically loading modules, you are limited in your constructor. Using a constructor that accepts _no arguments_, or a constructor that accepts a @Discord.Commands.CommandService will always work.
  20. Alternatively, you can use an @Discord.Commands.IDependencyMap, as shown below.
  21. ## Dependency Injection
  22. The Commands Service includes a very basic implementation of Dependency Injection that allows you to have completely custom constructors, within certain limitations.
  23. ### Setup
  24. First, you need to create an @Discord.Commands.IDependencyMap . The library includes @Discord.Commands.DependencyMap to help with this, however you may create your own IDependencyMap if you wish.
  25. Next, add the dependencies your modules will use to the map.
  26. Finally, pass the map into the `LoadAssembly` method. Your modules will automatically be loaded with this dependency map.
  27. [!code-csharp[DependencyMap Setup](samples/dependency_map_setup.cs)]
  28. ### Usage in Modules
  29. In the constructor of your module, any parameters will be filled in by the @Discord.Commands.IDependencyMap you pass into `LoadAssembly`.
  30. >[!NOTE]
  31. >If you accept `CommandService` or `IDependencyMap` as a parameter in your constructor, these parameters will be filled by the CommandService the module was loaded from, and the DependencyMap passed into it, respectively.
  32. [!code-csharp[DependencyMap in Modules](samples/dependency_module.cs)]
  33. ## Type Readers
  34. Type Readers allow you to parse different types of arguments in your commands.
  35. By default, the following Types are supported arguments:
  36. - string
  37. - sbyte/byte
  38. - ushort/short
  39. - uint/int
  40. - ulong/long
  41. - float, double, decimal
  42. - DateTime/DateTimeOffset
  43. - IUser/IGuildUser
  44. - IChannel/IGuildChannel/ITextChannel/IVoiceChannel/IGroupChannel
  45. - IRole
  46. - IMessage
  47. ### Creating a Type Readers
  48. To create a TypeReader, create a new class that imports @Discord and @Discord.Commands . Ensure your class inherits from @Discord.Commands.TypeReader
  49. Next, satisfy the `TypeReader` class by overriding `Task<TypeReaderResult> Read(IMessage context, string input)`.
  50. >[!NOTE]
  51. >In many cases, Visual Stuido can fill this in for you, using the "Implement Abstract Class" IntelliSense hint.
  52. Inside this task, add whatever logic you need to parse the input string.
  53. Finally, return a `TypeReaderResult`. If you were able to successfully parse the input, return `TypeReaderResult.FromSuccess(parsedInput)`. Otherwise, return `TypeReaderResult.FromError`.
  54. #### Sample
  55. [!code-csharp[TypeReaders](samples/typereader.cs)]
  56. ### Installing TypeReaders
  57. TypeReaders are not automatically discovered by the Command Service, and must be explicitly added. To install a TypeReader, invoke [CommandService.AddTypeReader](xref:Discord.Commands.CommandService#Discord_Commands_CommandService_AddTypeReader__1_Discord_Commands_TypeReader_).