【问题标题】:Problems with commands in a discord bot不和谐机器人中的命令问题
【发布时间】:2019-09-04 09:08:39
【问题描述】:

我正在编写的不和谐机器人正确识别一个命令,但忽略另一个命令

机器人应该向指定的用户发送一个 dm,并且处理得很好。但是,机器人不响应帮助命令。

    @SubscribeEvent
    public void onMessageRecived(GuildMessageReceivedEvent event) {
        Member member = event.getMessage().getMentionedMembers().get(0);
        System.out.println("message recived");
        event.getAuthor().getName();
        event.getMessage().getContentDisplay();
        if (event.getMessage().getContentRaw().equals("!help")) {
            event.getChannel().sendMessage("!help: displays this messgae" +
                    "!love (@user): Sends a dm to specified user that says 'I love you' in one of 102 languages").queue();
        }
            if (event.getMessage().getContentRaw().toLowerCase().startsWith("!love")) {
                event.getChannel().sendMessage(member.getUser().getName() + " has been loved").queue();

机器人应该输出:

!help: Displays this message
!love (@user): Sends a dm to specified user that says 'I love you' in one of 102 languages

但是当使用 !help 提示时不输出任何内容

【问题讨论】:

    标签: java discord discord-jda


    【解决方案1】:

    我注意到您的示例中可能有错误的第一件事是您的方法名称的拼写。它被称为received,而不是recived。请注意,GuildMessageReceivedEvent 仅针对在 guild 中收到的消息触发,如果您使用直接消息,则不会触发。

    您可以选择 JDA 实现事件处理的 2 种方式。

    InterfacedEventManager(默认)

    文档:InterfacedEventManagerListenerAdapter

    创建监听类

    public class MessageListener extends ListenerAdapter {
        @Override // this is good practice, it fails compilation if the method doesn't overeride
        public void onMessageReceived(MessageReceivedEvent event) {
            // your code here
        }
    
        @Override
        public void onGuildMessageReceived(GuildMessageReceivedEvent event) {
            // your code here
        }
    }
    

    您的方法必须具有相同的名称、可见性和参数才能正确覆盖来自ListenerAdapter 的定义。如果覆盖格式不正确,则使用 @Override 通过生成编译错误来确保这一点。

    注册 ListenerAdapter

    JDABuilder builder = new JDABuilder(BOT_TOKEN);
    builder.setEventManager(new InterfacedEventManager()); // this can be omitted, its the default
    builder.addEventListener(new MessageListener());
    JDA api = builder.build();
    

    要求每个监听器为此事件管理器实现EventListener 接口。这是由ListenerAdapter 传递完成的。


    AnnotatedEventManager

    文档:AnnotatedEventManagerSubscribeEvent

    创建监听方法

    public class MessageSubscriber {
        @SubscribeEvent // required annotation
        public void onMessage(MessageReceivedEvent event) {
            // your code here
        }
    
        @SubscribeEvent // required annotation
        public void onGuildMessage(GuildMessageReceivedEvent event) {
            // your code here
        }
    }
    

    可以在成员方法和类方法(静态方法)上添加@SubscribeEvent注解。

    注册订阅者

    JDABuilder builder = new JDABuilder(BOT_TOKEN);
    builder.setEventManager(new AnnotatedEventManager());
    builder.addEventListener(new MessageSubscriber());
    JDA api = builder.build();
    

    如果您注释了类方法,您可以简单地使用addEventListener(MessageSubscriber.class),对于成员方法,它必须是一个新实例new MessageSubscriber()


    如果这不能回答您的问题,您可能有一些无法从您当前的问题中解释的问题。请通过调试代码并创建MCVE 将其限制为特定问题。

    【讨论】:

      猜你喜欢
      • 2021-01-06
      • 2018-07-21
      • 2018-11-10
      • 1970-01-01
      • 2022-11-10
      • 2017-05-31
      • 2021-10-21
      • 2022-01-15
      • 2021-06-17
      相关资源
      最近更新 更多