当前位置: 首页 > 知识库问答 >
问题:

需要一个关于在Java上写一个不和谐机器人来调查人们的提示

东门阳飇
2023-03-14

我正在写一个用于调查的小机器人。它应该是这样工作的:一个人点击一个反应或输入一个命令,然后机器人为他创建一个个人通道,并向这个人提出他必须回答的问题。

但我需要的机器人能够与几个人在同一时间。我被困在创建频道和提问的时刻。事实是,例如,如果一个人点击某个反应并开始进行调查,而此时另一个人也开始进行调查,那么机器人将停止对第一个人进行投票。

这很可能是因为我不知道如何正确地让机器人检查某个人被调查的频道。我的问题有点混乱,因为我不能正确地表达它,所以我会试着在我的代码中解释它。

所以,我有两节课,有两个听众。第一个ReactionListener.java,这个类应该检查一个人是否点击了某个消息的某个反应,然后为这个人创建一个个人频道,机器人将在这个频道上向他提问。

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...
        }
    }
}

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

共有1个答案

万修然
2023-03-14

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

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数据结构的更多信息,请参见此处。

 类似资料:
  • 我试图做一个程序来创建一个无尽的循环,例如: 但是主要的问题是一个机器人听不到另一个机器人的声音,所以这不起作用。。。 有没有办法让机器人听另一个机器人的?提前感谢!:)

  • 我已经创建了一个bot,它现在在我的discord服务器中,使用下面的代码。 我的问题是,一旦我在与bot不和谐的聊天中,我如何调用命令让bot运行代码,为用户列表收集csv?我不确定如何调用机器人,一旦它在聊天/服务器中获得列表。

  • 我使用repl。它让我的不和机器人。我使用Python并遵循本教程: https://www.youtube.com/watch?v=SPTfmiYiuok 这是我的代码:

  • 当有人加入语音频道时,如何制作一个标记为@角色的discord机器人?示例:@role{user}已加入

  • 我要离开一个网站(https://realpython.com/how-to-make-a-discord-bot-python/#how-to-make-a-discord-bot-in-python)和我下面的步骤,但我一直得到一个错误msg Traceback(最近一次调用最后一次): File"C:\用户\Bryce.Persello346\Desktop\bot.py",第15行,cli

  • 我使用Python3.6idle编写了一个bot,我想添加一个命令,但我不知道如何添加它。你们中的一些人能帮我举一些例子或建议吗?我会很高兴的,谢谢。