This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
PyCamp_Bot es un bot de Telegram diseñado para organizar y gestionar PyCamps (eventos de Python Argentina). Maneja la carga de proyectos, votación, cronogramas, y asignación de magos (ayudantes) durante el evento.
TOKEN: Token del bot de Telegram (obtener de @BotFather)PYCAMP_BOT_MASTER_KEY: Password para comandos de adminSENTRY_DATA_SOURCE_NAME: (Opcional) ID de Sentry para monitoreo
python3 -m venv venv
source venv/bin/activate
pip install -e '.[dev]'TOKEN='tu_token' PYCAMP_BOT_MASTER_KEY='tu_clave' python bin/run_bot.py- Crear archivo de configuración:
cp .env.example .env
- Editar
.envcon tus valores - Ejecutar:
python bin/run_bot.py # Lee automáticamente .env
make # Construye imagen (si no existe) y ejecuta el bot
make build # Solo construir la imagen
make run # Solo ejecutar (requiere .env)El Dockerfile usa python:3.10-slim para balance óptimo entre tamaño (~150MB) y compatibilidad.
Los comandos del proyecto (bot, tests) se ejecutan dentro del contenedor cuando se usa el Makefile.
make test # Ejecuta pytest en el contenedor
make test-cov # pytest con reporte de cobertura (--cov=pycamp_bot)pytest # Todos los tests
pytest test/test_wizard.py # Test específico
pytest -v # Modo verboseflake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statisticsLos comandos del bot están organizados modularmente en src/pycamp_bot/commands/:
auth.py: Autenticación y manejo de admins (/su,/admins,/degradar)manage_pycamp.py: Gestión de PyCamps (/empezar_pycamp,/activar_pycamp,/terminar_pycamp)projects.py: CRUD de proyectos (/cargar_proyecto,/proyectos,/borrar_proyecto)voting.py: Sistema de votación (/votar,/empezar_votacion_proyectos,/terminar_votacion_proyectos)schedule.py: Generación de cronogramas (/cronogramear,/cambiar_slot)wizard.py: Sistema de magos (/ser_magx,/agendar_magx,/evocar_magx)announcements.py: Anuncios (/anunciar)raffle.py: Sorteo de pycampistas (/rifar)base.py: Comandos básicos (/start,/ayuda)
Cada módulo de comandos tiene su función set_handlers(application) que registra los CommandHandler en el bot.
En src/pycamp_bot/models.py:
Pycamp: Representa un evento PyCampPycampista: Usuario del bot con info de llegada/salida, wizard status, admin statusPycampistaAtPycamp: RelaciónMany-to-Many entre Pycampistas y PycampsWizardAtPycamp: Asignación de magos en slots de tiempo específicosProject: Proyectos presentados con nombre, dificultad, tema, slot, ownerSlot: Slots de tiempo para presentaciones de proyectosVote: Votos de pycampistas sobre proyectos (con campointerest)
La base de datos es SQLite (pycamp_projects.db).
El algoritmo de scheduling (src/pycamp_bot/scheduler/schedule_calculator.py) usa random restart hill climbing para optimizar el cronograma basándose en múltiples factores:
- Colisiones de responsables y participantes
- Disponibilidad de responsables
- Proyectos más votados
- Distribución de población en slots
- Balance de niveles de dificultad y temas
- Admin hace
/su <password>para obtener permisos - Admin ejecuta
/empezar_pycamp <nombre>para crear el PyCamp - Admin ejecuta
/empezar_carga_proyectos - Pycampistas cargan proyectos con
/cargar_proyecto - Admin ejecuta
/terminar_carga_proyectosy/empezar_votacion_proyectos - Pycampistas votan con
/votar - Admin ejecuta
/terminar_votacion_proyectosy/cronogramearpara generar el schedule - Pycampistas se registran como magos con
/ser_magx - Admin ejecuta
/agendar_magxpara asignar turnos de magos - Durante el evento:
/evocar_magxpara llamar al mago de turno
Los magos son pycampistas que ayudan durante el evento. El bot:
- Permite registro con
/ser_magx - Asigna automáticamente turnos de 9-13 y 14-19 con
/agendar_magx - Identifica al mago de turno actual usando timezone de Córdoba, Argentina
- Usa
Pycampista.is_busy()para evitar conflictos con presentaciones de proyectos
- Mensajes de commit en español: formato
{tipo}({alcance}): {Resumen}\n\nDetalles. - Sin co-author en commits
- Logging con el módulo
pycamp_bot.logger - Comandos usan async/await (python-telegram-bot v21)
- Tests con pytest y freezegun para mocking de fechas
La DB se inicializa automáticamente al ejecutar bin/run_bot.py mediante models_db_connection(). El archivo pycamp_projects.db persiste entre ejecuciones.
Para migraciones, ver directorio migrations/ con scripts de migración manual.
El proyecto incluye un Makefile para simplificar el uso de Docker:
makeomake all: Construye la imagen y ejecuta el contenedormake build: Solo construye la imagen Dockermake run: Solo ejecuta el contenedor (requiere imagen existente)make test: Ejecuta pytest dentro del contenedor
Todos los comandos usan el archivo .env para las variables de entorno.
- Usa
python:3.10-slimcomo base (~150MB) - Instala el paquete en modo editable
- CMD por defecto:
python bin/run_bot.py - El archivo
.envdebe existir paramake runymake test
- El bot requiere que usuarios tengan username de Telegram configurado
- Zona horaria por defecto:
America/Argentina/Cordoba - Duración de slots por defecto: 60 minutos (
DEFAULT_SLOT_PERIOD) - Un solo PyCamp puede estar "activo" a la vez
- Los votos previenen duplicados usando el campo
_project_pycampista_id - El archivo
.envestá en.gitignore(nunca commitear credenciales) .env.examplecontiene el template de configuración