если член получает определенную роль, я хочу добавить валюту, однако если член имеет эту роль и получает другую, он снова дает ему валюту
Я пытаюсь дать участнику определенную сумму в валюте, когда он получит определенную роль. Моя проблема в том, что если участник, имеющий одну из конкретных ролей, получает другую роль, например админ, которая не является одной из конкретных ролей, они снова получают валюту. Я знаю, что мне чего-то не хватает, я просто не знаю, что именно.
client.on("guildMemberUpdate", (oldMember, newMember) => {
var roleIdB = '660416964195385360';
var roleIdC = '664340587021074462';
var roleIdD = '662931802305855489';
var roleIdE = '662931967272288297';
var roleIdF = '664296178568921128';
var patreon = new db.table(`patreon`);
if (oldMember.displayName != newMember.displayName) {
let channel = client.channels.find(channel => channel.id === "667588202093215749");
let embed = new Discord.RichEmbed()
.setColor([38, 92, 216])
.setTitle(newMember.user.tag)
.addField("Before", `${oldMember.displayName}`)
.addField("After", `${newMember.displayName.toString()}`)
.setDescription(`${oldMember.displayName}'s Name Changed`)
.setTimestamp();
channel.send(embed);
return;
}
let channel = client.channels.find(channel => channel.id === "667588202093215749");
if (oldMember.roles.size < newMember.roles.size) {
const embed = new Discord.RichEmbed()
.setColor([38, 92, 216])
.setTimestamp()
.setAuthor('**Role added!**')
.setThumbnail(newMember.user.displayAvatarURL);
for (const role of newMember.roles.map(x => x.id)) {
if (!oldMember.roles.has(role)) {
embed.addField(`${oldMember.displayName}`, `was given the ${oldMember.guild.roles.get(role).name} role!`);
}
}
channel.send({
embed
});
if (newMember.roles.size < oldMember.roles.size) {
const embed = new Discord.RichEmbed()
.setColor([38, 92, 216])
.setTimestamp()
.setAuthor('**Role removed!**')
.setThumbnail(newMember.user.displayAvatarURL);
for (const role of oldMember.roles.map(x => x.id)) {
if (!newMember.roles.has(role)) {
embed.addField(`${newMember.displayName}`, `was removed from the ${newMember.guild.roles.get(role).name} role!`);
}
}
channel.send({
embed
});
return;
}
}
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;
}
}
});
2 ответа
Ваша проблема в том, что каждый раз, когда их роли меняются, вы проверяете, есть ли у них здесь определенная роль:
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;
}
}
Вместо того, чтобы смотреть на все роли участника, сначала определите роли. Т.е. смотрите только на новые роли. Еслиroles
были простым массивом, вы могли бы различать их так:
var newRoles = newMember.roles.filter(role => !oldMember.roles.includes(role));
Однако оказывается, что roles
на самом деле это более сложная структура данных, поэтому одно только вышеперечисленное не сработает! Выясните, есть ли способ повернутьroles
в массив. Если да, то используйте указанный выше метод, чтобы получить массив только новых ролей, а затем используйте его так:
if (newRoles.includes(roleIdB)) {
Разобрался, похоже, долгий путь, но работает.
if (oldMember.roles.size < newMember.roles.size) {
for (const role of newMember.roles.map(x => x.id)) {
if (!oldMember.roles.has(role)) {
if(!oldMember.roles.has(roleIdB)&&newMember.roles.has(roleIdB)) {
patreon.add(newMember.id, 75000)
}else
if(!oldMember.roles.has(roleIdC)&&newMember.roles.has(roleIdC)) {
patreon.add(newMember.id, 150000)
}else
if(!oldMember.roles.has(roleIdD)&&newMember.roles.has(roleIdD)) {
patreon.add(newMember.id, 325000)
}else
if(!oldMember.roles.has(roleIdE)&&newMember.roles.has(roleIdE)) {
patreon.add(newMember.id, 400000)
}else
if(!oldMember.roles.has(roleIdF)&&newMember.roles.has(roleIdF)) {
patreon.add(newMember.id, 475000)
return;
}
}
}
}