Lenguajes de programación

INTRODUCCIÓN Y VISIÓN GENERAL

Discord.js vs Discord.py -- Guía definitiva para elegir tu stack de desarrollo

¿Qué es Discord.js y Discord.py?

Discord.jsarrow-up-right es una potente librería de Node.js que permite interactuar con la API de Discord de manera muy sencilla. Adopta un enfoque más orientado a objetos que la mayoría de otras librerías de Discord en JavaScript, haciendo que el código de tu bot sea significativamente más ordenado y fácil de comprender.

discord.pyarrow-up-right es una librería moderna, fácil de usar, rica en características y lista para async, que actúa como un wrapper de la API de Discord. Utiliza la sintaxis moderna async/await de Python y cuenta con un manejo inteligente de límites de velocidad que previene errores 429.

Historia y Evolución

Año
Discord.js
Discord.py
Eventos Importantes

2015

v0.1.0 - Lanzamiento inicial

v0.8.0 - Primera versión estable

Introducción de webhooks

2017

v11.0 - Reescritura completa

v0.16.0 - Async/await nativo

Gateway v6 introducido

2019

v12.0 - Gateway v7, Collections

v1.0.0 - Lanzamiento oficial

Intents introducidos

2021

v13.0 - Gateway v9, Intents obligatorios

v2.0 - Slash Commands, Intents

Comandos de aplicación

2023

v14.0 - Gateway v10, ESM support

v2.3 - Híbrido app_commands

Componentes UI mejorados

2025

v14.21.x - Voice v2, Performance

v2.5.2 - Flag Converters

Optimizaciones de memoria

Filosofía de cada librería

Discord.jsarrow-up-right - "Simplicidad y Performance"

  • Principio core: "Hacer que el desarrollo sea intuitivo sin sacrificar potencia".

  • Arquitectura: Event-driven con Collections optimizadas.

  • Comunidad: Enfoque en tutoriales visuales y documentación interactiva.

"Discord.js prioriza la experiencia del desarrollador con APIs intuitivas y tooling moderno"

Discord.pyarrow-up-right - "Elegancia Pythónica"

  • Principio core: "Pythónico, limpio y extensible".

  • Arquitectura: Async-first con extensiones modulares.

  • Comunidad: Enfoque académico con documentación técnica profunda.

"Discord.py abraza los principios de Python: legible, explícito y poderoso"

Comparativa inicial - ¿Cuál elegir?

Criterio
Discord.js
Discord.py

Curva de Aprendizaje

⭐⭐⭐ Moderada

⭐⭐⭐⭐ Fácil

Performance

⭐⭐⭐⭐⭐ Excelente

⭐⭐⭐⭐ Muy buena

Ecosistema

⭐⭐⭐⭐⭐ npm vastísimo

⭐⭐⭐⭐ PyPI robusto

Documentación

⭐⭐⭐⭐ Muy buena

⭐⭐⭐⭐⭐ Excepcional

Deployment

⭐⭐⭐⭐⭐ Muy flexible

⭐⭐⭐⭐ Flexible

Criterios de selección técnicos

Elige Discord.js si:

  • Tienes experiencia previa con JavaScript/TypeScript.

  • Necesitas integración con herramientas web (React dashboards, APIs REST).

  • Priorizas el ecosistema npm y sus 2M+ paquetes.

  • Requieres máximo rendimiento en aplicaciones con alta concurrencia.

  • Planeas usar Docker y contenedores modernos.

  • Tu equipo ya domina el stack JS (Next.js, Express, etc.).

Elige Discord.py si:

  • Eres nuevo en programación (sintaxis más legible).

  • Vienes del mundo de data science/machine learning.

  • Necesitas integración con librerías científicas (numpy, pandas, scikit-learn).

  • Priorizas código limpio y mantenible a largo plazo.

  • Tu proyecto requiere procesamiento de datos complejos.

  • Trabajas en un entorno académico o de investigación.

Métricas de adopción 2025

Métrica
Discord.js
Discord.py

Downloads mensuales

~15M (npm)

~2.1M (PyPI)

GitHub Stars

25.2k ⭐

14.8k ⭐

Servers activos estimados

~850k

~320k

Contributors

350+

280+

Issues cerrados

98.2%

97.8%

Casos de Uso Reales

Bots enterprise con Discord.js

  • MEE6: 19M+ servidores, maneja 2B+ mensajes/día

  • Dyno: 8M+ servidores, sistema de moderación distribuido

  • Carl-bot: 6M+ servidores, automod con ML integrado

Bots especializados con Discord.py

  • Red-DiscordBot: Framework modular con 500+ cogs

  • Groovy (antes del cierre): 16M+ servidores de música

  • Bots académicos: Universidades para gestión estudiantil

Tendencias de la industria

Encuesta Stack Overflow 2025: JavaScript continúa siendo el lenguaje más popular (65.3%), mientras Python mantiene el segundo lugar (48.2%) por séptimo año consecutivo.

📊 Insight del mercado: Los bots híbridos (microservicios JS + workers Python) están ganando tracción en aplicaciones enterprise.


INSTALACIÓN Y CONFIGURACIÓN COMPLETA

Guía Step-by-Step para ambos ecosistemas.

Requisitos mínimos del sistema

Componente
Discord.js
Discord.py

SO

Windows 10+, macOS 10.15+, Ubuntu 18.04+

Windows 10+, macOS 10.15+, Ubuntu 18.04+

Runtime

Node.js ≥ 16.11.0 (LTS 18 recomendado)

Python ≥ 3.8 (3.11+ recomendado)

RAM

512MB (dev), 2GB+ (producción)

512MB (dev), 1.5GB+ (producción)

Disco

500MB (deps incluidas)

300MB (deps incluidas)

Red

Puerto 443 (HTTPS), 80 (HTTP)

Puerto 443 (HTTPS), 80 (HTTP)

Instalación de Node.js (Discord.js)

Windows

macOS

Linux (Ubuntu/Debian)

Instalación de Python (Discord.py)

Windows

macOS

Linux (Ubuntu/Debian)

Configuración del proyecto Discord.js

Estructura de carpetas recomendada

Inicialización del proyecto

Configuración de package.json

Configuración del proyecto Discord.py

Estructura de carpetas recomendada

Creación del entorno virtual

requirements.txt Completo

Configuración de variables de entorno

Archivo .env (ambos proyectos)

Docker Setup (Ambos proyectos)

Dockerfile para Discord.js

Dockerfile para Discord.py

docker-compose.yml

Verificación de la instalación

Test Discord.js

Test Discord.py

Herramientas de Desarrollo Recomendadas

VSCode Extensions

Comandos útiles para el día a día

Discord.js

Desarrollo con hot reload

Discord.py

Ejecutar con recarga automática

CONCEPTOS BÁSICOS

Cliente, intentos, eventos y comandos

1. Cliente (Client)

Elemento
Discord.js (JS)
discord.py (Py)

Clase principal

Client

discord.Client / commands.Bot

Import

import { Client } from "discord.js";

import discord from discord.ext import commands

Instanciación

const client = new Client({ intents: [...] });

client = discord.Client(intents=intents) o bot = commands.Bot(command_prefix="!", intents=intents)

Login

client.login(process.env.DISCORD_TOKEN);

client.run(TOKEN) / bot.run(TOKEN)

chevron-rightEjemplo completo [JS]hashtag
chevron-rightEjemplo completo [Py]hashtag

2. Intentos

Los intentos controlan qué eventos recibe tu bot del Gateway. Desde 2021 son obligatorios.

Intents

JS (GatewayIntentBits)

Py (discord.Intents)

Predeterminados

GatewayIntentBits.Guilds

discord.Intents.default()

Mensajes de contenido

MessageContent

message_content=True

Miembros del servidor

GuildMembers

members=True

Presencias de usuarios

GuildPresences

presences=True

circle-exclamation

3. Eventos

Maneja eventos usando client.on (JS) o @bot.event (Py).

Evento
JS
Py
Descripción

Conexión lista

ready

on_ready

Bot inició sesión y está listo

Mensaje recibido

messageCreate

on_message

Se recibe un mensaje en un canal

Nuevo miembro

guildMemberAdd

on_member_join

Alguien se une al servidor

Interacción

interactionCreate

on_interaction

Slash command o componente interactivo

Reacción añadida

messageReactionAdd

on_reaction_add

Una reacción Emoji fue añadida a un mensaje

chevron-rightEjemplo de eventos avanzadoshashtag

4. Comandos

Comandos de prefijo vs Comandos de barra

Característica
Prefix Commands
Slash Commands

Invocación

!comando args

/comando args

Autocompletar

No

Parámetros tipados

Manualmente parseados

Tipados automáticamente

Permisos por comando

Manual

Configurable en Portal de Desarrollador

Soporte JS

client.on("messageCreate")

@Slash() (discord.js builders)

Soporte Py

@bot.command()

@app_commands.command()

chevron-rightEjemplo de comando de barra [JS]hashtag
chevron-rightEjemplo de comando de barra [Py]hashtag

5. Terminología Comparada

Término
JS
Py

Cliente

Client

Client / Bot

Comando prefix

messageCreate + parser

@bot.command()

Comando slash

SlashCommandBuilder

@app_commands.command()

Cog / Extensión

Collection<string, Command>

cog class

Evento ready

ready

on_ready

Evento mensaje

messageCreate

on_message

ACCIONADOR DE COMANDOS

Comandos de prefijo, comandos de barra y menús contextuales

Tabla de Contenidos

  1. Estructura de un Command Handler

  2. Prefix Commands

  3. Slash Commands (Application Commands)

  4. Context Menus (User & Message Commands)

  5. Middleware y Validaciones

  6. Auto-completado y Parámetros

  7. Ejemplos Listos para Copiar


1. Estructura de un accionador de comandos

Discord.js

discord.py


2. Comandos de prefijo

Discord.js

discord.py


3. Comandos de barra

Registro

Discord.js

discord.py

Manejo en el bot

Discord.js

discord.py


4. Menús contextuales

Tipo
Discord.js
discord.py

Usuario

setType(ApplicationCommandType.User)

@app_commands.user_command()

Mensaje

setType(ApplicationCommandType.Message)

@app_commands.message_command()

Discord.js – Ejemplo mensaje

discord.py – Ejemplo usuario


5. Middleware y validaciones

Validación
JS
Py

Verificar Roles

member.roles.cache.has(id)

@commands.has_role("Admin")

Verificar Canal

if(channel.id!==id) return

@commands.check(is_correct_channel)

Cooldowns

setTimeout + Map

@commands.cooldown(1, 10, commands.BucketType.user)


6. Auto-completado y parámetros

Discord.js

discord.py


7. Ejemplos listos para copiar

chevron-rightComando /calculadora con parámetros numéricoshashtag

COMPONENTES DE INTERFAZ (UI)

Botones, menús de selección, modales y filas de acción.


1. Introducción a componentes

Los componentes interactivos permiten interfaces ricas sin salir de Discord. Son gestionados por el Gateway v10 y requieren manejar el evento interactionCreate.


2. Botones

Propiedad

Discord.js (ButtonBuilder)

discord.py (discord.ui.Button)

Label

setLabel("Click")

discord.ui.Button(label="Click")

Custom ID

setCustomId("btn1")

discord.ui.Button(custom_id="btn1")

Estilo

setStyle(ButtonStyle.Primary)

discord.ui.Button(style=ButtonStyle.primary)

chevron-right[JS] – Creación y manejo de botoneshashtag
chevron-right[Py] – Creación y manejo de botoneshashtag

3. Menús de selección

Propiedad

Discord.js (StringSelectMenuBuilder)

discord.py (discord.ui.Select)

Custom ID

setCustomId("select1")

discord.ui.Select(custom_id="s1")

Opciones

addOptions([{ label, value }])

options=[discord.SelectOption(...)]

Placeholder

setPlaceholder("Elige...")

placeholder="Elige..."

chevron-right[JS] – Creación y manejo de menú de selecciónhashtag
chevron-right[Py] – Creación y manejo de menú de selecciónhashtag

4. Modales (formularios)

Propiedad

Discord.js (ModalBuilder)

discord.py (discord.ui.Modal)

Custom ID

setCustomId("modal1")

discord.ui.Modal(custom_id="m1")

Título

setTitle("Formulario")

discord.ui.Modal(title="Formulario")

Campos

addComponents(TextInputBuilder)

discord.ui.TextInput(...)

chevron-right[JS] – Creación y manejo de modaleshashtag
chevron-right[Py] – Creación y manejo de modaleshashtag

5. Filas de acción y diseño

Los componentes deben agruparse dentro de ActionRow para mantener la estructura de hasta 5 componentes por fila.


6. Componentes de menús contextuales

Tipo

JS (ContextMenuCommandBuilder)

Py (@app_commands.*_command)

Message

.setType(ApplicationCommandType.Message)

@app_commands.message_command()

User

.setType(ApplicationCommandType.User)

@app_commands.user_command()


7. Ejemplos Equivalentes JS ↔︎ Py

chevron-rightCombinación de botón + modaleshashtag

EMBEDS AVANZADOS

Creación de mensajes ricos con embeds

Tabla de Contenidos

  1. Estructura Básica de un Embed

  2. Propiedades Comunes

  3. Campos y Layout

  4. Color y Estilos

  5. Thumbnail, Image, Footer, Author

  6. Comparativa JS ↔︎ Py

  7. Ejemplos Profesionales


1. Estructura básica de un embed

Aspecto

Discord.js (EmbedBuilder)

discord.py (discord.Embed)

Instanciación

new EmbedBuilder()

discord.Embed()

Serialización

embed.toJSON()

No aplica (enviado directamente)

Envío

channel.send({ embeds: [embed] })

await ctx.send(embed=embed)


2. Propiedades comunes

Propiedad

JS (set)

Py (embed.)

Descripción

Título

.setTitle("Título")

title="Título"

Título principal

Descripción

.setDescription("Texto")

description="Texto"

Texto principal

URL

.setURL("https://...")

url="https://..."

Enlace al título

Color

.setColor("#0099ff")

color=0x0099ff

Color del borde

Timestamp

.setTimestamp()

timestamp=datetime.utcnow()

Marca de tiempo


3. Campos y diseño

Los campos se muestran en columnas responsivas.

Método JS
Método Py

.addFields({ name, value, inline })

.add_field(name="", value="", inline=True)

chevron-rightEjemplo de camposhashtag

4. Color y estilos

Forma
JS
Py

Hexadecimal

.setColor("#FF0000")

color=0xFF0000

Entero decimal

.setColor(16711680)

color=16711680

Nota: Discord.py acepta únicamente enteros o discord.Color.*.


5. Miniatura, Imagen, Pie de página, Autor

Elemento
JS
Py

Thumbnail

.setThumbnail("https://img.png")

embed.set_thumbnail(url="https://")

Image

.setImage("https://img.png")

embed.set_image(url="https://")

Footer

.setFooter({ text:"Pie", iconURL })

embed.set_footer(text="Pie", icon_url="...")

Author

.setAuthor({ name:"Autor", iconURL })

embed.set_author(name="Autor", icon_url="...")

chevron-rightEjemplo completo de embedhashtag

6. Comparativa JS ↔︎ Py

Característica
Discord.js
discord.py

Builder Fluent

Sí (Builder Pattern)

No

Instanciación rápida

new EmbedBuilder()

discord.Embed()

Conversión JSON

Sí (toJSON())

No

Tipos de color

Hex, int, Colors enum

int, discord.Color.*


7. Ejemplos Profesionales

Embed con campos dinámicos y gráficos

AUDIO Y VOZ

Reproducción de audio, voz y TTS

Tabla de Contenidos

  1. Introducción al Módulo de Voz

  2. Instalación y Dependencias

  3. Conexión a Canales de Voz

  4. Reproducción de Audio Local y Streams

  5. Text-to-Speech (TTS)

  6. Filtros y Efectos

  7. Comparativa JS ↔︎ Py

  8. Ejemplos Completos


1. Introducción al módulo de voz

  • Discord.js utiliza @discordjs/voice para manejar conexiones de voz y transmisión de audio.

  • discord.py incluye el paquete voice en el extra discord.py[voice], basado en FFmpeg y Opus.


2. Instalación y Dependencias

Librería
JS
Py

Paquete principal

@discordjs/voice@0.15.x

Incluido en discord.py[voice]

FFmpeg

Instalar sistema (ffmpeg en PATH)

Igual

Opción Opcional

@discordjs/opus

PyNaCl


3. Conexión a canales de voz

chevron-right[JS] – Conectar al canal de vozhashtag
chevron-right[Py] – Conectar al canal de vozhashtag

4. Reproducción de audio local y streams

Acción

JS (createAudioPlayer)

Py (vc.play)

Crear reproductor

createAudioPlayer()

No aplica (directo play)

Suscribir conexión

connection.subscribe(player)

vc.play(source)

Fuente local

createAudioResource("./audio.mp3")

discord.FFmpegPCMAudio("audio.mp3")

Fuente remoto (stream URL)

createAudioResource("https://...")

discord.FFmpegPCMAudio("https://...")

chevron-right[JS] – Reproduce archivo localhashtag
chevron-right[Py] – Reproduce archivo localhashtag

5. Text-to-Speech (TTS)

  • Discord.js envía TTS como flags en mensajes.

  • discord.py similar, usando tts=True.

circle-info

Para voces avanzadas se recomienda usar APIs externas (Google TTS, Amazon Polly).


6. Filtros y efectos

Ejemplo JS con FFmpeg Filters

Ejemplo Py con FFmpeg Arguments


7. Comparativa JS ↔︎ Py

Característica
Discord.js
discord.py

API dedicada

Módulo @discordjs/voice

Integrado en discord.py[voice]

Builder vs Función

createAudioResource

Directo FFmpegPCMAudio

Eventos de reproductor

AudioPlayerStatus

Callback after

Plugins de filtros

ffmpegArgs

before_options


8. Ejemplos Completos

chevron-rightBot de música completo [JS]hashtag
chevron-rightBot de música completo [Py]hashtag

TAREAS EN SEGUNDO PLANO

Programadores, trabajos cron y tareas en segundo plano

Tabla de Contenidos

  1. Introducción a Background Tasks

  2. discord.ext.tasks (Py)

  3. Cron Jobs con node-cron (JS)

  4. Timers nativos (setInterval)

  5. Workers externos (BullMQ, RQ)

  6. Comparativa JS ↔︎ Py

  7. Ejemplos Completos


1. Introducción a las tareas en segundo plano

A menudo necesitas ejecutar tareas periódicas: limpiar cachés, enviar recordatorios, refrescar datos de API.


2. discord.ext.tasks (Python)

  • Decoradores disponibles: @tasks.loop(seconds, minutes, hours, count)

  • Control de inicio/parada: my_task.start(), my_task.cancel()


3. Cron Jobs con node-cron (JavaScript)

  • Sintaxis cron estándar (min, hour, day, month, weekday)

  • Permite timezone, start/stop dinámicos


4. Timers nativos (JS)


5. Workers Externos

Librería JS
Librería Py
Uso Principal

BullMQ

RQ

Colas de trabajo distribuidas

Agenda

APScheduler

Jobs persistentes en DB

Bree

Celery

Tareas distribuidas + cron


6. Comparativa JS ↔︎ Py

Característica
Discord.js
discord.py

Built-in Loop

No

Sí (discord.ext.tasks)

Cron integrado

No (npm)

No (extra libs)

Workers distribuidos

BullMQ, Agenda

Celery, RQ

Persistencia

Redis/Mongo + libs

Redis/RDB + libs


7. Ejemplos completos

chevron-right[JS] – Limpieza de caché diaria a medianochehashtag
chevron-right[Py] – Recordatorio diario con APSchedulerhashtag

BASES DE DATOS Y CACHÉ

SQLite, PostgreSQL, Redis, Prisma y SQLAlchemy

Tabla de Contenidos

  1. Uso de SQLite para desarrollo ligero

  2. Conexión a PostgreSQL

  3. Caché con Redis

  4. ORM Prisma (JS)

  5. ORM SQLAlchemy (Py)

  6. Comparativa JS ↔︎ Py

  7. Ejemplos Completos


1. SQLite (Desarrollo y tests)

Característica
Discord.js (node-sqlite3)
discord.py (sqlite3)

Instalación

npm install sqlite3

Incluido en stdlib Python

Conexión

new sqlite3.Database('./db.sqlite')

sqlite3.connect('db.sqlite')

Promesas vs Sync

Usa callbacks o better-sqlite3

Sync (blobs)

JS Ejemplo

Py Ejemplo


2. PostgreSQL (producción)

Cliente

JS (pg)

Py (asyncpg o psycopg)

Instalación

npm install pg

pip install asyncpg

Conexión (JS)

Pool({ connectionString })

await asyncpg.connect()

Query Templates

Template strings / pg-format

$1, $2 placeholders

JS Ejemplo

Py Ejemplo


3. Redis (Caché y rate limits)

Uso

JS (ioredis)

Py (redis-py)

Instalación

npm install ioredis

pip install redis

Conexión

new Redis(url)

Redis.from_url(url)

TTL

redis.set(key,val,'EX',60)

redis.set(key,val,ex=60)

JS Ejemplo

Py Ejemplo


4. ORM Prisma (JavaScript/TypeScript)

Setup

Uso


5. ORM SQLAlchemy (Python)

Setup

Uso


6. Comparativa JS ↔︎ Py

Función
Discord.js Ecosistema
Discord.py Ecosistema

SQLite

sqlite3 / better-sqlite3

sqlite3 stdlib

PostgreSQL

pg

asyncpg, psycopg

ORM

Prisma

SQLAlchemy

Caché

Redis (ioredis)

redis-py


7. Ejemplos Completos

chevron-right[JS] – Sistema de economía con Prismahashtag
chevron-right[Py] – Sistema de economía con SQLAlchemyhashtag

SHARDING Y ESCALABILIDAD

Distribución de carga y clusters

Tabla de Contenidos

  1. ¿Qué es Sharding?

  2. AutoShardedClient (JS)

  3. Sharding Manual (JS)

  4. ShardBot (Py)

  5. Clusters y Balanceo

  6. Comparativa JS ↔︎ Py

  7. Ejemplos Prácticos


1. ¿Qué es Sharding?

El sharding divide instancias del bot por grupos de servidores para sortear límites de 2k servidores por conexión Gateway y distribuir carga.


2. AutoShardedClient (Discord.js)

  • Detecta automáticamente la cantidad óptima de shards.

  • Eventos: shardReady, shardDisconnect, shardError.


3. Sharding manual (Discord.js)

  • Permite control fino de spawn, respawn y comunicación IPC.


4. Sharding en discord.py

  • AutoShardedBot maneja shards automáticamente.

  • Propiedades: bot.shard_id, bot.shard_count.


5. Clusters y balanceo

Clusters con PM2 (JS)

  • -i max crea tantos instancias como núcleos CPU.

  • PM2 maneja auto-restart y logs.

Clusters con multiprocessing (Py)


6. Comparativa JS ↔︎ Py

Aspecto
Discord.js
discord.py

Auto-sharding nativo

AutoShardedClient

AutoShardedBot

Sharding manual

ShardingManager

No nativo (workers)

Clusters múltiples

PM2, Docker autoscaling

multiprocessing, Celery


7. Ejemplos prácticos

chevron-right[JS] – Comunicación entre shardshashtag
chevron-right[Py] – Monitor de shardshashtag

SEGURIDAD Y MEJORES PRÁCTICAS

Protección de tokens, permisos e intentos

Tabla de Contenidos

  1. Gestión de Tokens

  2. Permisos y Roles

  3. Intents Privilegiados

  4. Rate Limits y Manejo

  5. Validación de Datos de Usuario

  6. Seguridad de Dependencias

  7. Ejemplos de Buenas Prácticas


1. Gestión de tokens

  • Mantén el token en variables de entorno (.env).

  • Nunca subas tokens a repositorios públicos.

  • Usa herramientas como GitGuardianarrow-up-right para escaneo automático.

  • Para regenerar token en Discord Developer Portal: BotRegenerate.


2. Permisos y roles

Permiso

JS (PermissionsBitField)

Py (discord.Permissions)

Administrador

PermissionsBitField.Flags.Administrator

discord.Permissions(administrator=True)

Leer mensajes

ViewChannel

read_messages=True

Enviar mensajes

SendMessages

send_messages=True


3. Intentos privilegiados

  • Habilita Server Members Intent y Message Content Intent en Portal.

  • Úsalos solo si es imprescindible, para evitar abusos.

Intent
JS BitField
Py Attribute

Server Members Intent

GuildMembers

intents.members=True

Message Content Intent

MessageContent

intents.message_content=True


4. Rate limits y manejo

  • Discord aplica rate limits por ruta.

  • Usa métodos con retry/backoff.

JS

Py


5. Validación de datos de usuario

  • Sanitiza entradas para evitar inyección de comandos.

  • Limita longitudes de strings y valores numéricos.


6. Seguridad de dependencias

  • Ejecuta npm audit / pip-audit.

  • Usa herramientas como Snyk.

  • Bloquea dependencias con versiones fijas (package-lock.json / requirements.txt).


7. Ejemplos de buenas prácticas

  • Desafío: Evitar leaks de información en errores.

DESPLIEGUE Y HOSTING

Railway, Supabase, VPS, Docker, Cloudflare Tunnels y CI/CD

Tabla de Contenidos

  1. Despliegue en VPS (Ubuntu)

  2. Railway y Supabase

  3. Docker Compose (repaso)

  4. Cloudflare Tunnels

  5. CI/CD con GitHub Actions

  6. Monitoreo y Logs

  7. Escalado Automático


1. VPS con Ubuntu 22.04

Preparación del Servidor

Configuración de usuario

Despliegue manual


2. Railway & Supabase

Servicio
JS
Py

Railway

railway up automatiza deploy Docker

Igual

Supabase

Hosting de Functions (Node)

Functions Python (Edge Functions)


3. Docker Compose (Resumen)

Uso de docker-compose.yml definido en 01-instalacion.


4. Cloudflare Tunnels


5. CI/CD con GitHub Actions


6. Monitoreo y Logs

  • PM2 Dashboard

  • Logrotate Configurar /etc/logrotate.d/bot para rotar logs.

  • Integración con Sentry


7. Escalado Automático

  • Horizontal: Kubernetes / Docker Swarm

  • Vertical: Aumentar recursos VPS o plan Railway


TESTING Y DEBUGGING

Pruebas unitarias, registros y perfil

Contenidos

  1. Logging Avanzado

  2. Tests con Jest (JS) y Pytest (Py)

  3. Coverage

  4. Debugger en VSCode

  5. Profile de Rendimiento


1. Registros avanzados

Librería

JS (winston)

Py (loguru)

Instalación

npm install winston

pip install loguru

Configuración JS


2. Pruebass

JS con Jest

Py con Pytest


3. Coverage

  • JS: jest --coverage

  • Py: pytest --cov=.


4. Debugger VSCode


5. Perfil de rendimiento

  • Uso de clinic.js (JS)

  • Uso de cProfile (Py)


EJEMPLOS COMPLETOS

8 Proyectos Listos para Producción

  1. Bot de Música

  2. Sistema de Tickets

  3. Panel de Administración

  4. Trivia

  5. Economía

  6. Moderación

  7. Dashboard Web

  8. API Gateway

Cada proyecto contiene estructura de carpetas, Dockerfile, tests y despliegue CI/CD.


REFERENCIA API DISCORD.JS

Clases, métodos, propiedades y eventos (v14.21.x)

Clases principales

Clase
Descripción

Client

Cliente principal, conecta al Gateway

Guild

Representa un servidor Discord

TextChannel

Canal de texto

VoiceChannel

Canal de voz

Message

Mensaje en un canal

Interaction

Eventos de interacción (slash, buttons, selects)

Métodos clave

Método
Descripción

client.login()

Autentica con el token

guild.channels.cache

Collection de canales

message.reply()

Responde a un mensaje

interaction.deferReply()

Retraso de respuesta

Propiedades comunes

Propiedad
Descripción

client.user

Instancia de User (bot)

guild.id

ID del servidor

message.author

Usuario que envió el mensaje

interaction.options

Opciones del comando slash

Eventos disponibles

Evento
Descripción

ready

Cliente listo

messageCreate

Nuevo mensaje

interactionCreate

Nueva interacción

guildMemberAdd

Nuevo miembro

(Para la lista exhaustiva de 200+ eventos y métodos, consulta la documentación oficial o usa discord.js.org/docs)


REFERENCIA API DISCORD.PY

Clases, métodos, propiedades y eventos (v2.5.2)

Clases principales

Clase
Descripción

Client / Bot

Cliente principal

Guild

Servidor Discord

TextChannel

Canal de texto

VoiceChannel

Canal de voz

Message

Mensaje en canal

Interaction

Interacción con comandos/aplicaciones

Métodos clave

Método
Descripción

bot.run()

Autentica y conecta al Gateway

guild.channels

Lista de canales

ctx.send()

Envia un mensaje de texto

interaction.response

Métodos de respuesta de Slash Commands

Propiedades comunes

Propiedad
Descripción

bot.user

Bot User

guild.id

ID del servidor

ctx.author

Autor del comando

interaction.data

Datos de la interacción

Eventos disponibles

Evento
Descripción

on_ready

Bot listo

on_message

Mensaje recibido

on_interaction

Interacción recibida

on_member_join

Miembro ingresó

(Para la lista completa de 150+ clases y 300+ métodos, consulta la documentación oficial en discordpy.readthedocs.io)