Exemple #1
0
        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);
        }
Exemple #2
0
        /// <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
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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
        }