| @@ -1,6 +1,7 @@ | |||||
| using System; | using System; | ||||
| using System.Reflection; | using System.Reflection; | ||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||
| using Microsoft.Extensions.DependencyInjection; | |||||
| using Discord; | using Discord; | ||||
| using Discord.Commands; | using Discord.Commands; | ||||
| using Discord.WebSocket; | using Discord.WebSocket; | ||||
| @@ -9,8 +10,8 @@ class Program | |||||
| { | { | ||||
| private readonly DiscordSocketClient _client; | private readonly DiscordSocketClient _client; | ||||
| // Keep the CommandService and IDependencyMap around for use with commands. | |||||
| private readonly IDependencyMap _map = new DependencyMap(); | |||||
| // Keep the CommandService and IServiceCollection around for use with commands. | |||||
| private readonly IServiceCollection _map = new ServiceCollection(); | |||||
| private readonly CommandService _commands = new CommandService(); | private readonly CommandService _commands = new CommandService(); | ||||
| // Program entry point | // Program entry point | ||||
| @@ -78,22 +79,29 @@ class Program | |||||
| // Login and connect. | // Login and connect. | ||||
| await _client.LoginAsync(TokenType.Bot, /* <DON'T HARDCODE YOUR TOKEN> */); | await _client.LoginAsync(TokenType.Bot, /* <DON'T HARDCODE YOUR TOKEN> */); | ||||
| await _client.StartAsync(); | await _client.StartAsync(); | ||||
| // Wait infinitely so your bot actually stays connected. | // Wait infinitely so your bot actually stays connected. | ||||
| await Task.Delay(-1); | await Task.Delay(-1); | ||||
| } | } | ||||
| private IServiceProvider _services; | |||||
| private async Task InitCommands() | private async Task InitCommands() | ||||
| { | { | ||||
| // Repeat this for all the service classes | // Repeat this for all the service classes | ||||
| // and other dependencies that your commands might need. | // and other dependencies that your commands might need. | ||||
| _map.Add(new SomeServiceClass()); | |||||
| _map.AddSingleton(new SomeServiceClass()); | |||||
| // Either search the program and add all Module classes that can be found: | // Either search the program and add all Module classes that can be found: | ||||
| await _commands.AddModulesAsync(Assembly.GetEntryAssembly()); | await _commands.AddModulesAsync(Assembly.GetEntryAssembly()); | ||||
| // Or add Modules manually if you prefer to be a little more explicit: | // Or add Modules manually if you prefer to be a little more explicit: | ||||
| await _commands.AddModuleAsync<SomeModule>(); | await _commands.AddModuleAsync<SomeModule>(); | ||||
| // When all your required services are in the collection, build the container. | |||||
| // Tip: There's an overload taking in a 'validateScopes' bool to make sure | |||||
| // you haven't made any mistakes in your dependency graph. | |||||
| _services = _map.BuildServiceProvider(); | |||||
| // Subscribe a handler to see if a message invokes a command. | // Subscribe a handler to see if a message invokes a command. | ||||
| _client.MessageReceived += HandleCommandAsync; | _client.MessageReceived += HandleCommandAsync; | ||||
| } | } | ||||
| @@ -110,14 +118,14 @@ class Program | |||||
| // you want to prefix your commands with. | // you want to prefix your commands with. | ||||
| // Uncomment the second half if you also want | // Uncomment the second half if you also want | ||||
| // commands to be invoked by mentioning the bot instead. | // commands to be invoked by mentioning the bot instead. | ||||
| if (msg.HasCharPrefix('!', ref pos) /* || msg.HasMentionPrefix(msg.Discord.CurrentUser, ref pos) */) | |||||
| if (msg.HasCharPrefix('!', ref pos) /* || msg.HasMentionPrefix(_client.CurrentUser, ref pos) */) | |||||
| { | { | ||||
| // Create a Command Context | // Create a Command Context | ||||
| var context = new SocketCommandContext(msg.Discord, msg); | |||||
| var context = new SocketCommandContext(_client, msg); | |||||
| // Execute the command. (result does not indicate a return value, | // Execute the command. (result does not indicate a return value, | ||||
| // rather an object stating if the command executed succesfully). | // rather an object stating if the command executed succesfully). | ||||
| var result = await _commands.ExecuteAsync(context, pos, _map); | |||||
| var result = await _commands.ExecuteAsync(context, pos, _services); | |||||
| // Uncomment the following lines if you want the bot | // Uncomment the following lines if you want the bot | ||||
| // to send a message if it failed (not advised for most situations). | // to send a message if it failed (not advised for most situations). | ||||