예제 #1
0
    public async Task <IResult> ListNotesAsync(IUser user)
    {
        var notes = await _notes.GetNotesAsync(_context.GuildID.Value, user.ID);

        var createPages = await PaginatedEmbedFactory.PagesFromCollectionAsync
                          (
            notes,
            async note =>
        {
            var getAuthor = await _userAPI.GetUserAsync(note.Author.DiscordID);
            if (!getAuthor.IsSuccess)
            {
                return(Result <Embed> .FromError(getAuthor));
            }

            var author = getAuthor.Entity;

            var getAuthorAvatar = CDN.GetUserAvatarUrl(author);

            var embedFields = new List <EmbedField>();
            var eb          = new Embed
            {
                Title  = $"Note #{note.ID} for {user.Username}:{user.Discriminator}",
                Colour = Color.Gold,
                Author = new EmbedAuthor(author.Username)
                {
                    IconUrl = getAuthorAvatar.IsSuccess
                            ? getAuthorAvatar.Entity.ToString()
                            : default(Optional <string>)
                },
                Description = note.Content,
                Fields      = embedFields
            };

            embedFields.Add(new EmbedField("Created", note.CreatedAt.Humanize()));

            if (note.CreatedAt != note.UpdatedAt)
            {
                embedFields.Add(new EmbedField("Last Updated", note.UpdatedAt.Humanize()));
            }

            return(eb);
        }
                          );

        if (createPages.Any(p => !p.IsSuccess))
        {
            return(createPages.First(p => !p.IsSuccess));
        }

        var pages = createPages.Select(p => p.Entity).ToList();

        return((Result)await _feedback.SendContextualPaginatedMessageAsync
               (
                   _context.User.ID,
                   pages,
                   ct : this.CancellationToken
               ));
    }
        public async Task <RuntimeResult> ListWarningsAsync(IGuildUser user)
        {
            var warnings = await _warnings.GetWarningsAsync(user);

            var appearance = PaginatedAppearanceOptions.Default;

            appearance.Title = "Warnings";
            appearance.Color = Color.Orange;

            var paginatedEmbed = await PaginatedEmbedFactory.PagesFromCollectionAsync
                                 (
                _feedback,
                _interactivity,
                this.Context.User,
                warnings,
                async (eb, warning) =>
            {
                eb.WithTitle($"Warning #{warning.ID} for {user.Username}:{user.Discriminator}");

                var author = await this.Context.Guild.GetUserAsync((ulong)warning.Author.DiscordID);
                eb.WithAuthor(author);

                eb.WithDescription(warning.Reason);

                eb.AddField("Created", warning.CreatedAt);

                if (warning.CreatedAt != warning.UpdatedAt)
                {
                    eb.AddField("Last Updated", warning.UpdatedAt);
                }

                if (warning.IsTemporary)
                {
                    eb.AddField("Expires On", warning.ExpiresOn);
                }

                if (!(warning.MessageID is null))
                {
                    // TODO
                }
            },
                appearance : appearance
                                 );

            await _interactivity.SendInteractiveMessageAndDeleteAsync
            (
                this.Context.Channel,
                paginatedEmbed,
                TimeSpan.FromMinutes(5)
            );

            return(RuntimeCommandResult.FromSuccess());
        }
예제 #3
0
    public async Task <Result> ShowCharactersAsync(IUser discordUser)
    {
        var getCharacters = await _characters.GetUserCharactersAsync
                            (
            _context.GuildID.Value,
            discordUser.ID,
            this.CancellationToken
                            );

        if (!getCharacters.IsSuccess)
        {
            return(Result.FromError(getCharacters));
        }

        var getChannel = await _channelAPI.GetChannelAsync(_context.ChannelID, this.CancellationToken);

        if (!getChannel.IsSuccess)
        {
            return(Result.FromError(getChannel));
        }

        var channel       = getChannel.Entity;
        var isChannelNSFW = channel.IsNsfw.IsDefined(out var isNsfw) && isNsfw;

        var characters = getCharacters.Entity.ToList();

        var pages = await PaginatedEmbedFactory.PagesFromCollectionAsync
                    (
            characters,
            async c =>
        {
            Embed embed;
            if (c.IsNSFW && !isChannelNSFW)
            {
                embed = new Embed(Description: "Redacted (Character is NSFW, but channel is not)");
            }
            else
            {
                var createEmbed = await CreateCharacterInfoEmbedAsync(c);
                if (!createEmbed.IsSuccess)
                {
                    return(createEmbed);
                }

                embed = createEmbed.Entity;
            }

            return(embed with
            {
                Title = $"{(_context.User.ID == discordUser.ID ? "Your" : $"<@{discordUser.ID}>'s")} characters"
            });
        },
예제 #4
0
        public async Task ListBansAsync(IGuildUser user)
        {
            var bans = _bans.GetBans(user);

            var appearance = PaginatedAppearanceOptions.Default;

            appearance.Title = "Bans";
            appearance.Color = Color.Orange;

            var paginatedEmbed = await PaginatedEmbedFactory.PagesFromCollectionAsync
                                 (
                _feedback,
                _interactivity,
                this.Context.User,
                bans,
                async (eb, ban) =>
            {
                eb.WithTitle($"Ban #{ban.ID} for {user.Username}:{user.Discriminator}");

                var author = await this.Context.Guild.GetUserAsync((ulong)ban.Author.DiscordID);
                eb.WithAuthor(author);

                eb.WithDescription(ban.Reason);

                eb.AddField("Created", ban.CreatedAt);

                if (ban.CreatedAt != ban.UpdatedAt)
                {
                    eb.AddField("Last Updated", ban.UpdatedAt);
                }

                if (ban.IsTemporary)
                {
                    eb.AddField("Expires On", ban.ExpiresOn);
                }

                if (!(ban.MessageID is null))
                {
                    // TODO
                }
            },
                appearance : appearance
                                 );

            await _interactivity.SendInteractiveMessageAndDeleteAsync
            (
                this.Context.Channel,
                paginatedEmbed,
                TimeSpan.FromMinutes(5)
            );
        }
예제 #5
0
        public async Task <RuntimeResult> ListNotesAsync(IGuildUser user)
        {
            var notes = await _notes.GetNotesAsync(user);

            var appearance = PaginatedAppearanceOptions.Default;

            appearance.Title = "Notes";
            appearance.Color = Color.Gold;

            var paginatedEmbed = await PaginatedEmbedFactory.PagesFromCollectionAsync
                                 (
                _feedback,
                _interactivity,
                this.Context.User,
                notes,
                async (eb, note) =>
            {
                eb.WithTitle($"Note #{note.ID} for {user.Username}:{user.Discriminator}");

                var author = await this.Context.Guild.GetUserAsync((ulong)note.Author.DiscordID);
                eb.WithAuthor(author);

                eb.WithDescription(note.Content);

                eb.AddField("Created", note.CreatedAt);

                if (note.CreatedAt != note.UpdatedAt)
                {
                    eb.AddField("Last Updated", note.UpdatedAt);
                }
            },
                appearance : appearance
                                 );

            await _interactivity.SendInteractiveMessageAndDeleteAsync
            (
                this.Context.Channel,
                paginatedEmbed,
                TimeSpan.FromMinutes(5)
            );

            return(RuntimeCommandResult.FromSuccess());
        }
예제 #6
0
        public async Task <RuntimeResult> ListBansAsync()
        {
            var bans = await _bans.GetBansAsync(this.Context.Guild);

            var appearance = PaginatedAppearanceOptions.Default;

            appearance.Title = "Bans";
            appearance.Color = Color.Orange;

            var paginatedEmbed = await PaginatedEmbedFactory.PagesFromCollectionAsync
                                 (
                _feedback,
                _interactivity,
                this.Context.User,
                bans,
                async (eb, ban) =>
            {
                IUser?bannedUser = null;
                if (this.Context.Client is DiscordSocketClient socketClient)
                {
                    bannedUser = await socketClient.Rest.GetUserAsync((ulong)ban.User.DiscordID);
                }

                if (bannedUser is null)
                {
                    eb.WithTitle($"Ban #{ban.ID} for user with ID {ban.User.DiscordID}");
                }
                else
                {
                    eb.WithTitle($"Ban #{ban.ID} for {bannedUser.Username}:{bannedUser.Discriminator}");
                }

                var author = await this.Context.Guild.GetUserAsync((ulong)ban.Author.DiscordID);
                eb.WithAuthor(author);

                eb.WithDescription(ban.Reason);

                eb.AddField("Created", ban.CreatedAt);

                if (ban.CreatedAt != ban.UpdatedAt)
                {
                    eb.AddField("Last Updated", ban.UpdatedAt);
                }

                if (ban.IsTemporary)
                {
                    eb.AddField("Expires On", ban.ExpiresOn);
                }

                if (!(ban.MessageID is null))
                {
                    // TODO
                }
            },
                appearance : appearance
                                 );

            await _interactivity.SendInteractiveMessageAndDeleteAsync
            (
                this.Context.Channel,
                paginatedEmbed,
                TimeSpan.FromMinutes(5)
            );

            return(RuntimeCommandResult.FromSuccess());
        }
예제 #7
0
    public async Task <IResult> ListBansAsync()
    {
        var bans = await _bans.GetBansAsync(_context.GuildID.Value);

        var createPages = await PaginatedEmbedFactory.PagesFromCollectionAsync
                          (
            bans,
            async ban =>
        {
            var getBanAuthor = await _userAPI.GetUserAsync(ban.Author.DiscordID);
            if (!getBanAuthor.IsSuccess)
            {
                return(Result <Embed> .FromError(getBanAuthor));
            }

            var banAuthor = getBanAuthor.Entity;

            var getBannedUser = await _userAPI.GetUserAsync(ban.User.DiscordID);
            if (!getBannedUser.IsSuccess)
            {
                return(Result <Embed> .FromError(getBannedUser));
            }

            var bannedUser = getBanAuthor.Entity;

            var getBanAuthorAvatar = CDN.GetUserAvatarUrl(banAuthor);

            var embedFields = new List <IEmbedField>();
            var eb          = new Embed
            {
                Title  = $"Ban #{ban.ID} for {bannedUser.Username}:{bannedUser.Discriminator}",
                Colour = Color.Orange,
                Author = new EmbedAuthor(banAuthor.Username)
                {
                    Url = getBanAuthorAvatar.IsSuccess
                            ? getBanAuthorAvatar.Entity.ToString()
                            : default(Optional <string>)
                },
                Description = ban.Reason,
                Fields      = embedFields
            };

            embedFields.Add(new EmbedField("Created", ban.CreatedAt.Humanize()));

            if (ban.CreatedAt != ban.UpdatedAt)
            {
                embedFields.Add(new EmbedField("Last Updated", ban.UpdatedAt.Humanize()));
            }

            if (ban.ExpiresOn.HasValue)
            {
                embedFields.Add(new EmbedField("Expires On", ban.ExpiresOn.Humanize()));
            }

            if (ban.MessageID is not null)
            {
                // TODO
            }

            return(eb);
        }
                          );

        if (createPages.Any(p => !p.IsSuccess))
        {
            return(createPages.First(p => !p.IsSuccess));
        }

        var pages = createPages.Select(p => p.Entity).ToList();

        return((Result)await _feedback.SendContextualPaginatedMessageAsync
               (
                   _context.User.ID,
                   pages,
                   ct : this.CancellationToken
               ));
    }