Exemplo n.º 1
0
        public async Task <ReactionCollectionContext> CreatePollAsync(DiscordMessage m, TimeSpan timeout, List <DiscordEmoji> Emojis)
        {
            foreach (var em in Emojis)
            {
                await m.CreateReactionAsync(em);
            }

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

            ct.Token.Register(() => tsc.TrySetResult(rcc));
            AsyncEventHandler <MessageReactionAddEventArgs> handler1 = async(e) =>
            {
                await Task.Yield();

                if (e.Message.Id == m.Id && Emojis.Count(x => x == e.Emoji) > 0)
                {
                    rcc.AddReaction(e.Emoji, e.User.Id);
                }
            };

            this.Client.MessageReactionAdded += handler1;

            AsyncEventHandler <MessageReactionRemoveEventArgs> handler2 = async(e) =>
            {
                await Task.Yield();

                if (e.Message.Id == m.Id && Emojis.Count(x => x == e.Emoji) > 0)
                {
                    rcc.RemoveReaction(e.Emoji, e.User.Id);
                }
            };

            this.Client.MessageReactionRemoved += handler2;

            AsyncEventHandler <MessageReactionsClearEventArgs> handler3 = async(e) =>
            {
                await Task.Yield();

                if (e.Message.Id == m.Id)
                {
                    rcc.ClearReactions();
                    foreach (var em in Emojis)
                    {
                        await m.CreateReactionAsync(em);
                    }
                }
            };

            this.Client.MessageReactionsCleared += handler3;

            var result = await tsc.Task;

            this.Client.MessageReactionAdded    -= handler1;
            this.Client.MessageReactionRemoved  -= handler2;
            this.Client.MessageReactionsCleared -= handler3;

            return(result);
        }
Exemplo n.º 2
0
        public async Task <ReactionCollectionContext> CollectReactionsAsync(DiscordMessage m, TimeSpan timeout)
        {
            var rcc = new ReactionCollectionContext();
            var tsc = new TaskCompletionSource <ReactionCollectionContext>();
            var ct  = new CancellationTokenSource(timeout);

            ct.Token.Register(() => tsc.TrySetResult(rcc));
            AsyncEventHandler <MessageReactionAddEventArgs> handler1 = async(e) =>
            {
                await Task.Yield();

                if (e.Message.Id == m.Id)
                {
                    rcc.AddReaction(e.Emoji);
                }
            };

            this.Client.MessageReactionAdded += handler1;

            AsyncEventHandler <MessageReactionRemoveEventArgs> handler2 = async(e) =>
            {
                await Task.Yield();

                if (e.Message.Id == m.Id)
                {
                    rcc.RemoveReaction(e.Emoji);
                }
            };

            this.Client.MessageReactionRemoved += handler2;

            AsyncEventHandler <MessageReactionsClearEventArgs> handler3 = async(e) =>
            {
                await Task.Yield();

                if (e.Message.Id == m.Id)
                {
                    rcc.ClearReactions();
                }
            };

            this.Client.MessageReactionsCleared += handler3;

            var result = await tsc.Task;

            this.Client.MessageReactionAdded    -= handler1;
            this.Client.MessageReactionRemoved  -= handler2;
            this.Client.MessageReactionsCleared -= handler3;

            return(result);
        }
Exemplo n.º 3
0
        public async Task <ReactionCollectionContext> CollectReactionsAsync(DiscordMessage message, TimeSpan?timeoutoverride = null)
        {
            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }

            TimeSpan timeout = Config.Timeout;

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

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

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

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

                var result = await tsc.Task;
                return(result);
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                this.Client.MessageReactionAdded    -= ReactionAddHandler;
                this.Client.MessageReactionRemoved  -= ReactionRemoveHandler;
                this.Client.MessageReactionsCleared -= ReactionClearHandler;
            }

            #region Handlers
            async Task ReactionAddHandler(MessageReactionAddEventArgs e)
            {
                await Task.Yield();

                if (e.Message.Id == message.Id)
                {
                    rcc.AddReaction(e.Emoji);
                }
            }

            async Task ReactionRemoveHandler(MessageReactionRemoveEventArgs e)
            {
                await Task.Yield();

                if (e.Message.Id == message.Id)
                {
                    rcc.RemoveReaction(e.Emoji);
                }
            }

            async Task ReactionClearHandler(MessageReactionsClearEventArgs e)
            {
                await Task.Yield();

                if (e.Message.Id == message.Id)
                {
                    rcc.ClearReactions();
                }
            }

            #endregion
        }
Exemplo n.º 4
0
        public async Task <ReactionCollectionContext> CreatePollAsync(DiscordMessage message, IEnumerable <DiscordEmoji> emojis, TimeSpan?timeoutoverride = null)
        {
            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }
            if (emojis == null)
            {
                throw new ArgumentNullException(nameof(emojis));
            }
            if (emojis.Count() < 1)
            {
                throw new InvalidOperationException("A minimum of one emoji is required to execute this method!");
            }

            TimeSpan timeout = Config.Timeout;

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

            foreach (var em in emojis)
            {
                await message.CreateReactionAsync(em);
            }

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

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

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

                var result = await tsc.Task;
                return(result);
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                this.Client.MessageReactionAdded    -= ReactionAddHandler;
                this.Client.MessageReactionRemoved  -= ReactionRemoveHandler;
                this.Client.MessageReactionsCleared -= ReactionClearHandler;
            }

            #region Handlers
            async Task ReactionAddHandler(MessageReactionAddEventArgs e)
            {
                await Task.Yield();

                if (e.Message.Id == message.Id && emojis.Count(x => x == e.Emoji) > 0)
                {
                    rcc.AddReaction(e.Emoji, e.User.Id);
                }
            }

            async Task ReactionRemoveHandler(MessageReactionRemoveEventArgs e)
            {
                await Task.Yield();

                if (e.Message.Id == message.Id && emojis.Count(x => x == e.Emoji) > 0)
                {
                    rcc.RemoveReaction(e.Emoji, e.User.Id);
                }
            }

            async Task ReactionClearHandler(MessageReactionsClearEventArgs e)
            {
                await Task.Yield();

                if (e.Message.Id == message.Id)
                {
                    rcc.ClearReactions();
                    foreach (var em in emojis)
                    {
                        await message.CreateReactionAsync(em);
                    }
                }
            }

            #endregion
        }