Ir al contenido

Ciclo de vida del módulo

Los módulos en Zumito Framework exponen hooks del ciclo de vida que permiten ejecutar código en momentos específicos durante la inicialización del bot.

Los módulos pueden declarar dependencias de otros módulos mediante propiedades estáticas. El framework resuelve estas dependencias y carga los módulos en el orden correcto usando ordenamiento topológico (dependencias primero).

Cada módulo puede declarar su propio nombre, usado para la resolución de dependencias:

import { Module } from 'zumito-framework';
export class MyModule extends Module {
static moduleName = 'my-module';
}

Si no se declara moduleName, se usa el nombre de la carpeta como nombre del módulo.

Declara dependencias requeridas — módulos que deben cargarse antes que este:

import { Module } from 'zumito-framework';
export class MyModule extends Module {
static dependencies = ['logger-module', 'admin-module'] as const;
}

Si una dependencia requerida no se encuentra, el módulo no se cargará y se registrará un error.

Declara dependencias opcionales — módulos que deben cargarse primero si están presentes, pero no impiden la carga si están ausentes:

import { Module } from 'zumito-framework';
export class MyModule extends Module {
static optionalDependencies = ['sentry'] as const;
}

La propiedad legada requeriments.modules sigue siendo soportada y se combina con el array dependencies:

export class MyModule extends Module {
static requeriments = {
modules: ['admin-module'],
services: [],
custom: [],
};
}

Las dependencias circulares se detectan y se reportan como errores. Los módulos afectados se omiten durante la carga:

[📦❌] Circular dependency detected involving: ModuleA, ModuleB

Este método se llama automáticamente cuando el módulo se carga. Se encarga de:

  • Cargar comandos desde la carpeta commands/
  • Registrar eventos desde la carpeta events/
  • Cargar traducciones desde la carpeta translations/
  • Registrar rutas desde la carpeta routes/

Puedes sobrescribirlo si necesitas lógica de inicialización personalizada, pero asegúrate de llamar a super.initialize():

import { Module } from 'zumito-framework';
export class MyModule extends Module {
async initialize() {
await super.initialize();
// Código de inicialización personalizado
}
}

Este hook se ejecuta después de que todo el framework esté listo — cliente de Discord conectado, todos los módulos cargados, slash commands refrescados y servidor API iniciado. Es el lugar ideal para código que depende de que el bot esté completamente operativo.

import { Module } from 'zumito-framework';
export class MyModule extends Module {
async onAllReady() {
// El bot está completamente listo
console.log(`Conectado como ${this.framework.client.user?.tag}`);
}
}

Como alternativa, puedes escuchar el evento ready emitido por el emitter del framework. Esto es útil cuando quieres reaccionar desde una clase de evento sin tocar la clase del módulo:

import { FrameworkEvent } from 'zumito-framework';
export class OnFrameworkReady extends FrameworkEvent {
source = 'framework';
once = true;
async execute(): Promise<void> {
console.log('¡El framework está listo!');
}
}
  1. El cliente de Discord se conecta y emite ready
  2. Todas las clases de módulos se cargan y sus dependencias se resuelven
  3. Los módulos se ordenan topológicamente (dependencias primero)
  4. Cada módulo se instancia en orden ordenado
  5. Se llama a initialize() de cada módulo en orden ordenado
  6. Se refrescan los slash commands
  7. Se inicia el servidor API
  8. Se emite el evento ready del framework
  9. Se llama a onAllReady() de cada módulo
  10. Se ejecuta el callback del usuario (configurado en zumito.config.ts)