繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM