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; } }
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); }
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()); }
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); }
/// <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(); }
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); }