2020-08-28 02:34:12 +00:00
const magick = require ( "../build/Release/image.node" ) ;
2021-01-10 01:50:29 +00:00
const { Worker } = require ( "worker_threads" ) ;
2020-09-01 22:10:19 +00:00
const fetch = require ( "node-fetch" ) ;
Class commands, improved sharding, and many other changes (#88)
* Load commands recursively
* Sort commands
* Missed a couple of spots
* missed even more spots apparently
* Ported commands in "fun" category to new class-based format, added babel eslint plugin
* Ported general commands, removed old/unneeded stuff, replaced moment with day, many more fixes I lost track of
* Missed a spot
* Removed unnecessary abort-controller package, add deprecation warning for mongo database
* Added imagereload, clarified premature end message
* Fixed docker-compose path issue, added total bot uptime to stats, more fixes for various parts
* Converted image commands into classes, fixed reload, ignore another WS event, cleaned up command handler and image runner
* Converted music/soundboard commands to class format
* Cleanup unnecessary logs
* awful tag command class port
* I literally somehow just learned that you can leave out the constructor in classes
* Pass client directly to commands/events, cleaned up command handler
* Migrated bot to eris-sharder, fixed some error handling stuff
* Remove unused modules
* Fixed type returning
* Switched back to Eris stable
* Some fixes and cleanup
* might wanna correct this
* Implement image command ratelimiting
* Added Bot token prefix, added imagestats, added running endpoint to API
2021-04-12 16:16:12 +00:00
const fs = require ( "fs" ) ;
2020-11-17 14:52:12 +00:00
const net = require ( "net" ) ;
2020-10-18 21:53:35 +00:00
const fileType = require ( "file-type" ) ;
2021-01-10 01:50:29 +00:00
const path = require ( "path" ) ;
2021-01-18 20:11:28 +00:00
const { EventEmitter } = require ( "events" ) ;
const logger = require ( "./logger.js" ) ;
2020-10-18 21:53:35 +00:00
2021-04-19 14:31:39 +00:00
const formats = [ "image/jpeg" , "image/png" , "image/webp" , "image/gif" , "video/mp4" , "video/webm" , "video/mov" ] ;
2020-08-28 02:34:12 +00:00
2021-05-18 03:37:40 +00:00
exports . jobs = { } ;
2021-01-18 20:11:28 +00:00
Class commands, improved sharding, and many other changes (#88)
* Load commands recursively
* Sort commands
* Missed a couple of spots
* missed even more spots apparently
* Ported commands in "fun" category to new class-based format, added babel eslint plugin
* Ported general commands, removed old/unneeded stuff, replaced moment with day, many more fixes I lost track of
* Missed a spot
* Removed unnecessary abort-controller package, add deprecation warning for mongo database
* Added imagereload, clarified premature end message
* Fixed docker-compose path issue, added total bot uptime to stats, more fixes for various parts
* Converted image commands into classes, fixed reload, ignore another WS event, cleaned up command handler and image runner
* Converted music/soundboard commands to class format
* Cleanup unnecessary logs
* awful tag command class port
* I literally somehow just learned that you can leave out the constructor in classes
* Pass client directly to commands/events, cleaned up command handler
* Migrated bot to eris-sharder, fixed some error handling stuff
* Remove unused modules
* Fixed type returning
* Switched back to Eris stable
* Some fixes and cleanup
* might wanna correct this
* Implement image command ratelimiting
* Added Bot token prefix, added imagestats, added running endpoint to API
2021-04-12 16:16:12 +00:00
exports . connections = [ ] ;
2021-01-18 20:11:28 +00:00
Class commands, improved sharding, and many other changes (#88)
* Load commands recursively
* Sort commands
* Missed a couple of spots
* missed even more spots apparently
* Ported commands in "fun" category to new class-based format, added babel eslint plugin
* Ported general commands, removed old/unneeded stuff, replaced moment with day, many more fixes I lost track of
* Missed a spot
* Removed unnecessary abort-controller package, add deprecation warning for mongo database
* Added imagereload, clarified premature end message
* Fixed docker-compose path issue, added total bot uptime to stats, more fixes for various parts
* Converted image commands into classes, fixed reload, ignore another WS event, cleaned up command handler and image runner
* Converted music/soundboard commands to class format
* Cleanup unnecessary logs
* awful tag command class port
* I literally somehow just learned that you can leave out the constructor in classes
* Pass client directly to commands/events, cleaned up command handler
* Migrated bot to eris-sharder, fixed some error handling stuff
* Remove unused modules
* Fixed type returning
* Switched back to Eris stable
* Some fixes and cleanup
* might wanna correct this
* Implement image command ratelimiting
* Added Bot token prefix, added imagestats, added running endpoint to API
2021-04-12 16:16:12 +00:00
exports . servers = JSON . parse ( fs . readFileSync ( "./servers.json" , { encoding : "utf8" } ) ) . image ;
2020-12-26 02:27:45 +00:00
const chooseServer = async ( ideal ) => {
if ( ideal . length === 0 ) throw "No available servers" ;
const sorted = ideal . sort ( ( a , b ) => {
2021-01-08 18:08:10 +00:00
return b . load - a . load ;
2020-12-26 02:27:45 +00:00
} ) ;
return sorted [ 0 ] ;
} ;
Class commands, improved sharding, and many other changes (#88)
* Load commands recursively
* Sort commands
* Missed a couple of spots
* missed even more spots apparently
* Ported commands in "fun" category to new class-based format, added babel eslint plugin
* Ported general commands, removed old/unneeded stuff, replaced moment with day, many more fixes I lost track of
* Missed a spot
* Removed unnecessary abort-controller package, add deprecation warning for mongo database
* Added imagereload, clarified premature end message
* Fixed docker-compose path issue, added total bot uptime to stats, more fixes for various parts
* Converted image commands into classes, fixed reload, ignore another WS event, cleaned up command handler and image runner
* Converted music/soundboard commands to class format
* Cleanup unnecessary logs
* awful tag command class port
* I literally somehow just learned that you can leave out the constructor in classes
* Pass client directly to commands/events, cleaned up command handler
* Migrated bot to eris-sharder, fixed some error handling stuff
* Remove unused modules
* Fixed type returning
* Switched back to Eris stable
* Some fixes and cleanup
* might wanna correct this
* Implement image command ratelimiting
* Added Bot token prefix, added imagestats, added running endpoint to API
2021-04-12 16:16:12 +00:00
exports . repopulate = async ( ) => {
const data = await fs . promises . readFile ( "./servers.json" , { encoding : "utf8" } ) ;
this . servers = JSON . parse ( data ) . image ;
return ;
} ;
exports . getStatus = ( ) => {
return new Promise ( ( resolve , reject ) => {
let serversLeft = this . connections . length ;
const statuses = [ ] ;
const timeout = setTimeout ( ( ) => {
resolve ( statuses ) ;
} , 5000 ) ;
for ( const connection of this . connections ) {
2021-05-18 00:08:06 +00:00
if ( ! connection . remoteAddress ) {
serversLeft -- ;
continue ;
}
Class commands, improved sharding, and many other changes (#88)
* Load commands recursively
* Sort commands
* Missed a couple of spots
* missed even more spots apparently
* Ported commands in "fun" category to new class-based format, added babel eslint plugin
* Ported general commands, removed old/unneeded stuff, replaced moment with day, many more fixes I lost track of
* Missed a spot
* Removed unnecessary abort-controller package, add deprecation warning for mongo database
* Added imagereload, clarified premature end message
* Fixed docker-compose path issue, added total bot uptime to stats, more fixes for various parts
* Converted image commands into classes, fixed reload, ignore another WS event, cleaned up command handler and image runner
* Converted music/soundboard commands to class format
* Cleanup unnecessary logs
* awful tag command class port
* I literally somehow just learned that you can leave out the constructor in classes
* Pass client directly to commands/events, cleaned up command handler
* Migrated bot to eris-sharder, fixed some error handling stuff
* Remove unused modules
* Fixed type returning
* Switched back to Eris stable
* Some fixes and cleanup
* might wanna correct this
* Implement image command ratelimiting
* Added Bot token prefix, added imagestats, added running endpoint to API
2021-04-12 16:16:12 +00:00
fetch ( ` http:// ${ connection . remoteAddress } :8081/running ` ) . then ( statusRequest => statusRequest . json ( ) ) . then ( ( status ) => {
serversLeft -- ;
statuses . push ( status ) ;
if ( ! serversLeft ) {
clearTimeout ( timeout ) ;
resolve ( statuses ) ;
}
return ;
2021-05-18 00:08:06 +00:00
} ) . catch ( e => {
if ( e . code === "ECONNREFUSED" ) {
serversLeft -- ;
return ;
}
reject ( e ) ;
} ) ;
}
if ( ! serversLeft ) {
clearTimeout ( timeout ) ;
resolve ( statuses ) ;
Class commands, improved sharding, and many other changes (#88)
* Load commands recursively
* Sort commands
* Missed a couple of spots
* missed even more spots apparently
* Ported commands in "fun" category to new class-based format, added babel eslint plugin
* Ported general commands, removed old/unneeded stuff, replaced moment with day, many more fixes I lost track of
* Missed a spot
* Removed unnecessary abort-controller package, add deprecation warning for mongo database
* Added imagereload, clarified premature end message
* Fixed docker-compose path issue, added total bot uptime to stats, more fixes for various parts
* Converted image commands into classes, fixed reload, ignore another WS event, cleaned up command handler and image runner
* Converted music/soundboard commands to class format
* Cleanup unnecessary logs
* awful tag command class port
* I literally somehow just learned that you can leave out the constructor in classes
* Pass client directly to commands/events, cleaned up command handler
* Migrated bot to eris-sharder, fixed some error handling stuff
* Remove unused modules
* Fixed type returning
* Switched back to Eris stable
* Some fixes and cleanup
* might wanna correct this
* Implement image command ratelimiting
* Added Bot token prefix, added imagestats, added running endpoint to API
2021-04-12 16:16:12 +00:00
}
} ) ;
} ;
2021-01-18 20:11:28 +00:00
exports . connect = ( server ) => {
2020-12-26 02:27:45 +00:00
return new Promise ( ( resolve , reject ) => {
2021-01-18 20:11:28 +00:00
const connection = net . createConnection ( 8080 , server ) ;
2020-12-26 02:27:45 +00:00
const timeout = setTimeout ( ( ) => {
Class commands, improved sharding, and many other changes (#88)
* Load commands recursively
* Sort commands
* Missed a couple of spots
* missed even more spots apparently
* Ported commands in "fun" category to new class-based format, added babel eslint plugin
* Ported general commands, removed old/unneeded stuff, replaced moment with day, many more fixes I lost track of
* Missed a spot
* Removed unnecessary abort-controller package, add deprecation warning for mongo database
* Added imagereload, clarified premature end message
* Fixed docker-compose path issue, added total bot uptime to stats, more fixes for various parts
* Converted image commands into classes, fixed reload, ignore another WS event, cleaned up command handler and image runner
* Converted music/soundboard commands to class format
* Cleanup unnecessary logs
* awful tag command class port
* I literally somehow just learned that you can leave out the constructor in classes
* Pass client directly to commands/events, cleaned up command handler
* Migrated bot to eris-sharder, fixed some error handling stuff
* Remove unused modules
* Fixed type returning
* Switched back to Eris stable
* Some fixes and cleanup
* might wanna correct this
* Implement image command ratelimiting
* Added Bot token prefix, added imagestats, added running endpoint to API
2021-04-12 16:16:12 +00:00
const connectionIndex = this . connections . indexOf ( connection ) ;
if ( connectionIndex < 0 ) delete this . connections [ connectionIndex ] ;
2021-01-18 20:11:28 +00:00
reject ( ` Failed to connect to ${ server } ` ) ;
2020-12-26 02:27:45 +00:00
} , 5000 ) ;
2021-01-18 20:11:28 +00:00
connection . once ( "connect" , ( ) => {
clearTimeout ( timeout ) ;
} ) ;
connection . on ( "data" , async ( msg ) => {
2020-12-26 02:27:45 +00:00
const opcode = msg . readUint8 ( 0 ) ;
2021-01-18 20:11:28 +00:00
const req = msg . slice ( 37 , msg . length ) ;
const uuid = msg . slice ( 1 , 37 ) . toString ( ) ;
if ( opcode === 0x00 ) { // Job queued
2021-05-18 03:37:40 +00:00
if ( this . jobs [ req ] ) {
this . jobs [ req ] . event . emit ( "uuid" , uuid ) ;
2021-01-18 20:11:28 +00:00
}
} else if ( opcode === 0x01 ) { // Job completed successfully
2021-05-22 15:10:42 +00:00
// the image API sends all job responses over the same socket; make sure this is ours
2021-05-18 03:37:40 +00:00
if ( this . jobs [ uuid ] ) {
2021-01-18 20:11:28 +00:00
const imageReq = await fetch ( ` http:// ${ connection . remoteAddress } :8081/image?id= ${ uuid } ` ) ;
const image = await imageReq . buffer ( ) ;
// The response data is given as the file extension/ImageMagick type of the image (e.g. "png"), followed
// by a newline, followed by the image data.
2021-05-18 03:37:40 +00:00
this . jobs [ uuid ] . event . emit ( "image" , image , imageReq . headers . get ( "ext" ) ) ;
2021-01-18 20:11:28 +00:00
}
} else if ( opcode === 0x02 ) { // Job errored
2021-05-18 03:37:40 +00:00
if ( this . jobs [ uuid ] ) {
this . jobs [ uuid ] . event . emit ( "error" , new Error ( req ) ) ;
2021-01-18 20:11:28 +00:00
}
}
} ) ;
connection . on ( "error" , ( e ) => {
2021-05-17 19:23:29 +00:00
logger . error ( e . toString ( ) ) ;
2021-05-06 21:40:05 +00:00
} ) ;
2021-05-23 22:22:31 +00:00
connection . once ( "end" , ( ) => {
2021-05-18 03:37:40 +00:00
for ( const uuid of Object . keys ( this . jobs ) ) {
if ( this . jobs [ uuid ] . addr === connection . remoteAddress ) this . jobs [ uuid ] . event . emit ( "error" , "Job ended prematurely due to a closed connection; please run your image job again" ) ;
2021-05-06 21:40:05 +00:00
}
2021-01-18 20:11:28 +00:00
} ) ;
Class commands, improved sharding, and many other changes (#88)
* Load commands recursively
* Sort commands
* Missed a couple of spots
* missed even more spots apparently
* Ported commands in "fun" category to new class-based format, added babel eslint plugin
* Ported general commands, removed old/unneeded stuff, replaced moment with day, many more fixes I lost track of
* Missed a spot
* Removed unnecessary abort-controller package, add deprecation warning for mongo database
* Added imagereload, clarified premature end message
* Fixed docker-compose path issue, added total bot uptime to stats, more fixes for various parts
* Converted image commands into classes, fixed reload, ignore another WS event, cleaned up command handler and image runner
* Converted music/soundboard commands to class format
* Cleanup unnecessary logs
* awful tag command class port
* I literally somehow just learned that you can leave out the constructor in classes
* Pass client directly to commands/events, cleaned up command handler
* Migrated bot to eris-sharder, fixed some error handling stuff
* Remove unused modules
* Fixed type returning
* Switched back to Eris stable
* Some fixes and cleanup
* might wanna correct this
* Implement image command ratelimiting
* Added Bot token prefix, added imagestats, added running endpoint to API
2021-04-12 16:16:12 +00:00
this . connections . push ( connection ) ;
2021-01-18 20:11:28 +00:00
resolve ( ) ;
} ) ;
} ;
Class commands, improved sharding, and many other changes (#88)
* Load commands recursively
* Sort commands
* Missed a couple of spots
* missed even more spots apparently
* Ported commands in "fun" category to new class-based format, added babel eslint plugin
* Ported general commands, removed old/unneeded stuff, replaced moment with day, many more fixes I lost track of
* Missed a spot
* Removed unnecessary abort-controller package, add deprecation warning for mongo database
* Added imagereload, clarified premature end message
* Fixed docker-compose path issue, added total bot uptime to stats, more fixes for various parts
* Converted image commands into classes, fixed reload, ignore another WS event, cleaned up command handler and image runner
* Converted music/soundboard commands to class format
* Cleanup unnecessary logs
* awful tag command class port
* I literally somehow just learned that you can leave out the constructor in classes
* Pass client directly to commands/events, cleaned up command handler
* Migrated bot to eris-sharder, fixed some error handling stuff
* Remove unused modules
* Fixed type returning
* Switched back to Eris stable
* Some fixes and cleanup
* might wanna correct this
* Implement image command ratelimiting
* Added Bot token prefix, added imagestats, added running endpoint to API
2021-04-12 16:16:12 +00:00
exports . disconnect = async ( ) => {
for ( const connection of this . connections ) {
connection . destroy ( ) ;
}
2021-05-18 03:37:40 +00:00
for ( const uuid of Object . keys ( this . jobs ) ) {
this . jobs [ uuid ] . event . emit ( "error" , "Job ended prematurely (not really an error; just run your image job again)" ) ;
delete this . jobs [ uuid ] ;
Class commands, improved sharding, and many other changes (#88)
* Load commands recursively
* Sort commands
* Missed a couple of spots
* missed even more spots apparently
* Ported commands in "fun" category to new class-based format, added babel eslint plugin
* Ported general commands, removed old/unneeded stuff, replaced moment with day, many more fixes I lost track of
* Missed a spot
* Removed unnecessary abort-controller package, add deprecation warning for mongo database
* Added imagereload, clarified premature end message
* Fixed docker-compose path issue, added total bot uptime to stats, more fixes for various parts
* Converted image commands into classes, fixed reload, ignore another WS event, cleaned up command handler and image runner
* Converted music/soundboard commands to class format
* Cleanup unnecessary logs
* awful tag command class port
* I literally somehow just learned that you can leave out the constructor in classes
* Pass client directly to commands/events, cleaned up command handler
* Migrated bot to eris-sharder, fixed some error handling stuff
* Remove unused modules
* Fixed type returning
* Switched back to Eris stable
* Some fixes and cleanup
* might wanna correct this
* Implement image command ratelimiting
* Added Bot token prefix, added imagestats, added running endpoint to API
2021-04-12 16:16:12 +00:00
}
this . connections = [ ] ;
return ;
} ;
2021-01-18 20:11:28 +00:00
const getIdeal = ( ) => {
2021-03-16 03:29:48 +00:00
return new Promise ( ( resolve , reject ) => {
Class commands, improved sharding, and many other changes (#88)
* Load commands recursively
* Sort commands
* Missed a couple of spots
* missed even more spots apparently
* Ported commands in "fun" category to new class-based format, added babel eslint plugin
* Ported general commands, removed old/unneeded stuff, replaced moment with day, many more fixes I lost track of
* Missed a spot
* Removed unnecessary abort-controller package, add deprecation warning for mongo database
* Added imagereload, clarified premature end message
* Fixed docker-compose path issue, added total bot uptime to stats, more fixes for various parts
* Converted image commands into classes, fixed reload, ignore another WS event, cleaned up command handler and image runner
* Converted music/soundboard commands to class format
* Cleanup unnecessary logs
* awful tag command class port
* I literally somehow just learned that you can leave out the constructor in classes
* Pass client directly to commands/events, cleaned up command handler
* Migrated bot to eris-sharder, fixed some error handling stuff
* Remove unused modules
* Fixed type returning
* Switched back to Eris stable
* Some fixes and cleanup
* might wanna correct this
* Implement image command ratelimiting
* Added Bot token prefix, added imagestats, added running endpoint to API
2021-04-12 16:16:12 +00:00
let serversLeft = this . connections . length ;
2021-01-18 20:11:28 +00:00
const idealServers = [ ] ;
const timeout = setTimeout ( async ( ) => {
try {
const server = await chooseServer ( idealServers ) ;
Class commands, improved sharding, and many other changes (#88)
* Load commands recursively
* Sort commands
* Missed a couple of spots
* missed even more spots apparently
* Ported commands in "fun" category to new class-based format, added babel eslint plugin
* Ported general commands, removed old/unneeded stuff, replaced moment with day, many more fixes I lost track of
* Missed a spot
* Removed unnecessary abort-controller package, add deprecation warning for mongo database
* Added imagereload, clarified premature end message
* Fixed docker-compose path issue, added total bot uptime to stats, more fixes for various parts
* Converted image commands into classes, fixed reload, ignore another WS event, cleaned up command handler and image runner
* Converted music/soundboard commands to class format
* Cleanup unnecessary logs
* awful tag command class port
* I literally somehow just learned that you can leave out the constructor in classes
* Pass client directly to commands/events, cleaned up command handler
* Migrated bot to eris-sharder, fixed some error handling stuff
* Remove unused modules
* Fixed type returning
* Switched back to Eris stable
* Some fixes and cleanup
* might wanna correct this
* Implement image command ratelimiting
* Added Bot token prefix, added imagestats, added running endpoint to API
2021-04-12 16:16:12 +00:00
resolve ( this . connections . find ( val => val . remoteAddress === server . addr ) ) ;
2021-01-18 20:11:28 +00:00
} catch ( e ) {
reject ( e ) ;
}
} , 5000 ) ;
Class commands, improved sharding, and many other changes (#88)
* Load commands recursively
* Sort commands
* Missed a couple of spots
* missed even more spots apparently
* Ported commands in "fun" category to new class-based format, added babel eslint plugin
* Ported general commands, removed old/unneeded stuff, replaced moment with day, many more fixes I lost track of
* Missed a spot
* Removed unnecessary abort-controller package, add deprecation warning for mongo database
* Added imagereload, clarified premature end message
* Fixed docker-compose path issue, added total bot uptime to stats, more fixes for various parts
* Converted image commands into classes, fixed reload, ignore another WS event, cleaned up command handler and image runner
* Converted music/soundboard commands to class format
* Cleanup unnecessary logs
* awful tag command class port
* I literally somehow just learned that you can leave out the constructor in classes
* Pass client directly to commands/events, cleaned up command handler
* Migrated bot to eris-sharder, fixed some error handling stuff
* Remove unused modules
* Fixed type returning
* Switched back to Eris stable
* Some fixes and cleanup
* might wanna correct this
* Implement image command ratelimiting
* Added Bot token prefix, added imagestats, added running endpoint to API
2021-04-12 16:16:12 +00:00
for ( const connection of this . connections ) {
2021-05-18 00:08:06 +00:00
if ( ! connection . remoteAddress ) {
2021-05-17 19:23:29 +00:00
serversLeft -- ;
continue ;
}
fetch ( ` http:// ${ connection . remoteAddress } :8081/status ` ) . then ( statusRequest => statusRequest . text ( ) ) . then ( ( status ) => {
2020-12-26 02:27:45 +00:00
serversLeft -- ;
idealServers . push ( {
2021-01-18 20:11:28 +00:00
addr : connection . remoteAddress ,
load : parseInt ( status )
2020-12-26 02:27:45 +00:00
} ) ;
2021-05-17 19:23:29 +00:00
return ;
} ) . then ( async ( ) => {
2020-12-26 02:27:45 +00:00
if ( ! serversLeft ) {
clearTimeout ( timeout ) ;
2021-01-18 20:11:28 +00:00
const server = await chooseServer ( idealServers ) ;
Class commands, improved sharding, and many other changes (#88)
* Load commands recursively
* Sort commands
* Missed a couple of spots
* missed even more spots apparently
* Ported commands in "fun" category to new class-based format, added babel eslint plugin
* Ported general commands, removed old/unneeded stuff, replaced moment with day, many more fixes I lost track of
* Missed a spot
* Removed unnecessary abort-controller package, add deprecation warning for mongo database
* Added imagereload, clarified premature end message
* Fixed docker-compose path issue, added total bot uptime to stats, more fixes for various parts
* Converted image commands into classes, fixed reload, ignore another WS event, cleaned up command handler and image runner
* Converted music/soundboard commands to class format
* Cleanup unnecessary logs
* awful tag command class port
* I literally somehow just learned that you can leave out the constructor in classes
* Pass client directly to commands/events, cleaned up command handler
* Migrated bot to eris-sharder, fixed some error handling stuff
* Remove unused modules
* Fixed type returning
* Switched back to Eris stable
* Some fixes and cleanup
* might wanna correct this
* Implement image command ratelimiting
* Added Bot token prefix, added imagestats, added running endpoint to API
2021-04-12 16:16:12 +00:00
resolve ( this . connections . find ( val => val . remoteAddress === server . addr ) ) ;
2020-12-26 02:27:45 +00:00
}
2021-05-18 00:08:06 +00:00
} ) . catch ( e => {
if ( e . code === "ECONNREFUSED" ) {
serversLeft -- ;
return ;
}
reject ( e ) ;
} ) ;
2021-05-17 19:23:29 +00:00
}
if ( ! serversLeft ) {
clearTimeout ( timeout ) ;
chooseServer ( idealServers ) . then ( server => {
resolve ( this . connections . find ( val => val . remoteAddress === server . addr ) ) ;
2021-03-16 03:29:48 +00:00
} ) . catch ( e => reject ( e ) ) ;
2021-01-18 20:11:28 +00:00
}
} ) ;
} ;
const start = ( object , num ) => {
2021-03-16 03:29:48 +00:00
return getIdeal ( ) . then ( async ( currentServer ) => {
const data = Buffer . concat ( [ Buffer . from ( [ 0x01 /* queue job */ ] ) , Buffer . from ( num . length . toString ( ) ) , Buffer . from ( num ) , Buffer . from ( JSON . stringify ( object ) ) ] ) ;
return new Promise ( ( resolve , reject ) => {
2021-05-18 00:08:06 +00:00
if ( currentServer . destroyed ) {
logger . log ( ` Lost connection to ${ currentServer . remoteAddress } , attempting to reconnect... ` ) ;
currentServer . connect ( 8080 , currentServer . remoteAddress , ( ) => {
const res = start ( object , num ) ;
reject ( res ) ; // this is done to differentiate the result from a step
} ) ;
}
2021-01-18 20:11:28 +00:00
currentServer . write ( data , ( err ) => {
if ( err ) {
if ( err . code === "EPIPE" ) {
logger . log ( ` Lost connection to ${ currentServer . remoteAddress } , attempting to reconnect... ` ) ;
2021-03-16 03:29:48 +00:00
currentServer . connect ( 8080 , currentServer . remoteAddress , ( ) => {
2021-01-18 20:11:28 +00:00
const res = start ( object , num ) ;
2021-03-16 03:29:48 +00:00
reject ( res ) ; // this is done to differentiate the result from a step
2021-01-18 20:11:28 +00:00
} ) ;
} else {
reject ( err ) ;
}
2021-03-16 03:29:48 +00:00
} else {
2021-05-06 21:58:35 +00:00
resolve ( currentServer . remoteAddress ) ;
2021-01-18 20:11:28 +00:00
}
} ) ;
2021-03-16 03:29:48 +00:00
} ) ;
2021-05-06 21:58:35 +00:00
} ) . then ( ( addr ) => {
2021-03-16 03:29:48 +00:00
const event = new EventEmitter ( ) ;
return new Promise ( ( resolve ) => {
2021-05-06 21:58:35 +00:00
event . once ( "uuid" , ( uuid ) => resolve ( { event , uuid , addr } ) ) ;
2021-05-18 03:37:40 +00:00
this . jobs [ num ] = { event , addr } ;
2021-03-16 03:29:48 +00:00
} ) ;
} , ( result ) => {
2021-03-18 14:29:03 +00:00
throw result ;
2021-03-16 03:29:48 +00:00
} ) . then ( data => {
2021-05-18 03:37:40 +00:00
delete this . jobs [ num ] ;
this . jobs [ data . uuid ] = { event : data . event , addr : data . addr } ;
2021-03-16 03:29:48 +00:00
return { uuid : data . uuid , event : data . event } ;
2020-12-26 02:27:45 +00:00
} ) ;
} ;
2020-11-26 17:48:19 +00:00
exports . check = ( cmd ) => {
return magick [ cmd ] ? true : false ;
} ;
exports . getType = async ( image ) => {
if ( ! image . startsWith ( "http" ) ) {
const imageType = await fileType . fromFile ( image ) ;
if ( imageType && formats . includes ( imageType . mime ) ) {
return imageType . mime ;
}
return undefined ;
}
let type ;
Class commands, improved sharding, and many other changes (#88)
* Load commands recursively
* Sort commands
* Missed a couple of spots
* missed even more spots apparently
* Ported commands in "fun" category to new class-based format, added babel eslint plugin
* Ported general commands, removed old/unneeded stuff, replaced moment with day, many more fixes I lost track of
* Missed a spot
* Removed unnecessary abort-controller package, add deprecation warning for mongo database
* Added imagereload, clarified premature end message
* Fixed docker-compose path issue, added total bot uptime to stats, more fixes for various parts
* Converted image commands into classes, fixed reload, ignore another WS event, cleaned up command handler and image runner
* Converted music/soundboard commands to class format
* Cleanup unnecessary logs
* awful tag command class port
* I literally somehow just learned that you can leave out the constructor in classes
* Pass client directly to commands/events, cleaned up command handler
* Migrated bot to eris-sharder, fixed some error handling stuff
* Remove unused modules
* Fixed type returning
* Switched back to Eris stable
* Some fixes and cleanup
* might wanna correct this
* Implement image command ratelimiting
* Added Bot token prefix, added imagestats, added running endpoint to API
2021-04-12 16:16:12 +00:00
const controller = new AbortController ( ) ; // eslint-disable-line no-undef
2020-11-26 17:48:19 +00:00
const timeout = setTimeout ( ( ) => {
controller . abort ( ) ;
} , 25000 ) ;
try {
2021-05-22 15:10:42 +00:00
const imageRequest = await fetch ( image , {
signal : controller . signal , headers : {
"Range" : "bytes=0-1023"
}
} ) ;
2021-01-04 16:29:18 +00:00
clearTimeout ( timeout ) ;
2021-05-15 03:02:50 +00:00
const size = imageRequest . headers . has ( "Content-Range" ) ? imageRequest . headers . get ( "Content-Range" ) . split ( "/" ) [ 1 ] : imageRequest . headers . get ( "Content-Length" ) ;
if ( parseInt ( size ) > 20971520 ) {
2021-05-07 03:01:30 +00:00
type = "large" ;
return type ;
}
2020-11-26 17:48:19 +00:00
const imageBuffer = await imageRequest . buffer ( ) ;
const imageType = await fileType . fromBuffer ( imageBuffer ) ;
if ( imageType && formats . includes ( imageType . mime ) ) {
type = imageType . mime ;
}
} catch ( error ) {
if ( error . name === "AbortError" ) {
throw Error ( "Timed out" ) ;
} else {
throw error ;
}
} finally {
clearTimeout ( timeout ) ;
}
return type ;
} ;
2021-01-10 01:50:29 +00:00
exports . run = object => {
2021-03-16 03:29:48 +00:00
return new Promise ( ( resolve , reject ) => {
2021-01-10 01:50:29 +00:00
if ( process . env . API === "true" ) {
2021-03-16 03:29:48 +00:00
// Connect to best image server
const num = Math . floor ( Math . random ( ) * 100000 ) . toString ( ) . slice ( 0 , 5 ) ;
const timeout = setTimeout ( ( ) => {
2021-05-18 03:37:40 +00:00
if ( this . jobs [ num ] ) delete this . jobs [ num ] ;
Class commands, improved sharding, and many other changes (#88)
* Load commands recursively
* Sort commands
* Missed a couple of spots
* missed even more spots apparently
* Ported commands in "fun" category to new class-based format, added babel eslint plugin
* Ported general commands, removed old/unneeded stuff, replaced moment with day, many more fixes I lost track of
* Missed a spot
* Removed unnecessary abort-controller package, add deprecation warning for mongo database
* Added imagereload, clarified premature end message
* Fixed docker-compose path issue, added total bot uptime to stats, more fixes for various parts
* Converted image commands into classes, fixed reload, ignore another WS event, cleaned up command handler and image runner
* Converted music/soundboard commands to class format
* Cleanup unnecessary logs
* awful tag command class port
* I literally somehow just learned that you can leave out the constructor in classes
* Pass client directly to commands/events, cleaned up command handler
* Migrated bot to eris-sharder, fixed some error handling stuff
* Remove unused modules
* Fixed type returning
* Switched back to Eris stable
* Some fixes and cleanup
* might wanna correct this
* Implement image command ratelimiting
* Added Bot token prefix, added imagestats, added running endpoint to API
2021-04-12 16:16:12 +00:00
reject ( "the image request timed out after 25 seconds. Try uploading your image elsewhere." ) ;
2021-03-16 03:29:48 +00:00
} , 25000 ) ;
start ( object , num ) . catch ( err => { // incredibly hacky code incoming
Class commands, improved sharding, and many other changes (#88)
* Load commands recursively
* Sort commands
* Missed a couple of spots
* missed even more spots apparently
* Ported commands in "fun" category to new class-based format, added babel eslint plugin
* Ported general commands, removed old/unneeded stuff, replaced moment with day, many more fixes I lost track of
* Missed a spot
* Removed unnecessary abort-controller package, add deprecation warning for mongo database
* Added imagereload, clarified premature end message
* Fixed docker-compose path issue, added total bot uptime to stats, more fixes for various parts
* Converted image commands into classes, fixed reload, ignore another WS event, cleaned up command handler and image runner
* Converted music/soundboard commands to class format
* Cleanup unnecessary logs
* awful tag command class port
* I literally somehow just learned that you can leave out the constructor in classes
* Pass client directly to commands/events, cleaned up command handler
* Migrated bot to eris-sharder, fixed some error handling stuff
* Remove unused modules
* Fixed type returning
* Switched back to Eris stable
* Some fixes and cleanup
* might wanna correct this
* Implement image command ratelimiting
* Added Bot token prefix, added imagestats, added running endpoint to API
2021-04-12 16:16:12 +00:00
clearTimeout ( timeout ) ;
2021-03-16 03:29:48 +00:00
if ( err instanceof Error ) return reject ( err ) ;
return err ;
} ) . then ( ( data ) => {
2021-01-18 20:11:28 +00:00
clearTimeout ( timeout ) ;
Class commands, improved sharding, and many other changes (#88)
* Load commands recursively
* Sort commands
* Missed a couple of spots
* missed even more spots apparently
* Ported commands in "fun" category to new class-based format, added babel eslint plugin
* Ported general commands, removed old/unneeded stuff, replaced moment with day, many more fixes I lost track of
* Missed a spot
* Removed unnecessary abort-controller package, add deprecation warning for mongo database
* Added imagereload, clarified premature end message
* Fixed docker-compose path issue, added total bot uptime to stats, more fixes for various parts
* Converted image commands into classes, fixed reload, ignore another WS event, cleaned up command handler and image runner
* Converted music/soundboard commands to class format
* Cleanup unnecessary logs
* awful tag command class port
* I literally somehow just learned that you can leave out the constructor in classes
* Pass client directly to commands/events, cleaned up command handler
* Migrated bot to eris-sharder, fixed some error handling stuff
* Remove unused modules
* Fixed type returning
* Switched back to Eris stable
* Some fixes and cleanup
* might wanna correct this
* Implement image command ratelimiting
* Added Bot token prefix, added imagestats, added running endpoint to API
2021-04-12 16:16:12 +00:00
if ( ! data . event ) reject ( "Not connected to image server" ) ;
2021-03-16 03:29:48 +00:00
data . event . once ( "image" , ( image , type ) => {
2021-05-18 03:37:40 +00:00
delete this . jobs [ data . uuid ] ;
2021-01-18 20:11:28 +00:00
const payload = {
2021-05-22 15:10:42 +00:00
// Take just the image data
2021-01-18 20:11:28 +00:00
buffer : image ,
type : type
} ;
resolve ( payload ) ;
} ) ;
2021-03-16 03:29:48 +00:00
data . event . once ( "error" , ( err ) => {
2021-01-10 01:50:29 +00:00
reject ( err ) ;
2021-01-18 20:11:28 +00:00
} ) ;
2021-03-18 14:29:03 +00:00
return ;
2021-03-16 03:29:48 +00:00
} ) . catch ( err => reject ( err ) ) ;
2021-01-10 01:50:29 +00:00
} else {
// Called from command (not using image API)
const worker = new Worker ( path . join ( _ _dirname , "image-runner.js" ) , {
2020-11-26 17:48:19 +00:00
workerData : object
} ) ;
2021-05-06 21:40:05 +00:00
worker . once ( "message" , ( data ) => {
2020-11-26 17:48:19 +00:00
resolve ( {
buffer : Buffer . from ( [ ... data . buffer ] ) ,
2021-01-10 01:50:29 +00:00
type : data . fileExtension
2020-11-26 17:48:19 +00:00
} ) ;
} ) ;
2021-05-06 21:40:05 +00:00
worker . once ( "error" , reject ) ;
2020-11-17 14:52:12 +00:00
}
} ) ;
} ;