private Task ModifyEvent(Event existingEvent, Event newEvent, IUserMessage eventMessage, IUser leaderUser)
        {
            Logger.Log(new LogMessage(LogSeverity.Verbose, "NewEvent", $"Modifying event {existingEvent.EventName}"));

            existingEvent.EventName   = newEvent.EventName;
            existingEvent.DateAndTime = newEvent.DateAndTime;
            existingEvent.Description = newEvent.Description;

            var newReserves = new List <Signup>();

            existingEvent.TransferSignups(newEvent, out newReserves);

            //Anyone that was moved to reserved needs to be notified, and their old reaction removed
            foreach (var newReserve in newReserves)
            {
                var getUserTask = Context.Channel.GetUserAsync(newReserve.UserId);
                getUserTask.ContinueWith(t => t.Result.SendMessageAsync($"You were moved to reserve as {existingEvent.EventName} was modified, and no longer had room for your role"));
                var emotesToRemoveForUser = new IEmote[] { Role.DD.GetEmoji(), Role.Healer.GetEmoji(), Role.Tank.GetEmoji() };
                getUserTask.ContinueWith(t => eventMessage.RemoveReactionsAsync(t.Result, emotesToRemoveForUser));
            }

            //Remove reactions that are no longer needed
            //There might be an easier way to write this code? It seems really verbose... Maybe ternaries? I dunno
            if (newEvent.Signups.Any(e => e.IsRequired))
            {
                var hasTanks   = newEvent.Signups.Any(e => e.Role == Role.Tank && e.IsRequired);
                var hasHealers = newEvent.Signups.Any(e => e.Role == Role.Healer && e.IsRequired);
                var hasDDs     = newEvent.Signups.Any(e => e.Role == Role.DD && e.IsRequired);

                var emotesToRemoveForBot = new List <IEmote>();
                if (!hasTanks)
                {
                    emotesToRemoveForBot.Add(Role.Tank.GetEmoji());
                }
                if (!hasHealers)
                {
                    emotesToRemoveForBot.Add(Role.Healer.GetEmoji());
                }
                if (!hasDDs)
                {
                    emotesToRemoveForBot.Add(Role.DD.GetEmoji());
                }
                eventMessage.RemoveReactionsAsync(Context.Client.CurrentUser, emotesToRemoveForBot.ToArray());
            }

            DbContext.SaveChanges();

            var messageTask = eventMessage.ModifyAsync(e => e.Embed = GetEmbedForEvent(existingEvent, leaderUser));

            messageTask.ContinueWith(cont => existingEvent.UpdateSignupsOnMessageAsync(eventMessage, Context.Guild));
            messageTask.ContinueWith(cont => existingEvent.AddReactionsToMessageAsync(eventMessage));
            return(messageTask);
        }
        /// <summary>
        /// Executes the action in <paramref name="actionOnStop"/>.
        /// </summary>
        /// <param name="message">
        /// The message.
        /// </param>
        /// <param name="actionOnStop">
        /// The action to do.
        /// </param>
        public async Task OnStopAsync(IUserMessage message, ActionOnTimeout actionOnStop)
        {
            Interactive.RemoveReactionCallback(message);
            switch (actionOnStop)
            {
            case ActionOnTimeout.DeleteMessage:
                await message.DeleteAsync();

                break;

            case ActionOnTimeout.DeleteReactions:
                bool manageMessages = message.Channel is SocketGuildChannel guildChannel &&
                                      guildChannel.GetUser(message.Author.Id).GetPermissions(guildChannel).ManageMessages;
                if (manageMessages)
                {
                    await message.RemoveAllReactionsAsync();
                }
                else
                {
                    await message.RemoveReactionsAsync(message.Author, message.Reactions.Where(x => x.Value.IsMe).Select(x => x.Key).ToArray());
                }
                break;

            case ActionOnTimeout.Nothing:
            default:
                break;
            }
        }
예제 #3
0
        public async Task <UI> Edit(Player player, string content, Embed embed, MsgType type, string data, bool editEmotes = true)
        {
            this.type   = type;
            this.player = player;
            this.data   = data;

            //Edit Message
            IUserMessage msg = await GetUiMessage();

            await msg.ModifyAsync(x =>
            {
                x.Content = content;
                x.Embed   = embed;
            });


            if (editEmotes)
            {
                List <string> oldops = options;
                InitialiseOption();
                VerifyOptions();

                oldops.RemoveAll(e => options.Contains(e));
                _ = msg.RemoveReactionsAsync(Handlers.DiscordBotHandler.Client.CurrentUser, oldops.Select(x => EUI.ToEmote(x)).ToArray());

                LoadOptions(msg);
            }

            return(this);
        }
예제 #4
0
        async Task RemoveReactions(IUserMessage msg)
        {
            msg ??= message ?? await GetUiMessage();

            var bot = Handlers.DiscordBotHandler.Client.CurrentUser;

            _ = msg.RemoveReactionsAsync(bot, options.Select(x => EUI.ToEmote(x)).ToArray());
        }
예제 #5
0
        public async Task <bool> HandleReactionChangedAsync(IUserMessage message, IEmote reaction, IUser user, ReactionEvent eventType)
        {
            // Basic check to optimize number of queries to db
            if (!message.Content.StartsWith("**\n"))
            {
                return(false);
            }

            var channel = message.Channel as ITextChannel;

            using var dbContext = DatabaseFactory.Create();
            var data = await dbContext.RoleMenuMessageRoles.AsQueryable()
                       .Where(i =>
                              i.GuildId == channel.GuildId &&
                              i.ChannelId == channel.Id &&
                              i.MessageId == message.Id)
                       .ToArrayAsync();

            // check if message is role picker message
            if (data.Length == 0)
            {
                return(false);
            }

            var role = Array.Find(data, d => d.Emote == reaction.ToString());

            // Invalid reaction
            if (role == null)
            {
                await message.RemoveReactionAsync(reaction, user);

                return(true);
            }

            var guildRoles   = channel.Guild.Roles.Where(r => data.Any(e => r.Id == e.RoleId));
            var selectedRole = guildRoles.FirstOrDefault(r => r.Id == role.RoleId);

            // Role does not exists
            if (selectedRole == null)
            {
                // TODO Remove role from db
                return(true);
            }

            if (user is not IGuildUser guildUser)
            {
                await message.RemoveReactionAsync(reaction, user);

                return(true);
            }

            if (eventType == ReactionEvent.Removed)
            {
                await guildUser.RemoveRoleAsync(selectedRole);

                return(true);
            }

            // Remove roles when in exclusive mode
            if (dbContext.RoleMenuMessages.Any(m =>
                                               m.GuildId == channel.GuildId &&
                                               m.ChannelId == channel.Id &&
                                               m.MessageId == message.Id &&
                                               !m.CanSelectMultiple))
            {
                var removeReactions = message.Reactions
                                      .Where(kv => kv.Value.IsMe && kv.Key.ToString() != reaction.ToString())
                                      .Select(kv => kv.Key)
                                      .ToArray();

                await message.RemoveReactionsAsync(user, removeReactions);

                var removeRoles = guildRoles.Where(r => guildUser.RoleIds.Contains(r.Id));
                await guildUser.RemoveRolesAsync(removeRoles);
            }

            await guildUser.AddRoleAsync(selectedRole);

            return(true);
        }
예제 #6
0
 /// <summary>Removes the actual reactions from the message.</summary>
 public void RemoveReactions()
 {
     Message.RemoveReactionsAsync(DiscordBotBaseHelper.CurrentBot.Client.CurrentUser, new IEmote[] { new Emoji(Constants.ACCEPT_EMOJI), new Emoji(Constants.DENY_EMOJI) }).Wait();
 }
예제 #7
0
        public async Task ReactionAddedAsync(
            Cacheable <IUserMessage, ulong> cache, ISocketMessageChannel channel, SocketReaction reaction)
        {
            SocketGuild     guild = Program.Singleton.Client.GetGuild(573131665660968970);
            SocketGuildUser gUser = guild.GetUser(reaction.UserId);

            if (gUser == null)
            {
                return;
            }

            IUser        iUser = reaction.User.Value;
            IUserMessage msg   = await cache.DownloadAsync();

            if (reaction.MessageId.ToString() == Config.Bot.reactGender)
            {
                await msg.RemoveReactionsAsync(iUser, EmotesGender.Where(obj => obj.Name != reaction.Emote.Name).ToArray());

                await gUser.RemoveRolesAsync(RolesGender.Intersect(gUser.Roles.Select(obj => (IRole)obj)));

                switch (reaction.Emote.Name)
                {
                case "male":
                    _ = gUser.AddRoleAsync(RolesGender.FirstOrDefault(obj => obj.Name.ToString() == "Male"));
                    break;

                case "female":
                    _ = gUser.AddRoleAsync(RolesGender.FirstOrDefault(obj => obj.Name.ToString() == "Female"));
                    break;

                case "other":
                    _ = gUser.AddRoleAsync(RolesGender.FirstOrDefault(obj => obj.Name.ToString() == "Other"));
                    break;

                default:
                    _ = msg.RemoveReactionAsync(reaction.Emote, iUser, RequestOptions.Default);
                    break;
                }
            }
            else if (reaction.MessageId.ToString() == Config.Bot.reactHome)
            {
                await msg.RemoveReactionsAsync(iUser, EmotesHome.Where(obj => obj.Name != reaction.Emote.Name).ToArray());

                await gUser.RemoveRolesAsync(RolesHome.Intersect(gUser.Roles.Select(obj => (IRole)obj)));


                switch (reaction.Emote.Name)
                {
                case "northamerica":
                    _ = gUser.AddRoleAsync(RolesHome.FirstOrDefault(obj => obj.Name.ToString() == "North America"));
                    break;

                case "southamerica":
                    _ = gUser.AddRoleAsync(RolesHome.FirstOrDefault(obj => obj.Name.ToString() == "South America"));
                    break;

                case "oceania":
                    _ = gUser.AddRoleAsync(RolesHome.FirstOrDefault(obj => obj.Name.ToString() == "Oceania"));
                    break;

                case "europe":
                    _ = gUser.AddRoleAsync(RolesHome.FirstOrDefault(obj => obj.Name.ToString() == "Europe"));
                    break;

                case "asia":
                    _ = gUser.AddRoleAsync(RolesHome.FirstOrDefault(obj => obj.Name.ToString() == "Asia"));
                    break;

                case "africa":
                    _ = gUser.AddRoleAsync(RolesHome.FirstOrDefault(obj => obj.Name.ToString() == "Africa"));
                    break;

                default:
                    _ = msg.RemoveReactionAsync(reaction.Emote, iUser);
                    break;
                }
            }
            else if (reaction.MessageId.ToString() == Config.Bot.reactZodiac)
            {
                await msg.RemoveReactionsAsync(iUser, EmotesZodiac.Where(obj => obj.Name != reaction.Emote.Name).ToArray());

                await gUser.RemoveRolesAsync(RolesZodiac.Intersect(gUser.Roles.Select(obj => (IRole)obj)));

                switch (reaction.Emote.Name)
                {
                case "♒":
                    _ = gUser.AddRoleAsync(RolesZodiac.FirstOrDefault(obj => obj.Name.ToString() == "Aquarius"));
                    break;

                case "♓":
                    _ = gUser.AddRoleAsync(RolesZodiac.FirstOrDefault(obj => obj.Name.ToString() == "Pisces"));
                    break;

                case "♈":
                    _ = gUser.AddRoleAsync(RolesZodiac.FirstOrDefault(obj => obj.Name.ToString() == "Aries"));
                    break;

                case "♉":
                    _ = gUser.AddRoleAsync(RolesZodiac.FirstOrDefault(obj => obj.Name.ToString() == "Taurus"));
                    break;

                case "♊":
                    _ = gUser.AddRoleAsync(RolesZodiac.FirstOrDefault(obj => obj.Name.ToString() == "Gemini"));
                    break;

                case "♋":
                    _ = gUser.AddRoleAsync(RolesZodiac.FirstOrDefault(obj => obj.Name.ToString() == "Cancer"));
                    break;

                case "♌":
                    _ = gUser.AddRoleAsync(RolesZodiac.FirstOrDefault(obj => obj.Name.ToString() == "Leo"));
                    break;

                case "♍":
                    _ = gUser.AddRoleAsync(RolesZodiac.FirstOrDefault(obj => obj.Name.ToString() == "Virgo"));
                    break;

                case "♎":
                    _ = gUser.AddRoleAsync(RolesZodiac.FirstOrDefault(obj => obj.Name.ToString() == "Libra"));
                    break;

                case "♏":
                    _ = gUser.AddRoleAsync(RolesZodiac.FirstOrDefault(obj => obj.Name.ToString() == "Scorpio"));
                    break;

                case "♐":
                    _ = gUser.AddRoleAsync(RolesZodiac.FirstOrDefault(obj => obj.Name.ToString() == "Sagittarius"));
                    break;

                case "♑":
                    _ = gUser.AddRoleAsync(RolesZodiac.FirstOrDefault(obj => obj.Name.ToString() == "Capricorn"));
                    break;

                default:
                    _ = msg.RemoveReactionAsync(reaction.Emote, iUser);
                    break;
                }
            }
            else if (reaction.MessageId.ToString() == Config.Bot.reactMBTI)
            {
                await msg.RemoveReactionsAsync(iUser, EmotesMBTI.Where(obj => obj.Name != reaction.Emote.Name).ToArray());

                await gUser.RemoveRolesAsync(RolesMBTI.Intersect(gUser.Roles.Select(obj => (IRole)obj)));

                switch (reaction.Emote.Name)
                {
                case "intj":
                    _ = gUser.AddRoleAsync(RolesMBTI.FirstOrDefault(obj => obj.Name.ToString() == "INTJ"));
                    break;

                case "intp":
                    _ = gUser.AddRoleAsync(RolesMBTI.FirstOrDefault(obj => obj.Name.ToString() == "INTP"));
                    break;

                case "entj":
                    _ = gUser.AddRoleAsync(RolesMBTI.FirstOrDefault(obj => obj.Name.ToString() == "ENTJ"));
                    break;

                case "entp":
                    _ = gUser.AddRoleAsync(RolesMBTI.FirstOrDefault(obj => obj.Name.ToString() == "ENTP"));
                    break;

                case "infj":
                    _ = gUser.AddRoleAsync(RolesMBTI.FirstOrDefault(obj => obj.Name.ToString() == "INFJ"));
                    break;

                case "infp":
                    _ = gUser.AddRoleAsync(RolesMBTI.FirstOrDefault(obj => obj.Name.ToString() == "INFP"));
                    break;

                case "enfj":
                    _ = gUser.AddRoleAsync(RolesMBTI.FirstOrDefault(obj => obj.Name.ToString() == "ENFJ"));
                    break;

                case "enfp":
                    _ = gUser.AddRoleAsync(RolesMBTI.FirstOrDefault(obj => obj.Name.ToString() == "ENFP"));
                    break;

                case "istj":
                    _ = gUser.AddRoleAsync(RolesMBTI.FirstOrDefault(obj => obj.Name.ToString() == "ISTJ"));
                    break;

                case "isfj":
                    _ = gUser.AddRoleAsync(RolesMBTI.FirstOrDefault(obj => obj.Name.ToString() == "ISFJ"));
                    break;

                case "estj":
                    _ = gUser.AddRoleAsync(RolesMBTI.FirstOrDefault(obj => obj.Name.ToString() == "ESTJ"));
                    break;

                case "esfj":
                    _ = gUser.AddRoleAsync(RolesMBTI.FirstOrDefault(obj => obj.Name.ToString() == "ESFJ"));
                    break;

                case "istp":
                    _ = gUser.AddRoleAsync(RolesMBTI.FirstOrDefault(obj => obj.Name.ToString() == "ISTP"));
                    break;

                case "isfp":
                    _ = gUser.AddRoleAsync(RolesMBTI.FirstOrDefault(obj => obj.Name.ToString() == "ISFP"));
                    break;

                case "estp":
                    _ = gUser.AddRoleAsync(RolesMBTI.FirstOrDefault(obj => obj.Name.ToString() == "ESTP"));
                    break;

                case "esfp":
                    _ = gUser.AddRoleAsync(RolesMBTI.FirstOrDefault(obj => obj.Name.ToString() == "ESFP"));
                    break;

                default:
                    _ = msg.RemoveReactionAsync(reaction.Emote, iUser);
                    break;
                }
            }

            User user = User.Get(reaction.UserId);

            if (user == null)
            {
                return;
            }

            ActionParam action = new ActionParam("React", channel.Id);

            ActionManager.Singleton.OnAction(user, action);
        }