如何在没有重新启动的情况下更新bot状态中的'bot.users.size'
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在没有重新启动的情况下更新bot状态中的'bot.users.size'相关的知识,希望对你有一定的参考价值。
所以基本上我希望我的机器人具有每5秒更改一次的动态状态,并显示我的机器人当前正在帮助的用户数量。更改状态部分不是问题,问题是如果没有重新启动我的机器人,用户帮助计数不会改变,这不是理想的考虑它是托管和在许多服务器上,没有点只是为了用户计数重新启动准确。
我尝试过的是通过包含一个间隔计时器来更新userCount变量,以使其准确到它正在帮助的用户数量。似乎正在发生的事情是当用户加入服务器时,变量将相应地更新并显示与前一个用户数相关的+1。但是,当用户离开时,它不会从计数中减去一个,而是将它留在先前的计数中。我包括console.log(userCount)
只是为了让你更容易在控制台中每隔10秒查看一次数字,而不必等待僵尸程序的状态更改为正确的状态。
bot.on('ready', function() {
let userCount = bot.users.size
setInterval(() => {
userCount = bot.users.size
console.log(userCount)
}, 10000);
setInterval(async () => {
let statuslist = [
'blah',
"blah'",
'blah ' + ` ${userCount} Users`
];
const random = Math.floor(Math.random() * statuslist.length);
try {
await bot.user.setPresence({
game: {
name: `${statuslist[random]}`,
type: "Playing"
},
status: "online"
});
} catch (error) {
console.error(error);
}
}, 5000);
console.log("Logged in as " + bot.user.username);
});
我觉得这不是一个库问题,因为我对创建检查更改的代码的能力不是很有信心。理想情况下,它会根据用户加入/离开服务器所在的服务器显示准确的数字,以及公会从公会中邀请/删除僵尸程序。我不确定我是否应该使用这个事件,即使我去了,我也不知道怎么做。
但是,当用户离开时,它不会从计数中减去一个,而是将它留在先前的计数中。
这是client.users
的预期。它是客户端在某些时候缓存的所有用户的集合,因此不应删除任何用户。我想你要找的是......
bot.on('ready', () => {
setInterval(async () => {
let users = 0;
for (let g of bot.guilds.array()) users += (g.members.size - 1));
await bot.user.setActivity(`${users} user${users !== 1 ? 's' : ''}`, {type: 'WATCHING'})
.catch(err => console.error());
}, 15000);
});
请注意,如果用户在2个公会中,这将重新计算用户数。如果您想以精确计数,以内存为代价,您可以使用......
bot.on('ready', () => {
setInterval(() => {
let guilds = bot.guilds.array();
let users = [];
for (var i = 0; i < guilds.length; i++) {
let members = guilds[i].members.array();
for (var i = 0; i < members.length; i++) {
if (members[i].user.id !== bot.user.id && users.indexOf(members[i].user.id) === -1) users.push(members[i].user.id);
}
}
bot.user.setActivity(`${users.length} user${users.length !== 1 ? 's' : ''}`, {type: 'WATCHING'})
.catch(err => console.error());
});
});
你有2个setIntervals,结合它们!这应该可以解决你的问题。
你也可以使用guildMemberAdd
/ guildMemberRemove
事件。
bot.on('ready', function() {
setInterval(async () => {
const statuslist = [
'blah',
'blah_1',
` ${bot.users.size} Users`,
];
console.log(statuslist);
const random = Math.floor(Math.random() * statuslist.length);
try {
await bot.user.setPresence({
game: {
name: `${statuslist[random]}`,
type: 'Playing',
},
status: 'online',
});
}
catch (error) {
console.error(error);
}
}, 15000);
console.log('Logged in as ' + bot.user.username);
});
以上是关于如何在没有重新启动的情况下更新bot状态中的'bot.users.size'的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在不重新启动 JSF 中的服务器的情况下更新应用程序?
如何在没有root访问权限的情况下部署NodeJS应用程序,以便在服务器重新启动后保持在线状态?
有没有办法在不重新启动 Solr 服务器的情况下动态更新同义词文件?