为我的jda音乐机器人实现投票跳过命令时出现的问题

5lwkijsr  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(452)

这是我第一次在这里问问题,所以请原谅任何错误,我在张贴这个。另外,我对编程有些陌生,所以请原谅我做的任何不好的做法。
所以我要做的是创建一个投票跳过命令,为我的jdadiscord音乐机器人跳过当前的歌曲。我的问题是我找不到计算选票的方法(在本例中,我的机器人发送的消息中添加了React)。
以下代码段显示了我尝试的内容:

channel.sendMessage( builder.build() ).queue( (message) -> {
            message.addReaction(Emojis.upvote).queue();
            message.addReaction(Emojis.downvote).queue();

            this.waiter.waitForEvent(

                    // The class the EventWaiter should listen for
                    GuildMessageReactionAddEvent.class,

                    // Conditions

                    // TODO Change event as GuildMessageReactionAddEvent doesn't provide a count for reactions
                    (evt) -> ((GuildMessageReactionAddEvent) evt).getReaction().getCount() >= 10

                            && ((GuildMessageReactionAddEvent) evt).getReaction().getReactionEmote().getEmoji().equals(Emojis.upvote)
                            && evt.getMessageIdLong() == context.getMessage().getIdLong(),

                    // Action if the conditions are fulfilled
                    (evt) -> skip(context),

                    // Timeout after 1 minute
                    1L, TimeUnit.MINUTES,

                    // Action after timeout
                    () -> channel.sendMessage("Not enough votes! Track will be continued").queue());
        } );

我意识到GuildMessageActionAddEvent不提供消息上的React计数,因为它只检查添加到消息中的单个React,这意味着我的尝试毫无意义。
我解决这个问题的方法是使用一个int变量作为计数器,每次触发guildMessageActionAddEvent事件时它都会递增。现在,只要计数器达到所需的票数,歌曲就会被跳过,如果没有,就会出现超时,导致bot发送“票数不足!”信息。
如果你们中的一些人能就如何解决这个问题写些建议或仅仅是提示,我将非常感激。

v64noz0r

v64noz0r1#

您需要这样做(这是一个草图,不是可编译的代码)
你需要记录投票数,所以你的 predicate 需要有副作用。
你可以用一个 AtomicInteger 在 predicate lambda的范围内。
predicate 的返回值取决于投票数。

channel.sendMessage( builder.build() ).queue( (message) -> {
            final AtomicInteger voteCounter = new AtomicInteger();
            message.addReaction(Emojis.upvote).queue();
            message.addReaction(Emojis.downvote).queue();

            this.waiter.waitForEvent(

                    // The class the EventWaiter should listen for
                    GuildMessageReactionAddEvent.class,

                    // Conditions

                    (evt) -> {
                        if (((GuildMessageReactionAddEvent) evt).getReaction().getReactionEmote().getEmoji().equals(Emojis.upvote)
                            && evt.getMessageIdLong() == context.getMessage().getIdLong()) {
                            voteCounter.incrementAndGet();
                        }
                        return voteCounter.get() > 10;
                    },

                    // Action if the conditions are fullfilled
                    (evt) -> skip(context),

                    // Timeout after 1 minute
                    1L, TimeUnit.MINUTES,

                    // Action after timeout
                    () -> channel.sendMessage("Not enough votes! Track will be continued").queue());
        } );
    }

相关问题