我正在使用JDA 4.1.1_101编码Discord机器人。我创建了“ ban”命令,但无法使unban命令起作用。我真不明白为什么...谢谢您的帮助。
if (args[0].equalsIgnoreCase(Main.prefix + "unban")) {
if(event.getGuild().getSelfMember().hasPermission(Permission.BAN_MEMBERS)) {
if (args.length > 0 && args.length < 3) {
try {
event.getMessage().delete().queue();
User member = event.getMessage().getMentionedMembers().get(0).getUser();
String id = member.getId();
event.getGuild().unban(id).queue();
EmbedBuilder ban = new EmbedBuilder();
ban.setColor(Color.GREEN);
ban.setTitle("UnBan");
ban.setDescription("UnBan Report");
ban.addField("Staffer: ", event.getMessage().getAuthor().getName(), true);
ban.addField("Unban: ", member.getName(), true);
logs.sendMessage(ban.build()).queue();
} catch (IndexOutOfBoundsException exx) {
EmbedBuilder error = new EmbedBuilder();
error.setColor(0xff3923);
error.setTitle("Error: User");
error.setDescription("Invalid user.");
event.getChannel().sendMessage(error.build()).queue(message -> {
message.delete().queueAfter(5, TimeUnit.SECONDS);
});
}
} else {
EmbedBuilder error = new EmbedBuilder();
error.setColor(0xff3923);
error.setTitle("Error: Wrong usage.");
error.setDescription("Use: .unban [@user].");
event.getChannel().sendMessage(error.build()).queue(message -> {
message.delete().queueAfter(5, TimeUnit.SECONDS);
});
}
}
}
答案 0 :(得分:1)
问题是,您正在尝试从消息中的提及中检索用户。
由于用户不再是公会的一部分,因此似乎不起作用。
要变通解决此问题,您必须手动检索ID。
提及内容始终采用<@userid>
或<!@userid>
格式。
要获取ID,您可以拆分邮件并替换不必要的部分,例如 String id = event.getMessage().getContentRaw().split("<")[1].split(">")[0].replace("!", "").replace("@", "");
我敢肯定有更好,更流畅的方法可以做到这一点。 ;)
检索ID的更好方法是使用Minn提到的正则表达式,例如<@!?(\d+)>
。
为了获得用户名,您只需要通过event.getJDA().getUserById(id).getName()
来获得ID。
重要的是要提到您不能正确提及不在服务器上的用户(这种情况在被禁止时就是这种情况)。
(另外:我尝试使用.getMentionedUsers()
,其结果与OP相同。)