如何在 discord.js 中使用审核日志的成员角色更新部分

Posted

技术标签:

【中文标题】如何在 discord.js 中使用审核日志的成员角色更新部分【英文标题】:How to work with member role update part of audit log in discord.js 【发布时间】:2021-07-08 15:32:07 【问题描述】:

我目前正在制作一个机器人,通过在服务器上更新成员角色时发送消息来通知人们。我不知道如何设置应该正式为 client.on 部分的初始部分。 在这里,我展示了一些我认为应该可以工作的代码,但不幸的是它没有工作。

const Discord = require(‘discord.js’);
const client = Discord.Client();

client.on('guildMemberUpdate', (oldMember, newmember) => 

这是我期望做的:

【问题讨论】:

尝试在您的问题中添加更多内容。具体来说,您的代码。我对您要问的内容感到困惑,而一行代码并没有太大帮助。 我已经更新了应该显示更多信息的帖子。以及我期望做的其他机器人的屏幕截图。谢谢。 【参考方案1】:

在我给你代码之前,我会告诉你我为实现它所采取的步骤。

提示:始终使用文档。 discord.js 文档帮助了我很多次。


流程:

    设置指定的文字频道。在我的例子中,我手动获取了频道的 ID 并将其设置为变量 txtChannel。您必须将我的数字字符串替换为您自己的频道 ID。 我缓存了“新”成员和“旧”成员的每个角色 ID。 检查新成员角色数组的长度是否比旧成员角色数组长。这表示该成员已获得角色。 创建了一个过滤函数,可以“取消”新旧角色数组共有的每个角色 ID。 抓取图标 URL - 我发现如果您尝试获取具有默认不和谐图标的用户的 URL,它将返回 NULL。要绕过这一点,您可以在线获取某种不可见的 PNG 并将其设置为占位符。否则,您会收到一条错误消息,提示您无法检索到正确的 URL 链接。 设置嵌入,并将其发送到文本频道!

注意:

起初,我不明白为什么机器人没有为角色发生变化的其他用户注册。然后我找到了this question on Stack Overflow。该链接指出您必须确保启用公会成员意图。只需按照链接中的说明进行操作,您就应该一切就绪!它有点过时(在术语上),所以当它引用“公会成员意图”时,它实际上现在是“服务器成员意图”。


代码:

它非常复杂,但它完成了工作。

client.on('guildMemberUpdate', (oldMember, newMember) => 
    let txtChannel = client.channels.cache.get('803359668054786118'); //my own text channel, you may want to specify your own
    let oldRoleIDs = [];
    oldMember.roles.cache.each(role => 
        console.log(role.name, role.id);
        oldRoleIDs.push(role.id);
    );
    let newRoleIDs = [];
    newMember.roles.cache.each(role => 
        console.log(role.name, role.id);
        newRoleIDs.push(role.id);
    );
    //check if the newRoleIDs had one more role, which means it added a new role
    if (newRoleIDs.length > oldRoleIDs.length) 
        function filterOutOld(id) 
            for (var i = 0; i < oldRoleIDs.length; i++) 
                if (id === oldRoleIDs[i]) 
                    return false;
                
            
            return true;
        
        let onlyRole = newRoleIDs.filter(filterOutOld);

        let IDNum = onlyRole[0];
        //fetch the link of the icon name
        //NOTE: only works if the user has their own icon, else it'll return null if user has standard discord icon
        let icon = newMember.user.avatarURL();
        
        const newRoleAdded = new Discord.MessageEmbed()
            .setTitle('Role added')
            .setAuthor(`$newMember.user.tag`, `$icon`)
            .setDescription(`<@&$IDNum>`)
            .setFooter(`ID: $IDNum`)
            .setTimestamp()
    
        txtChannel.send(newRoleAdded);
    
)

【讨论】:

谢谢!答案已被接受并投票。而且我发现需要打开 Discord Developer Portal 中 Privileged Gateway Intents 类别下的 Presence Intent 才能使用该功能。无论如何,谢谢你的时间。祝你有美好的一天 好的。很好,你找到了 Presence Intents。

以上是关于如何在 discord.js 中使用审核日志的成员角色更新部分的主要内容,如果未能解决你的问题,请参考以下文章

如何使用索引访问特定的 discord.js 审计日志

如何在 Discord.Js 中列出所有具有角色的成员

如何在 discord.js v12 中列出所有公会成员

如何获取公会 Discord.js 中的成员列表

Discord.js 如何感知公会成员何时更改活动

如何在 discord.js 上为 discord 服务器的新成员发送欢迎消息?