using Discord; using Discord.Commands; using Discord.WebSocket; using Microsoft.Extensions.DependencyInjection; using System; using System.Reflection; using System.Threading.Tasks; namespace ShardedClient.Services { public class CommandHandlingService { private readonly CommandService _commands; private readonly DiscordShardedClient _discord; private readonly IServiceProvider _services; public CommandHandlingService(IServiceProvider services) { _commands = services.GetRequiredService<CommandService>(); _discord = services.GetRequiredService<DiscordShardedClient>(); _services = services; _commands.CommandExecuted += CommandExecutedAsync; _commands.Log += LogAsync; _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 not 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); await _commands.ExecuteAsync(context, argPos, _services); } public async Task CommandExecutedAsync(Optional<CommandInfo> command, ICommandContext context, IResult result) { // command is unspecified when there was a search failure (command not found); we don't care about these errors if (!command.IsSpecified) return; // the command was successful, we don't care about this result, unless we want to log that a command succeeded. if (result.IsSuccess) return; // the command failed, let's notify the user that something happened. await context.Channel.SendMessageAsync($"error: {result}"); } private Task LogAsync(LogMessage log) { Console.WriteLine(log.ToString()); return Task.CompletedTask; } } }