You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 06:48:04