java - 如何使用基于 JDA 的 Discord 机器人遍历公会的所有成员并更改他们的昵称

标签 java discord

我正在尝试编写一个简单的调用,列出公会的所有用户,检查他们的名字旁边是否有氏族标签,如果没有则添加它们,但我一生都无法让它工作。我在检查昵称时得到 NullPointers,因此我认为我没有正确获取这些值。

我很擅长 Java,只是以前从未使用过 JDA。我找不到任何像列出所有成员并迭代它们这样简单的代码示例。有人可以指出我正确的方向吗?我在大学里做过一些关于 REST 的工作,但不是很多。

添加 catch block ,但我没有将任何昵称的值放入我的列表中,因此我的代码没有执行任何操作。我尝试过在列表、数组和数组列表中实现,但问题似乎是从公会本身获取信息。

if(event.getMessage().getContentRaw().equals("!tags")){
        Guild guild = event.getGuild();
        List<Member> users = guild.getMembers();
        for(Member member: users){
            String s = "";
            try{
                s = member.getNickname();
                if(!member.getNickname().startsWith("[NNN]")) {
                    try {
                        member.modifyNickname("[NNN]" + member.getNickname()).queue();
                    } catch (Exception ignored) {
                    }
                }
            }
            catch(Exception ignored){ }
        }
    }

最佳答案

昵称可以为空,因为用户可以选择不设置昵称,这通过返回空来表示。您可以通过执行 s == null || 来检查这一点!s.startsWith("[NNN]")。或者,您可以使用 getEffectiveName 如果未为服务器设置昵称,它将返回用户名:

Member self = guild.getSelfMember();
for (Member member : guild.getMembers()) {
    String name = member.getEffectiveName(); // username or nickname
    if (!name.startsWith("[NNN]") && self.canInteract(member)) {
        member.modifyNickname("[NNN]" + name).queue();
    }
}

我使用 canInteract 来避免层次结构异常,如果您尝试设置服务器所有者或角色比您的机器人更高的成员的昵称,这种异常将不可避免地发生。

关于java - 如何使用基于 JDA 的 Discord 机器人遍历公会的所有成员并更改他们的昵称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58558220/

相关文章:

java - 使用 javascriptExecutor 查找 WebElement

java - 通过提供InputStream getter 来延迟访问InputStream

java - 3D 表面 JavaFX

java - 如何将单个实现绑定(bind)到 Guice 中的多个通用接口(interface)?

python - Discord.py计算器: Multiple Values?

javascript - Discord.js 以 "only you can see this"消息回复交互

java - RSA Java 加密和 Node.js 解密不起作用

python - 当我提到某个人时,我是否可以通过discord.py 让我的机器人通过私信联系他们?

python - Discord.py 在不使用消息功能的情况下返回用户名?

python - Discord.py 循环播放音频源