#discord.js
Вопрос:
Этим утром я только начал пытаться научиться писать своего первого бота Discord, так что у меня очень мало опыта в discord.js, но я знаком с JavaScript. Однако я искал пару часов, пытаясь найти способ вызова функции всякий раз, когда пользователь на моем сервере получает или теряет роль.
На моем сервере я добавил бота Patreon, который назначает роль пользователям, которые становятся посетителями. И я хотел бы создать пользовательского бота, который публикует «имя пользователя» ура » в моем общем канале, когда пользователь получает роль покровителя.
Я не могу найти ни одного примера, который показывает, как определить, когда пользователь получает или теряет роль. Можно ли сделать это просто с помощью события? Или мне, возможно, потребуется периодически перебирать всех пользователей и вести список их текущих ролей, проверяя наличие изменений?
Я приношу извинения, что мой вопрос не содержит никакого кода или примеров, но я не добился никакого прогресса и обращаюсь к сообществу SO за советом.
Ответ №1:
Вы хотите использовать это мероприятие guildMemberUpdate
.
Вы можете сравнить состояние старого элемента с состоянием нового элемента и посмотреть, какие роли изменились.
Это не самое элегантное решение, но оно выполнит свою работу.
client.on('guildMemberUpdate', (oldMember, newMember) => {
// Roles
const oldRoles = oldMember.roles.cache,
newRoles = newMember.roles.cache;
// Has Role?
const oldHas = oldRoles.has('role-id'),
newHas = newRoles.has('role-id');
// Check if removed or added
if (oldHas amp;amp; !newHas) {
// Role has been removed
} else if (!oldHas amp;amp; newHas) {
// Role has been added
}
});
Ответ №2:
Это просто с клиентом#guildMemberUpdate. Вот простой код, который может вам помочь
(Это самый короткий код, который я мог придумать)
client.on('guildMemberUpdate', async (oldMember, newMember) => {
if(oldMember.roles.cache.has('patreonRoleId')) return;
if(newMember.roles.cache.has('patreonRoleId')) {
//code here to run if member received role
//Warning: I didn’t test it as I had no time.
}
})
Чтобы увидеть удаленную роль, просто поместите логический оператор NOT (!) перед обоими операторами if, как это:
if(!oldMember.roles.cache.has('patreonRoleId'))
if(!newMember.roles.cache.has('patreonRoleId'))
Примечание: убедитесь, что у вас включено намерение членов гильдии на портале разработчиков