Bot de Discord para el server de amigos Gmi2. Originalmente conocido como BotitoV2.
Hosteado en Railway, deploy automático en cada push a master.
| Categoría | Comandos |
|---|---|
| info (8) | /about · /changelog · /channel-id · /feedback · /gmi2 · /help · /ping · /uptime |
| fun (9) | /ahorcado · /flip · /imc · /love · /poke · /roll · /ruleta · /shuffle · /team |
| mod (7) | /clear · /cum · /cums · /nextcum · /register · /say · /who |
Para ver el detalle de cualquier comando dentro del bot: /help command:<nombre>.
- Cumpleaños persistentes con cron diario que saluda automáticamente.
/lovecon persistencia en Mongo y subcomandos owner para curar overrides (set/reset)./helpcon autocomplete, dropdown y botón "Volver al listado"./clearque DMea al moderador un recap con texto y archivos de los mensajes eliminados./pokeque matchea el color del embed con el tipo del Pokémon./teamdivide listas en N equipos balanceados (round-robin).
| Capa | Tech |
|---|---|
| Runtime | Node 22 |
| Lenguaje | TypeScript 5.9 |
| Discord | discord.js 14 |
| Base de datos | MongoDB + Mongoose 8 |
| HTTP server | Express 4 (health-check para Railway) |
| Tests | Vitest 4 + mongodb-memory-server |
| Package manager | pnpm 10 |
| Deploy | Railway (CD desde master) |
pnpm install
cp .env.example .env # configurar TOKEN, MONGODB, OWNERID, GMI2_CHANNEL, etc.
pnpm dev # tsx watch — recarga al guardar| Var | Default | Descripción |
|---|---|---|
TOKEN |
— | Token del bot de Discord |
MONGODB |
— | Connection string de Mongo |
OWNERID |
— | Discord ID del owner del bot (para comandos owner-only) |
GMI2_CHANNEL |
— | ID del canal principal del server (para crons y listeners) |
PORT |
3000 |
Puerto Express (Railway lo usa para health-check) |
MAX_DELETE_MESSAGES |
20 |
Cap de /clear |
PHOTO_ROOT |
— | Base URL de Cloudinary para GIFs/imágenes |
| Script | Acción |
|---|---|
pnpm dev |
tsx watch src/index.ts — desarrollo con hot reload |
pnpm build |
rimraf dist && tsc -p . |
pnpm start |
node dist/index.js — producción |
pnpm test |
vitest run — suite completa |
pnpm test:watch |
vitest — modo interactivo |
src/
├── index.ts # Entry: levanta Express + Discord client
├── discord.ts # Setup del client (intents, partials, login)
├── database.ts # Conexión a Mongo
├── config/ # Env vars
├── api/ # Express REST (reservada para dashboard futuro)
│ ├── app.ts
│ ├── router.ts
│ ├── routes/ # Manifest estático de routes
│ ├── controller/
│ ├── dao/ # Acceso directo a Mongo
│ └── models/ # Schemas Mongoose
├── slashCommands/ # Slash commands organizados por categoría
│ ├── index.ts # Manifest estático
│ ├── fun/ # 9 comandos
│ ├── info/ # 8 comandos
│ └── mod/ # 7 comandos
├── events/ # Discord event handlers
│ ├── index.ts # Manifest estático
│ ├── client/ # ready, interactionCreate
│ └── message/ # messageDelete, messageUpdate
├── handlers/ # Boot loaders + ErrorHandler
└── shared/
├── classes/ # ClientDiscord (extiende Client de discord.js)
├── constants/ # branding, changelog, calendar
├── data/ # Datos estáticos (palabras de hangman, etc.)
├── services/ # Wrappers sobre DAOs (unwrappean ResponseData)
├── types/ # Tipos compartidos
└── utils/ # Helpers (shuffle, formatUptime, dateToUTC5, …)
Reglas detalladas para contribuir: .claude/conventions.md.
Resumen rápido:
- Branches:
feature → dev → master.masteres release-only. - Commits: conventional commits (
feat,fix,chore,refactor,test,docs). - Strings del bot al usuario: español neutral (tuteo). Voseo solo en chat dev/comments.
- Branding de embeds: sin
setAuthor, footerXiza Bot vX.Y.Z, color por categoría. - Tests co-locados (
*.test.tsal lado del source). - DAO directo: los slash commands consumen
dao/*oservices/*, NUNCA hacen HTTP a la propia API.
Ver /changelog o el comando /changelog dentro del bot.
v0.4.0 — Facelift completo de los 18 comandos heredados + 6 comandos nuevos. 284 tests.