index.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. 'use strict';
  2. process.env.NODE_CONFIG_DIR = `${__dirname}/config`;
  3. process.on('uncaughtException', err => {
  4. if (lockdownB || err.code === 'ECONNREFUSED' || err.code === 'UNCERTAIN_STATE') return;
  5. console.log(`UNCAUGHT EXCEPTION: ${err.stack}`);
  6. });
  7. class ModuleManager {
  8. constructor() {
  9. this.modules = {};
  10. this.modulesInitialized = 0;
  11. this.totalModules = 0;
  12. this.modulesLeft = [];
  13. this.i = 0;
  14. this.lockdown = false;
  15. }
  16. addModule(moduleName) {
  17. console.log("add module", moduleName);
  18. const moduleClass = new require(`./logic/${moduleName}`);
  19. this.modules[moduleName] = new moduleClass(moduleName, this);
  20. this.totalModules++;
  21. this.modulesLeft.push(moduleName);
  22. }
  23. initialize() {
  24. if (!this.modules["logger"]) return console.error("There is no logger module");
  25. this.logger = this.modules["logger"];
  26. for (let moduleName in this.modules) {
  27. let module = this.modules[moduleName];
  28. if (this.lockdown) break;
  29. module._onInitialize().then(() => {
  30. this.moduleInitialized(moduleName);
  31. });
  32. let dependenciesInitializedPromises = [];
  33. module.dependsOn.forEach(dependencyName => {
  34. let dependency = this.modules[dependencyName];
  35. dependenciesInitializedPromises.push(dependency._onInitialize());
  36. });
  37. Promise.all(dependenciesInitializedPromises).then((res, res2) => {
  38. if (this.lockdown) return;
  39. this.logger.info("MODULE_MANAGER", `${moduleName} dependencies have been completed`);
  40. module._initialize();
  41. });
  42. }
  43. }
  44. moduleInitialized(moduleName) {
  45. this.modulesInitialized++;
  46. this.modulesLeft.splice(this.modulesLeft.indexOf(moduleName), 1);
  47. this.logger.info("MODULE_MANAGER", `Initialized: ${this.modulesInitialized}/${this.totalModules}.`);
  48. if (this.modulesLeft.length === 0) this.allModulesInitialized();
  49. }
  50. allModulesInitialized() {
  51. this.logger.success("MODULE_MANAGER", "All modules have started!");
  52. this.modules["discord"].sendAdminAlertMessage("The backend server started successfully.", "#00AA00", "Startup", false, []);
  53. }
  54. aModuleFailed(failedModule) {
  55. this.logger.error("MODULE_MANAGER", `A module has failed, locking down. Module: ${failedModule.name}`);
  56. this.modules["discord"].sendAdminAlertMessage(`The backend server failed to start due to a failing module: ${failedModule.name}.`, "#AA0000", "Startup", false, []);
  57. this.lockdown = true;
  58. for (let moduleName in this.modules) {
  59. let module = this.modules[moduleName];
  60. module._lockdown();
  61. }
  62. }
  63. }
  64. const moduleManager = new ModuleManager();
  65. module.exports = moduleManager;
  66. moduleManager.addModule("cache");
  67. moduleManager.addModule("db");
  68. moduleManager.addModule("mail");
  69. moduleManager.addModule("api");
  70. moduleManager.addModule("app");
  71. moduleManager.addModule("discord");
  72. moduleManager.addModule("io");
  73. moduleManager.addModule("logger");
  74. moduleManager.addModule("notifications");
  75. moduleManager.addModule("playlists");
  76. moduleManager.addModule("punishments");
  77. moduleManager.addModule("songs");
  78. moduleManager.addModule("spotify");
  79. moduleManager.addModule("stations");
  80. moduleManager.addModule("tasks");
  81. moduleManager.addModule("utils");
  82. moduleManager.initialize();