Javascript 如何使角色删除命令不受速率限制?
这是一个用于从所有服务器成员中删除角色的命令。如何使其不达到利率限制? 以下是我尝试过的一些解决方案,但没有奏效Javascript 如何使角色删除命令不受速率限制?,javascript,node.js,discord.js,Javascript,Node.js,Discord.js,这是一个用于从所有服务器成员中删除角色的命令。如何使其不达到利率限制? 以下是我尝试过的一些解决方案,但没有奏效 if (!message.member.hasPermission("MANAGE_ROLES")) return message.channel.send("Nice try, but you can't") if (!message.guild.me.hasPermission("MANAGE_ROLES"
if (!message.member.hasPermission("MANAGE_ROLES")) return message.channel.send("Nice try, but you can't")
if (!message.guild.me.hasPermission("MANAGE_ROLES")) return message.channel.send('I don\'t have permissions.')
const role = message.mentions.roles.first()
if (!role) {
return message.channel.send("Please mention a role");
}else {
await message.guild.members.fetch()
const targets = message.guild.members.cache.filter(m => !m.roles.cache.has(role))
await targets.forEach(member => member.roles.remove(role))
message.channel.send(`Done`)
}}};
var指数=0;
var myInterval=setInterval(函数(){
如果(索引
p•S当我在有80名成员的小型测试服务器上运行它时,它可以正常工作。但在更大的服务器上,情况并非如此。那是因为利率限制(我想)。我怎么能不达到速率限制并完成它呢?您只需启动多个异步调用,如果它们遇到错误,就会返回一个错误 尝试改用地图,您可以等待承诺带来的一系列承诺。所有:
var index = 0;
var myInterval = setInterval(function() {
if (index < targets.length - 1)
targets[index].roles.remove(role);
else
clearInterval(myInterval);
index++;
}, 1000);
答案2
这个函数允许我们执行任何API请求,如果它受到速率限制,它将在请求返回的时间内创建一个超时
await Promise.all(targets.map(async (member) => {
await member.roles.remove(role)
}));
如何使用它?在下面的示例中,我将使用删除请求
这不是有速率限制吗?我记得可能没有,但它会通知我,我将通过api直接用另一种方法更新我的答案。我尝试过,目标是所有服务器成员。它得到了速率限制。其他方法?希望这有帮助。
授权:`${client.user?.bot?.bot?“:“}${client.token}`
意外令牌。”
await Promise.all(targets.map(async (member) => {
await member.roles.remove(role)
}));
const fetch = require("node-fetch")
function discordRetryHandler(input, init) {
return new Promise((resolve, reject) => {
fetch(input, init)
.then(res => {
if (res.headers.get('content-type') === 'application/json') {
return res.json();
}
else {
return { retry_after: undefined };
}
})
.then(res => {
if (typeof res.retry_after === 'number') {
setTimeout(() => resolve(discordRetryHandler(input, init)), res.retry_after);
}
else {
resolve(res);
}
})
.catch(reject);
});
}
const requestOptions = {
method: 'DELETE',
headers: {
Authorization: `${client.user.bot ? "Bot " : ""}${client.token}`
}
};
await discordRetryHandler(`https://discord.com/api/v7/guilds/${guild?.id}/members/${member?.id}/roles/${role.id}`, requestOptions);