所以我的问题主要在于执行命令,例如!rolemenu [messageID]
例如:!rolemenu 1234 @ Role1 @ Role2 @ Role3
我基本上是想做到这一点,以便我遍历每个角色,要求用户对特定消息做出反应(通过消息ID),然后将特定反应映射到一个角色,然后服务器上的任何人都可以对反应做出反应并获得那个特定的角色。
要使其更加清晰:
机器人将询问“您对@ Role1想要什么反应”,然后您对:happy:的消息做出反应,表情,所以role1映射到:happy:这样对:happy的消息做出反应的任何人都会收到角色1。
我面临的问题是我的代码遍历提到的角色循环,但是它不等待特定角色的答案,而是对所有角色仅获得1条反应。所以不是1比1。
为了更加清楚:
我运行循环并询问用户“您对@ Role1想要什么反应”,但是它没有等待反应,而是转到下一个迭代并询问用户“您对@ Role2想要什么反应”,并且终止循环。但是,当我对消息做出反应时,它会打印并注册它,但我不知道如何将其设置为1到1。
这是我的代码:
import com.jagrosh.jdautilities.command.Command;
import com.jagrosh.jdautilities.command.CommandEvent;
import com.jagrosh.jdautilities.commons.waiter.EventWaiter;
import net.dv8tion.jda.api.entities.Role;
import net.dv8tion.jda.api.events.message.guild.react.GuildMessageReactionAddEvent;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class ReactionsCommand extends Command {
private final EventWaiter waiter;
public ReactionsCommand(EventWaiter waiter) {
this.waiter = waiter;
super.name = "Reaction";
super.aliases = new String[]{"rolemenu", "reactionmenu"};
}
@Override
protected void execute(CommandEvent event) {
List<Role> roles = event.getMessage().getMentionedRoles();
String msg[] = event.getMessage().getContentRaw().split(" ");
String msgId = msg[1];
for (int i = 0; i < roles.size(); i++) {
event.reply("The reaction you want for " + roles.get(i).getName());
waiter.waitForEvent(GuildMessageReactionAddEvent.class,
e -> e.getChannel().equals(event.getChannel()) &&
e.getMessageId().equals(msgId),
e -> event.reply(e.getReactionEmote().getName()),
1, TimeUnit.MINUTES, () -> event.reply("Sorry, you took too long."));
}
}
}
现在,出于测试目的,我用反应表情名称来答复它。有人可以帮我解决我的问题吗?