public async Task <ReactionContext> WaitForReactionAsync(Func <DiscordEmoji, bool> predicate, TimeSpan timeout) { var tsc = new TaskCompletionSource <ReactionContext>(); var ct = new CancellationTokenSource(timeout); ct.Token.Register(() => tsc.TrySetResult(null)); AsyncEventHandler <MessageReactionAddEventArgs> handler = async e => { await Task.Yield(); if (predicate(e.Emoji)) { var rc = new ReactionContext() { Channel = e.Channel, Emoji = e.Emoji, Message = e.Message, User = e.User, Interactivity = this }; tsc.TrySetResult(rc); return; } }; this.Client.MessageReactionAdded += handler; var result = await tsc.Task; this.Client.MessageReactionAdded -= handler; return(result); }
/// <summary> /// Waits for a reaction to be received /// </summary> /// <param name="predicate">Expected predicate</param> /// <param name="timeoutoverride">TImeout override</param> /// <returns></returns> public async Task <ReactionContext> WaitForReactionAsync(Func <DiscordEmoji, bool> predicate, TimeSpan?timeoutoverride = null) { if (predicate == null) { throw new ArgumentNullException(nameof(predicate)); } TimeSpan timeout = Config.Timeout; if (timeoutoverride != null) { timeout = (TimeSpan)timeoutoverride; } var tsc = new TaskCompletionSource <ReactionContext>(); var ct = new CancellationTokenSource(timeout); ct.Token.Register(() => tsc.TrySetResult(null)); try { this.Client.MessageReactionAdded += Handler; var result = await tsc.Task.ConfigureAwait(false); return(result); } catch (Exception) { throw; } finally { this.Client.MessageReactionAdded -= Handler; ct.Dispose(); } #region Handler async Task Handler(MessageReactionAddEventArgs e) { await Task.Yield(); if (predicate(e.Emoji)) { var rc = new ReactionContext() { Channel = e.Channel, Emoji = e.Emoji, Message = e.Message, User = e.User, Interactivity = this }; tsc.TrySetResult(rc); return; } } #endregion }
public async Task <ReactionContext> WaitForMessageReactionAsync(DiscordMessage msg, TimeSpan timeout, ulong user_id = 0) { var message_id = msg.Id; var tsc = new TaskCompletionSource <ReactionContext>(); var ct = new CancellationTokenSource(timeout); ct.Token.Register(() => tsc.TrySetResult(null)); AsyncEventHandler <MessageReactionAddEventArgs> handler = async(e) => { await Task.Yield(); if (e.Message.Id == message_id) { if (user_id == 0 || e.User.Id == user_id) { var rc = new ReactionContext() { Channel = e.Channel, Emoji = e.Emoji, Message = e.Message, User = e.User, Interactivity = this }; tsc.TrySetResult(rc); return; } } }; this.Client.MessageReactionAdded += handler; var result = await tsc.Task; this.Client.MessageReactionAdded -= handler; return(result); }
public async Task <ReactionContext> WaitForMessageReactionAsync(DiscordMessage message, DiscordUser user = null, TimeSpan?timeoutoverride = null) { if (message == null) { throw new ArgumentNullException(nameof(message)); } TimeSpan timeout = Config.Timeout; if (timeoutoverride != null) { timeout = (TimeSpan)timeoutoverride; } var message_id = message.Id; var tsc = new TaskCompletionSource <ReactionContext>(); var ct = new CancellationTokenSource(timeout); ct.Token.Register(() => tsc.TrySetResult(null)); try { this.Client.MessageReactionAdded += Handler; var result = await tsc.Task; return(result); } catch (Exception) { throw; } finally { this.Client.MessageReactionAdded -= Handler; } #region Handler async Task Handler(MessageReactionAddEventArgs e) { await Task.Yield(); if (e.Message.Id == message_id) { if (user == null || e.User.Id == user?.Id) { var rc = new ReactionContext() { Channel = e.Channel, Emoji = e.Emoji, Message = e.Message, User = e.User, Interactivity = this }; tsc.TrySetResult(rc); return; } } } #endregion }