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

时间:2019-10-25 12:06:47

标签: java discord

我正在尝试编写一个简单的电话,列出所有行会用户,检查他们的姓名旁边是否有氏族标签,如果没有,则添加它们,但是我一生都无法正常工作。在检查昵称时我得到了NullPointers,所以我想我没有正确获得这些值。

我对Java很好,我以前从未使用过JDA。我找不到列出所有成员并对其进行迭代这样简单的代码示例。有人能指出我正确的方向吗?我在大学里做了一些关于REST的事情,但是没有很多。

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

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){ }
        }
    }

1 个答案:

答案 0 :(得分:0)

昵称可为空,因为用户可以选择不设置一个,这通过返回null来表示。您可以通过执行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来避免层次结构异常,如果您尝试设置服务器所有者或角色比机械手更高的成员的昵称,将不可避免地发生层次结构异常。