这是我第一次在这里问问题,所以请原谅任何错误,我在张贴这个。另外,我对编程有些陌生,所以请原谅我做的任何不好的做法。
所以我要做的是创建一个投票跳过命令,为我的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发送“票数不足!”信息。
如果你们中的一些人能就如何解决这个问题写些建议或仅仅是提示,我将非常感激。
1条答案
按热度按时间v64noz0r1#
您需要这样做(这是一个草图,不是可编译的代码)
你需要记录投票数,所以你的 predicate 需要有副作用。
你可以用一个
AtomicInteger
在 predicate lambda的范围内。predicate 的返回值取决于投票数。