首页 > 解决方案 > “JDA 成员可能不为空”错误的替代解决方案

问题描述

我正在努力做到这一点,因此当具有“所有者”角色的人键入静音命令时,它会使用他们@提到的人并赋予他们“静音”角色。

其余代码自行工作,唯一不工作的部分是行

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

并且变量“成员”定义为

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("❌&quot;).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 不是最熟悉的,也不知道如何以更简单的方式完成。

标签: javaeclipsediscorddiscord-jdajdal

解决方案


而不是解析字符串:

  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();
}

推荐阅读