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

Java开发Discord上线问候Bot失效问题排查求助

Discord JDA机器人无法触发成员上线问候,且出现“无法解析符号/方法”错误

我用Java开发了一款Discord Bot,已在服务器上线,但无法实现成员上线问候功能。已开启Presence Intent、Server Members Intent和Message Content Intent权限,Maven、JDA均使用最新版本。作为编程新手,怀疑是逻辑错误,尝试更换JDA版本和方法后,仍频繁出现“无法解析符号/方法”的提示。

以下是我的代码文件和pom.xml:

Java代码

import net.dv8tion.jda.api.JDABuilder;
import net.dv8tion.jda.api.OnlineStatus;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
import net.dv8tion.jda.api.events.user.update.UserUpdateOnlineStatusEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import net.dv8tion.jda.api.requests.GatewayIntent;

import javax.security.auth.login.LoginException;

public class OnlineTrackerBot extends ListenerAdapter
{

    public static void main(String[] args) throws LoginException {
        String token = "my_token";  // Replaced with my bot token

        JDABuilder builder = JDABuilder.createDefault(token);
        builder.enableIntents(GatewayIntent.GUILD_PRESENCES, GatewayIntent.GUILD_MEMBERS, GatewayIntent.MESSAGE_CONTENT);  // Enable necessary intents
        builder.addEventListeners(new OnlineTrackerBot());
        System.out.println("Event listeners added.");
        builder.build();
    }

    @Override
    public void onUserUpdateOnlineStatus(UserUpdateOnlineStatusEvent event) {
        System.out.println("Received UserUpdateOnlineStatusEvent for user: " + event.getUser().getName());

        // Get the member whose presence updated
        Member member = event.getGuild().getMember(event.getUser());
        if (member == null) {
            System.out.println("Member not found in the guild.");
            return;
        }
        System.out.println("Member found: " + member.getEffectiveName());

        // Check if the member's status is now ONLINE
        if (event.getNewOnlineStatus() == OnlineStatus.ONLINE) {
            // Get the general channel (replace with your actual channel name)
            TextChannel generalChannel = event.getGuild().getTextChannelsByName("inte-dansband-förhelvete", true).get(0);

            // Send a welcome message in the general channel
            if (generalChannel != null) {
                System.out.println("Sending message to channel: " + generalChannel.getName());
                generalChannel.sendMessage("Welcome back online, " + member.getAsMention() + "!").queue();
            } else {
                System.out.println("General channel not found.");
            }
        }
    }
}

pom.xml文件

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>me.Carllundholm</groupId>
  <artifactId>OnlineTrackerBot</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>OnlineTrackerBot</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>net.dv8tion</groupId>
      <artifactId>JDA</artifactId>
      <version>5.1.0</version> <!-- Use a stable release of JDA -->
    </dependency>
    <!-- JUnit 5 Dependency -->
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-api</artifactId>
      <version>5.9.3</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-engine</artifactId>
      <version>5.9.3</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>2.0.9</version>
    </dependency>

问题解决步骤

1. 修复Maven依赖问题(解决“无法解析符号/方法”)

你的pom.xml存在两个关键问题:

  • 缺失</dependencies>和</project>闭合标签,导致Maven无法正确解析依赖
  • JDA 5.x需要完整的依赖包,且缺少SLF4J的日志实现(仅依赖slf4j-api会导致运行时错误)

修正后的pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>me.Carllundholm</groupId>
  <artifactId>OnlineTrackerBot</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>OnlineTrackerBot</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <!-- JDA 5.x 完整依赖 -->
    <dependency>
      <groupId>net.dv8tion</groupId>
      <artifactId>JDA</artifactId>
      <version>5.1.0</version>
      <exclusions>
          <exclusion>
              <groupId>org.slf4j</groupId>
              <artifactId>slf4j-api</artifactId>
          </exclusion>
      </exclusions>
    </dependency>
    <!-- SLF4J 日志实现,用于输出JDA日志 -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>2.0.9</version>
    </dependency>
    <!-- JUnit 5 Dependency -->
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-api</artifactId>
      <version>5.9.3</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-engine</artifactId>
      <version>5.9.3</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

2. 修正代码逻辑(解决上线问候不触发及空指针问题)

  • 事件监听调整:UserUpdateOnlineStatusEvent仅监听用户在线状态的变更,但用户从离线切换到在线时,更可靠的是监听GuildMemberUpdateOnlineStatusEvent
  • 空指针防护:获取频道时,先判断返回的列表是否为空,避免调用get(0)抛出异常
  • 成员缓存优化:启用必要的缓存标记,确保JDA正确加载成员信息,避免getMember()返回null

修正后的Java代码:

import net.dv8tion.jda.api.JDABuilder;
import net.dv8tion.jda.api.OnlineStatus;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
import net.dv8tion.jda.api.events.guild.member.update.GuildMemberUpdateOnlineStatusEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import net.dv8tion.jda.api.requests.GatewayIntent;
import net.dv8tion.jda.api.utils.cache.CacheFlag;

import javax.security.auth.login.LoginException;
import java.util.List;

public class OnlineTrackerBot extends ListenerAdapter
{

    public static void main(String[] args) throws LoginException {
        String token = "my_token";

        JDABuilder builder = JDABuilder.createDefault(token);
        // 启用必要的意图和缓存
        builder.enableIntents(GatewayIntent.GUILD_PRESENCES, GatewayIntent.GUILD_MEMBERS, GatewayIntent.MESSAGE_CONTENT);
        builder.enableCache(CacheFlag.MEMBER_OVERRIDES, CacheFlag.PRESENCE);
        builder.addEventListeners(new OnlineTrackerBot());
        builder.build();
    }

    @Override
    public void onGuildMemberUpdateOnlineStatus(GuildMemberUpdateOnlineStatusEvent event) {
        Member member = event.getMember();
        if (member == null) {
            System.out.println("无法获取成员信息");
            return;
        }

        // 仅处理从离线切换到在线的情况
        if (event.getOldOnlineStatus() == OnlineStatus.OFFLINE && event.getNewOnlineStatus() == OnlineStatus.ONLINE) {
            List<TextChannel> channels = event.getGuild().getTextChannelsByName("inte-dansband-förhelvete", true);
            if (channels.isEmpty()) {
                System.out.println("未找到目标频道");
                return;
            }
            TextChannel generalChannel = channels.get(0);
            generalChannel.sendMessage("欢迎回来," + member.getAsMention() + "!").queue(
                success -> System.out.println("问候消息已发送"),
                error -> System.out.println("发送消息失败: " + error.getMessage())
            );
        }
    }
}

3. 服务器权限验证

  • 确认机器人在服务器中拥有发送消息、查看频道的权限
  • 再次检查Discord开发者后台,确认Presence Intent、Server Members Intent、Message Content Intent已完全开启,保存设置后重启机器人

内容的提问来源于stack exchange,提问作者Carl Lundholm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 15:59:51