Example #1
0
        public async Task DoPagination(DiscordEmoji emoji, DiscordMessage message, PaginatedMessage paginatedmessage, CancellationTokenSource canceltoken)
        {
            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }
            if (paginatedmessage == null)
            {
                throw new ArgumentNullException(nameof(paginatedmessage));
            }
            if (emoji == null)
            {
                throw new ArgumentNullException(nameof(emoji));
            }
            if (canceltoken == null)
            {
                throw new ArgumentNullException(nameof(canceltoken));
            }

            #region The "good" shit
            switch (emoji.Name)
            {
            case "⏮":
                paginatedmessage.CurrentIndex = 0;
                break;

            case "◀":
                if (paginatedmessage.CurrentIndex != 0)
                {
                    paginatedmessage.CurrentIndex--;
                }
                break;

            case "⏹":
                canceltoken.Cancel();
                return;

            case "▶":
                if (paginatedmessage.CurrentIndex != paginatedmessage.Pages.Count() - 1)
                {
                    paginatedmessage.CurrentIndex++;
                }
                break;

            case "⏭":
                paginatedmessage.CurrentIndex = paginatedmessage.Pages.Count() - 1;
                break;

            default:
                return;
            }

            await message.ModifyAsync((string.IsNullOrEmpty(paginatedmessage.Pages.ToArray()[paginatedmessage.CurrentIndex].Content))? "" : paginatedmessage.Pages.ToArray()[paginatedmessage.CurrentIndex].Content,
                                      embed : paginatedmessage.Pages.ToArray()[paginatedmessage.CurrentIndex].Embed ?? null);

            #endregion
        }
        public async Task DoPagination(DiscordEmoji emoji, DiscordMessage message, PaginatedMessage paginatedmessage, CancellationTokenSource canceltoken, PaginationEmojis emojis)
        {
            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }
            if (paginatedmessage == null)
            {
                throw new ArgumentNullException(nameof(paginatedmessage));
            }
            if (emoji == null)
            {
                throw new ArgumentNullException(nameof(emoji));
            }
            if (canceltoken == null)
            {
                throw new ArgumentNullException(nameof(canceltoken));
            }

            #region The "good" shit
            // used brackets everywhere for the sake of consistency
            if (emoji == emojis.SkipLeft)
            {
                paginatedmessage.CurrentIndex = 0;
            }
            else if (emoji == emojis.Left)
            {
                if (paginatedmessage.CurrentIndex != 0)
                {
                    paginatedmessage.CurrentIndex--;
                }
            }
            else if (emoji == emojis.Stop)
            {
                canceltoken.Cancel();
            }
            else if (emoji == emojis.Right)
            {
                if (paginatedmessage.CurrentIndex != paginatedmessage.Pages.Count() - 1)
                {
                    paginatedmessage.CurrentIndex++;
                }
            }
            else if (emoji == emojis.SkipRight)
            {
                paginatedmessage.CurrentIndex = paginatedmessage.Pages.Count() - 1;
            }
            else
            {
                return;
            }

            await message.ModifyAsync((string.IsNullOrEmpty(paginatedmessage.Pages.ToArray()[paginatedmessage.CurrentIndex].Content))? "" : paginatedmessage.Pages.ToArray()[paginatedmessage.CurrentIndex].Content,
                                      embed : paginatedmessage.Pages.ToArray()[paginatedmessage.CurrentIndex].Embed ?? null).ConfigureAwait(false);

            #endregion
        }
Example #3
0
        public async Task DoPagination(DiscordEmoji emoji, DiscordMessage m, PaginatedMessage pm, CancellationTokenSource ct)
        {
            #region The "good" shit
            switch (emoji.Name)
            {
            case "⏮":
                pm.CurrentIndex = 0;
                break;

            case "◀":
                if (pm.CurrentIndex != 0)
                {
                    pm.CurrentIndex--;
                }
                break;

            case "⏹":
                ct.Cancel();
                return;

            case "▶":
                if (pm.CurrentIndex != pm.Pages.Count() - 1)
                {
                    pm.CurrentIndex++;
                }
                break;

            case "⏭":
                pm.CurrentIndex = pm.Pages.Count() - 1;
                break;

            default:
                return;
            }

            await m.ModifyAsync((string.IsNullOrEmpty(pm.Pages.ToArray()[pm.CurrentIndex].Content))? "" : pm.Pages.ToArray()[pm.CurrentIndex].Content,
                                embed : pm.Pages.ToArray()[pm.CurrentIndex].Embed ?? null);

            #endregion
        }
Example #4
0
        public async Task SendPaginatedMessage(DiscordChannel channel, DiscordUser user, IEnumerable <Page> message_pages, TimeSpan?timeoutoverride = null, TimeoutBehaviour?timeoutbehaviouroverride = null)
        {
            if (channel == null)
            {
                throw new ArgumentNullException(nameof(channel));
            }
            if (user == null)
            {
                throw new ArgumentNullException(nameof(user));
            }
            if (message_pages == null)
            {
                throw new ArgumentNullException(nameof(message_pages));
            }
            if (message_pages.Count() < 1)
            {
                throw new InvalidOperationException("This method can only be executed with a minimum of one page!");
            }

            TimeSpan timeout = Config.Timeout;

            if (timeoutoverride != null)
            {
                timeout = (TimeSpan)timeoutoverride;
            }

            TimeoutBehaviour timeout_behaviour = Config.PaginationBehaviour;

            if (timeoutbehaviouroverride != null)
            {
                timeout_behaviour = (TimeoutBehaviour)timeoutbehaviouroverride;
            }

            List <Page> pages = message_pages.ToList();

            if (pages.Count() == 0)
            {
                throw new ArgumentException("You need to provide at least 1 page!");
            }

            var tsc = new TaskCompletionSource <string>();
            var ct  = new CancellationTokenSource(timeout);

            ct.Token.Register(() => tsc.TrySetResult(null));

            DiscordMessage m = await this.Client.SendMessageAsync(channel, string.IsNullOrEmpty(pages.First().Content)? "" : pages.First().Content, embed : pages.First().Embed);

            PaginatedMessage pm = new PaginatedMessage()
            {
                CurrentIndex = 0,
                Pages        = pages,
                Timeout      = timeout
            };

            await this.GeneratePaginationReactions(m);

            try
            {
                this.Client.MessageReactionsCleared += ReactionClearHandler;
                this.Client.MessageReactionAdded    += ReactionAddHandler;
                this.Client.MessageReactionRemoved  += ReactionRemoveHandler;

                await tsc.Task;

                switch (timeout_behaviour)
                {
                case TimeoutBehaviour.Default:
                case TimeoutBehaviour.Ignore:
                    await m.DeleteAllReactionsAsync();

                    break;

                case TimeoutBehaviour.Delete:
                    await m.DeleteAllReactionsAsync();

                    await m.DeleteAsync();

                    break;
                }
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                this.Client.MessageReactionsCleared -= ReactionClearHandler;
                this.Client.MessageReactionAdded    -= ReactionAddHandler;
                this.Client.MessageReactionRemoved  -= ReactionRemoveHandler;
            }

            #region Handlers
            async Task ReactionAddHandler(MessageReactionAddEventArgs e)
            {
                if (e.Message.Id == m.Id && e.User.Id != this.Client.CurrentUser.Id && e.User.Id == user.Id)
                {
                    await this.DoPagination(e.Emoji, m, pm, ct);
                }
            }

            async Task ReactionRemoveHandler(MessageReactionRemoveEventArgs e)
            {
                if (e.Message.Id == m.Id && e.User.Id != this.Client.CurrentUser.Id && e.User.Id == user.Id)
                {
                    await this.DoPagination(e.Emoji, m, pm, ct);
                }
            }

            async Task ReactionClearHandler(MessageReactionsClearEventArgs e)
            {
                await this.GeneratePaginationReactions(m);
            }

            #endregion
        }
Example #5
0
        public async Task SendPaginatedMessage(DiscordChannel channel, DiscordUser user, IEnumerable <Page> message_pages, TimeSpan timeout, TimeoutBehaviour timeout_behaviour)
        {
            List <Page> pages = message_pages.ToList();

            if (pages.Count() == 0)
            {
                throw new ArgumentException("You need to provide at least 1 page!");
            }

            var tsc = new TaskCompletionSource <string>();
            var ct  = new CancellationTokenSource(timeout);

            ct.Token.Register(() => tsc.TrySetResult(null));

            DiscordMessage m = await this.Client.SendMessageAsync(channel, string.IsNullOrEmpty(pages.First().Content)? "" : pages.First().Content, embed : pages.First().Embed);

            PaginatedMessage pm = new PaginatedMessage()
            {
                CurrentIndex = 0,
                Pages        = pages,
                Timeout      = timeout
            };

            await this.GeneratePaginationReactions(m);

            AsyncEventHandler <MessageReactionsClearEventArgs> _reaction_removed_all = async e =>
            {
                await this.GeneratePaginationReactions(m);
            };

            this.Client.MessageReactionsCleared += _reaction_removed_all;

            AsyncEventHandler <MessageReactionAddEventArgs> _reaction_added = async e =>
            {
                if (e.Message.Id == m.Id && e.User.Id != this.Client.CurrentUser.Id && e.User.Id == user.Id)
                {
                    await this.DoPagination(e.Emoji, m, pm, ct);
                }
            };

            this.Client.MessageReactionAdded += _reaction_added;

            AsyncEventHandler <MessageReactionRemoveEventArgs> _reaction_removed = async e =>
            {
                if (e.Message.Id == m.Id && e.User.Id != this.Client.CurrentUser.Id && e.User.Id == user.Id)
                {
                    await this.DoPagination(e.Emoji, m, pm, ct);
                }
            };

            this.Client.MessageReactionRemoved += _reaction_removed;

            await tsc.Task;

            switch (timeout_behaviour)
            {
            case TimeoutBehaviour.Default:
            case TimeoutBehaviour.Ignore:
                await m.DeleteAllReactionsAsync();

                break;

            case TimeoutBehaviour.Delete:
                await m.DeleteAllReactionsAsync();

                await m.DeleteAsync();

                break;
            }

            this.Client.MessageReactionsCleared -= _reaction_removed_all;
            this.Client.MessageReactionAdded    -= _reaction_added;
            this.Client.MessageReactionRemoved  -= _reaction_removed;
        }