我正在尝试使正在编写的漫游器在包含特定关键字的情况下对用户的消息作出反应。机器人可以对大约50个关键字做出反应,但前提是它们只在消息的开头。
当机器人在用户消息的开头时,表情符号会做出反应,而在第一个单词之后的表情符号时则不会响应。
我已经尝试过向不和谐者寻求帮助,但是很明显,他们并不太在乎对新来者的友好。我尝试将参数从“ 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
我希望结果是对消息的反应,关键字随时随地位于消息内部,而不仅仅是在开头。假设“金钱”是关键字。
我需要什么:
[6:52 PM] Anon: I have money
|| Reactions: :spy:
我得到的是
[6:52 PM] Anon: I have money
|| Reactions: None
答案 0 :(得分:1)
仅当第一条消息是关键字时,您的代码才会做出反应,因为您是按空格分割,然后仅检查数组的第一个元素。将数组转换为列表,然后使用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();
}