Пример #1
0
        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());
        }
Пример #2
0
        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()));
        }
Пример #3
0
        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);
        }
Пример #4
0
        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));
        }
Пример #6
0
        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);
 }
Пример #8
0
        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();
        }