public async Task MasteriesAsync(Region region, [Remainder] string summonerName) { summonerName ??= DbContext.User.LeagueProfile.Username; if (string.IsNullOrWhiteSpace(summonerName)) { await RespondEmbedAsync("You need to specify a nickname or set yours up."); return; } var summoner = await _riot.Summoner.GetSummonerByNameAsync(region, summonerName); if (summoner is null) { await RespondEmbedAsync("Unknown summoner. Try another region."); return; } var versions = await _staticEndpoints.Versions.GetAllAsync(); var champions = await _staticEndpoints.Champions.GetAllAsync(versions.First()); var masteries = await _riot.ChampionMastery.GetChampionMasteriesAsync(region, summoner.Id); var maxPage = masteries.Count; var currentPage = 1; var pages = new List <Page>(); foreach (var mastery in masteries) { var page = new Page { Identifier = champions.Keys[(int)mastery.ChampionId] }; var embed = new LocalEmbedBuilder { Color = Color.Goldenrod, Description = $"Mastery for champion {page.Identifier}", ThumbnailUrl = $"http://ddragon.leagueoflegends.com/cdn/{versions.First()}/img/champion/{page.Identifier}.png" }; embed.WithFooter($"{summonerName} | Paginator - Page {currentPage}/{maxPage}"); embed.AddField("Level", mastery.ChampionLevel, true); embed.AddField("Points", mastery.ChampionPoints.ToString("N0"), true); embed.AddField("Chest", $"{(!mastery.ChestGranted ? "Not" : "")} granted", true); embed.AddField("Last play time", mastery.LastPlayTime.ToString("G"), true); page.Embed = embed.Build(); currentPage++; pages.Add(page); } await PaginateAsync(pages.ToImmutableArray()); }
private Task OnCommandExecutionFailed(CommandExecutionFailedEventArgs e) { var ctx = (AatroxCommandContext)e.Context; _logger.Error($"Command errored: {e.Context.Command.Name} by {ctx.User.Id} in {ctx.Guild.Id}", e.Result.Exception); var str = new StringBuilder(); switch (e.Result.Exception) { case DiscordHttpException ex when ex.HttpStatusCode == HttpStatusCode.Unauthorized: str.AppendLine("I don't have enough power to perform this action. (please check that the hierarchy of the bot is correct)"); break; case DiscordHttpException ex when ex.HttpStatusCode == HttpStatusCode.BadRequest: str.AppendLine($"The requested action has been stopped by Discord: `{ex.Message}`"); break; case DiscordHttpException ex: str.AppendLine($":angry: | Something bad happened: [{ex.HttpStatusCode}] {ex.Message}"); break; case ArgumentException ex: str.AppendLine($"{ex.Message}\n"); str.AppendLine($"Are you sure you didn't fail when typing the command? Please do `{ctx.Prefix}help {e.Result.Command.FullAliases[0]}`"); break; default: str.AppendLine($"{e.Result.Exception.GetType()} occured."); str.AppendLine($"{e.Result.Exception.Message}"); str.AppendLine($"{e.Result.Exception.StackTrace}"); _logger.Error($"{e.Result.Exception.GetType()} occured.", e.Result.Exception); break; } if (str.Length == 0) { return(Task.CompletedTask); } var embed = new LocalEmbedBuilder { Color = _configuration.DefaultEmbedColor, Title = "Something went wrong!" }; embed.AddField("__Command__", e.Result.Command.Name, true); embed.AddField("__Author__", ctx.User.FullName(), true); embed.AddField("__Error(s)__", str.ToString()); embed.WithFooter($"Type '{ctx.Prefix}help {ctx.Command.FullAliases[0].ToLowerInvariant()}' for more information."); return(ctx.Channel.SendMessageAsync("", false, embed.Build())); }
public async Task CommandsAsync([Remainder] string name) { var module = _commandService.GetAllModules().FirstOrDefault(m => m.Name.StartsWith(name, StringComparison.InvariantCultureIgnoreCase)); if (module is null) { await ReplyErrorAsync(Localization.HelpModuleNotFound, Context.Prefix); return; } var isOwner = Context.User.Id == Credentials.MasterId; var modulesCommands = GetModuleCommands(module, isOwner); if (modulesCommands.Count == 0) { await ReplyErrorAsync(Localization.HelpModuleNotFound, Context.Prefix); return; } var commandsAliases = GetCommandsAliases(modulesCommands, Context.Prefix); var embed = new LocalEmbedBuilder { Color = RiasUtilities.ConfirmColor, Title = GetText(module.Parent != null ? Localization.HelpAllCommandsForSubmodule : Localization.HelpAllCommandsForModule, module.Name) }.AddField(module.Name, string.Join("\n", commandsAliases), true); foreach (var submodule in module.Submodules) { var submoduleCommands = GetModuleCommands(submodule, isOwner); if (submoduleCommands.Count == 0) { continue; } var submoduleCommandsAliases = GetCommandsAliases(submoduleCommands, Context.Prefix); embed.AddField(submodule.Name, string.Join("\n", submoduleCommandsAliases), true); } embed.WithFooter(GetText(Localization.HelpCommandInfo, Context.Prefix)); embed.WithCurrentTimestamp(); await ReplyAsync(embed); }
public static bool TryParseEmbed(string json, out LocalEmbedBuilder embed) { embed = new LocalEmbedBuilder(); try { var embedDeserialized = JsonConvert.DeserializeObject <JsonEmbed>(json); var author = embedDeserialized.Author; var title = embedDeserialized.Title; var description = embedDeserialized.Description; var colorString = embedDeserialized.Color; var thumbnail = embedDeserialized.Thumbnail; var image = embedDeserialized.Image; var fields = embedDeserialized.Fields; var footer = embedDeserialized.Footer; var timestamp = embedDeserialized.Timestamp; if (author != null) { embed.WithAuthor(author); } if (!string.IsNullOrEmpty(title)) { embed.WithTitle(title); } if (!string.IsNullOrEmpty(description)) { embed.WithDescription(description); } if (!string.IsNullOrEmpty(colorString)) { embed.WithColor(HexToInt(colorString) ?? 0xFFFFFF); } if (!string.IsNullOrEmpty(thumbnail)) { embed.WithThumbnailUrl(thumbnail); } if (!string.IsNullOrEmpty(image)) { embed.WithImageUrl(image); } if (fields != null) { foreach (var field in fields) { var fieldName = field.Name; var fieldValue = field.Value; var fieldInline = field.IsInline; if (!string.IsNullOrEmpty(fieldName) && !string.IsNullOrEmpty(fieldValue)) { embed.AddField(fieldName, fieldValue, fieldInline); } } } if (footer != null) { embed.WithFooter(footer); } if (timestamp.HasValue) { embed.WithTimestamp(timestamp.Value); } else if (embedDeserialized.WithCurrentTimestamp) { embed.WithCurrentTimestamp(); } return(true); } catch { return(false); } }
public async ValueTask <AdminCommandResult> ShowModmailThreadAsync(int id, [MustBe(Operator.GreaterThan, 0)] int page = 1) { var modmail = await Context.Database.Modmails.Include(x => x.Messages).FirstOrDefaultAsync(x => x.Id == id); if (modmail is null) { return(CommandErrorLocalized("modmail_notfound")); } if (Context.IsPrivate && modmail.UserId != Context.User.Id) { return(CommandErrorLocalized("modmail_notfound")); } if (!Context.IsPrivate && modmail.GuildId != Context.Guild.Id) { return(CommandErrorLocalized("modmail_notfound")); } var split = modmail.Messages.OrderBy(x => x.Timestamp) .ToList().SplitBy(10); page = Math.Min(page, split.Count) - 1; var guild = Context.IsPrivate ? Context.Client.GetGuild(modmail.GuildId) : Context.Guild; var user = await Context.Client.GetOrDownloadUserAsync(modmail.UserId); var sb = new StringBuilder(); var lastTarget = ModmailTarget.User; var pages = new List <Page>(); var counter = 0; foreach (var group in split) { var builder = new LocalEmbedBuilder() .WithSuccessColor() .WithTitle(Context.Localize("modmail_message_title", modmail.Id)); if (split.Count > 1) { builder.WithFooter($"{++counter}/{split.Count}"); } for (var i = 0; i < group.Count; i++) { var message = group[i]; if (message.Target != lastTarget && i > 0) { if (Context.IsPrivate) { builder.AddField(lastTarget == ModmailTarget.User ? Context.User.Name.Sanitize() : Context.Localize("modmail_modteam", guild.Name.Sanitize()), sb.ToString().TrimTo(256, true)); } else { builder.AddField(lastTarget == ModmailTarget.User ? modmail.IsAnonymous ? Context.Localize("modmail_anonymous") : user.Name.Sanitize() : Context.Localize("modmail_modteam", guild.Name.Sanitize()), sb.ToString().TrimTo(256, true)); } sb.Clear(); i--; } else { sb.AppendNewline(message.Text); } lastTarget = message.Target; if (i == group.Count - 1) { if (Context.IsPrivate) { builder.AddField(lastTarget == ModmailTarget.User ? Context.User.Name.Sanitize() : Context.Localize("modmail_modteam", guild.Name.Sanitize()), sb.ToString().TrimTo(256, true)); } else { builder.AddField(lastTarget == ModmailTarget.User ? modmail.IsAnonymous ? Context.Localize("modmail_anonymous") : user.Name.Sanitize() : Context.Localize("modmail_modteam", guild.Name.Sanitize()), sb.ToString().TrimTo(256, true)); } } } pages.Add(builder.Build()); } if (split.Count > 1) { await Pagination.SendPaginatorAsync(Context.Channel, new DefaultPaginator(pages, page), pages[page]); return(CommandSuccess()); } return(CommandSuccess(embed: pages[0].Embed)); }
protected override async ValueTask AfterExecutedAsync(IResult result, DiscordCommandContext context) { var ctx = (AatroxCommandContext)context; if (result.IsSuccessful) { await ctx.EndAsync(); return; } if (result is CommandNotFoundResult) { string?cmdName; var index = 0; var split = ctx.Message.Content.Substring(ctx.Prefix.ToString() !.Length) .Split(Separator, StringSplitOptions.RemoveEmptyEntries); var maxIndex = split.Length; do { string toLev = (index == 0 ? "" : Separator) + string.Join(Separator, split.Take(maxIndex)); maxIndex--; //toLev += (index == 0 ? "" : Separator) + split[index]; cmdName = toLev.Levenshtein(this); index++; } while (string.IsNullOrWhiteSpace(cmdName) && index < split.Length); if (string.IsNullOrWhiteSpace(cmdName)) { return; } maxIndex++; string?cmdParams = null; while (maxIndex < split.Length) { cmdParams += " " + split[maxIndex++]; } var tryResult = await ExecuteAsync(cmdName + cmdParams, ctx); if (tryResult.IsSuccessful) { return; } result = tryResult; } await ctx.EndAsync(); var str = new StringBuilder(); switch (result) { case ChecksFailedResult err: str.AppendLine("The following check(s) failed:"); foreach (var(check, error) in err.FailedChecks) { str.AppendLine($"[`{(check as AatroxCheckAttribute)?.Name ?? check.GetType().Name}`]: `{error}`"); } break; case TypeParseFailedResult err: str.AppendLine(err.Reason); break; case ArgumentParseFailedResult _: str.AppendLine($"The syntax of the command `{ctx.Command.FullAliases[0]}` was wrong."); break; case OverloadsFailedResult err: str.AppendLine($"I can't find any valid overload for the command `{ctx.Command.Name}`."); foreach (var overload in err.FailedOverloads) { str.AppendLine($"[`{overload.Key.Name}`] -> `{overload.Value.Reason}`"); } break; case ParameterChecksFailedResult err: str.AppendLine("The following parameter check(s) failed:"); foreach (var(check, error) in err.FailedChecks) { str.AppendLine($"[`{check.Parameter.Name}`]: `{error}`"); } break; case ExecutionFailedResult _: //this should be handled in the CommandErrored event or in the Custom Result case. case CommandNotFoundResult _: //this is handled at the beginning of this method with levenshtein thing. break; case CommandOnCooldownResult err: var remainingTime = err.Cooldowns.OrderByDescending(x => x.RetryAfter).FirstOrDefault(); str.AppendLine($"You're being rate limited! Please retry after {remainingTime.RetryAfter.Humanize()}."); break; default: str.AppendLine($"Unknown error: {result}"); break; } if (str.Length == 0) { return; } var embed = new LocalEmbedBuilder { Color = _configuration.DefaultEmbedColor, Title = "Something went wrong!" }; embed.WithFooter($"Type '{ctx.Prefix}help {ctx.Command?.FullAliases[0] ?? ctx.Command?.FullAliases[0] ?? ""}' for more information."); embed.AddField("__Command/Module__", ctx.Command?.Name ?? ctx.Command?.Module?.Name ?? "Unknown command...", true); embed.AddField("__Author__", ctx.User.FullName(), true); embed.AddField("__Error(s)__", str.ToString()); _logger.Warn($"{ctx.User.Id} - {ctx.Guild.Id} ::> Command errored: {ctx.Command?.Name ?? "-unknown command-"}"); await ctx.Channel.SendMessageAsync("", false, embed.Build()); await ctx.DisposeAsync(); }
public LocalizedEmbedBuilder WithFooter(LocalizedFooterBuilder builder) { _builder.WithFooter(builder); return(this); }
protected override async ValueTask AfterExecutedAsync(IResult result, DiscordCommandContext context) { var ctx = (AbfCommandContext)context; if (result.IsSuccessful) { await ctx.EndAsync(); return; } await ctx.EndAsync(); var str = new StringBuilder(); switch (result) { case ChecksFailedResult err: str.AppendLine("The following check(s) failed:"); foreach (var(check, error) in err.FailedChecks) { str.AppendLine($"[`{(check as AbfCheckBaseAttribute)?.Name ?? check.GetType().Name}`]: `{error}`"); } break; case TypeParseFailedResult err: str.AppendLine(err.Reason); break; case ArgumentParseFailedResult _: str.AppendLine($"The syntax of the command `{ctx.Command.FullAliases[0]}` was wrong."); break; case OverloadsFailedResult err: str.AppendLine($"I can't find any valid overload for the command `{ctx.Command.Name}`."); foreach (var overload in err.FailedOverloads) { str.AppendLine($" -> `{overload.Value.Reason}`"); } str.AppendLine($"Example: `{ctx.Command.Remarks}`"); break; case ParameterChecksFailedResult err: str.AppendLine("The following parameter check(s) failed:"); foreach (var(check, error) in err.FailedChecks) { str.AppendLine($"[`{check.Parameter.Name}`]: `{error}`"); } break; case ExecutionFailedResult _: //this should be handled in the CommandErrored event or in the Custom Result case. break; case CommandNotFoundResult err: //this is handled at the beginning of this method with levenshtein thing. str.AppendLine($"Command Not Found: {err.Reason}"); break; case CommandOnCooldownResult err: var remainingTime = err.Cooldowns.OrderByDescending(x => x.RetryAfter).FirstOrDefault(); str.AppendLine($"You're being rate limited! Please retry after {remainingTime.RetryAfter.Humanize()}."); break; default: str.AppendLine($"Unknown error: {result}"); break; } if (str.Length == 0) { return; } var embed = new LocalEmbedBuilder { Title = "Something went wrong!" }; embed.WithFooter($"Type '{ctx.Prefix}help {ctx.Command?.FullAliases[0] ?? ctx.Command?.FullAliases[0] ?? ""}' for more information."); embed.AddField("__Command/Module__", ctx.Command?.Name ?? ctx.Command?.Module?.Name ?? "Unknown command...", true); embed.AddField("__Author__", ctx.User.ToString(), true); embed.AddField("__Error(s)__", str.ToString()); _logger.Warning($"{ctx.User.Id} - {ctx.Guild.Id} ::> Command errored: {ctx.Command?.Name ?? "-unknown command-"}"); var msg = await ctx.Channel.SendMessageAsync("", false, embed.Build()); _ = Task.Run(async() => { await Task.Delay(TimeSpan.FromSeconds(20)); await msg.DeleteAsync(); }); await ctx.DisposeAsync(); }