main.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. require('dotenv').config();
  2. const {ShardingManager} = require('discord.js');
  3. const manager = new ShardingManager( './bot.js', {
  4. execArgv: ['--icu-data-dir=node_modules/full-icu'],
  5. shardArgs: ( process.argv[2] === 'debug' ? ['debug'] : [] ),
  6. token: process.env.token
  7. } );
  8. var diedShards = 0;
  9. manager.on( 'shardCreate', shard => {
  10. console.log( `\n- Shard[${shard.id}]: Launched` );
  11. shard.on( 'spawn', message => {
  12. console.log( `- Shard[${shard.id}]: Spawned` );
  13. shard.send( {
  14. shard: {
  15. id: shard.id
  16. }
  17. } );
  18. } );
  19. shard.on( 'message', message => {
  20. if ( message === 'SIGKILL' ) {
  21. console.log( '\n- Killing all shards!\n\n' );
  22. manager.shards.forEach( shard => shard.kill() );
  23. }
  24. } );
  25. shard.on( 'death', message => {
  26. if ( manager.respawn === false ) diedShards++;
  27. if ( message.exitCode !== 0 ) {
  28. if ( !shard.ready ) {
  29. manager.respawn = false;
  30. console.log( `\n\n- Shard[${shard.id}]: Died due to fatal error, disable respawn!\n\n` );
  31. }
  32. else console.log( `\n\n- Shard[${shard.id}]: Died due to fatal error!\n\n` );
  33. }
  34. } );
  35. } );
  36. manager.spawn().catch( error => {
  37. console.error( '- ' + error.name + ': ' + error.message );
  38. manager.respawnAll();
  39. } );
  40. async function graceful(signal) {
  41. console.log( '- ' + signal + ': Disabling respawn...' );
  42. manager.respawn = false;
  43. }
  44. process.once( 'SIGINT', graceful );
  45. process.once( 'SIGTERM', graceful );
  46. process.on( 'exit', code => {
  47. if ( diedShards >= manager.totalShards ) process.exit(1);
  48. } );