Ваша проблема в том, что каждый раз, когда их роли меняются, вы проверяете, имеют ли они определенную роль c здесь:
if (oldMember.roles.size < newMember.roles.size) {
if (newMember.roles.has(roleIdB)) {
patreon.add(newMember.id, 75000);
return;
}
if (newMember.roles.has(roleIdC)) {
patreon.add(newMember.id, 150000);
return;
}
if (newMember.roles.has(roleIdD)) {
patreon.add(newMember.id, 325000);
return;
}
if (newMember.roles.has(roleIdE)) {
patreon.add(newMember.id, 400000);
return;
}
if (newMember.roles.has(roleIdF)) {
patreon.add(newMember.id, 475000);
return;
}
}
Вместо того, чтобы рассматривать полные роли участника, diff роли в первую очередь. Т.е. смотреть только на новые роли. Если бы roles
был простым массивом, вы могли бы различать их следующим образом:
var newRoles = newMember.roles.filter(role => !oldMember.roles.includes(role));
Однако, похоже, что roles
на самом деле является более сложной структурой данных, так что вышеперечисленное победило ' t работа! Выясните, есть ли способ превратить roles
в массив. Если это так, то используйте вышеуказанный метод, чтобы получить массив только новых ролей, а затем используйте его так:
if (newRoles.includes(roleIdB)) {