使用Discord4J开发Java Discord机器人时如何将UserID转换为Member对象
代码修改方案
原有代码存在3个核心错误:
- 空@判断逻辑错误:使用
==比对字符串是引用比较,且直接将集合转字符串比对"[]"的写法不严谨 - UserID取值错误:
getUserMentionIds()返回的是Set<Snowflake>集合,直接调用toString()会带出[]等多余字符,无法直接转换为有效用户ID - Member实例化逻辑错误:Discord4J的
Member是框架维护的实体类,不支持手动new构造,必须通过服务端请求获取
正确实现代码
public static void run(MessageCreateEvent event) { // 先判断是否是服务器消息,只有服务器环境才有Member对象,私聊场景仅能获取User对象 if (event.getGuild().blockOptional().isEmpty()) { Utils.sendMessageToChannel("ERROR: This command can only be used in guilds.", event); return; } Set<Snowflake> mentionIds = event.getMessage().getUserMentionIds(); // 直接判断集合是否为空即可 if (mentionIds.isEmpty()) { Utils.sendMessageToChannel("ERROR: No User got mentioned.", event); return; } // 此处取第一个被@的用户,需处理多个被@用户可以遍历集合 Snowflake targetUserId = mentionIds.stream().findFirst().get(); // 从服务器对象中获取Member,block()为同步阻塞获取,也可以改用非阻塞的subscribe方式处理 Member member = event.getGuild().block().getMemberById(targetUserId).block(); // 后续可正常使用member对象 }
注意事项
- 要使用非阻塞异步写法的话,把
block()替换为对应的响应式回调逻辑即可,适配Discord4J的Reactor设计规范 - 如果被@用户不在当前服务器中,
getMemberById会返回空,可自行添加空值判断逻辑避免空指针异常
内容的提问来源于stack exchange,提问作者JeremyStarTM
相关产品推荐
相关产品推荐

