java - “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("❌").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);
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();
}
推荐阅读
- entity-framework - EF Core:单独的模型和 SQL 属性
- python - 如何解决 HTTPSConnectionPool(host='ads.google.com', port=443):读取超时。(读取超时=3600)错误?
- maven - Maven:依赖项:解包/如何覆盖工件依赖项?
- lua - 使用罗技 G-Hub 的 math.pow
- css - next.js 我不知道如何将全局 .container css 样式应用到其他页面
- javascript - 在 iOS 上切换标签时强制自动播放视频继续
- regex - 了解 powershell 正则表达式
- python - 仅在上传完成后下载 s3 文件
- java - 使用嵌套的静态类模拟接口
- laravel - 是否可以使用 laravel 中的时间戳将 Jalali 日期存储在 created_at 和 updated_at 字段中?