UNPKG

d-bot

Version:

A quirky Discord bot made for single, small, private servers

99 lines (93 loc) 4.15 kB
// Copy me to make a new addon var util = require(__base+'core/util.js'); var messages = require(__base+'core/messages.js'); var discord = require(__base+'core/discord.js'); var config = require(__base+'core/config.js'); var storage = require(__base+'core/storage.js'); const targetChannel = '447939162885193730'; const ignoreChannels = ['87590930709749760', '162513414420299776', '102240512634798080', '391035069638115328']; const chunkSize = 1000; const cutoff = 1 * 24 * 60 * 60 * 1000; const replayData = storage.json('replay', { lastMessageTime: 0, offset: null, sentIDs: [] }, '\t'); let archiveChunk = { data: null }; let loading = false; let offset = replayData.get('offset'); let nextMessageIndex = 0; async function loadChunk() { loading = true; archiveChunk.data = await messages.cursor(db => db.cfind( { time: { $gt: replayData.get('lastMessageTime') }, $not: { channel: { $in: ignoreChannels } } }) .sort({ time: 1 }).limit(chunkSize)); loading = false; if(!offset) { // First run replayData.set('offset', Date.now() - archiveChunk.data[0].time); } } // let beforeID = '448460249914015744'; // function deleteArchive() { // discord.bot.getMessages({ before: '448460249914015744', limit: 100, channelID: targetChannel }, (err, res) => { // if(err) return console.log('error getting messages', err); // console.log('got', res.length, 'messages to delete'); // res.reverse(); // discord.bot.deleteMessages({ channelID: targetChannel, messageIDs: res.map(msg => msg.id) }, (err, res) => { // if(err) console.log('Error deleting old messages!', res.map(msg => msg.id), err); // }); // beforeID = res[0].id; // if(res.length < 100) return console.log('done deleting messages'); // setTimeout(deleteArchive, 10000); // Wait 10s // }); // } module.exports = { tick: async function() { if(loading) return; if(!archiveChunk.data) { if(messages.db) loadChunk().then(() => {}); // deleteArchive(); return; } let nextMessage = archiveChunk.data[nextMessageIndex]; if(Date.now() > nextMessage.time + offset) { let messageText = nextMessage.content; if(nextMessage.attachments) messageText += '\n' + nextMessage.attachments.join('\n'); let username = discord.getUsernameFromID(nextMessage.user) || nextMessage.user; if(messageText !== '') discord.sendMessage(targetChannel, `**${username}**: ${messageText}`, { noMentions: true }, message => { replayData.trans('sentIDs', s => { s.push(message[0].id); return s; }); }); let messageDate = new Date(nextMessage.time); if(new Date(replayData.get('lastMessageTime')).getDate() !== messageDate.getDate()) { let topic = 'Current date: ' + messageDate.toLocaleDateString(); discord.bot.editChannel(targetChannel, { topic }, `New #replay date`) //.then(() => data.reply('Topic set!')) .catch(err => console.log('Error setting topic!', err)); } replayData.set('lastMessageTime', nextMessage.time); nextMessageIndex++; if(nextMessageIndex >= archiveChunk.data.length) { nextMessageIndex = 0; loadChunk().then(() => {}); } } let sentIDs = replayData.get('sentIDs'); if(sentIDs[99] && discord.getTimeFromID(sentIDs[99]).getTime() + cutoff < Date.now()) { discord.bot.deleteMessages(targetChannel, sentIDs.slice(0, 100), 'Pruning #replay') .catch(err => console.log('Error pruning #replay', sentIDs.slice(0, 100), err)); replayData.trans('sentIDs', s => { s.splice(0, 100); return s; }); } }, commands: {} };