2021-12-23 22:36:13 -05:00
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 = 7 ;
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 = ` <strong><i>CLASSIFIED RESOURCE: CL-GEN/AD</i></strong><br><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 ( 20 ) . 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 : 20 ,
} ) ;
await file . save ( ) ;
loadingMessage . delete ( ) ;
this . client . getDMChannel ( message . author . id ) . then ( ( c ) = > c . createMessage ( ` https://cr.ins/m/ ${ identifier } .html.gz || https://cr.ins/m/ ${ identifier } .html?d=1 ` ) ) . 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 ) ;
}
}
}