"JDA Member may not be null"错误的替代解决方案



我正在努力使它,当有人与角色"Owner"输入静音命令,它会输入他们@提到的人,并给他们"Muted"作用。

其余的代码可以自己工作,唯一不工作的部分是

行。
event.getGuild().addRoleToMember(member,event.getGuild().getRoleById(0)).complete();

和变量"member"由

定义
Member member = event.getGuild().getMemberById(mentionid);

完整的代码块是:

package radishmouse.FoodWorld.Events;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import radishmouse.FoodWorld.FoodWorld;
public class GuildMessageReceived extends ListenerAdapter {
public void onGuildMessageReceived(GuildMessageReceivedEvent event) {
String[] args = event.getMessage().getContentRaw().split("\s+");

if (args[0].equalsIgnoreCase(FoodWorld.prefix + "mute")) {
if  (hasRole("Owner", event)) {
if (args.length == 2) {
String mentionid = args[1].replace("<@!", "").replace(">", "");
Member member = event.getGuild().getMemberById(mentionid);
event.getGuild().addRoleToMember(member, event.getGuild().getRoleById(0)).complete();
EmbedBuilder msg = FoodWorld.sendMessage(null, "idk " + mentionid + member, "Blue");
event.getChannel().sendMessageEmbeds(msg.build()).queue();
}
else {
EmbedBuilder msg = FoodWorld.sendMessage("Specify Who To Mute", "Usage: " + FoodWorld.prefix + "mute [@mention who to mute]", "Blue");
event.getChannel().sendMessageEmbeds(msg.build()).queue();
}
}
}

/* If the bot ever sends a message, then add a ❌ reaction so users can delete that message */
if (event.getAuthor().equals(event.getJDA().getSelfUser())) {
event.getMessage().addReaction("❌").queue();
}
}
private boolean hasRole(String string, GuildMessageReceivedEvent event) {
Boolean toReturn = false;

for(int i=0; i < event.getMember().getRoles().size(); i++){
if("Owner".equals(event.getMember().getRoles().get(i).getName())){
toReturn = true;
}
}

return toReturn;
}
作为参考,我在youtube上跟随这个教程:教程。我对JDA不是很熟悉,也不知道如何用一种更简单的方法来完成这个任务。

不解析字符串:

String mentionid = args[1].replace("<@!", "").replace(">", "");
Member member = event.getGuild().getMemberById(mentionid);

使用getMentionedMembers:

List<Member> mentions = event.getMessage().getMentionedMembers();
if (mentions.isEmpty()) {
EmbedBuilder msg = FoodWorld.sendMessage("Specify Who To Mute", "Usage: " + FoodWorld.prefix + "mute [@mention who to mute]", "Blue");
event.getChannel().sendMessageEmbeds(msg.build()).queue();
} else {
Member member = mentions.get(0);
event.getGuild().addRoleToMember(member, event.getGuild().getRoleById(0)).queue();
EmbedBuilder msg = FoodWorld.sendMessage(null, "idk " + member.getId() + member, "Blue");
event.getChannel().sendMessageEmbeds(msg.build()).queue();
}