') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); GitHub - ROM3Z/PyKedex: ¿Eres fan de Pokémon y la programación? PyKedex es tu herramienta definitiva para explorar datos de Pokémon con Python. Consulta estadísticas, habilidades, tipos y más... · GitHub
Skip to content

Latest commit

History

22 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

PyKedex - API Pokémon con FastAPI 🚀

FastAPIPythonPostgreSQLJWT

API REST inspirada en Pokémon construida con FastAPI, PostgreSQL y autenticación JWT. Desarrollado como proyecto educativo para el curso PyKedex de DruidCode.

Características ✨

  • Operaciones CRUD completas para Pokémon, Entrenadores y Batallas
  • Autenticación JWT con roles de admin/superadmin
  • Sistema de batallas por turnos avanzado con:
    • Cálculo de daño 4x/0.25x para múltiples debilidades/resistencias
    • Selección inteligente de Pokémon basada en ventajas de tipo y estadísticas
    • Gestión de Pokémon derrotados (no pueden volver a combatir)
  • Operaciones asíncronas con SQLAlchemy y PostgreSQL
  • Documentación automática con Swagger UI y ReDoc
  • Preparado para producción con seguridad y validaciones

Mejoras Recientes 🚀

Sistema de Batallas

  • Daño 4x/0.25x: Cálculo preciso de múltiples debilidades/resistencias
  • Selección inteligente: Los entrenadores eligen Pokémon estratégicamente
  • Diálogos mejorados: Mensajes especiales para combates extremos
  • MVP: Identificación del Pokémon más valioso en cada batalla

Base de Datos

  • Gestión asíncrona mejorada: Creación y verificación de tablas
  • Pool de conexiones optimizado: Mejor manejo de conexiones concurrentes
  • Sesiones mejoradas: Limpieza automática de recursos

Seguridad

  • Middleware reforzado: Protección adicional para endpoints
  • Manejo de errores: Respuestas estructuradas para excepciones
  • OpenAPI actualizado: Documentación de seguridad mejorada

Estructura del Proyecto 📂

app/
├── routers/
│ ├── admin.py # Endpoints de administración
│ ├── auth.py # Autenticación JWT
│ ├── battle.py # Lógica avanzada de batallas
│ ├── pokemon.py # Endpoints de Pokémon
│ └── trainer.py # Endpoints de Entrenadores
├── crud.py # Operaciones de base de datos
├── database.py # Configuración mejorada de DB
├── create_tables.py # Script para gestión de tablas
├── initial_data.py # Cargador de datos iniciales
├── main.py # Aplicación principal mejorada
├── models.py # Modelos SQLAlchemy
└── schemas.py # Esquemas Pydantic

Instalación ⚙️

  1. Clona el repositorio:
git clone https://github.com/tuusuario/pykedex-api.git
cd pykedex-api
  1. Instala las dependencias:
pip install -r requirements.txt
  1. Configura las variables de entorno en .env:
DATABASE_URL=postgresql+asyncpg://usuario:contraseña@localhost:5432/pykedex
SECRET_KEY=tu-clave-secreta-aqui
ALGORITHM=HS256
ACCESS_TOKEN_EXPIRE_MINUTES=30
  1. (Opcional) Crea las tablas:
python app/create_tables.py
  1. Ejecuta la aplicación:
uvicorn app.main:app --reload

Documentación de la API 📚

Una vez en funcionamiento, accede a la documentación interactiva:

Ejemplo de Batalla Mejorada ⚔️

POST /battlesAuthorization: Bearer <tu-token>Content-Type: application/json
{
"trainer_id": 1,
"opponent_id": 2,
"smart_selection": true# Activa selección inteligente de Pokémon
}

Respuesta incluye:

  • Turnos detallados con efectividad de ataques (x4, x2, x0.5, x0.25)
  • MVP de la batalla (Pokémon más valioso)
  • Pokémon derrotados que no podrán volver a combatir

Contribuciones 🤝

¡Las contribuciones son bienvenidas! Abre un issue o envía un pull request.

Licencia 📜

Este proyecto está bajo la Licencia MIT - ver el archivo LICENSE para más detalles.


Desarrollado por Isaac Rodríguez ROMEZ
Para el Curso PyKedex de DruidCode

"¡Los combates Pokémon ahora son más estratégicos que nunca!"

About

¿Eres fan de Pokémon y la programación? PyKedex es tu herramienta definitiva para explorar datos de Pokémon con Python. Consulta estadísticas, habilidades, tipos y más...

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages