如何在 Discord.js 中添加角色添加、删除和用户名更改的审核日志?

How to add an audit log for role added, removed, and username changed in Discord.js?

对于我的 Discord.js 机器人,我正在尝试创建一个审计日志,该日志将消息发送到它所在的每个服务器内的特定日志通道以进行用户更改。我有一个可用的 'message deleted' 审计日志功能,但是当我尝试将其用于角色添加和删除、用户名、昵称和头像更改时,机器人无法记录并崩溃。如何在我的代码中解决这个问题?

我已经包含消息删除审核日志消息发送和角色 add/remove/username 更改

client.on('messageDelete', function (message) {
  if (message.channel.type === 'text') {
    // post in the server's log channel, by finding the accuratebotlog channel (SERVER ADMINS **MUST** CREATE THIS CHANNEL ON THEIR OWN, IF THEY WANT A LOG)
    var log = message.guild.channels.find('name', CHANNEL)
    if (log != null) {
      log.sendMessage('**Message Deleted** ' + message.author + '\'s message: ' + message.cleanContent + ' has been deleted.')
    }
  }
})

// sends message when important (externally editable) user statuses change (for example nickname)
// user in a guild has been updated
client.on('guildMemberUpdate', function (guild, oldMember, newMember) {
  // declare changes
  var Changes = {
    unknown: 0,
    addedRole: 1,
    removedRole: 2,
    username: 3,
    nickname: 4,
    avatar: 5
  }
  var change = Changes.unknown

  // check if roles were removed
  var removedRole = ''
  oldMember.roles.every(function (value) {
    if (newMember.roles.find('id', value.id) == null) {
      change = Changes.removedRole
      removedRole = value.name
    }
  })

  // check if roles were added
  var addedRole = ''
  newMember.roles.every(function (value) {
    if (oldMember.roles.find('id', value.id) == null) {
      change = Changes.addedRole
      addedRole = value.name
    }
  })

  // check if username changed
  if (newMember.user.username != oldMember.user.username) {
    change = Changes.username
  }
  // check if nickname changed
  if (newMember.nickname != oldMember.nickname) {
    change = Changes.nickname
  }
  // check if avatar changed
  if (newMember.user.avatarURL != oldMember.user.avatarURL) {
    change = Changes.avatar
  }
  // post in the guild's log channel
  var log = guild.channels.find('name', CHANNEL)
  if (log != null) {
    switch (change) {
      case Changes.unknown:
        log.sendMessage('**[User Update]** ' + newMember)
        break
      case Changes.addedRole:
        log.sendMessage('**[User Role Added]** ' + newMember + ': ' + addedRole)
        break
      case Changes.removedRole:
        log.sendMessage('**[User Role Removed]** ' + newMember + ': ' + removedRole)
        break
      case Changes.username:
        log.sendMessage('**[User Username Changed]** ' + newMember + ': Username changed from ' +
          oldMember.user.username + '#' + oldMember.user.discriminator + ' to ' +
          newMember.user.username + '#' + newMember.user.discriminator)
        break
      case Changes.nickname:
        log.sendMessage('**[User Nickname Changed]** ' + newMember + ': ' +
          (oldMember.nickname != null ? 'Changed nickname from ' + oldMember.nickname +
            +newMember.nickname : 'Set nickname') + ' to ' +
          (newMember.nickname != null ? newMember.nickname + '.' : 'original username.'))
        break
      case Changes.avatar:
        log.sendMessage('**[User Avatar Changed]** ' + newMember)
        break
    }
  }
})

我希望机器人向我的频道发送一条消息说 'User Role Removed: memberName + their old role',反之亦然以添加角色,但我的机器人无法将这些消息发送到我设置的机器人日志频道。

GuildMemberUpdate 事件中没有 guild 参数。因此,newMember 是未定义的,因为只传递了两个参数。

client.on('guildMemberUpdate', (oldMember, newMember) => {
  const guild = newMember.guild;

  // continue with code
});