【问题标题】:JDA - Event if new user joined to GuildJDA - 新用户加入公会时的事件
【发布时间】:2020-10-03 21:39:34
【问题描述】:

我有一个问题,我正在尝试使用 Java Discord API (JDA) 编写一个机器人。 当新用户加入服务器时,机器人会发送一条消息,但我的代码不起作用。 代码:

    public class UserJoinModule extends ListenerAdapter {
        public void onGuildMemberJoined(GuildMemberJoinEvent event) throws LoginException {
            String user = event.getMember().getAsMention();
            JDA client = new JDABuilder("awesome token").build();
            final List<TextChannel> channels = client.getTextChannelsByName("awesome channel name", true);
            for (final TextChannel ch : channels) {
                ch.sendMessage("New member joined: " + user).queue();
            }
        }

    }

谁能告诉我怎么回事?

【问题讨论】:

    标签: java discord-jda


    【解决方案1】:

    在您的Main.java 或任何文件中,有一个JDABuilder 类型的变量,在同一行代码中,有您的令牌,最后是.build() 等等...

    将此代码插入该行:

    .enableIntents(GatewayIntent.GUILD_MEMBERS)
    

    所以它看起来像这样:

    jda = JDABuilder.createDefault("TOKEN").enableIntents(GatewayIntent.GUILD_MEMBERS).build();
    

    要使其正常工作,请转到您的 Discord Developer Portal,点击您的机器人,从左侧菜单中点击 Bot,然后向下滚动并启用:

    • 服务器成员意图

    仍然存在明显的错误,例如在每条消息和其他问题上注册一个新客户端,修复它们,然后启动你的机器人,它应该可以工作。

    【讨论】:

      【解决方案2】:

      对我来说,问题不在于我覆盖的侦听器和方法。 我相信您必须将GatewayIntent.GUILD_MEMBERS 添加到您的JDABuilder。

      builder.enableIntents(GatewayIntent.GUILD_MEMBERS);
      

      这为我解决了同样的问题。

      【讨论】:

        【解决方案3】:

        您的代码中有 2 个问题。

        1. 每次有成员加入时,您都会创建一个新的 JDA 客户端。
        2. 您正在向 每个 公会中具有该名称的 每个 频道发送消息。不仅仅是用户加入的公会。

        这是你想要做的:

        public class UserJoinModule extends ListenerAdapter {
            @Override
            public void onGuildMemberJoin(GuildMemberJoinEvent event) {
                Guild guild = event.getGuild(); // Get the guild that the user joined.
                User user = event.getUser();    // Get the user that joined.
                JDA client = event.getJDA();    // Get the already existing JDA instance.
        
                List<TextChannel> channels = guild.getTextChannelsByName("awesome channel name", true); // Get the list of channels in the guild that matches that name.
        
                for (TextChannel channel : channels) { // Loops through the channels and sends a message to each one.
                    channel.sendMessage("New member joined: " + user).queue();
                }
            }
        }
        

        【讨论】:

          【解决方案4】:

          您的代码应如下所示:

          public class UserJoinModule extends ListenerAdapter {
              @Override // USE THIS WHEN YOU WANT TO OVERRIDE A METHOD
              public void onGuildMemberJoin(GuildMemberJoinEvent event) {
                  String user = event.getMember().getAsMention();
                  JDA client = event.getJDA(); // DO NOT CREATE A NEW JDA INSTANCE EVERY TIME
                  List<TextChannel> channels = client.getTextChannelsByName("awesome channel name", true);
                  for (TextChannel ch : channels) {
                      ch.sendMessage("New member joined: " + user).queue();
                  }
              }
          }
          

          并且您必须在您的 JDABuilder 实例中注册此侦听器,最好在整个代码库中只有其中一个。见addEventListeners

          【讨论】:

            猜你喜欢
            • 2020-09-27
            • 2019-10-12
            • 2021-12-28
            • 2018-05-11
            • 2021-03-06
            • 2021-09-09
            • 2019-03-07
            • 2023-01-23
            • 2021-01-19
            相关资源
            最近更新 更多