Пример #1
0
        private async Task Client_MessageDeletedAsync(Cacheable <IMessage, ulong> messageCacheable, ISocketMessageChannel channel)
        {
            var eventForMessage = DbContext.Events.AsQueryable().Where(e => e.CommandMessageId == messageCacheable.Id).FirstOrDefault();

            if (eventForMessage != null)
            {
                var messageForEvent = await channel.GetMessageAsync(eventForMessage.EventMessageId);

                await channel.DeleteMessageAsync(messageForEvent);

                DbContext.Events.Remove(eventForMessage);
                DbContext.SaveChanges();
            }
        }
        private async Task ReactionRemovedAsync(Cacheable <IUserMessage, ulong> messageCacheable, ISocketMessageChannel channel, SocketReaction reaction)
        {
            if (reaction.UserId == client.CurrentUser.Id)
            {
                return;
            }

            var messageId       = messageCacheable.Id;
            var eventForMessage = DbContext.Events.AsQueryable().Where(e => e.EventMessageId == messageId).FirstOrDefault();

            if (eventForMessage != null)
            {
                //Must do this, as the message in the Cacheable is not available 90% of time.
                var message = await messageCacheable.GetOrDownloadAsync();

                var role           = RoleExtensions.EmojiToRole(reaction.Emote.Name);
                var existingSignup = eventForMessage.Signups.FirstOrDefault(e => (e.Role == role || e.ReserveRole == role) && e.UserId == reaction.UserId);
                if (existingSignup != null)
                {
                    //If someone is a role-specific-reserve, we only remove their signup if they hit the role emoji, not the reserve emoji.
                    if (role == Role.Reserve && existingSignup.ReserveRole != Role.None)
                    {
                        return;
                    }

                    bool wasFull     = eventForMessage.IsFull();
                    bool roleWasFull = eventForMessage.IsRoleFull(role);

                    eventForMessage.RemoveSignup(existingSignup);
                    DbContext.SaveChanges();
                    if (channel is IGuildChannel guildChannel)
                    {
                        eventForMessage.UpdateSignupsOnMessageAsync(message, guildChannel.Guild);
                    }

                    var user = await channel.GetUserAsync(reaction.UserId);

                    if (user != null)
                    {
                        var returnTask = user.SendMessageAsync($"You are no longer joining {eventForMessage.EventName}");

                        Signup nextReserve = null;

                        if (wasFull && !eventForMessage.IsFull())
                        {
                            var leaderMsg = $"Your event {eventForMessage.EventName} is no longer full, as {user.Username} is no longer joining";
                            nextReserve = eventForMessage.GetNextReserve();
                            if (nextReserve != null)
                            {
                                var nextReserveUser = await message.Channel.GetUserAsync(nextReserve.UserId);

                                leaderMsg += $"\nAs {nextReserveUser.Username} is the first reserve, they have been notified";
                            }

                            var leaderUser = await channel.GetUserAsync(eventForMessage.LeaderUserID);

                            await returnTask.ContinueWith(t => leaderUser.SendMessageAsync(leaderMsg));
                        }
                        else if (roleWasFull && !eventForMessage.IsRoleFull(role))
                        {
                            nextReserve = eventForMessage.GetNextReserve(role);
                        }

                        if (nextReserve != null)
                        {
                            var reserveUser = await channel.GetUserAsync(nextReserve.UserId);

                            await returnTask.ContinueWith(t => reserveUser.SendMessageAsync($"A spot has opened up in {eventForMessage.EventName} and you are next on the reserves!"));
                        }

                        await returnTask;
                    }
                }
            }

            return;
        }