Discord Java Бот waiter.waitForEvent проблемы - PullRequest
0 голосов
/ 03 августа 2020

так что моя проблема в основном состоит в выполнении такой команды, как! Rolemenu [messageID]

Например:! Rolemenu 1234 @ Role1 @ Role2 @ Role3

Я в основном хочу сделать это так что я перебираю каждую роль, прося пользователя отреагировать на определенное сообщение (по идентификатору сообщения), а затем эта спецификация c сопоставляется с ролью, а затем любой на сервере может отреагировать на реакцию и получить эту c роль.

Чтобы было немного понятнее:

Бот спросит: «Какую реакцию вы хотите на @ Role1». Затем вы реагируете на сообщение с помощью: happy: emote so role1 отображается на: happy: так что любой, кто отреагирует на это сообщение с помощью: happy:, вы получите role1.

Проблема, с которой я столкнулся, заключается в том, что мой код проходит через l oop упомянутых ролей, но он не ждет ответа на конкретную роль, а просто получает 1 реакцию на все. Так что это не 1 к 1.

Чтобы было понятнее:

Я запускаю l oop и спрашиваю пользователя: «Какую реакцию вы хотите для @ Role1», но вместо ожидания для реакции он переходит к следующей итерации, спрашивает пользователя «Какую реакцию вы хотите для @ Role2» и завершает l oop. Но затем, когда я реагирую на сообщение, которое оно печатает, оно регистрирует его, но я не знаю, как сделать его 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."));
        }
    }
}

Прямо сейчас я в целях тестирования попросите его ответить названием эмоции реакции. Может ли кто-нибудь помочь мне с моей проблемой?

...