add store messages command for archival purposes

merge-requests/15/head
Matthew 2020-07-13 00:01:24 -04:00
parent ec692e8e77
commit 5b31d5f88c
No known key found for this signature in database
GPG Key ID: 210AF32ADE3B5C4B
2 changed files with 53 additions and 0 deletions

View File

@ -19,6 +19,7 @@ export { default as page } from './page';
export { default as ping } from './ping'; export { default as ping } from './ping';
export { default as rank } from './rank'; export { default as rank } from './rank';
export { default as roleinfo } from './roleinfo'; export { default as roleinfo } from './roleinfo';
export { default as storemessages } from './storemessages';
export { default as unban } from './unban'; export { default as unban } from './unban';
export { default as unmute } from './unmute'; export { default as unmute } from './unmute';
export { default as whois } from './whois'; export { default as whois } from './whois';

View File

@ -0,0 +1,52 @@
import { randomBytes } from 'crypto';
import { Message, TextChannel } from 'eris';
import { Client, Command, LocalStorage } from '../class';
export default class StoreMessages extends Command {
constructor(client: Client) {
super(client);
this.name = 'storemessages';
this.description = 'Fetches 1000 messages from the specified channel and stores them in a HTML file.';
this.usage = `${this.client.config.prefix}storemessages <channel> [member ID]`;
this.aliases = ['sm'];
this.permissions = 3;
this.guildOnly = true;
this.enabled = true;
}
public async run(message: Message, args: string[]) {
try {
if (!args[0]) return this.client.commands.get('help').run(message, [this.name]);
const check = this.client.util.resolveGuildChannel(args[0], this.mainGuild, false);
if (!check || check.type !== 0) return this.error(message.channel, 'The channel you specified either doesn\'t exist or isn\'t a textable guild channel.');
const chan = <TextChannel> this.mainGuild.channels.get(check.id);
const loadingMessage = await this.loading(message.channel, 'Fetching messages...');
let messages = await chan.getMessages(10000);
if (args[1]) {
messages = messages.filter((m) => m.author.id === args[1]);
}
let html = `<h3>Library of Code sp-us</h3><strong>Channel:</strong> ${chan.name} (${chan.id})<br><strong>Generated by:</strong> ${message.author.username}#${message.author.discriminator}<br><strong>Generated at:</strong> ${new Date().toLocaleString('en-us')}<br><br>`;
for (const msg of messages) {
html += `(<i>${new Date(msg.timestamp).toLocaleString('en-us')}</i>) [<strong>${msg.author.username}#${msg.author.discriminator} - ${msg.author.id}</strong>]: ${msg.cleanContent}<br>`;
}
message.delete();
const identifier = randomBytes(10).toString('hex');
const comp = await LocalStorage.compress(html);
const file = new this.client.db.File({
name: `${chan.name}-${new Date().toLocaleString('en-us')}.html.gz`,
identifier,
mimeType: 'application/gzip',
data: comp,
downloaded: 0,
maxDownloads: 1,
});
await file.save();
loadingMessage.delete();
this.client.getDMChannel(message.author.id).then((c) => c.createMessage(`https://loc.sh/m/${identifier}.html.gz`)).catch(() => this.error(message.channel, 'Could not send a DM to you.'));
return this.success(message.channel, `Fetched messages for <#${chan.id}>. Check your DMs for link to access.`);
} catch (err) {
return this.client.util.handleError(err, message, this);
}
}
}