main.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  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 ( message.exitCode === 1 ) {
  27. if ( manager.respawn === true ) {
  28. console.log( `\n\n- Shard[${shard.id}]: Died due to fatal error, disable respawn!\n\n` );
  29. manager.respawn = false;
  30. }
  31. else diedShards++;
  32. }
  33. } );
  34. } );
  35. manager.spawn().catch( error => {
  36. console.error( '- ' + error.name + ': ' + error.message );
  37. manager.respawnAll();
  38. } );
  39. async function graceful(signal) {
  40. console.log( '- ' + signal + ': Disabling respawn...' );
  41. manager.respawn = false;
  42. }
  43. process.once( 'SIGINT', graceful );
  44. process.once( 'SIGTERM', graceful );
  45. process.on( 'exit', code => {
  46. if ( diedShards >= manager.totalShards ) process.exit(1);
  47. } );