【问题标题】:Role assignment gives announcement to specific channel角色分配向特定频道发布公告
【发布时间】:2020-12-28 23:52:25
【问题描述】:

我正在使用 discord.js 尝试制作一个机器人,其唯一目的是每当成员被赋予特定角色(alpha、bravo、charlie、delta)时,它都会向特定频道发送通知(#general)恭喜你成为派系的一员!我该怎么做呢? (我知道它是“GuildMembers”块的一部分)

const Discord = require('discord.js');
const client = new Discord.Client();
const token = 'NzUzNTY0NjA0MjM1MzgyODI1.X1oBug.E0GEmnakRtQMbOfg5IwllQsW_Ps';

client.on('ready', () => {
    console.log('This bot is online!')
})


client.on("guildMemberUpdate", async(oldMember, newMember) => {
    // On `guildMemberUpdate`

    if (oldMember.roles.cache !== newMember.roles.cache) {
        // Check if a role was updated

        let newRole;
        newMember.roles.cache.forEach((role) => {
            if (oldMember.roles.cache.includes(role)) return;
            // Check for the new role that was added

            let roleNames = ["bobbies", "beebos", "babbos", "bobbios"];
            if (roleNames.toLowerCase().includes(role.name.toLowerCase())) {
                // Check for only `['bobbies', 'beebos', 'babbos', 'bobbios']`
                newRole = role;
            }
        });

        // Anything you want to run here with the `newRole` data.
        const channel = oldMember.guild.channels.cache.find(
            (channel) => channel.name === "general"
        );
        channel.send("Congratulations on becoming part of the faction!");
    }
});


client.login(token);

不幸的是,这会返回错误:

(node:6240) UnhandledPromiseRejectionWarning: TypeError: oldMember.roles.cache.includes is not a function
    at C:\Users\sanderj\Desktop\Discord Bot\index.js:18:39
    at Map.forEach (<anonymous>)
    at Client.<anonymous> (C:\Users\sanderj\Desktop\Discord Bot\index.js:17:31)
    at Client.emit (events.js:315:20)
    at Object.module.exports [as GUILD_MEMBER_UPDATE] (C:\Users\sanderj\Desktop\Discord Bot\node_modules\discord.js\src\client\websocket\handlers\GUILD_MEMBER_UPDATE.js:25:16)
    at WebSocketManager.handlePacket (C:\Users\sanderj\Desktop\Discord Bot\node_modules\discord.js\src\client\websocket\WebSocketManager.js:384:31)
    at WebSocketShard.onPacket (C:\Users\sanderj\Desktop\Discord Bot\node_modules\discord.js\src\client\websocket\WebSocketShard.js:444:22)
    at WebSocketShard.onMessage (C:\Users\sanderj\Desktop\Discord Bot\node_modules\discord.js\src\client\websocket\WebSocketShard.js:301:10)
    at WebSocket.onMessage (C:\Users\sanderj\Desktop\Discord Bot\node_modules\ws\lib\event-target.js:125:16)
    at WebSocket.emit (events.js:315:20)
(node:6240) UnhandledPromiseRejectionWarning: Unhandled promise rejection. 

此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。要在未处理的 Promise 拒绝时终止节点进程,请使用 CLI 标志 --unhandled-rejections=strict(请参阅 https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)。 (拒绝编号:1) (节点:6240)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。

【问题讨论】:

  • 您能否添加您当前的代码、您尝试过的代码以及您的问题是什么? Stackoverflow 不是您要求人们为您做/做事的地方。请查看其他答案、指南、文档,并先尝试使用谷歌搜索。
  • 我已经尝试过谷歌搜索和一切,但似乎没有提到如何做到这一点
  • 改用if (oldMember.roles.cache.has(role.id)) return.includes() 仅适用于 arrays

标签: javascript event-handling discord discord.js dom-events


【解决方案1】:

查看Client#guildMemberUpdate,当与member 属性有关的某些内容发生更改(即添加角色)时,它会发出。尝试将此代码添加到您的机器人:

client.on("guildMemberUpdate", async (oldMember, newMember) => {
  // On `guildMemberUpdate`

  if (!oldMember.roles.cache.equals(newMember.roles.cache)) {
    // Check if a role was updated

    let newRole;
    newMember.roles.cache.forEach((role) => {
      if (oldMember.roles.cache.includes(role)) return;
      // Check for the new role that was added

      let roleNames = ["alpha", "bravo", "charlie", "delta"];
      if (roleNames.toLowerCase().includes(role.name.toLowerCase())) {
        // Check for only `['alpha', 'bravo', 'charlie', 'delta']`
        newRole = role;
      }
    });

    // Anything you want to run here with the `newRole` data.
    const channel = oldMember.guild.channels.cache.find(
      (channel) => channel.name === "general"
    );
    channel.send("Congratulations on becoming part of the faction!");
  }
});

【讨论】:

  • oldMember.roles.cache !== newMember.roles.cache 将始终返回 true。请改用Collection#equals
猜你喜欢
  • 1970-01-01
  • 2021-10-31
  • 2022-01-25
  • 1970-01-01
  • 2021-08-01
  • 2021-04-08
  • 2021-05-25
  • 2019-03-08
  • 2020-04-03
相关资源
最近更新 更多