|
|
@@ -1,6 +1,7 @@ |
|
|
|
using System; |
|
|
|
using System.Reflection; |
|
|
|
using System.Threading.Tasks; |
|
|
|
using Microsoft.Extensions.DependencyInjection; |
|
|
|
using Discord; |
|
|
|
using Discord.Commands; |
|
|
|
using Discord.WebSocket; |
|
|
@@ -9,8 +10,8 @@ class Program |
|
|
|
{ |
|
|
|
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(); |
|
|
|
|
|
|
|
// Program entry point |
|
|
@@ -78,22 +79,29 @@ class Program |
|
|
|
// Login and connect. |
|
|
|
await _client.LoginAsync(TokenType.Bot, /* <DON'T HARDCODE YOUR TOKEN> */); |
|
|
|
await _client.StartAsync(); |
|
|
|
|
|
|
|
|
|
|
|
// Wait infinitely so your bot actually stays connected. |
|
|
|
await Task.Delay(-1); |
|
|
|
} |
|
|
|
|
|
|
|
private IServiceProvider _services; |
|
|
|
|
|
|
|
private async Task InitCommands() |
|
|
|
{ |
|
|
|
// Repeat this for all the service classes |
|
|
|
// 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: |
|
|
|
await _commands.AddModulesAsync(Assembly.GetEntryAssembly()); |
|
|
|
// Or add Modules manually if you prefer to be a little more explicit: |
|
|
|
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. |
|
|
|
_client.MessageReceived += HandleCommandAsync; |
|
|
|
} |
|
|
@@ -110,14 +118,14 @@ class Program |
|
|
|
// you want to prefix your commands with. |
|
|
|
// Uncomment the second half if you also want |
|
|
|
// 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 |
|
|
|
var context = new SocketCommandContext(msg.Discord, msg); |
|
|
|
var context = new SocketCommandContext(_client, msg); |
|
|
|
|
|
|
|
// Execute the command. (result does not indicate a return value, |
|
|
|
// 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 |
|
|
|
// to send a message if it failed (not advised for most situations). |
|
|
|