using System; using System.Reflection; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Discord; using Discord.Commands; using Discord.WebSocket; namespace _03_sharded_client.Services { public class CommandHandlingService { private readonly CommandService _commands; private readonly DiscordShardedClient _discord; private readonly IServiceProvider _services; public CommandHandlingService(IServiceProvider services) { _commands = services.GetRequiredService(); _discord = services.GetRequiredService(); _services = services; _discord.MessageReceived += MessageReceivedAsync; } public async Task InitializeAsync() { await _commands.AddModulesAsync(Assembly.GetEntryAssembly(), _services); } public async Task MessageReceivedAsync(SocketMessage rawMessage) { // Ignore system messages, or messages from other bots if (!(rawMessage is SocketUserMessage message)) return; if (message.Source != MessageSource.User) return; // This value holds the offset where the prefix ends var argPos = 0; if (!message.HasMentionPrefix(_discord.CurrentUser, ref argPos)) return; // A new kind of command context, ShardedCommandContext can be utilized with the commands framework var context = new ShardedCommandContext(_discord, message); var result = await _commands.ExecuteAsync(context, argPos, _services); if (result.Error.HasValue && result.Error.Value != CommandError.UnknownCommand) // it's bad practice to send 'unknown command' errors await context.Channel.SendMessageAsync(result.ToString()); } } }