当前位置: 首页 > 知识库问答 >
问题:

JDA-新用户加入公会的事件

晁国发
2023-03-14

我有一个问题,我试图使用Java不和谐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();
            }
        }

    }

有人能告诉我怎么了吗?

共有3个答案

赵明亮
2023-03-14

对我来说,问题不是来自我重写的侦听器和方法。我相信您必须添加网关意图。帮会成员到您的JDABuilder。

builder.enableIntents(GatewayIntent.GUILD_MEMBERS);

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

凤凡
2023-03-14

您的代码中有两个问题。

  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();
        }
    }
}
司徒阳曜
2023-03-14

您的代码应该如下所示:

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

 类似资料:
  • 我在使用Discord。js创建一个基本的Discord机器人。当bot第一次启动时,我运行获取机器人当前订阅的所有协会的列表。我将其保存到其他程序使用的数据库中。 然而,当人们从他们的公会中添加/删除机器人时,我想保留一个更新的公会列表。我意识到我可以每分钟重新运行,但这似乎效率低下。 当你的机器人被添加到公会和/或频道时,是否有触发的事件?据我所知,事件似乎针对所有已经订阅该公会的用户/机器人

  • 我希望能够运行以开始的命令!suspend,提到一个用户,然后确定一个时间长度,并在指定的时间长度内向提到的用户添加一个名为“suspend”的角色。 我不知道该怎么做,因为我对JDA太不熟悉,无法让它工作。除了实际添加的名为“暂停”的角色之外,我的一切都正常。

  • 编辑:我想知道我是否添加了错误的bot?bot与用户的OAuth 2位于同一应用程序上。此bot添加了以下内容:https://discordapp.com/oauth2/authorize?client_id={我的id} 我与Discord有OAuth2连接,使用https://github.com/wohali/oauth2-discord-new这将返回discord用户和我的访问令牌。它

  • 我希望我的Discord机器人在成员加入频道时向他们致意。我一直找不到在这种情况下触发的事件。我试过我的客户。UserJoined=MyMethod 谢谢,如果我能提供更多的信息,请告诉我。 编辑:建议的链接实现了用户加入事件,该事件似乎仅在新成员加入频道时触发。我需要每次有人登录频道时触发的东西,即使是现有成员。

  • 我有一个用例,我想将a作为JSON到我的服务,然后服务应该注册一个新用户(使用给定的和自动生成的密码)。 数据 我正在使用,我面临的问题是: 每当我尝试HTTP 用户名时,服务已经要求身份验证(用户名和密码)。这不是我想要的原因。我希望注册 API 是完全公开的。这意味着每个人(未经授权)都可以一个新的用户名,从而“打开帐户”。 我不确定我怎样才能达到想要的行为。服务的一部分应该是公共的(就像上面

  • 本文向大家介绍Ubuntu 添加新用户,包括了Ubuntu 添加新用户的使用技巧和注意事项,需要的朋友参考一下 示例 adduser命令将用户添加到系统。为了添加新的用户类型: 例: 键入上述命令后,将提示您输入有关新用户的详细信息,例如新密码,用户全名等。 以下是要求用户填写以添加新用户的信息: