if(command === "mute"){
const target = message.mentions.users.first();
if (target) {
if (!message.member.hasPermission("ADMINISTRATOR")) {
return message.reply("Unauthorized");
}
let muted = client.settings.get(message.guild.id, 'mute')
let muteRole = message.guild.roles.cache.find(role => role.name === muted);
let memberTarget = message.guild.members.cache.get(target.id);
let rolelist = memberTarget.roles.cache
.map(r => r)
if (!args[1]) {
memberTarget.roles.remove(rolelist);
memberTarget.roles.add(muteRole);
message.channel.send(`<@${memberTarget.user.id}> has been muted`);
return
}
memberTarget.roles.remove(rolelist);
memberTarget.roles.add(muteRole);
message.channel.send(`<@${memberTarget.user.id}> will be muted for ${ms(ms(args[1]))}`);
setTimeout(function () {
memberTarget.roles.add(rolelist);
memberTarget.roles.remove(muteRole);
}, ms(args[1]));
} else {
message.channel.send('User not found!');
}
所以我有这个静音命令,它删除你所有的角色,给你 muteRole
,当时间到了,它返回你以前的角色并删除 muteRole
。我遇到的问题是它有时会删除您的所有角色并且不给您 muteRole
,有时它不会在时间到时删除 muteRole
。有时它会删除您的所有角色,并且不会为您提供
muteRole
当时间到了它不会让你的角色回来......
基本上结果总是随机的。所以我的问题是如何使它保持一致?
答案 0 :(得分:1)
方法 .add()
和 .remove()
返回 Promise
,因此您应该尝试使用 await
/ .then()
。
如果你这样做,下一个 function
或 .then()
将不会被执行直到promise
是<强>完全处理。
示例:
memberTarget.roles.remove(rolelist)
.then(() => memberTarget.roles.add(muteRole))
.then(() => message.channel.send('some message'));
现在你快完成了。您需要的最后一件事是 .catch()
块,因为如果上面的代码失败/抛出错误,您应该catch
:
.catch(err => console.log(`An error occured: ${err}`))
最终结果:
memberTarget.roles.remove(rolelist)
.then(() => memberTarget.roles.add(muteRole))
.then(() => message.channel.send('some message'))
.catch(err => console.log(`An error occured: ${err}`));
promises