Contribuir
🤝 Contribuir al Proyecto
¡Gracias por tu interés en contribuir a DiscordBot-TK! Esta guía te ayudará a empezar y te explicará cómo puedes ayudar a mejorar el proyecto.
🎯 Formas de Contribuir
🐛 Reportar Bugs
- Usa el sistema de Issues en GitHub
- Incluye pasos para reproducir el problema
- Proporciona logs y capturas de pantalla
- Especifica versión del bot y entorno
💡 Sugerir Funcionalidades
- Crea un Feature Request en GitHub
- Explica el caso de uso y beneficios
- Proporciona mockups o ejemplos si es posible
- Discute la implementación con el equipo
🔧 Contribuir con Código
- Fork del repositorio
- Crear rama de feature
- Implementar cambios
- Crear Pull Request
📚 Mejorar Documentación
- Corregir errores tipográficos
- Agregar ejemplos y casos de uso
- Traducir a nuevos idiomas
- Mejorar explicaciones técnicas
🌍 Traducciones
- Agregar soporte para nuevos idiomas
- Mejorar traducciones existentes
- Validar consistencia de traducciones
🚀 Configuración del Entorno de Desarrollo
Prerrequisitos
# Node.js v18 o superiornode --version
# PNPM (recomendado) o NPMpnpm --version
# Gitgit --versionConfiguración Inicial
-
Fork y Clone
Ventana de terminal # Fork el repositorio en GitHubgit clone https://github.com/tu-usuario/discordbot-tk.gitcd discordbot-tk -
Instalar Dependencias
Ventana de terminal pnpm install -
Configurar Variables de Entorno
Ventana de terminal cp .env.example .env# Editar .env con tus tokens de desarrollo -
Configurar Bot de Desarrollo
- Crear aplicación en Discord Developer Portal
- Obtener token y Client ID
- Invitar bot a servidor de pruebas
-
Inicializar Base de Datos
Ventana de terminal # La base de datos se crea automáticamente al iniciarpnpm dev
Estructura para Desarrollo
discordbot-tk/├── .github/ # Workflows y templates├── src/ # Código fuente├── tests/ # Tests automatizados├── docs/ # Documentación├── scripts/ # Scripts de utilidad└── .dev/ # Archivos de desarrollo ├── test-guild/ # Configuración de servidor de pruebas └── fixtures/ # Datos de prueba📝 Estándares de Código
Estilo de Código
// ✅ Buenoconst { SlashCommandBuilder } = require('discord.js');const { getTranslation } = require('../../utils/i18n');
module.exports = { data: new SlashCommandBuilder() .setName('ejemplo') .setDescription('Comando de ejemplo'),
async execute(interaction) { try { const t = await getTranslation(interaction.guild.id);
await interaction.reply({ content: t('commands.ejemplo.response'), ephemeral: true }); } catch (error) { console.error('Error en comando ejemplo:', error); await interaction.reply({ content: 'Ocurrió un error.', ephemeral: true }); } }};Convenciones de Nombres
// Archivos y directorioscomando-ejemplo.js // kebab-caseManejadorEjemplo.js // PascalCase para clases
// Variables y funcionesconst miVariable = 'valor'; // camelCasefunction miFuncion() {} // camelCase
// Constantesconst MI_CONSTANTE = 'valor'; // SCREAMING_SNAKE_CASE
// Clasesclass MiClase {} // PascalCaseManejo de Errores
// ✅ Siempre manejar errorestry { await rieskyOperation();} catch (error) { Logger.error('Error específico', { error, context }); // Manejar gracefully}
// ✅ Usar logging apropiadoLogger.info('Operación exitosa', { details });Logger.warn('Situación atípica', { context });Logger.error('Error crítico', { error });
// ✅ Respuestas de error amigablesawait interaction.reply({ content: t('errors.unexpectedError'), ephemeral: true});🧪 Testing
Estructura de Tests
tests/├── unit/ # Tests unitarios│ ├── utils/ # Tests de utilidades│ ├── handlers/ # Tests de handlers│ └── commands/ # Tests de comandos├── integration/ # Tests de integración│ ├── database/ # Tests de BD│ └── discord/ # Tests con Discord API├── e2e/ # Tests end-to-end└── fixtures/ # Datos de pruebaEjemplo de Test Unitario
const { TextUtils } = require('../../../src/utils/text');
describe('TextUtils', () => { describe('truncate', () => { test('should truncate long text', () => { const text = 'Este es un texto muy largo'; const result = TextUtils.truncate(text, 10); expect(result).toBe('Este es...'); });
test('should not truncate short text', () => { const text = 'Corto'; const result = TextUtils.truncate(text, 10); expect(result).toBe('Corto'); }); });
describe('capitalize', () => { test('should capitalize first letter', () => { const result = TextUtils.capitalize('hello world'); expect(result).toBe('Hello world'); }); });});Ejecutar Tests
# Todos los testspnpm test
# Tests específicospnpm test -- --grep "TextUtils"
# Tests con coveragepnpm test:coverage
# Tests en modo watchpnpm test:watch🔀 Flujo de Trabajo Git
Ramas
main # Rama principal (producción)├── develop # Rama de desarrollo├── feature/nombre # Nuevas funcionalidades├── bugfix/nombre # Correcciones de bugs├── hotfix/nombre # Correcciones urgentes└── release/vX.X.X # Preparación de releasesComandos Git
# Crear rama de featuregit checkout developgit pull origin developgit checkout -b feature/nueva-funcionalidad
# Commit con mensaje descriptivogit add .git commit -m "feat: agregar comando de ejemplo
- Implementar comando slash /ejemplo- Agregar traducciones es/en- Incluir tests unitarios- Actualizar documentación
Fixes #123"
# Push y crear PRgit push origin feature/nueva-funcionalidad# Crear Pull Request en GitHubConvención de Commits
# Tipos de commitfeat: # Nueva funcionalidadfix: # Corrección de bugdocs: # Cambios en documentaciónstyle: # Cambios de formato (no afectan lógica)refactor: # Refactorización de códigotest: # Agregar o modificar testschore: # Tareas de mantenimiento
# Ejemplosgit commit -m "feat: agregar sistema de roles automáticos"git commit -m "fix: corregir error en cálculo de XP"git commit -m "docs: actualizar guía de instalación"git commit -m "refactor: mejorar manejo de errores en tickets"📋 Pull Request Guidelines
Checklist antes de crear PR
- ✅ Código sigue las convenciones establecidas
- ✅ Tests pasan correctamente
- ✅ Documentación actualizada
- ✅ Traducciones incluidas (es/en)
- ✅ No hay conflictos de merge
- ✅ Commits están bien estructurados
- ✅ PR tiene descripción clara
Template de Pull Request
## 📝 DescripciónDescripción clara y concisa de los cambios realizados.
## 🎯 Tipo de Cambio- [ ] 🐛 Bug fix- [ ] ✨ Nueva funcionalidad- [ ] 💥 Breaking change- [ ] 📚 Documentación- [ ] 🔧 Refactorización
## 🧪 Testing- [ ] Tests unitarios pasando- [ ] Tests de integración pasando- [ ] Probado manualmente en servidor de desarrollo
## 📸 Screenshots(Si aplica, incluir capturas de pantalla)
## 📝 Checklist- [ ] Código sigue las convenciones del proyecto- [ ] Self-review realizado- [ ] Documentación actualizada- [ ] Traducciones incluidas- [ ] Tests agregados/actualizados
## 🔗 Issues RelacionadosFixes #123Closes #456Related to #789🐛 Reportar Issues
Template de Bug Report
## 🐛 Descripción del BugDescripción clara y concisa del problema.
## 🔄 Pasos para Reproducir1. Ir a '...'2. Ejecutar comando '...'3. Ver error
## ✅ Comportamiento EsperadoDescripción de lo que debería pasar.
## 🔥 Comportamiento ActualDescripción de lo que está pasando.
## 🖼️ Screenshots(Si aplica)
## 🌍 Entorno- OS: [ej. Windows 10]- Node.js: [ej. v18.17.0]- Bot version: [ej. v1.2.3]- Discord.js: [ej. v14.14.1]
## 📋 LogsIncluir logs relevantes aquí
## 📊 Información AdicionalCualquier otra información que pueda ser útil.Template de Feature Request
## 💡 Descripción de la FuncionalidadDescripción clara y concisa de la funcionalidad propuesta.
## 🎯 Problema que Resuelve¿Qué problema resuelve esta funcionalidad?
## 💭 Solución PropuestaDescripción de la solución que te gustaría ver.
## 🔀 Alternativas ConsideradasOtras soluciones o funcionalidades que has considerado.
## 🖼️ Mockups/Ejemplos(Si aplica, incluir ejemplos visuales)
## 📊 Contexto AdicionalCualquier otra información relevante.🏷️ Labels en GitHub
Tipos de Issues
bug- Error en el códigoenhancement- Nueva funcionalidaddocumentation- Mejoras en docstranslation- Temas de traduccionesquestion- Preguntas generales
Prioridad
priority: high- Alta prioridadpriority: medium- Prioridad mediapriority: low- Baja prioridad
Estado
status: ready- Listo para trabajarstatus: in-progress- En desarrollostatus: needs-review- Necesita revisiónstatus: blocked- Bloqueado
Áreas
area: commands- Comandos del botarea: database- Base de datosarea: docs- Documentaciónarea: i18n- Internacionalización
🎉 Reconocimientos
Contributors
Todos los contribuidores son reconocidos en:
README.mdprincipal- Página de créditos en documentación
- Releases notes
Tipos de Contribución
- 💻 Código
- 📖 Documentación
- 🐛 Bug reports
- 💡 Ideas
- 🌍 Traducciones
- 🎨 Diseño
- 🧪 Testing
📞 Contacto y Soporte
Canales de Comunicación
- GitHub Issues - Bugs y features
- GitHub Discussions - Preguntas generales
- Discord Server - Chat en tiempo real
- Email - Contacto directo con maintainers
Maintainers
- @tu-usuario - Lead Developer
- Lista de maintainers activos
📜 Código de Conducta
Nuestro Compromiso
Nos comprometemos a hacer de la participación en nuestro proyecto una experiencia libre de acoso para todos.
Comportamientos Esperados
- Usar lenguaje respetuoso e inclusivo
- Respetar diferentes puntos de vista
- Aceptar críticas constructivas gracefully
- Enfocarse en lo mejor para la comunidad
Comportamientos Inaceptables
- Uso de lenguaje o imágenes sexualizadas
- Trolling, comentarios insultantes
- Acoso público o privado
- Publicar información privada sin permiso
Aplicación
Los maintainers tienen el derecho y la responsabilidad de remover, editar o rechazar contribuciones que no se alineen con este Código de Conducta.
¡Gracias por contribuir a DiscordBot-TK! Cada contribución, por pequeña que sea, hace que el proyecto sea mejor para todos. 🚀