#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
вместо этого.