Discord.js - Получение пользователей последней активности? - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь выяснить, возможно ли ретроспективно получить время / информацию о последних действиях пользователей, используя 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 всегда имеет значение null.

Есть ли способ найти последнее занятие? или обходной путь, например, запрос на возврат всех пользовательских сообщений, из которого я могу затем взять самое последнее?

По сути, я хочу знать, в какую дату / время последний раз публиковал пользователь, чтобы мы могли отслеживать не вносящие вклады аккаунты.

Спасибо

Ответы [ 2 ]

0 голосов
/ 24 июля 2019

Изучив документацию, я ничего не нашел и поэтому нашел функцию ручного поиска.

По сути, он будет сканировать все каналы до тех пор, пока не найдет сообщение от пользователя 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 последних сообщений от каждого канала и связывать каждого пользователя с его самыми последними сообщениями, если он написал одно, и делать это до тех пор, пока все сообщения во всех каналы слишком старые, чтобы избежать удара / что угодно. А затем сделайте что-нибудь для всех пользователей, у которых нет связанных сообщений.

0 голосов
/ 29 апреля 2018

Я думаю, что вам нужна одна из встроенных функций Discord, а именно: обрезка. Эта функция захватывает неактивных участников и позволяет вам пнуть их. К счастью, discord.js имеет вызов API и даже позволяет вам сначала получить количество членов, фактически не задавая их, установив для параметра dry значение true. Эта функция также позволит вам указать количество дней, в течение которых пользователь должен быть неактивным.

Посмотрите документы: https://discord.js.org/#/docs/main/stable/class/Guild?scrollTo=pruneMembers

Надеюсь, это поможет!

...