Discord.js - 获取用户上次活动?

时间:2018-04-29 14:38:42

标签: javascript node.js discord discord.js

我试图找出是否有可能使用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始终为空。

有没有办法找到最后一项活动?或者一种解决方法,比如一个返回所有用户消息的查询,我可以从中获取最新消息?

有效地,我想知道用户上次发布的日期/时间,以便我们可以监控非贡献帐户。

由于

2 个答案:

答案 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}}

希望有所帮助!