尝试添加反应时 onGuildMessageReceived() 出现问题

Having Issues With onGuildMessageReceived() When Trying to Add Reactions

我正在尝试让我编写的机器人在用户消息中包含特定关键字时对其做出反应。我有大约 50 个关键字可以让机器人做出反应,但前提是它们位于消息的开头。

当机器人在用户消息的开头时会用表情做出反应,但在第一个单词之后不会。

我已经尝试向 discord 寻求帮助,但很明显他们并不真正关心对新来者友好。我尝试将参数从“0”更改为 "Message.MAX_CONTENT_LENGTH",但没有用。我最初也有一个 ArrayList,我将其转换为一个无效的 String,后来尝试只使用一个普通的 List;结果相同。现在我坚持使用一个极度未优化的 if/else 语句,但我可以忍受它。我只是需要它来工作。

import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
import net.dv8tion.jda.core.hooks.ListenerAdapter;

public class GuildMessageReceived extends ListenerAdapter {

    public void onGuildMessageReceived(GuildMessageReceivedEvent event) {
        String[] args = event.getMessage().getContentRaw().split("\s+");

        if (args[0].equalsIgnoreCase("zachary")) {
            event.getMessage().addReaction("").queue();
        } // if
    } // onGuildMessageReceived()
} // GuildMessageReceived

我希望结果是对消息的反应,关键字位于消息中的任何时候,而不仅仅是在开头。假设 "money" 是关键字。

我需要的:

[6:52 PM] Anon: I have money
|| Reactions: :spy:

我得到的:

[6:52 PM] Anon: I have money
|| Reactions: None

您的代码仅在第一条消息是关键字时才会做出反应,因为您按 space 拆分,然后仅检查数组的第一个元素。将数组转换为列表并使用 contains()。例如:

List<String> words = Arrays.asList(event.getMessage().getContentRaw().split("\s+"));
if (words.contains("zachary")) {
  event.getMessage().addReaction("").queue();
}

如果您想轻松检查多个关键字,可以改用 Collections.disjoint()。例如:

Set<String> keywords = Set.of("foo", "bar", "baz");
List<String> words = Arrays.asList(event.getMessage().getContentRaw().split("\s+"));

if (!Collections.disjoint(keywords, words)) {
  event.getMessage().addReaction("").queue();
}