目前,用户可以选择本节中给出的尽可能多的 Angular 色,但是,我希望能够执行以下操作: ( Angular 色A或 Angular 色B)AND( Angular 色C或 Angular 色D)AND Angular 色E等
以上内容都是通过检查他们已经提交的 react 来触发的,如果新的选择与当前的选择相矛盾,则删除它们。
用户可以通过对指定消息使用react来为自己应用 react Angular 色。根据是否做出特定选择,它能够添加/删除另一个 Angular 色,即
你几岁了? - 18-24 - 25-30 - 31+
你的性别是什么? - 男性 - 女性
你在哪个洲? - IDK,我已经用完了 - 虚假问题 - 填充空间。
如果用户点击 25-30,但随后意识到自己是 24,并点击该按钮,我希望删除先前的 react 和 Angular 色,而无需手动干预。 不仅有 1 个选项可用,因此还希望有多个选项可用。
bot.on("raw", event =>{
console.log(event);
const eventName = event.t;
if(eventName === 'MESSAGE_REACTION_ADD')
{
if(event.d.message_id === '<REMOVED ID>')
{
var reactionChannel = bot.channels.get(event.d.channel_id);
if(reactionChannel.messages.has(event.d.message_id))
return;
else {
reactionChannel.fetchMessage(event.d.message_id)
.then(msg => {
var msgReaction = msg.reactions.get(event.d.emoji.name + ":" + event.d.emoji.id);
var user = bot.users.get(event.d.user_id);
bot.emit('messageReactionAdd', msgReaction, user);
})
.catch(err => console.log(err));
}
}
}
else if (eventName === 'MESSAGE_REACTION_REMOVE')
{
if(event.d.message_id === '<REMOVED ID>')
{
var reactionChannel = bot.channels.get(event.d.channel_id);
if(reactionChannel.messages.has(event.d.message_id))
return;
else{
reactionChannel.fetchMessage(event.d.message_id)
.then(msg => {
var msgReaction = msg.reactions.get(event.d.emoji.name + ":" + event.d.emoji.id);
var user = bot.users.get(event.d.user_id);
bot.emit('messageReactionRemove', msgReaction, user);
})
.catch(err => console.log(err));
}
}
}
});
bot.on('messageReactionAdd', (messageReaction, user) => {
var roleName = messageReaction.emoji.name;
var role = messageReaction.message.guild.roles.find(role => role.name.toLowerCase() === roleName.toLowerCase());
if(role)
{
var member = messageReaction.message.guild.members.find(member => member.id === user.id);
if(member)
{
member.addRole(role.id);
console.log('Success. Added role.');
}
}
});
bot.on('messageReactionRemove', (messageReaction, user) => {
var roleName = messageReaction.emoji.name;
var role = messageReaction.message.guild.roles.find(role => role.name.toLowerCase() === roleName.toLowerCase());
if(role)
{
var member = messageReaction.message.guild.members.find(member => member.id === user.id);
if(member)
{
member.removeRole(role.id);
console.log('Success. Removed role.');
}
}
});```
最佳答案
在 messageReactionAdd
事件中,您可以尝试查找由/向用户应用的与特定选择相对应的 react 或 Angular 色。如果有的话,那就意味着他们已经选择了这个答案。然后,您可以在向用户添加新 Angular 色之前删除它们。如果没有,代码应该照常继续。
bot.on('messageReactionAdd', async (messageReaction, user) => { // async needed for 'await'
const name = messageReaction.emoji.name.toLowerCase();
const message = messageReaction.message;
const role = message.guild.roles.find(role => role.name.toLowerCase() === name);
const member = message.guild.member(user);
if (!role || !member) return;
const emojis = message.reactions.map(emoji => emoji.name);
const conflictingReaction = message.reactions.find(reaction => reaction.users.get(user.id) && emojis.includes(reaction.emoji.name));
const conflictingRole = member.roles.find(role => emojis.includes(role.name.toLowerCase());
try {
if (conflictingReaction || conflictingRole) {
await conflictingReaction.remove(user);
await member.removeRole(conflictingRole);
}
await member.addRole(role);
console.log('Success.');
} catch(err) {
console.error(err);
}
});
关于javascript - 更新角色一次仅允许用户使用一个角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56702391/