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 }
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 }
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 }
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; }