public async Task ProcessCommandAsync(SocketMessage msg) { var message = msg as SocketUserMessage; if (message == null) { return; } int argPos = 0; var context = new SocketCommandContext(Client, message); List <DiscordCustomPrefix> guildPrefixes = await PrefixService.GetGuildPrefixes(context.Guild); string FinalPrefix = Config.Prefix; foreach (DiscordCustomPrefix prefix in guildPrefixes) { argPos = 0; if (message.HasStringPrefix(prefix.Prefix, ref argPos)) { FinalPrefix = prefix.Prefix; break; } argPos = 0; } if (message.HasStringPrefix(FinalPrefix, ref argPos)) { string commandExecuted = message.Content.Split(' ')[0].Replace(FinalPrefix, ""); if (!Provider.GetService <CooldownService>().IsCooldownExpired(context.Guild.Id, commandExecuted)) { CommandInfo cmdInfo = Commands.FindInfoByName(commandExecuted); Embed cooldownEmbed = Provider.GetService <EmbedService>().MakeFailFeedbackEmbed($"The command `{cmdInfo.Name}` cannot be used for another {Math.Max(Provider.GetService<CooldownService>().GetRemainingTime(context.Guild.Id, cmdInfo), 1)} seconds!"); await context.Channel.SendMessageAsync(cooldownEmbed, lifeTime : Provider.GetService <Config>().FeedbackMessageLifeTime); return; } var result = await Commands.ExecuteAsync(context, argPos, Provider); if (result.IsSuccess) { CommandInfo cmdInfo = Commands.FindInfoByName(commandExecuted); if (cmdInfo != null) { foreach (var attr in cmdInfo.Preconditions) { if (attr.GetType() == typeof(RequireCooldownAttribute)) { RequireCooldownAttribute cooldownAttr = attr as RequireCooldownAttribute; Provider.GetService <CooldownService>().SetCooldown(context.Guild.Id, cmdInfo, cooldownAttr.Seconds); } } using (BotDBContext DBContext = Provider.GetService <DBContextFactory>().Create <BotDBContext>()) { string arguments = message.Content.Replace($"{FinalPrefix}{commandExecuted} ", "").Replace($"{FinalPrefix}{commandExecuted}", ""); DBContext.CommandLogs.Add(new DiscordCommandLog(message.Author.Id.ToString(), cmdInfo.Name, arguments, context.Channel.Id.ToString(), context.Guild.Id.ToString(), DateTime.Now)); await DBContext.SaveChangesAsync(); } } } else { ConsoleEx.WriteColoredLine(LogSeverity.Error, ConsoleTextFormat.TimeAndText, ConsoleColor.Red, $"[Command Error - {result.Error?.ToString()}] ", ConsoleColor.White, result.ErrorReason?.ToString()); int lifeTime = Provider.GetService <Config>().FeedbackMessageLifeTime; EmbedService embedService = Provider.GetService <EmbedService>(); switch (result.Error?.ToString()) { case "UnmetPrecondition": Embed unmetEmbed = embedService.MakeFailFeedbackEmbed(result.ErrorReason); await context.Channel.SendMessageAsync("", embed : unmetEmbed, lifeTime : lifeTime); break; case "UnknownCommand": string err = ""; err = result.ErrorReason?.ToString(); bool badArgs = (err.Contains("This input does not match any overload.")); if (badArgs) { await TriggerBadArgEmbed(commandExecuted, context, FinalPrefix); return; } List <FuzzyMatch> matches = Commands.FuzzySearch(commandExecuted); if (matches.Count > 0) { string builtString = ""; foreach (FuzzyMatch match in matches) { builtString += $"{match.TextValue.Bold()}, "; } builtString = builtString.Substring(0, builtString.Length - 2); Embed suggestEmbed = embedService.MakeFeedbackEmbed($"That command wasn't found.\nDid you mean {builtString}?"); await context.Channel.SendMessageAsync("", embed : suggestEmbed); } break; case "BadArgCount": await TriggerBadArgEmbed(commandExecuted, context, FinalPrefix); break; case "ParseFailed": Embed badParseEmbed = embedService.MakeFailFeedbackEmbed("Failed to parse one of the arguments for that command."); await context.Channel.SendMessageAsync("", embed : badParseEmbed, lifeTime : lifeTime); break; case "MultipleMatches": Embed multiMatchEmbed = embedService.MakeFailFeedbackEmbed("Multiple matches were found."); await context.Channel.SendMessageAsync("", embed : multiMatchEmbed, lifeTime : lifeTime); break; case "ObjectNotFound": Embed notFoundEmbed = embedService.MakeFailFeedbackEmbed("One of your specified objects could not be found."); await context.Channel.SendMessageAsync("", embed : notFoundEmbed, lifeTime : lifeTime); break; } } } else if (message.HasMentionPrefix(Provider.GetService <DiscordSocketClient>().CurrentUser, ref argPos)) { using (var typingState = message.Channel.EnterTypingState()) { string query = message.Content.Replace(Provider.GetService <DiscordSocketClient>().CurrentUser.Mention + " ", ""); string resp = await CleverbotAPI.AskAsync(query); await message.Channel.SendMessageAsync(resp); typingState.Dispose(); } } }