コード例 #1
0
        private static async Task ClientOnMessageReactionAdded(MessageReactionAddEventArgs e, Game game)
        {
            var present = false;

            foreach (var personnage in game.PersonnagesList.FindAll(p => p.Alive))
            {
                if (e.Emoji == personnage.Emoji)
                {
                    present = true;
                }
            }

            if (!present || (GameBuilder.GetMember(game.Guild, e.User)).Roles.Contains(Global.Roles[CustomRoles.Spectator]))
            {
                await DailyVotingMessage.DeleteReactionAsync(e.Emoji, e.User);

                return;
            }


            if (!e.User.IsBot && !GameBuilder.GetMember(game.Guild, e.User).Roles.Contains(Global.Roles[CustomRoles.Spectator]))
            {
                foreach (var otherEmoji in (await game.Guild.GetEmojisAsync()))
                {
                    if (otherEmoji.Name != e.Emoji.Name)
                    {
                        await DailyVotingMessage.DeleteReactionAsync(otherEmoji, e.User,
                                                                     $"{e.User.Username} already voted");
                    }
                }
            }
        }
コード例 #2
0
        private Task _discordClient_MessageReactionAdded(DiscordClient sender, MessageReactionAddEventArgs e)
        {
            _ = Task.Run(async() =>
            {
                await _semaphoreLock.WaitAsync();
                _semaphoreLock.Release();

                if (e.Channel.Id != _textChannel.Id || e.Emoji != _config.FaqRoleEmoji ||
                    !(e.User is DiscordMember member))
                {
                    return;
                }

                if (!IsEnabled)
                {
                    if (_faqLockInformed.Contains(member.Id) || member.Roles.Any(x => x.Id == _config.FaqRoleId))
                    {
                        return;
                    }

                    // Only send the DM once.
                    _faqLockInformed.Add(member.Id);

                    await member.SendMessageAsync(embed: new DiscordEmbedBuilder
                    {
                        Description =
                            "The FAQ verification process is temporarily locked, this is most likely due to spam bots joining. Please try again later.",
                        Color = DiscordColor.Orange
                    }.Build());

                    return;
                }

                // Check that the message reacted to is the last message in the channel
                if (_lastMessage.Id == e.Message.Id)
                {
                    // Ignore actions from the bot, or if the user already has the role
                    if (!member.IsSelf(_discordClient))
                    {
                        if (member.Roles.All(x => x.Id != _config.FaqRoleId))
                        {
                            var role = _textChannel.Guild.GetRole(_config.FaqRoleId);
                            await member.GrantRoleAsync(role);
                        }

                        if (_lastMessage.IsUserMessage())
                        {
                            await _lastMessage.DeleteReactionAsync(_config.FaqRoleEmoji, member);
                        }
                    }
                }
            });

            return(Task.CompletedTask);
        }
コード例 #3
0
        public async Task Background(CommandContext ctx, int?page = null)
        {
            if (page == null || page <= 0)
            {
                page = 1;
            }
            var msgBuilder = new DiscordMessageBuilder()
                             .WithContent(CustomMethod.GetBackgroundList(ctx, (int)page))
                             .WithReply(ctx.Message.Id, true);
            DiscordMessage TopMessage = await ctx.RespondAsync(msgBuilder);

            DiscordEmoji left  = DiscordEmoji.FromName(ctx.Client, ":arrow_left:");
            DiscordEmoji right = DiscordEmoji.FromName(ctx.Client, ":arrow_right:");

            await TopMessage.CreateReactionAsync(left);

            await Task.Delay(300).ContinueWith(t => TopMessage.CreateReactionAsync(right));

            bool end = false;

            do
            {
                var result = TopMessage.WaitForReactionAsync(ctx.User, TimeSpan.FromSeconds(20));
                if (result.Result.TimedOut)
                {
                    end = result.Result.TimedOut;
                }
                else if (result.Result.Result.Emoji == left)
                {
                    await TopMessage.DeleteReactionAsync(result.Result.Result.Emoji, ctx.User);

                    if (page > 1)
                    {
                        page--;
                        await TopMessage.ModifyAsync(CustomMethod.GetBackgroundList(ctx, (int)page));
                    }
                }
                else if (result.Result.Result.Emoji == right)
                {
                    await TopMessage.DeleteReactionAsync(result.Result.Result.Emoji, ctx.User);

                    page++;
                    try
                    {
                        await TopMessage.ModifyAsync(CustomMethod.GetBackgroundList(ctx, (int)page));
                    }
                    catch (Exception)
                    {
                        page--;
                    }
                }
            } while (!end);
            await TopMessage.DeleteAllReactionsAsync();
        }
コード例 #4
0
        public async Task <bool> DeleteReactionAsync(DiscordMessage message, DiscordUser reactionUser, DiscordEmoji emoji)
        {
            try
            {
                await message.DeleteReactionAsync(emoji, reactionUser);
            }
            catch (UnauthorizedException)
            {
                var messageContent = message.Content ?? (await message.Channel.GetMessageAsync(message.Id)).Content;

                if (messageContent.EndsWith("```", StringComparison.InvariantCultureIgnoreCase))
                {
                    messageContent += "\r\n";
                    messageContent += "*It seems that I have not enough permissions to do pagination properly. Please check " +
                                      "bot/channel permissions and be sure that I have ability to manage messages.*";
                }

                _logger.Warn("Can't do pagination due to permissions");
                await message.ModifyAsync(messageContent);

                return(false);
            }

            return(true);
        }
コード例 #5
0
ファイル: VUTDB.cs プロジェクト: Speyd3r/MeekPlushRW
 public async void Derratives(CommandContext ctx, DiscordMessage init, int select, dynamic myresponse, dynamic dresponse)
 {
     try
     {
         try { await init.DeleteReactionAsync(DiscordEmoji.FromName(ctx.Client, ":revolving_hearts:"), ctx.Message.Author); }
         catch { }
         string tumurl = "";
         if (myresponse.items[select].pvs.Count != 0)
         {
             tumurl = myresponse.items[select].pvs[0].thumbUrl;
         }
         var emim = new DiscordEmbedBuilder
         {
             Color = new DiscordColor("#68D3D2"),
             Title = "Covers & Remixes!"
         };
         emim.WithThumbnail(tumurl);
         string stuff = "";
         foreach (var derr in dresponse)
         {
             stuff += $"**{derr.name} by {derr.artistString}**\n https://vocadb.net/S/" + derr.id + " \n\n";
         }
         if (stuff.Length > 1950)
         {
             stuff = "too many please go to https://vocadb.net/S/" + myresponse.items[select].id;
         }
         emim.WithDescription("Found: \n\n" + stuff);
         var end = emim.Build();
         await init.ModifyAsync(null, embed : end);
     }
     catch
     {
         await ctx.RespondAsync("Error");
     }
 }
コード例 #6
0
        public async Task RemovePreviousReactionsAsync(DiscordUser user, DiscordEmoji currentReaction)
        {
            var reactions = m_message.Reactions
                            .Where(x => x.Count > 1 && x.Emoji != currentReaction);

            foreach (var reaction in reactions)
            {
                await m_message.DeleteReactionAsync(reaction.Emoji, user);
            }
        }
コード例 #7
0
        protected async Task AddReactionButton(DiscordEmoji emoji, UIAction pressedAction)
        {
            await message.CreateReactionAsync(emoji);

            Flipper.Bot.MessageReactionAdded += async args =>
            {
                if (args.Message == message && args.Emoji == emoji && args.User != Flipper.Bot.CurrentUser)
                {
                    var press  = pressedAction(args.ToUIActionArgs());
                    var delete = message.DeleteReactionAsync(emoji, args.User);
                    await Task.WhenAll(press, delete);
                }
            };
        }
コード例 #8
0
ファイル: VUTDB.cs プロジェクト: Speyd3r/MeekPlush-Bot
        public async void BaseiInfo(CommandContext ctx, DiscordMessage init, int select, dynamic myresponse, dynamic dresponse)
        {
            try
            {
                try { await init.DeleteReactionAsync(DiscordEmoji.FromName(ctx.Client, ":pushpin:"), ctx.Message.Author); }
                catch { }
                string tumurl = "";
                if (myresponse.items[select].pvs.Count != 0)
                {
                    tumurl = myresponse.items[select].pvs[0].thumbUrl;
                }
                var emim = new DiscordEmbedBuilder
                {
                    Color        = new DiscordColor("#68D3D2"),
                    Title        = "Results!",
                    Description  = "Entry for " + myresponse.term,
                    ThumbnailUrl = tumurl
                };

                emim.AddField("Artist", myresponse.items[select].artistString, true);
                emim.AddField("Title", myresponse.items[select].defaultName, true);
                emim.AddField("Language", myresponse.items[select].defaultNameLanguage, true);
                emim.AddField("Published", myresponse.items[select].publishDate.ToShortDateString(), true);
                emim.AddField("Song Type", myresponse.items[select].songType, true);
                //emim.AddField("Lyrics", lys);
                string pvs = "";
                foreach (var pv in myresponse.items[select].pvs)
                {
                    pvs += pv.url + "\n";
                }
                emim.AddField("PV(s)", pvs, true);
                emim.AddField("VocaDB Link", $"https://vocadb.net/S/{myresponse.items[select].id}", true);
                emim.AddField("Cover/Remix count", dresponse.Count.ToString(), true);
                emim.WithFooter("Requested by " + ctx.Message.Author.Username, ctx.Message.Author.AvatarUrl);

                //emim.AddField("Buttons", $"{DiscordEmoji.FromName(ctx.Client, ":pushpin: ")} this\n" +
                //    $"{DiscordEmoji.FromName(ctx.Client, ":page_facing_up:")} (if available) Lyrics!\n" +
                //    $"{DiscordEmoji.FromName(ctx.Client, ":movie_camera:")} Watch the PV!\n" +
                //    $"{DiscordEmoji.FromName(ctx.Client, ":x:")} cancel out, not needed, but its there");
                var end = emim.Build();
                await init.ModifyAsync(null, embed : end);
            }
            catch
            {
                await ctx.RespondAsync("Song not found (Note: In weird cases it finds the song but still returns 0 results, since this crashes the bot, its not showing anything here)");
            }
        }
コード例 #9
0
ファイル: VUTDB.cs プロジェクト: Speyd3r/MeekPlush-Bot
 public async void PVShowInfo(CommandContext ctx, DiscordMessage init, int select, dynamic myresponse, dynamic dresponse, int yt)
 {
     try
     {
         try { await init.DeleteReactionAsync(DiscordEmoji.FromName(ctx.Client, ":movie_camera:"), ctx.Message.Author); }
         catch { }
         if (yt == -1)
         {
             yt = 0;
         }
         await init.ModifyAsync(myresponse.items[select].pvs[yt].url, embed : null);
     }
     catch
     {
         await ctx.RespondAsync("If you see this, idk how this can even break, it just changes the message to a link, no fancy embed making involved anyway, tell Speyd3r#3939");
     }
 }
コード例 #10
0
ファイル: VUTDB.cs プロジェクト: Speyd3r/MeekPlushRW
 public async void PVShowInfo(CommandContext ctx, DiscordMessage init, int select, dynamic myresponse, dynamic dresponse, int yt)
 {
     try
     {
         try { await init.DeleteReactionAsync(DiscordEmoji.FromName(ctx.Client, ":movie_camera:"), ctx.Message.Author); }
         catch { }
         if (yt == -1)
         {
             yt = 0;
         }
         await init.ModifyAsync(myresponse.items[select].pvs[yt].url, embed : null);
     }
     catch
     {
         await ctx.RespondAsync("Something broke that shouldnt break, hmm");
     }
 }
コード例 #11
0
        public async Task OnReactionAdd(MessageReactionAddEventArgs e)
        {
            if (e.User.Id == user.Id && ValidReactions.Contains(e.Emoji))
            {
                if (e.Emoji == LeftArrowEmoji)
                {
                    if (CanGoLeftPage)
                    {
                        --page;
                    }
                }
                else if (e.Emoji == RightArrowEmoji)
                {
                    if (CanGoRightPage)
                    {
                        ++page;
                    }
                }
                else
                {
                    int index    = DigitEmojis.ToList().IndexOf(e.Emoji);
                    var reminder = remindersOnPage[index];
                    await remindMe.DeleteReminder(reminder);

                    scopedRemindersCount = scopedReminders.Count();
                    if (page > 0 && NumberOfRemindersOnPage <= 0)
                    {
                        --page;
                    }
                }
                timeoutTimer.Stop();
                timeoutTimer.Start();
                await UpdateMessage();
            }
            else
            {
                try {
                    await message.DeleteReactionAsync(e.Emoji, e.User, "Invalid reaction to reminder list");
                } catch (UnauthorizedException) {
                    remindMe.BotMethods.Log(this, new LogEventArgs {
                        Message = $"ReminderList tried clearing reactions, but couldn't because it doesn't have permission. The user must clear their own reaction.",
                        Type    = LogType.Warning
                    });
                }
            }
        }
コード例 #12
0
        public async void ManageRole(DiscordMessage message, DiscordChannel channel, DiscordMember member, DiscordEmoji emoji)
        {
            var guild = await redis.GetAsync <Guild>(RedisKeyNaming.Guild(channel.GuildId));

            var reactionCategory     = guild.ReactionCategories?.FirstOrDefault(x => x.Id == message.Id);
            var reactionCategoryItem = reactionCategory?.ReactionRoles.Single(x => x.Emoji == emoji.ToString());
            var reactionMessageItem  = guild.ReactionMessages?.Single(x => x.Id == message.Id)?.ReactionRoles.Single(x => x.Emoji == emoji.ToString());

            var roleId         = ulong.MinValue;
            var categoryRoleId = ulong.MinValue;

            if (reactionCategoryItem != null)
            {
                categoryRoleId = reactionCategory.RoleId;
                roleId         = reactionCategoryItem.RoleId;
            }

            if (reactionMessageItem != null)
            {
                roleId = reactionMessageItem.RoleId;
            }

            var role         = channel.Guild.GetRole(roleId);
            var categoryRole = channel.Guild.GetRole(categoryRoleId);

            if (role != null)
            {
                if (member.Roles.Contains(role))
                {
                    this.logger.Information($"The role '{role.Name}' was revoked from '{member.GetUsertag()}' on the guild '{channel.Guild.Name}' ({channel.GuildId}).");
                    await member.RevokeRoleAsync(role);

                    await member.SendMessageAsync($"The role {Formatter.InlineCode(role.Name)} has been revoked from you on {Formatter.Bold(channel.Guild.Name)}.");
                }
                else
                {
                    this.logger.Information($"The role '{role.Name}' was granted to '{member.GetUsertag()}' on the guild '{channel.Guild.Name}' ({channel.GuildId}).");
                    await member.GrantRoleAsync(role);

                    await member.SendMessageAsync($"The role {Formatter.InlineCode(role.Name)} has been granted to you on {Formatter.Bold(channel.Guild.Name)}.");
                }

                await message.DeleteReactionAsync(emoji, member);
            }
        }
コード例 #13
0
        /// <summary>
        /// listens for reactions from users and responds accordingly
        /// </summary>
        /// <returns></returns>
        public async Task<GameState> RunLobby()
        {
            var timeOut = TimeSpan.FromSeconds(1);
            while (CurrentGameStatus != GameState.Finished)
            {
                var emojiReaction = await _Interactivity.WaitForReactionAsync(x => x.Message == _EmbedMessage, timeOut);
                if (!emojiReaction.TimedOut)
                {
                    var emoji = emojiReaction.Result.Emoji;
                    var user = emojiReaction.Result.User;

                    if (_ValidReactEmojis.Contains(emoji))
                    {
                        if (emoji == _PlayGame)
                        {
                            await StartOrPauseGame(user);
                        }
                        else if (emoji == _StopGame)
                        {
                            await RestartGame(user);
                        }
                        else if (emoji == _LeaveLobby)
                        {
                            if (await LeaveLobby(user))
                                break;
                        }
                        else if (emoji != _LeaveLobby)
                        {
                            await OnEmbedMessageReaction(user, emoji);
                        }
                    }
                    else
                    {
                        //delete unwanted reactions
                        await _EmbedMessage.DeleteReactionsEmojiAsync(emoji);
                    }

                    //delete the latest reaction
                    await _EmbedMessage.DeleteReactionAsync(emoji, user);
                }
            }

            return CurrentGameStatus.GetValueOrDefault();
        }
コード例 #14
0
        public async void ManageRole(DiscordChannel channel, DiscordMessage message, DiscordUser user, DiscordEmoji emoji, BaseDiscordClient client)
        {
            var roleId = _listener[message.Id.ToString()][emoji];
            var role   = channel.Guild.GetRole(roleId);
            var member = await channel.Guild.GetMemberAsync(user.Id);

            if (member.Roles.Contains(role))
            {
                _logger.Information($"The role '{role.Name}' was revoked from '{user.Username}#{user.Discriminator}' on the guild '{channel.Guild.Name}' ({channel.Guild.Id}).");
                await((DiscordMember)user).RevokeRoleAsync(role);
            }
            else
            {
                _logger.Information($"The role '{role.Name}' was granted to '{user.Username}#{user.Discriminator}' on the guild '{channel.Guild.Name}' ({channel.Guild.Id}).");
                await((DiscordMember)user).GrantRoleAsync(role);
            }

            await message.DeleteReactionAsync(emoji, user);
        }
コード例 #15
0
        private async Task OnMessageReactionAdded(DiscordClient dClient, MessageReactionAddEventArgs args)
        {
            if (args.Guild.Id != Guilds.Bloon || args.Channel.Id != BloonChannels.Settings || args.User.Id == dClient.CurrentUser.Id)
            {
                return;
            }

            DiscordChannel settingsChannel = await this.dClient.GetChannelAsync(BloonChannels.Settings);

            DiscordChannel botMods = await this.dClient.GetChannelAsync(BloonChannels.BotMods);

            DiscordMessage featureMessage = await settingsChannel.GetMessageAsync(args.Message.Id);

            Feature feature = this.featureManager.Features.Where(f => f.Name == featureMessage.Embeds[0]?.Title).FirstOrDefault();

            if (feature == null)
            {
                return;
            }
            else if (args.Emoji.Id == FeatureEmojis.ToggleOff && feature.Enabled)
            {
                await feature.Disable();

                await this.featureManager.UpdateFeatureStatusAsync(feature.Name, false);

                await botMods.SendMessageAsync($"{args.User.Username}#{args.User.Discriminator} *disabled* `{feature.Name}` at {DateTime.Now}\n" +
                                               $"{featureMessage.JumpLink}");
            }
            else if (args.Emoji.Id == FeatureEmojis.ToggleOn && !feature.Enabled)
            {
                await feature.Enable();

                await this.featureManager.UpdateFeatureStatusAsync(feature.Name, true);

                await botMods.SendMessageAsync($"{args.User.Username}#{args.User.Discriminator} *enabled* `{feature.Name}` at {DateTime.Now}\n" +
                                               $"{featureMessage.JumpLink}");
            }

            await featureMessage.ModifyAsync(embed : CreateFeatureEmbed(feature));

            await featureMessage.DeleteReactionAsync(args.Emoji, args.User);
        }
コード例 #16
0
ファイル: Starbucks.cs プロジェクト: xenia-canary/discord-bot
        private static async Task BadUpdateAsync(DiscordClient client, DiscordUser user, DiscordMessage message, DiscordEmoji emoji)
        {
            if (message?.Channel.Id != Config.BotChannelId)
            {
                return;
            }

            if (!user.IsSmartlisted(client, message.Channel.Guild))
            {
                return;
            }

            await Moderation.ToggleBadUpdateAnnouncementAsync(message).ConfigureAwait(false);

            try
            {
                await message.DeleteReactionAsync(emoji, user).ConfigureAwait(false);
            }
            catch { }
        }
コード例 #17
0
        private static async Task SetReactions(DiscordMessage message, IEnumerable <Answer> answers, bool processOld = false, bool deleteOld = true)
        {
            var existingReactions = message.Reactions;
            var answerEmojis      = answers.Select(a => a.Emoji).ToArray();

            bool reactionsOk = existingReactions.Count() == answers.Count() ?
                               existingReactions.Select(r => r.Emoji).Zip(answerEmojis).All(p => p.First.Id == p.Second.Id) : false;

            if (reactionsOk)
            {
                //Clean others
                foreach (var p in existingReactions.SelectMany(r => message.GetReactionsAsync(r.Emoji).Result.Select((u) => (User: u, Reaction: r))))
                {
                    if (p.User.IsCurrent)
                    {
                        continue;
                    }
                    if (processOld && answerEmojis.Contains(p.Reaction.Emoji))
                    {
                        await answers.FirstOrDefault(a => a.Emoji == p.Reaction.Emoji).InvokeFromEmoji(p.User, message);
                    }
                    if (deleteOld)
                    {
                        await message.DeleteReactionAsync(p.Reaction.Emoji, p.User);
                    }
                }
            }
            else
            {
                //Clear, replace
                await message.DeleteAllReactionsAsync();

                foreach (var emoji in answerEmojis)
                {
                    await Task.Delay(100);                    //Will it suffice?

                    await message.CreateReactionAsync(emoji);
                }
            }
        }
コード例 #18
0
 /// <summary>Deletes another user's reaction.</summary>
 public static Task DeleteReactionAsync(this DiscordMessage message, string emoji, DiscordUser user, string reason = null)
 => message.DeleteReactionAsync(emoji.ToEmoji(), user, reason);
コード例 #19
0
        public static async Task Reaction_Roles(DiscordClient Client, MessageReactionAddEventArgs e)
        {
            _ = Task.Run(async() =>
            {
                if (e.Emoji.Id != 0 && !e.User.IsBot)
                {
                    new Thread(async() =>
                    {
                        DiscordEmoji used        = e.Emoji;
                        DiscordMessage sourcemsg = e.Message;
                        DiscordUser username     = e.User;

                        List <DB.ReactionRoles> ReactionRoles = DB.DBLists.ReactionRoles;
                        var RoleInfo = (from rr in ReactionRoles
                                        where rr.Server_ID == e.Channel.Guild.Id
                                        where rr.Message_ID == sourcemsg.Id
                                        where rr.Reaction_ID == used.Id
                                        select rr).FirstOrDefault();
                        if (RoleInfo != null)
                        {
                            DiscordGuild guild = await Client.GetGuildAsync(Convert.ToUInt64(RoleInfo.Server_ID));
                            if (RoleInfo.Type == "acquire")
                            {
                                DiscordMember rolemember = username as DiscordMember;
                                if (rolemember.Roles.Any(w => w.Id == Convert.ToUInt64(RoleInfo.Role_ID)))
                                {
                                    await rolemember.RevokeRoleAsync(guild.GetRole(Convert.ToUInt64(RoleInfo.Role_ID)));
                                }
                                else
                                {
                                    await rolemember.GrantRoleAsync(guild.GetRole(Convert.ToUInt64(RoleInfo.Role_ID)));
                                }

                                Thread.Sleep(20000);
                                await sourcemsg.DeleteReactionAsync(used, e.User, null);
                            }
                            else if (RoleInfo.Type == "activate")
                            {
                                DiscordRole role = guild.GetRole(Convert.ToUInt64(RoleInfo.Role_ID));
                                string msg       = $"---";
                                if (role.IsMentionable)
                                {
                                    await role.ModifyAsync(mentionable: false);
                                    msg = $"{role.Name} ⨯";
                                    ActivateRolesTimer.RemoveAt(ActivateRolesTimer.FindIndex(a => a.Guild == e.Guild && a.Role == role));
                                }
                                else if (!role.IsMentionable)
                                {
                                    await role.ModifyAsync(mentionable: true);
                                    msg = $"{role.Name} ✓";
                                    ActivateRolesTimer newItem = new()
                                    {
                                        Guild = guild,
                                        Role  = role,
                                        Time  = DateTime.Now
                                    };
                                    ActivateRolesTimer.Add(newItem);
                                }
                                await sourcemsg.DeleteReactionAsync(used, e.User, null);
                                DiscordMessage m = await e.Channel.SendMessageAsync(msg);
                                Thread.Sleep(3000);
                                await m.DeleteAsync();
                            }
                        }
                    }).Start();
                    await Task.Delay(0);
                }
            });
            await Task.Delay(1);
        }
コード例 #20
0
ファイル: RaidLobbyManager.cs プロジェクト: versx/Brock
        private async Task ProcessRaidLobbyReactionDM(DiscordUser user, DiscordChannel channel, DiscordMessage message, DiscordEmoji emoji)
        {
            if (SupportersOnly)
            {
                var hasPrivilege = await _client.IsSupporterOrHigher(user.Id, _config);

                if (!hasPrivilege)
                {
                    await message.RespondAsync($"{user.Mention} does not have the supporter role assigned.");

                    return;
                }
            }

            var origMessageId = Convert.ToUInt64(Utils.GetBetween(message.Content, "#", "#"));
            var lobby         = GetLobby(channel, ref origMessageId);

            var settings = await GetRaidLobbySettings(lobby, origMessageId, message, channel);

            if (settings == null)
            {
                _logger.Error($"Failed to find raid lobby settings for original raid message id {origMessageId}.");
                return;
            }

            await message.DeleteReactionAsync(emoji, user);

            var lobMessage = default(DiscordMessage);
            var embedMsg   = settings.RaidMessage?.Embeds[0];

            switch (emoji.Name)
            {
            //case "1⃣":
            //    break;
            //case "2⃣":
            //    break;
            //case "3⃣":
            //    break;
            //case "4⃣":
            //    break;
            case "5⃣":
                lobby.UsersComing[user.Id].Eta      = RaidLobbyEta.Five;
                lobby.UsersComing[user.Id].EtaStart = DateTime.Now;
                lobMessage = await UpdateRaidLobbyMessage(lobby, settings.RaidLobbyChannel, embedMsg);

                await message.DeleteAllReactionsAsync();

                break;

            case "🔟":
                lobby.UsersComing[user.Id].Eta      = RaidLobbyEta.Ten;
                lobby.UsersComing[user.Id].EtaStart = DateTime.Now;
                lobMessage = await UpdateRaidLobbyMessage(lobby, settings.RaidLobbyChannel, embedMsg);

                await message.DeleteAllReactionsAsync();

                break;

            case "❌":
                if (!lobby.UsersComing.ContainsKey(user.Id))
                {
                    lobby.UsersComing.Remove(user.Id);
                    lobMessage = await UpdateRaidLobbyMessage(lobby, settings.RaidLobbyChannel, embedMsg);
                }
                break;
            }
            _config.RaidLobbies.ActiveLobbies[origMessageId] = lobby;
            _config.Save();
        }
コード例 #21
0
ファイル: Reactions.cs プロジェクト: Erisa/Heartosoft
        public static async Task ReactionAdd(ModCoreShard bot, MessageReactionAddEventArgs e)
        {
            GuildSettings cfg = null;

            using (var db = bot.Database.CreateContext())
            {
                cfg = e.Channel.Guild.GetGuildSettings(db);
                if (cfg == null)
                {
                    return;
                }

                if (cfg.ReactionRoles.Any(x => (ulong)x.ChannelId == e.Channel.Id && (ulong)x.MessageId == message.Id && (ulong)x.Reaction.EmojiId == e.Emoji.Id && x.Reaction.EmojiName == e.Emoji.Name))
                {
                    var rrid = (ulong)cfg.ReactionRoles.First(
                        x => (ulong)x.ChannelId == e.Channel.Id && (ulong)x.MessageId == message.Id && (ulong)x.Reaction.EmojiId == e.Emoji.Id && x.Reaction.EmojiName == e.Emoji.Name).RoleId;
                    var rrrole = e.Channel.Guild.GetRole(rrid);
                    var mem    = await e.Channel.Guild.GetMemberAsync(e.User.Id);

                    if (!mem.Roles.Any(x => x.Id == rrid))
                    {
                        await mem.GrantRoleAsync(rrrole);
                    }
                }

                var          emoji = cfg.Starboard.Emoji;
                DiscordEmoji em    = null;
                if (emoji.EmojiId != 0)
                {
                    em = DiscordEmoji.FromGuildEmote(e.Client, (ulong)emoji.EmojiId);
                }
                else
                {
                    em = DiscordEmoji.FromUnicode(e.Client, emoji.EmojiName);
                }

                if (!cfg.Starboard.AllowNSFW && e.Channel.IsNSFW)
                {
                    return;
                }

                if (cfg.Starboard.Enable && e.Emoji == em)
                {
                    long sbmid = 0;
                    var  c     = e.Channel.Guild.Channels.First(x => x.Key == (ulong)cfg.Starboard.ChannelId).Value;
                    if (c.Id == e.Channel.Id) // star on starboard entry
                    {
                        /*if (db.StarDatas.Any(x => (ulong)x.StarboardMessageId == message.Id))
                         * {
                         *  var other = db.StarDatas.First(x => (ulong)x.StarboardMessageId == message.Id);
                         *  var count = db.StarDatas.Count(x => (ulong)x.StarboardMessageId == message.Id);
                         *  if (!db.StarDatas.Any(x => x.MessageId == other.MessageId && x.StargazerId == (long)e.User.Id))
                         *  {
                         *      var chn = await e.Client.GetChannelAsync((ulong)other.ChannelId);
                         *      var msg = await chn.GetMessageAsync((ulong)other.MessageId);
                         *
                         *      if (msg.Author.Id == e.User.Id || e.User.IsBot)
                         *          return;
                         *
                         *      var d = await (await c.GetMessageAsync((ulong)other.StarboardMessageId)).ModifyAsync($"{e.Emoji}: {count + 1} ({msg.Id}) in {msg.Channel.Mention}", embed: BuildMessageEmbed(msg));
                         *      sbmid = (long)d.Id;
                         *      await db.StarDatas.AddAsync(new DatabaseStarData
                         *      {
                         *          ChannelId = other.ChannelId,
                         *          GuildId = (long)e.Channel.Guild.Id,
                         *          MessageId = other.MessageId,
                         *          AuthorId = other.AuthorId,
                         *          StarboardMessageId = sbmid,
                         *          StargazerId = (long)e.User.Id,
                         *      });
                         *      await db.SaveChangesAsync();
                         *  }
                         * }*/

                        // Removing this behaviour for jump links.
                    }
                    else // star on actual message
                    {
                        message = await e.Channel.GetMessageAsync(e.Message.Id);


                        if (message.Author.Id == e.User.Id)
                        {
                            await message.DeleteReactionAsync(e.Emoji, message.Author);

                            return;
                        }


                        if (db.StarDatas.Any(x => (ulong)x.MessageId == message.Id))
                        {
                            var count = db.StarDatas.Count(x => (ulong)x.MessageId == message.Id);

                            if (db.StarDatas.Any(x => (ulong)x.MessageId == message.Id && x.StarboardMessageId != 0))
                            {
                                var other = db.StarDatas.First(x => (ulong)x.MessageId == message.Id && x.StarboardMessageId != 0);
                                var msg   = await c.GetMessageAsync((ulong)other.StarboardMessageId);

                                var d = await msg.ModifyAsync($"{e.Emoji}: {count + 1} ({message.Id}) in {message.Channel.Mention}", embed : BuildMessageEmbed(message));

                                sbmid = (long)d.Id;
                            }
                            else
                            {
                                if (count + 1 >= cfg.Starboard.Minimum)
                                {
                                    // create msg
                                    var d = await c.ElevatedMessageAsync($"{e.Emoji}: {count + 1} ({message.Id}) in {message.Channel.Mention}", embed : BuildMessageEmbed(message));

                                    sbmid = (long)d.Id;
                                }
                            }
                        }
                        else if (cfg.Starboard.Minimum <= 1)
                        {
                            var d = await c.ElevatedMessageAsync($"{e.Emoji}: 1 ({message.Id}) in {message.Channel.Mention}", embed : BuildMessageEmbed(message));

                            sbmid = (long)d.Id;
                        }

                        await db.StarDatas.AddAsync(new DatabaseStarData
                        {
                            ChannelId          = (long)e.Channel.Id,
                            GuildId            = (long)e.Channel.Guild.Id,
                            MessageId          = (long)message.Id,
                            AuthorId           = (long)message.Author.Id,
                            StarboardMessageId = sbmid,
                            StargazerId        = (long)e.User.Id,
                        });

                        // somebody once told me...
                        var allstars = db.StarDatas.Where(x => (ulong)x.MessageId == message.Id).ToList();
                        allstars.ForEach(x => x.StarboardMessageId = sbmid);
                        db.StarDatas.UpdateRange(allstars);

                        await db.SaveChangesAsync();
                    }
                }
            }
        }
コード例 #22
0
ファイル: VUTDB.cs プロジェクト: Speyd3r/MeekPlushRW
        public async void LyricEm(CommandContext ctx, DiscordMessage init, int select, dynamic myresponse, dynamic dresponse)
        {
            try
            {
                try { await init.DeleteReactionAsync(DiscordEmoji.FromName(ctx.Client, ":page_facing_up:"), ctx.Message.Author); }
                catch { }
                var    interactivity = ctx.Client.GetInteractivity();
                int    lyse          = 0;
                string tumurl        = "";
                if (myresponse.items[select].pvs.Count != 0)
                {
                    tumurl = myresponse.items[select].pvs[0].thumbUrl;
                }
                var emim = new DiscordEmbedBuilder
                {
                    Color = new DiscordColor("#68D3D2"),
                    Title = "Results!"
                };
                emim.WithThumbnail(tumurl);
                emim.AddField("Artist", myresponse.items[select].artistString, true);
                emim.AddField("Title", myresponse.items[select].defaultName, true);
                emim.WithFooter("Requested by " + ctx.Message.Author.Username, ctx.Message.Author.AvatarUrl);
                if (myresponse.items[select].lyrics.Count > 1)
                {
                    await init.DeleteAllReactionsAsync();

                    var embed2 = new DiscordEmbedBuilder
                    {
                        Color       = new DiscordColor("#68D3D2"),
                        Title       = "Lyrics Entries!",
                        Description = "Multiple entries were found, select one!"
                    };
                    int      an    = 0;
                    string[] nums  = { ":one:", ":two:", ":three:", ":four:", ":five:", ":six:", ":seven:", ":eight:", ":nine:", ":keycap_ten:" };
                    var      blank = DiscordEmoji.FromGuildEmote(ctx.Client, 435447550196318218);
                    foreach (var entries in myresponse.items[select].lyrics)
                    {
                        if (an == 10)
                        {
                            break;
                        }
                        embed2.AddField("React " + DiscordEmoji.FromName(ctx.Client, nums[an]), $"[{entries.translationType}] + {entries.cultureCode.ToUpper()} by {entries.source}");
                        await init.CreateReactionAsync(DiscordEmoji.FromName(ctx.Client, nums[an]));

                        an++;
                    }
                    await init.ModifyAsync(null, embed : embed2.Build());

                    var one   = DiscordEmoji.FromName(ctx.Client, ":one:");
                    var two   = DiscordEmoji.FromName(ctx.Client, ":two:");
                    var three = DiscordEmoji.FromName(ctx.Client, ":three:");
                    var four  = DiscordEmoji.FromName(ctx.Client, ":four:");
                    var five  = DiscordEmoji.FromName(ctx.Client, ":five:");
                    var six   = DiscordEmoji.FromName(ctx.Client, ":six:");
                    var seven = DiscordEmoji.FromName(ctx.Client, ":seven:");
                    var eight = DiscordEmoji.FromName(ctx.Client, ":eight:");
                    var nine  = DiscordEmoji.FromName(ctx.Client, ":nine:");
                    var ten   = DiscordEmoji.FromName(ctx.Client, ":keycap_ten:");
                    try
                    {
                        var reSelect = await interactivity.WaitForReactionAsync(xe => (xe.Emoji == one || xe.Emoji == two || xe.Emoji == three || xe.Emoji == four || xe.Emoji == five || xe.Emoji == six || xe.Emoji == seven || xe.Emoji == eight || xe.Emoji == nine || xe.Emoji == ten) && xe.Message == init, ctx.Message.Author, TimeSpan.FromSeconds(30));

                        if (reSelect.Result.Emoji == DiscordEmoji.FromName(ctx.Client, ":one:"))
                        {
                            lyse = 0;
                        }
                        else if (reSelect.Result.Emoji == DiscordEmoji.FromName(ctx.Client, ":two:"))
                        {
                            lyse = 1;
                        }
                        else if (reSelect.Result.Emoji == DiscordEmoji.FromName(ctx.Client, ":three:"))
                        {
                            lyse = 2;
                        }
                        else if (reSelect.Result.Emoji == DiscordEmoji.FromName(ctx.Client, ":four:"))
                        {
                            lyse = 3;
                        }
                        else if (reSelect.Result.Emoji == DiscordEmoji.FromName(ctx.Client, ":five:"))
                        {
                            lyse = 4;
                        }
                        else if (reSelect.Result.Emoji == DiscordEmoji.FromName(ctx.Client, ":six:"))
                        {
                            lyse = 5;
                        }
                        else if (reSelect.Result.Emoji == DiscordEmoji.FromName(ctx.Client, ":seven:"))
                        {
                            lyse = 6;
                        }
                        else if (reSelect.Result.Emoji == DiscordEmoji.FromName(ctx.Client, ":eight:"))
                        {
                            lyse = 7;
                        }
                        else if (reSelect.Result.Emoji == DiscordEmoji.FromName(ctx.Client, ":nine:"))
                        {
                            lyse = 8;
                        }
                        else if (reSelect.Result.Emoji == DiscordEmoji.FromName(ctx.Client, ":keycap_ten:"))
                        {
                            lyse = 9;
                        }
                    }
                    catch
                    {
                        return;
                    }
                    await init.DeleteAllReactionsAsync();

                    await init.CreateReactionAsync(DiscordEmoji.FromName(ctx.Client, ":pushpin:"));

                    if (myresponse.items[select].lyrics.Count != 0)
                    {
                        await init.CreateReactionAsync(DiscordEmoji.FromName(ctx.Client, ":page_facing_up:"));
                    }
                    if (myresponse.items[select].pvs.Count != 0)
                    {
                        await init.CreateReactionAsync(DiscordEmoji.FromName(ctx.Client, ":movie_camera:"));
                    }
                    if (dresponse.Count != 0)
                    {
                        await init.CreateReactionAsync(DiscordEmoji.FromName(ctx.Client, ":revolving_hearts:"));
                    }
                    await init.CreateReactionAsync(DiscordEmoji.FromName(ctx.Client, ":x:"));
                }
                if (myresponse.items[select].lyrics[lyse].translationType.Length != 0)
                {
                    emim.AddField("Language", myresponse.items[select].lyrics[lyse].translationType, true);
                }
                if (myresponse.items[select].lyrics[lyse].source.Length != 0)
                {
                    emim.AddField("Source", myresponse.items[select].lyrics[lyse].source, true);
                }
                if (myresponse.items[select].lyrics[lyse].translationType.Length != 0)
                {
                    emim.AddField("Type", myresponse.items[select].lyrics[lyse].translationType, true);
                }
                if (myresponse.items[select].lyrics[lyse].url.Length != 0)
                {
                    emim.AddField("Link", myresponse.items[select].lyrics[lyse].url, true);
                }
                else
                {
                    emim.AddField("Link", $"https://vocadb.net/S/{myresponse.items[select].id}", true);
                }
                if (myresponse.items[select].lyrics[lyse].value.Length > 2000)
                {
                    emim.WithDescription("Lyrics too long, look at the link uwu");
                }
                else
                {
                    emim.WithDescription(myresponse.items[select].lyrics[lyse].value);
                }

                var end = emim.Build();

                await init.ModifyAsync(null, embed : end);
            }
            catch
            {
                await ctx.RespondAsync("Error!");
            }
        }
コード例 #23
0
        public async Task RemoveCargoReactRoleAsync(CommandContext ctx, DiscordChannel canalReactRole = null, DiscordEmoji emoji = null)
        {
            await ctx.TriggerTypingAsync();

            new Thread(async() =>
            {
                try
                {
                    DiscordEmbedBuilder embed = new DiscordEmbedBuilder();

                    if (canalReactRole == null || emoji == null)
                    {
                        embed.WithColor(Program.Bot.Utilities.HelpCommandsColor())
                        .WithAuthor("Como executar este comando:", null, Values.infoLogo)
                        .AddField("PC/Mobile", $"{ctx.Prefix}rr cargo.del Canal[Id] Emoji")
                        .WithFooter($"Comando requisitado pelo: {Program.Bot.Utilities.DiscordNick(ctx.Member)}", iconUrl: ctx.Member.AvatarUrl)
                        .WithTimestamp(DateTime.Now);

                        await ctx.RespondAsync(embed: embed.Build());
                        return;
                    }

                    if (string.IsNullOrWhiteSpace(emoji.Url))
                    {
                        embed.WithAuthor("Emoji inválido!", null, Values.infoLogo)
                        .WithColor(Program.Bot.Utilities.RandomColorEmbed())
                        .WithDescription("Digite um emoji válido!")
                        .WithFooter($"Comando requisitado pelo: {Program.Bot.Utilities.DiscordNick(ctx.Member)}", iconUrl: ctx.Member.AvatarUrl)
                        .WithTimestamp(DateTime.Now);

                        await ctx.RespondAsync(embed: embed.Build());
                        return;
                    }

                    IMongoDatabase local = Program.Bot.LocalDB;

                    IMongoCollection <Jogos> jogos   = local.GetCollection <Jogos>(Values.Mongo.jogos);
                    IMongoCollection <Reacts> reacts = local.GetCollection <Reacts>(Values.Mongo.reacts);

                    FilterDefinition <Jogos> filtroJogos = Builders <Jogos> .Filter.Eq(x => x.idDoEmoji, emoji.Id);
                    List <Jogos> resultadoJogos          = await(await jogos.FindAsync(filtroJogos)).ToListAsync();

                    Jogos ultimoResultadoJogo = resultadoJogos.LastOrDefault();

                    List <Reacts> resultadoReacts = await(await reacts.FindAsync(Builders <Reacts> .Filter.Eq(x => x.categoria, ultimoResultadoJogo.nomeDaCategoria))).ToListAsync();

                    Reacts ultimoResultadoReact = resultadoReacts.LastOrDefault();

                    if (resultadoJogos.Count != 0 && resultadoReacts.Count != 0)
                    {
                        DiscordMessage mensagem             = await canalReactRole.GetMessageAsync(ultimoResultadoReact.idDaMensagem);
                        DiscordEmbed embedMensagemReactRole = mensagem.Embeds.LastOrDefault();

                        DiscordEmbedBuilder builder = new DiscordEmbedBuilder(embedMensagemReactRole);

                        DiscordRole cargoJogoEmbed = ctx.Guild.GetRole(ultimoResultadoJogo.idDoCargo);

                        IReadOnlyList <DiscordUser> MembrosReacoes = await mensagem.GetReactionsAsync(emoji);

                        string linhaMensagemEmbed = $"{emoji.ToString()} - {cargoJogoEmbed.Name}";

                        if (embedMensagemReactRole.Description.Contains(linhaMensagemEmbed))
                        {
                            string descricaoEmbed = embedMensagemReactRole.Description;

                            List <string> lista = descricaoEmbed.Split('\n').ToList();
                            lista.RemoveAt(lista.FindIndex(linha => linha.Contains(linhaMensagemEmbed)));

                            StringBuilder strEmbedFinal = new StringBuilder();

                            foreach (string linha in lista)
                            {
                                strEmbedFinal.Append($"{linha}\n");
                            }

                            builder.WithDescription(strEmbedFinal.ToString());
                            builder.WithAuthor(embedMensagemReactRole.Author.Name, null, Values.logoUBGE);
                            builder.WithColor(embedMensagemReactRole.Color.Value);

                            await mensagem.ModifyAsync(embed: builder.Build());
                        }

                        await jogos.DeleteOneAsync(filtroJogos);

                        DiscordMessage msgAguarde = await ctx.RespondAsync($"Aguarde, estou removendo as reações dos membros que está no {canalReactRole.Mention}...");

                        int i = 0;

                        foreach (DiscordUser Membro in MembrosReacoes)
                        {
                            try
                            {
                                await Task.Delay(200);

                                await mensagem.DeleteReactionAsync(emoji, Membro);
                            }
                            catch (Exception)
                            {
                                ++i;
                            }
                        }

                        await msgAguarde.DeleteAsync();

                        if (i != 0)
                        {
                            await ctx.RespondAsync($"Existem **{i}** reações que não foram removidas por que os membros saíram da {ctx.Guild.Name}, por favor, remova-as manualmente. :wink:");
                        }

                        embed.WithAuthor("Jogo removido!", null, Values.logoUBGE)
                        .WithColor(Program.Bot.Utilities.RandomColorEmbed())
                        .WithThumbnailUrl(emoji.Url)
                        .WithDescription($"O cargo: {cargoJogoEmbed.Mention} e a reação: {emoji.ToString()} foram removidos com sucesso!{(i != 0 ? $"\n\n{i} reações restantes para serem removidas manualmente." : string.Empty)}")
                        .WithFooter($"Comando requisitado pelo: {Program.Bot.Utilities.DiscordNick(ctx.Member)}", iconUrl: ctx.Member.AvatarUrl)
                        .WithTimestamp(DateTime.Now);

                        await ctx.RespondAsync(embed: embed.Build());
                    }
                    else if (resultadoReacts.Count == 0)
                    {
                        await ctx.RespondAsync($"{ctx.Member.Mention}, essa categoria não existe!");
                    }
                    else if (resultadoJogos.Count == 0)
                    {
                        await ctx.RespondAsync($"{ctx.Member.Mention}, esse jogo não existe!");
                    }
                }
                catch (ArgumentException)
                {
                    await ctx.RespondAsync($"{ctx.Member.Mention}, este emoji não foi encontrado!");
                }
                catch (Exception exception)
                {
                    await Program.Bot.Logger.Error(Log.TypeError.Commands, exception);
                }
            }).Start();
        }
コード例 #24
0
        public async static Task OnPendingGameReaction(DiscordClient sender, DiscordMessage msg, DiscordEmoji emoji, DiscordUser user, bool added)
        {
            var  kanContext = KandoraContext.Instance;
            var  msgId      = msg.Id;
            var  userId     = user.Id.ToString();
            var  game       = kanContext.PendingGames[msgId];
            bool result     = false;
            var  okEmoji    = DiscordEmoji.FromName(sender, Reactions.OK);
            var  noEmoji    = DiscordEmoji.FromName(sender, Reactions.NO);

            if (emoji.Id == okEmoji.Id)
            {
                result = game.TryChangeUserOk(userId, isAdd: added);
            }
            else if (emoji.Id == noEmoji.Id)
            {
                result = game.TryChangeUserNo(userId, isAdd: added);
            }
            if (!result && added)
            {
                await msg.DeleteReactionAsync(emoji, user);
            }
            if (game.IsCancelled)
            {
                await msg.ModifyAsync($"All players have voted {noEmoji}, this log won't be recorded");

                kanContext.PendingGames.Remove(msgId);
            }
            if (game.IsValidated)
            {
                DbService.Begin("recordgame");
                try
                {
                    var serverId     = msg.Channel.GuildId.ToString();
                    var users        = UserDbService.GetUsers();
                    var servers      = ServerDbService.GetServers(users);
                    var server       = servers[serverId];
                    var leagueConfig = LeagueConfigDbService.GetLeagueConfig(server.LeagueConfigId);

                    if (game.Log == null)
                    {
                        ScoreDbService.RecordIRLGame(game.UserIds, game.Scores, server, leagueConfig);
                    }
                    else
                    {
                        ScoreDbService.RecordOnlineGame(game.Log, server);
                    }
                    kanContext.PendingGames.Remove(msgId);
                    await msg.RespondAsync($"All players have voted {okEmoji}, this log has been recorded!");

                    await msg.DeleteReactionsEmojiAsync(okEmoji);

                    await msg.DeleteReactionsEmojiAsync(noEmoji);

                    DbService.Commit("recordgame");
                }
                catch (Exception e)
                {
                    DbService.Rollback("recordgame");
                    await msg.RespondAsync(e.Message);
                }
            }
        }