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