为我的 JDA Music Bot 执行投票跳过命令时出现问题
Issues while implementing a vote skip command for my JDA Music Bot
这是我第一次在这里提问,所以请原谅我发帖时的错误。另外,我对编程有些陌生,所以请原谅我的任何不良做法。
所以我想做的是创建一个投票跳过命令来跳过我的 JDA Discord 音乐机器人的当前歌曲。我的问题是我找不到计算选票的方法(在这种情况下,我的机器人发送的消息中添加了反应)。
以下代码片段展示了我的尝试:
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());
} );
我意识到 GuildMessageReactionAddEvent 不提供对消息的反应计数,因为它只检查添加到消息中的单个反应,这意味着我的尝试没有完全没有意义。
我解决这个问题的想法是使用一个 int 变量作为计数器,每次触发 GuildMessageReactionAddEvent 事件时它都会递增。现在,一旦计数器达到所需的票数,就会跳过这首歌,否则,将会超时,导致机器人发送“票数不够!”留言。
如果你们中的一些人可以写一些关于如何解决这个问题的建议或提示,我将不胜感激。
你需要做这样的事情(这是一个草图,不是可编译的代码)
你需要记录得票数,所以你的predicate需要有side effect。
您可以在谓词 lambda 的范围内使用 AtomicInteger
来做到这一点。
谓词的return值取决于投票数
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());
} );
}
这是我第一次在这里提问,所以请原谅我发帖时的错误。另外,我对编程有些陌生,所以请原谅我的任何不良做法。
所以我想做的是创建一个投票跳过命令来跳过我的 JDA Discord 音乐机器人的当前歌曲。我的问题是我找不到计算选票的方法(在这种情况下,我的机器人发送的消息中添加了反应)。
以下代码片段展示了我的尝试:
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());
} );
我意识到 GuildMessageReactionAddEvent 不提供对消息的反应计数,因为它只检查添加到消息中的单个反应,这意味着我的尝试没有完全没有意义。
我解决这个问题的想法是使用一个 int 变量作为计数器,每次触发 GuildMessageReactionAddEvent 事件时它都会递增。现在,一旦计数器达到所需的票数,就会跳过这首歌,否则,将会超时,导致机器人发送“票数不够!”留言。
如果你们中的一些人可以写一些关于如何解决这个问题的建议或提示,我将不胜感激。
你需要做这样的事情(这是一个草图,不是可编译的代码)
你需要记录得票数,所以你的predicate需要有side effect。
您可以在谓词 lambda 的范围内使用 AtomicInteger
来做到这一点。
谓词的return值取决于投票数
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());
} );
}