Este documento detalla los subsistemas de la capa core y cómo colaboran entre sí.
- CommandRegistry: resolución de comandos y middleware transversal.
- IdentityService: identidad canónica y matching entre plataformas.
- CooldownService: políticas de frecuencia por plataforma/comando/scope.
- FunaService: persistencia y consulta de eventos de funa.
- Database/Migrations: contrato persistente y evolución de esquema.
- Config Loaders: validación y defaults de configuración.
flowchart LR
A[CommandRegistry] --> B[CooldownService]
A --> C[FunaCommand]
C --> D[IdentityService]
C --> E[FunaService]
B --> F[(command_cooldowns)]
D --> G[(users)]
D --> H[(identities)]
D --> I[(identity_merges)]
E --> J[(funa_events)]
Responsabilidad principal:
- Resolver identidad canónica (
users) a partir de identidades de plataforma (identities). - Reutilizar usuario existente cuando hay match confiable por similitud.
- Proveer merge manual y trazabilidad de merges.
Funciones clave:
getOrCreateIdentity(platform, platformUserId, username, displayName).getOrCreateUnresolvedIdentity(platform, username).findSimilarUsers(username).mergeUsers(sourceUserId, targetUserId, mergedBy, reason).
Modelo de matching:
- Normaliza username (
lowercase, trim, remove_.-, remove dígitos finales). - Calcula similitud Levenshtein normalizada en rango 0..1.
- Si existe exactamente un candidato por encima del umbral (
similarityThreshold), reusauser_id. - Si no hay candidato claro, crea usuario canónico nuevo.
Notas de diseño:
- Un username target no visto aún puede registrarse como identidad pendiente con prefijo
unresolved:. - El merge manual deja auditoría en
identity_merges.
flowchart TD
A[getOrCreateIdentity] --> B{Existe identidad exacta platform+platformUserId?}
B -- Si --> C[Retornar identidad existente]
B -- No --> D[Normalizar username]
D --> E[Buscar candidatos]
E --> F{Un candidato >= threshold?}
F -- Si --> G[Reusar user_id candidato]
F -- No --> H[Crear user canonico]
G --> I[Insertar identidad]
H --> I
I --> J[Retornar identidad creada]
Responsabilidad principal:
- Registro de comandos por nombre y alias.
- Punto único de ejecución con middleware de cooldown.
Flujo:
- Resuelve comando.
- Evalúa cooldown (
CooldownService.evaluateCooldown). - Si está en cooldown, responde mensaje de bloqueo.
- Si no, ejecuta comando.
- Registra uso (
recordCommandUsage) cuando la regla está activa.
Responsabilidad principal:
- Resolver reglas declarativas por plataforma/comando.
- Construir
scope_keysegún estrategia. - Persistir y evaluar ventanas de cooldown.
Resumen de scopes:
user_channelchanneluser_globalglobal
Documentación completa:
- ver
docs/cooldown-system.md.
Responsabilidad principal:
- Registrar eventos de funa.
- Exponer conteo, historial y estadísticas agregadas.
Capacidades:
recordFunaEvent(...)getFunaCount(targetUserId)getFunaHistory(targetUserId, limit)getFunaStats()
Responsabilidad principal:
- Definir y evolucionar el contrato de datos.
- Ejecutar migraciones en startup.
Tablas core relevantes:
usersidentitiesidentity_mergescommand_cooldownsfuna_events
Loaders relevantes:
loadConfig(env): variables de plataforma y rutas.loadCooldownConfig(JSON): reglas de cooldown validadas con Zod.
Objetivo:
- fallar temprano ante configuración inválida y aplicar defaults explícitos cuando corresponde.