@@ -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).