Назначение роли дает объявление определенному каналу

#javascript #event-handling #discord #discord.js #dom-events

#javascript #обработка событий #Discord #discord.js #dom-события

Вопрос:

Я использую discord.js попробуйте создать бота с единственной целью, чтобы всякий раз, когда участнику присваивается определенная роль (альфа, браво, Чарли, дельта), он отправлял объявление на определенный канал (#general) с поздравлениями по поводу вступления во фракцию! Как бы я это сделал? (что я знаю, так это то, что это часть блока «Члены гильдии»)

 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:UserssanderjDesktopDiscord Botindex.js:18:39
    at Map.forEach (<anonymous>)
    at Client.<anonymous> (C:UserssanderjDesktopDiscord Botindex.js:17:31)
    at Client.emit (events.js:315:20)
    at Object.module.exports [as GUILD_MEMBER_UPDATE] (C:UserssanderjDesktopDiscord Botnode_modulesdiscord.jssrcclientwebsockethandlersGUILD_MEMBER_UPDATE.js:25:16)
    at WebSocketManager.handlePacket (C:UserssanderjDesktopDiscord Botnode_modulesdiscord.jssrcclientwebsocketWebSocketManager.js:384:31)
    at WebSocketShard.onPacket (C:UserssanderjDesktopDiscord Botnode_modulesdiscord.jssrcclientwebsocketWebSocketShard.js:444:22)
    at WebSocketShard.onMessage (C:UserssanderjDesktopDiscord Botnode_modulesdiscord.jssrcclientwebsocketWebSocketShard.js:301:10)
    at WebSocket.onMessage (C:UserssanderjDesktopDiscord Botnode_moduleswslibevent-target.js:125:16)
    at WebSocket.emit (events.js:315:20)
(node:6240) UnhandledPromiseRejectionWarning: Unhandled promise rejection. 
  

Эта ошибка возникла либо из-за включения асинхронной функции без блока catch, либо из-за отклонения обещания, которое не было обработано с .catch() . Чтобы завершить процесс узла при отклонении необработанного обещания, используйте флаг CLI --unhandled-rejections=strict (см. https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode ). (идентификатор отклонения: 1)
(узел: 6240) [DEP0018] Предупреждение об устаревании: необработанные отклонения обещаний не рекомендуются. В будущем отклонения обещаний, которые не обрабатываются, завершат Node.js процесс с ненулевым кодом завершения.

Комментарии:

1. Не могли бы вы, пожалуйста, добавить свой текущий код, то, что вы пробовали, и в чем ваша проблема? Stackoverflow — это не то место, где вы можете просить людей делать что-то для вас. Пожалуйста, ознакомьтесь с другими ответами, руководствами, документами и попробуйте сначала погуглить это.

2. я пробовал поиск в Google и все такое, но, похоже, нет никаких упоминаний о том, как это сделать

3. Используйте if (oldMember.roles.cache.has(role.id)) return вместо этого. .includes() работает только для arrays

Ответ №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!");
  }
});
  

Комментарии:

1. oldMember.roles.cache !== newMember.roles.cache всегда возвращает true. Используйте Collection#equals вместо этого.