需要一个关于在java上编写discord机器人来调查人们的提示吗

9jyewag0  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(303)

我正在写一个调查用的小机器人。它应该是这样工作的:一个人点击一个React或输入一个命令,然后机器人为他创建一个个人频道,并向这个人提出他必须回答的问题。
但我需要机器人能够与几个人在同一时间工作。我被困在创建一个频道和提问的时刻。事实是,如果一个人,例如,点击一个React,并开始采取调查,在这一刻,另一个人也开始采取调查,然后机器人停止投票第一人。
很可能这是因为我不知道如何正确地让机器人检查某个人正在哪个频道被轮询。我的问题有点混乱,因为我无法正确地表达它,所以我将尝试在我的代码中解释它。
所以,我有两个班,两个听众。首先是reactionlistener.java,这个类应该检查一个人是否在某条消息上单击了某个React,然后为这个人创建一个个人通道,bot将在这个通道上向他提问。

public class ReactionListener extends ListenerAdapter {
    public static TextChannel channel;
    private long msgID = "some id of message...";
    private long categoryID = "some id of category...";
    @Override
    public void onMessageReactionAdd(MessageReactionAddEvent event) {
        MessageReaction.ReactionEmote reaction = event.getReaction().getReactionEmote();
        if (event.getMessageId().equals(msgID) && reaction.getEmoji().equals("✅")) {
            Category category = event.getGuild().getCategoryById(categoryID);
            channel = category.createTextChannel("survey")
                    .addPermissionOverride(guild.getPublicRole(), null, EnumSet.of(Permission.VIEW_CHANNEL))
                    .addPermissionOverride(member, EnumSet.of(Permission.VIEW_CHANNEL, Permission.MESSAGE_WRITE, Permission.MESSAGE_HISTORY), null)
                    .complete();
            channel.sendMessage("Some first question to member").queue();
        }
    }
}

第二个类是messagelistener.java,这就是我遇到的问题。我需要正确地将在reactionlistener.java类中创建的个人通道传递给这个类。

public class MessageListener extends ListenerAdapter {
    public static String answer;
    @Override
    public void onMessageReceived(MessageReceivedEvent event) {
        TextChannel channel = ReactionListener.channel;
        if (event.getChannel().equals(channel) && !event.getAuthor().isBot()) {
            answer = event.getMessage().getContentRaw();
            event.getChannel().sendMessage("Some second question").queue();
            // the rest of the code...
        }
    }
}

正如我上面所说,一个机器人不能同时调查几个人。很可能是因为我不能正确地将私有通道从一个类传递到另一个类。显然,当第二个人开始进行调查时,bot开始检查的不是第一个人的频道对应关系,而是第二个人的频道对应关系。我需要一个关于如何使它,使机器人可以与几个人在同一时间工作的提示。

cgfeq70w

cgfeq70w1#

您将数据保留为类对象,因此每次触发事件并处理它时,都会覆盖对象。不是使用类对象来存储数据,而是使用数据结构。
reactionlistener.java:

public class ReactionListener extends ListenerAdapter {

    public static Map<Member, List<String>> answerMap = new HashMap<>();
    public static Map<Member, TextChannel> surveyChannelMap = new HashMap<>();
    private final static long msgID = 11111; // Insert a valid msgId;
    private final long categoryID = 1111; // insert a valid category id

    @Override
    public void onMessageReactionAdd(MessageReactionAddEvent event) {
        MessageReaction.ReactionEmote reaction = event.getReaction().getReactionEmote();
        if (event.getMessageIdLong() == msgID && reaction.getEmoji().equals("✅")) {
            Guild guild = event.getGuild();
            Category category = guild.getCategoryById(categoryID);
            Member member = event.getMember();
            category.createTextChannel("survey-" + member.getEffectiveName())
                    .addPermissionOverride(guild.getPublicRole(), null, EnumSet.of(Permission.VIEW_CHANNEL))
                    .addPermissionOverride(member, EnumSet.of(Permission.VIEW_CHANNEL, Permission.MESSAGE_WRITE, Permission.MESSAGE_HISTORY), null)
                    .queue(textChannel -> {
                        surveyChannelMap.put(member, textChannel);
                        textChannel.sendMessage("Some first question to member").queue();
                    });
        }
    }
}

messagelistener.java文件:

public class MessageListener extends ListenerAdapter {

    @Override
    public void onMessageReceived(MessageReceivedEvent event) {
        Member member = event.getMember();
        if (ReactionListener.surveyChannelMap.containsKey(member)) {
            if (event.getTextChannel().equals(ReactionListener.surveyChannelMap.get(member))) {
                if (answerMap.containsKey(member)){
                    List<String> answers = answerMap.get(member);
                    answerMap.put(member, answers);
                } else {
                    answerMap.put(member, new ArrayList<>(Collections.singletonList(event.getMessage().getContentRaw())));
                }
                event.getChannel().sendMessage("Some second question").queue();
                // the rest of the code...
            }
        }
    }
}

在上面的例子中,我使用了数据结构来存储关于成员的信息,这样它们就不会相互覆盖,并且您能够以一种高效而简单的方式保存所有答案和通道。
有关我使用的hashmap数据结构的更多信息,请参见此处。

相关问题