我试图找出是否有可能使用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始终为空。
有没有办法找到最后一项活动?或者一种解决方法,比如一个返回所有用户消息的查询,我可以从中获取最新消息?
有效地,我想知道用户上次发布的日期/时间,以便我们可以监控非贡献帐户。
由于
答案 0 :(得分:0)
在考虑了文档之后,我也没有找到任何东西,因此我想到了手动搜索功能。
基本上,它将扫描每个通道,直到找到来自X用户的消息或该通道中消息的末尾。然后,它比较每个渠道中用户的最后一条消息,并打印最后一条消息。
如果用户很长一段时间没有写东西,则可能会很长。当然,您必须先尝试检查lastMessage
。
我可能会添加一个时间限制。因为如果您有数千条消息,该函数将永久运行。
如果找到的最后一条消息在允许的时间内没有被踢/执行任何操作,则可以停止该功能。
如果在获取的消息包中找到的第一条消息早于禁止限制,我就停止了搜索,但是,如果第一条消息不老,请记住,这意味着另一条消息,因此我们仍然需要检查它们(也可以通过检查包装中的最后一条消息来避免它们)。
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条最新消息,并将每个用户与其最近的消息(如果他写了一条消息)相关联,直到所有消息全部频道太旧,无法踢脚。然后为所有没有关联消息的用户执行操作。
答案 1 :(得分:-2)
我认为您需要的是Discord的内置功能之一,即:修剪。此功能将抓取非活动成员并允许您踢它们。幸运的是,discord.js有一个API调用,甚至可以通过将dry
参数设置为true
来让你先获得成员数而不实际踢它们。该功能还允许您指定用户必须处于非活动状态的天数。
查看文档:{{3}}
希望有所帮助!