不和谐机器人中的命令问题
Problems with commands in a discord bot
我编写的 discord bot 正确识别了一个命令,但忽略了另一个
该机器人应该向指定用户发送 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
时不输出任何内容
我注意到您的示例中可能有误的第一件事是您的方法名称的拼写。它被称为 received 而不是 recived。请注意,GuildMessageReceivedEvent 仅针对在 guild 中收到的消息触发,如果您使用直接消息,则不会触发它。
有 2 种 JDA 实现事件处理的方式可供您选择。
InterfacedEventManager(默认)
文档:InterfacedEventManager, ListenerAdapter
创建监听器Class
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, SubscribeEvent
创建侦听器方法
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
}
}
您可以在成员方法和 class 方法(静态方法)上添加 @SubscribeEvent
注释。
注册订阅者
JDABuilder builder = new JDABuilder(BOT_TOKEN);
builder.setEventManager(new AnnotatedEventManager());
builder.addEventListener(new MessageSubscriber());
JDA api = builder.build();
如果您注释了 class 方法,您可以简单地使用 addEventListener(MessageSubscriber.class)
,对于成员方法,它必须是一个新实例 new MessageSubscriber()
!
如果这不能回答您的问题,您可能遇到了一些无法从您当前的问题中解释的问题。请通过调试您的代码并创建 MCVE.
将其限制为特定问题
我编写的 discord bot 正确识别了一个命令,但忽略了另一个
该机器人应该向指定用户发送 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
时不输出任何内容我注意到您的示例中可能有误的第一件事是您的方法名称的拼写。它被称为 received 而不是 recived。请注意,GuildMessageReceivedEvent 仅针对在 guild 中收到的消息触发,如果您使用直接消息,则不会触发它。
有 2 种 JDA 实现事件处理的方式可供您选择。
InterfacedEventManager(默认)
文档:InterfacedEventManager, ListenerAdapter
创建监听器Class
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, SubscribeEvent
创建侦听器方法
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
}
}
您可以在成员方法和 class 方法(静态方法)上添加 @SubscribeEvent
注释。
注册订阅者
JDABuilder builder = new JDABuilder(BOT_TOKEN);
builder.setEventManager(new AnnotatedEventManager());
builder.addEventListener(new MessageSubscriber());
JDA api = builder.build();
如果您注释了 class 方法,您可以简单地使用 addEventListener(MessageSubscriber.class)
,对于成员方法,它必须是一个新实例 new MessageSubscriber()
!
如果这不能回答您的问题,您可能遇到了一些无法从您当前的问题中解释的问题。请通过调试您的代码并创建 MCVE.
将其限制为特定问题