[英]Discord.js - Getting users last activity?
我试图找出是否有可能使用discord.js
追溯获取用户上次活动的时间/信息
说我有类似的东西
client.guilds.find('id', 'SERVER ID').fetchMembers().then(members => {
const role = members.roles.find('name', 'Newbies')
role.members.forEach(member => {
console.log(member.user.lastMessage) // null
})
})
除非该成员已发布,否则由于客户端正在侦听,lastMessage 始终为空。
有没有办法找到最后一个活动? 或者一种解决方法,比如查询返回所有用户消息,然后我可以从中获取最新消息?
实际上,我想知道用户上次发布的日期/时间,以便我们可以监控非贡献帐户。
谢谢
在查看文档后我也没有找到任何东西,所以我想出了一个手动搜索功能。
基本上,它会扫描每个频道,直到找到来自 X 用户的消息,或者频道中的消息结束。 然后比较来自每个频道的用户的最后一条消息并打印最后一条。
如果用户很长时间没有写过,它可能会很长。 当然,您必须在尝试此lastMessage
之前检查lastMessage
。
我可能会添加一个时间限制。 因为如果您有数千条消息,该功能将永远运行。
如果找到的最后一条消息在可接受的时间内,您可以停止该功能,以免踢/做任何事情。
如果在 fetched messaged 包中找到的第一条消息比禁止限制更旧,我停止搜索,但是,如果第一条消息不旧,请记住它意味着另一个,所以我们仍然需要检查它们(它也可以通过检查包的最后一条消息来避免)。
async function fetchMessageUser(chan, id, res) {
let option = {};
if (typeof res !== 'undefined'){
option = {before: res.id};
}
return await chan.fetchMessages(option)
.then(async msgs => {
if (msgs.size === 0){
return {continue: false, found: false};
};
if ((Date.now() - (msgs.first().createdTimestamp)) > 86400000 ) { // 1 day
return {continue: false, found: false};
}
let msgByAuthor = msgs.find(msg => {
return msg.author.id === id;
});
if (msgByAuthor === null){
return {continue: true, id: msgs.last().id};
} else {
return {continue: false, found: true, timestamp: msgByAuthor.createdTimestamp};
}
})
.catch(err => console.log('ERR>>', err));
}
client.on('message', async (msg) => {
let timestamp = [];
for (let [id, chan] of msg.guild.channels){
if (chan.type !== 'text'){ continue; }
let id = '587692527826763788'; // id of the user, here a non verified account
let res;
do {
res = await fetchMessageUser(chan, id, res);
} while(res.continue);
if (res.found) {
timestamp.push(res.timestamp);
}
}
console.log(timestamp);
let first = timestamp.sort((a,b) => (b-a))[0];
console.log(new Date(first));
});
一个更好的变体是为一组用户运行它,检查来自每个频道的所有 50 条最后一条消息,如果他写了一条,则将每个用户与他最近的消息相关联,并这样做直到所有通道中的所有消息都太旧以避免踢/无论如何。 然后为所有没有关联消息的用户做一些事情。
我认为您需要的是 Discord 的内置功能之一,即:修剪。 此功能将抓取非活动成员并让您踢他们。 幸运的是,discord.js 有一个 API 调用,甚至可以通过将dry
参数设置为true
来让您首先获得成员数量而无需实际踢他们。 该功能还允许您指定用户必须处于非活动状态的天数。
看看文档: https : //discord.js.org/#/docs/main/stable/class/Guild? scrollTo =pruneMembers
希望有所帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.