Moderación
moderation/actions.ts casos warn/kick/ban/timeout/softban, DM con botón de apelación. Masivos hasta 15 objetivos.

Bot de comunidad desarrollado en TypeScript con tipado estricto, salas de voz automáticas, tickets y comandos slash de baja latencia.
Nexo es un servidor de Discord (voz activa, social, gaming, anime, gatos). El bot cubre VoiceMaster, economía nexocoin, bandas y policía, asaltos cooperativos, un juego de Pokémon, perfil con reputación, misiones, RPG, counting y tickets con Neko.
La restricción a un guild no es un “todo”. Es un producto cerrado: slash commands se despliegan solo ahí (src/index.ts) y GuildCreate en otro ID llama a guild.leave().
Custom bot for the Nexo Discord: VoiceMaster, nexocoin economy, gangs and police, co-op heists, a Pokémon game, profile reputation, missions, RPG, counting, and tickets with Neko.
Single-tenant on purpose: slash commands deploy only to that guild; joining any other server triggers guild.leave().
Un contenedor. TypeScript se compila a dist/ (Dockerfile multi-stage). Los slash viven en src/commands/ agrupados por área; la lógica gorda está en src/modules/. Los events de discord.js son finos: delegan en los motores (XP, automod, VoiceMaster, invites…).
Al apagar (SIGTERM) se reembolsan mesas de casino abiertas (economy/tables.ts) y se destruye el cliente con gracia de 25 s en Compose.
One container. TypeScript compiles to dist/. Slash commands live under src/commands/; heavy logic is in src/modules/. Discord events stay thin and call those engines.
On SIGTERM, open casino tables are refunded before the client is destroyed.
moderation/actions.ts casos warn/kick/ban/timeout/softban, DM con botón de apelación. Masivos hasta 15 objetivos.
Spam por ventana, invites, enlaces, caps, bad words. Hits en tabla automod_hits.
Hub ➕ crear sala. Panel: lock, hide, rename, límite, claim, transfer, kick. Tabla temp_voices.
XP chat + minutos en VC (×1.5 boosters), role rewards, tarjeta Canvas al subir.
Categorías, claim, cierre, transcripciones HTML. Neko responde hasta que staff reclama el ticket.
ZIP con roles, canales, emojis, bans, casos, niveles, tickets y mensajes. Restore con mapeo de IDs.
nexocoin: work/daily/crime, tienda, P2P, subastas, trading, minería, propiedades, préstamos, impuestos semanales. Cada movimiento se registra (transactionLogger.ts).
/asalto cooperativo: roles, objetivos, QTE, HUD Canvas, reliquias y eventos. /banda crea sindicatos, territorios y tributo. /policia es el otro lado.
/pokemon captura, equipo, Pokédex, gimnasios, duelos, intercambio y evolución. Sustituye a las mascotas sueltas.
/perfil con tarjeta y tema. /rep da reputación. Siguen cumpleaños, matrimonios, counting, bumps e invites.
/logs asigna canales. Deletes, edits, voz, audit log, tickets y boosts van a cada tipo.
Tarjetas Canvas (welcome, level-up, boost). Tracker de Server Boosts para sorteos ponderados.
Requisitos de rol, nivel o booster. Entradas extra por boosts e invites.
modules/ai/client.ts arma una cola de intentos y se queda con el primero que responde. Si un proveedor da 429, lo enfría (cooldown) y sigue. Orden:
local (Ollama) → Groq → Gemini (varias claves) → OpenRouter → Cohere → Cloudflare Workers AI → OpenAI.
La memoria del ticket (ai/memory.ts) guarda un resumen y hechos en SQLite para no reenviar todo el hilo. El prompt de normas se carga con /ticket ia prompt:.
modules/ai/client.ts builds a failover queue; 429 cools that provider. Order: local Ollama → Groq → Gemini (multi-key) → OpenRouter → Cohere → Cloudflare → OpenAI.
Ticket memory stores a summary plus facts so the whole thread is not resent. Staff can set the policy prompt with /ticket ia prompt:.
Eventos delgados, motores gordos. messageCreate.ts no es un switch de mil líneas: llama a automod, XP, counting, bump y chatbot. Eso se deja testear y no se mezcla con los slash.
Thin events, fat engines. messageCreate.ts delegates to automod, XP, counting, bump and chatbot instead of a thousand-line switch.
Schema explícito. database/schema.ts declara decenas de tablas (casos, tickets, economía, RPG, pets, misiones, counting…). WAL y foreign keys. No es un JSON suelto.
Explicit schema. database/schema.ts is a real relational model (cases, tickets, economy, RPG, missions…) with WAL and foreign keys.
Canvas de marca. Welcome, level-up y boost usan las PNG de assets/images/ y fuentes Inter. El logo de esta ficha es media/nexo.png.
Branded canvas cards for welcome, level-up and boosts. This page uses media/nexo.png.
Un compose: docker compose up -d --build. Datos en ./data, backups en ./backups. Token y claves de IA en .env (Zod al cargar). El repo público no lleva la base ni los ZIP de restore.
Single compose service. Data and backups on host volumes. Token and AI keys in .env (Zod). Public repo has neither the database nor restore ZIPs.