Как определить, когда пользователь получает роль?

#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
    }
});
 

https://discord.js.org/#/docs/main/stable/class/Client?scrollTo=обновление членов электронной гильдии

Ответ №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'))
 

Примечание: убедитесь, что у вас включено намерение членов гильдии на портале разработчиков