feat: Add complete EJS documentation layout and sections for Amayo Bot

- Created main index.ejs view with header, footer, and content structure.
- Developed layout.ejs for consistent styling across pages.
- Implemented partials for various sections including admin, alliances, chests, basic commands, crafting, economy, and more.
- Added a table of contents for easy navigation.
- Included responsive design elements and animations using Tailwind CSS.
- Migrated content to EJS format for dynamic rendering.
This commit is contained in:
2025-10-07 12:08:58 -05:00
parent 3f5757d28f
commit 3904c00114
32 changed files with 669 additions and 253 deletions

89
package-lock.json generated
View File

@@ -16,6 +16,7 @@
"chrono-node": "2.9.0",
"discord-api-types": "0.38.26",
"discord.js": "15.0.0-dev.1759363313-f510b5ffa",
"ejs": "^3.1.10",
"newrelic": "13.4.0",
"node-appwrite": "19.1.0",
"pino": "9.13.0",
@@ -23,6 +24,7 @@
"redis": "5.8.2"
},
"devDependencies": {
"@types/ejs": "^3.1.5",
"@types/node": "24.3.1",
"ts-node": "10.9.2",
"typescript": "5.9.2"
@@ -1054,6 +1056,13 @@
"dev": true,
"license": "MIT"
},
"node_modules/@types/ejs": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/@types/ejs/-/ejs-3.1.5.tgz",
"integrity": "sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/luxon": {
"version": "3.4.2",
"resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.4.2.tgz",
@@ -1188,6 +1197,12 @@
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
"license": "Python-2.0"
},
"node_modules/async": {
"version": "3.2.6",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
"integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
"license": "MIT"
},
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@@ -1214,6 +1229,12 @@
"proxy-from-env": "^1.1.0"
}
},
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"license": "MIT"
},
"node_modules/base64-js": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
@@ -1255,6 +1276,15 @@
"readable-stream": "^3.4.0"
}
},
"node_modules/brace-expansion": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
}
},
"node_modules/buffer": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
@@ -1645,6 +1675,21 @@
"fast-check": "^3.23.1"
}
},
"node_modules/ejs": {
"version": "3.1.10",
"resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
"integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
"license": "Apache-2.0",
"dependencies": {
"jake": "^10.8.5"
},
"bin": {
"ejs": "bin/cli.js"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@@ -1788,6 +1833,15 @@
"integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==",
"license": "MIT"
},
"node_modules/filelist": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
"integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
"license": "Apache-2.0",
"dependencies": {
"minimatch": "^5.0.1"
}
},
"node_modules/find-package-json": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/find-package-json/-/find-package-json-1.2.0.tgz",
@@ -2187,6 +2241,23 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/jake": {
"version": "10.9.4",
"resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz",
"integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==",
"license": "Apache-2.0",
"dependencies": {
"async": "^3.2.6",
"filelist": "^1.0.4",
"picocolors": "^1.1.1"
},
"bin": {
"jake": "bin/cli.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/jiti": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/jiti/-/jiti-2.5.1.tgz",
@@ -2377,6 +2448,18 @@
"integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
"license": "ISC"
},
"node_modules/minimatch": {
"version": "5.1.6",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
"integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
"license": "ISC",
"dependencies": {
"brace-expansion": "^2.0.1"
},
"engines": {
"node": ">=10"
}
},
"node_modules/minimist": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
@@ -2607,6 +2690,12 @@
"integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==",
"license": "MIT"
},
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
"license": "ISC"
},
"node_modules/pino": {
"version": "9.13.0",
"resolved": "https://registry.npmjs.org/pino/-/pino-9.13.0.tgz",

View File

@@ -1,6 +1,6 @@
{
"name": "amayo",
"version": "2.0.1",
"version": "2.0.15",
"description": "",
"main": "src/main.ts",
"scripts": {
@@ -13,6 +13,7 @@
"dev:optimized": "MEMORY_LOG_INTERVAL_SECONDS=300 ENABLE_MEMORY_OPTIMIZER=true NODE_OPTIONS='--expose-gc' npx tsx watch src/main.ts",
"start:prod": "NODE_ENV=production NODE_OPTIONS=--max-old-space-size=384 npx tsx src/main.ts",
"start:prod-optimized": "NODE_ENV=production ENABLE_MEMORY_OPTIMIZER=true NODE_OPTIONS='--max-old-space-size=512 --expose-gc' npx tsx src/main.ts",
"tsc": "tsc",
"typecheck": "tsc --noEmit",
"seed:minigames": "tsx src/game/minigames/seed.ts",
"start:optimize-relic": "NODE_ENV=production ENABLE_MEMORY_OPTIMIZER=true NEW_RELIC_APP_NAME=amayo NEW_RELIC_LICENSE_KEY=85ef833e676ed6ea726e23b3e373397dFFFFNRAL NODE_OPTIONS='--max-old-space-size=512 --expose-gc' npx tsx --experimental-loader=newrelic/esm-loader.mjs src/main.ts"
@@ -29,6 +30,7 @@
"chrono-node": "2.9.0",
"discord-api-types": "0.38.26",
"discord.js": "15.0.0-dev.1759363313-f510b5ffa",
"ejs": "^3.1.10",
"newrelic": "13.4.0",
"node-appwrite": "19.1.0",
"pino": "9.13.0",
@@ -36,6 +38,7 @@
"redis": "5.8.2"
},
"devDependencies": {
"@types/ejs": "^3.1.5",
"@types/node": "24.3.1",
"ts-node": "10.9.2",
"typescript": "5.9.2"

View File

@@ -1,210 +0,0 @@
<!DOCTYPE html>
<html lang="es" class="scroll-smooth">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Amayo Bot | Guía Completa - Diseño Moderno</title>
<meta name="description" content="Guía completa ultra moderna de Amayo Bot para Discord">
<script src="https://cdn.tailwindcss.com"></script>
<script>
tailwind.config = {
theme: {
extend: {
animation: {
'gradient': 'gradient 8s linear infinite',
'float': 'float 6s ease-in-out infinite',
'glow': 'glow 3s ease-in-out infinite',
'slide-in': 'slideIn 0.5s ease-out',
},
keyframes: {
gradient: {
'0%, 100%': { backgroundPosition: '0% 50%' },
'50%': { backgroundPosition: '100% 50%' },
},
float: {
'0%, 100%': { transform: 'translateY(0)' },
'50%': { transform: 'translateY(-20px)' },
},
glow: {
'0%, 100%': { opacity: '0.4' },
'50%': { opacity: '0.8' },
},
slideIn: {
'0%': { transform: 'translateY(20px)', opacity: '0' },
'100%': { transform: 'translateY(0)', opacity: '1' },
},
},
},
},
};
</script>
<link rel="stylesheet" href="./assets/css/styles.css">
</head>
<body class="min-h-screen bg-gradient-to-br from-slate-950 via-slate-900 to-slate-950 text-slate-100 antialiased">
<!-- Animated Background Blobs -->
<div class="fixed inset-0 overflow-hidden pointer-events-none z-0">
<div class="absolute top-0 left-1/4 w-96 h-96 bg-purple-500/20 rounded-full mix-blend-screen filter blur-3xl animate-float"></div>
<div class="absolute top-1/3 right-1/4 w-96 h-96 bg-indigo-500/20 rounded-full mix-blend-screen filter blur-3xl animate-float" style="animation-delay: 2s;"></div>
<div class="absolute bottom-0 left-1/3 w-96 h-96 bg-pink-500/15 rounded-full mix-blend-screen filter blur-3xl animate-float" style="animation-delay: 4s;"></div>
</div>
<div class="relative z-10">
<!-- Hero Ultra Moderno -->
<header class="relative overflow-hidden border-b border-white/5">
<div class="absolute inset-0 bg-gradient-to-b from-indigo-500/5 via-purple-500/5 to-transparent"></div>
<div class="container mx-auto px-4 sm:px-6 lg:px-8 py-20 sm:py-28 relative">
<div class="max-w-5xl mx-auto text-center space-y-8">
<!-- Badge con Pulse -->
<div class="inline-flex items-center gap-3 px-5 py-2.5 rounded-full bg-gradient-to-r from-indigo-500/10 via-purple-500/10 to-pink-500/10 border border-indigo-500/30 backdrop-blur-sm">
<span class="relative flex h-2.5 w-2.5">
<span class="animate-ping absolute inline-flex h-full w-full rounded-full bg-indigo-400 opacity-75"></span>
<span class="relative inline-flex rounded-full h-2.5 w-2.5 bg-gradient-to-r from-indigo-400 to-purple-400"></span>
</span>
<span class="text-sm font-bold tracking-wider uppercase bg-clip-text text-transparent bg-gradient-to-r from-indigo-200 to-purple-200">
Amayo Bot • v0.11.20
</span>
</div>
<!-- Título con Gradiente Animado -->
<h1 class="text-5xl sm:text-6xl md:text-7xl lg:text-8xl font-black leading-tight">
<span class="block bg-clip-text text-transparent bg-gradient-to-r from-white via-indigo-100 to-purple-100 animate-gradient bg-[length:200%_auto]">
Guía Completa
</span>
<span class="block bg-clip-text text-transparent bg-gradient-to-r from-indigo-400 via-purple-400 to-pink-400 animate-gradient bg-[length:200%_auto]">
Amayo Bot
</span>
</h1>
<!-- Descripción -->
<p class="text-xl sm:text-2xl text-slate-300 max-w-3xl mx-auto leading-relaxed font-light">
Sistema completo de <span class="font-semibold text-indigo-300">economía</span>, <span class="font-semibold text-purple-300">minijuegos</span>, <span class="font-semibold text-pink-300">misiones</span> y <span class="font-semibold text-blue-300">IA</span> para Discord
</p>
<!-- CTA Buttons Modernos -->
<div class="flex flex-col sm:flex-row gap-4 justify-center items-center pt-4">
<a href="#primeros-pasos" class="group relative px-10 py-4 text-lg font-bold text-white overflow-hidden rounded-2xl transition-all duration-300 hover:scale-105">
<div class="absolute inset-0 bg-gradient-to-r from-indigo-600 to-purple-600 transition-transform duration-300 group-hover:scale-110"></div>
<div class="absolute inset-0 bg-gradient-to-r from-indigo-500 to-purple-500 opacity-0 group-hover:opacity-100 transition-opacity duration-300"></div>
<span class="relative flex items-center gap-2">
Comenzar ahora
<svg class="w-5 h-5 transition-transform group-hover:translate-x-1" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M13 7l5 5m0 0l-5 5m5-5H6"></path>
</svg>
</span>
</a>
<button id="toggle-nav" class="group px-10 py-4 text-lg font-bold text-white backdrop-blur-xl bg-white/5 border-2 border-white/10 rounded-2xl hover:bg-white/10 hover:border-white/20 hover:scale-105 transition-all duration-300">
<span class="flex items-center gap-2">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"></path>
</svg>
Ver índice
</span>
</button>
</div>
<!-- Meta Info Ultra Moderno -->
<div class="flex flex-wrap justify-center gap-3 pt-6">
<span class="px-5 py-2 rounded-xl bg-white/5 backdrop-blur-sm border border-white/10 text-sm font-medium text-slate-300 hover:bg-white/10 transition-all">
Discord.js 15.0-dev
</span>
<span class="px-5 py-2 rounded-xl bg-white/5 backdrop-blur-sm border border-white/10 text-sm font-medium text-slate-300 hover:bg-white/10 transition-all">
Enero 2025
</span>
<span class="px-5 py-2 rounded-xl bg-gradient-to-r from-indigo-500/10 to-purple-500/10 border border-indigo-500/30 text-sm font-bold text-indigo-200 hover:from-indigo-500/20 hover:to-purple-500/20 transition-all">
23 Secciones Completas
</span>
</div>
</div>
</div>
</header>
<!-- TEST: Una sección moderna para ver el estilo -->
<div class="container mx-auto px-4 sm:px-6 lg:px-8 py-16">
<div class="max-w-4xl mx-auto">
<div class="rounded-3xl bg-gradient-to-br from-slate-800/40 to-slate-900/40 backdrop-blur-2xl border border-white/10 p-8 sm:p-12 shadow-2xl hover:shadow-indigo-500/10 transition-all duration-500 hover:border-indigo-500/30 animate-slide-in">
<div class="mb-8">
<div class="inline-block">
<h2 class="text-4xl sm:text-5xl font-black mb-4 bg-clip-text text-transparent bg-gradient-to-r from-white to-indigo-200">
🚀 Primeros Pasos
</h2>
<div class="h-1.5 bg-gradient-to-r from-indigo-500 via-purple-500 to-pink-500 rounded-full"></div>
</div>
</div>
<p class="text-lg sm:text-xl text-slate-300 leading-relaxed mb-10">
¡Bienvenido a <span class="font-bold text-white">Amayo Bot</span>! Este bot transforma tu servidor en una experiencia de juego completa.
</p>
<!-- Feature Grid Moderno -->
<div class="rounded-2xl bg-gradient-to-br from-indigo-500/10 to-purple-500/10 border border-indigo-500/20 p-8 mb-8">
<h3 class="text-2xl font-bold text-indigo-200 mb-6 flex items-center gap-3">
<span class="text-3xl"></span>
Características Principales
</h3>
<div class="grid gap-4">
<div class="flex items-start gap-4 p-4 rounded-xl bg-slate-800/30 border border-slate-700/50 hover:border-indigo-500/50 hover:bg-slate-800/50 transition-all duration-300">
<span class="text-2xl">🎮</span>
<div>
<h4 class="font-bold text-white mb-1">Minijuegos Épicos</h4>
<p class="text-sm text-slate-400">Mina, pesca, pelea y cultiva recursos</p>
</div>
</div>
<div class="flex items-start gap-4 p-4 rounded-xl bg-slate-800/30 border border-slate-700/50 hover:border-purple-500/50 hover:bg-slate-800/50 transition-all duration-300">
<span class="text-2xl">💰</span>
<div>
<h4 class="font-bold text-white mb-1">Economía Completa</h4>
<p class="text-sm text-slate-400">Tienda, crafteo e inventario</p>
</div>
</div>
<div class="flex items-start gap-4 p-4 rounded-xl bg-slate-800/30 border border-slate-700/50 hover:border-pink-500/50 hover:bg-slate-800/50 transition-all duration-300">
<span class="text-2xl">🏆</span>
<div>
<h4 class="font-bold text-white mb-1">Progresión & Logros</h4>
<p class="text-sm text-slate-400">Misiones, logros y rachas diarias</p>
</div>
</div>
</div>
</div>
<!-- Info Cards -->
<div class="grid md:grid-cols-2 gap-4">
<div class="group p-6 rounded-2xl bg-slate-800/50 border border-slate-700/50 hover:border-indigo-500/50 hover:bg-slate-800/70 transition-all duration-300 hover:scale-105 hover:shadow-xl hover:shadow-indigo-500/10">
<div class="flex items-center gap-3 mb-4">
<span class="text-4xl"></span>
<h3 class="text-xl font-bold text-white">Prefix: <code class="px-3 py-1 rounded-lg bg-indigo-500/20 text-indigo-200 border border-indigo-500/30">!</code></h3>
</div>
<p class="text-sm text-slate-400">Personalizable con <code class="px-2 py-0.5 rounded bg-slate-700/50 text-slate-300">!configuracion</code></p>
</div>
<div class="group p-6 rounded-2xl bg-slate-800/50 border border-slate-700/50 hover:border-purple-500/50 hover:bg-slate-800/70 transition-all duration-300 hover:scale-105 hover:shadow-xl hover:shadow-purple-500/10">
<div class="flex items-center gap-3 mb-4">
<span class="text-4xl"></span>
<h3 class="text-xl font-bold text-white">Ayuda</h3>
</div>
<p class="text-sm text-slate-400">Usa <code class="px-2 py-0.5 rounded bg-purple-500/20 text-purple-200 border border-purple-500/30">!ayuda</code> para ver comandos</p>
</div>
</div>
</div>
<!-- Mensaje para el usuario -->
<div class="mt-12 p-8 rounded-3xl bg-gradient-to-r from-indigo-500/10 via-purple-500/10 to-pink-500/10 border border-indigo-500/30 backdrop-blur-sm text-center">
<p class="text-2xl font-bold text-white mb-3">✨ Este es el nuevo diseño ultra moderno ✨</p>
<p class="text-lg text-slate-300">¿Te gusta este estilo? Todas las 23 secciones tendrán este diseño con:</p>
<div class="flex flex-wrap justify-center gap-3 mt-6">
<span class="px-4 py-2 rounded-xl bg-white/5 text-sm font-medium text-slate-300">Glassmorphism</span>
<span class="px-4 py-2 rounded-xl bg-white/5 text-sm font-medium text-slate-300">Hover Effects</span>
<span class="px-4 py-2 rounded-xl bg-white/5 text-sm font-medium text-slate-300">Gradientes</span>
<span class="px-4 py-2 rounded-xl bg-white/5 text-sm font-medium text-slate-300">Animaciones</span>
<span class="px-4 py-2 rounded-xl bg-white/5 text-sm font-medium text-slate-300">100% Tailwind</span>
</div>
</div>
</div>
</div>
</div>
<script src="./assets/js/main.js" type="module"></script>
</body>
</html>

View File

@@ -1,8 +1,24 @@
import { createServer, IncomingMessage, ServerResponse } from "node:http";
import { promises as fs } from "node:fs";
import { readFileSync } from "node:fs";
import path from "node:path";
import ejs from "ejs";
const publicDir = path.join(__dirname, "public");
const viewsDir = path.join(__dirname, "views");
// Cargar metadatos del proyecto para usarlos como variables en las vistas
let pkg: {
name?: string;
version?: string;
dependencies?: Record<string, string>;
} = {};
try {
const pkgPath = path.join(__dirname, "../../package.json");
pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
} catch {
// Ignorar si no se puede leer; usaremos valores por defecto
}
const MIME_TYPES: Record<string, string> = {
".html": "text/html; charset=utf-8",
@@ -55,51 +71,99 @@ const sendResponse = async (
res.end(data);
};
export const server = createServer(async (req: IncomingMessage, res: ServerResponse) => {
try {
// 🔒 Forzar HTTPS en producción (Heroku)
if (process.env.NODE_ENV === "production") {
const proto = req.headers["x-forwarded-proto"];
if (proto && proto !== "https") {
res.writeHead(301, {
Location: `https://${req.headers.host}${req.url}`,
});
return res.end();
}
}
const url = new URL(req.url ?? "/", `http://${req.headers.host ?? "localhost"}`);
const filePath = resolvePath(url.pathname);
if (!filePath.startsWith(publicDir)) {
res.writeHead(403);
res.end("Forbidden");
return;
}
const renderTemplate = async (
res: ServerResponse,
template: string,
locals: Record<string, any> = {},
statusCode = 200
) => {
const pageFile = path.join(viewsDir, "pages", `${template}.ejs`);
const layoutFile = path.join(viewsDir, "layouts", "layout.ejs");
const body = await ejs.renderFile(pageFile, locals, { async: true });
const html = await ejs.renderFile(
layoutFile,
{ ...locals, body },
{ async: true }
);
res.writeHead(statusCode, {
"Content-Type": "text/html; charset=utf-8",
"Cache-Control": "no-cache",
});
res.end(html);
};
export const server = createServer(
async (req: IncomingMessage, res: ServerResponse) => {
try {
await sendResponse(res, filePath);
} catch (error: any) {
if (error.code === "ENOENT") {
const notFoundPath = path.join(publicDir, "404.html");
try {
await sendResponse(res, notFoundPath, 404);
} catch {
res.writeHead(404, { "Content-Type": "text/plain; charset=utf-8" });
res.end("404 - Recurso no encontrado");
// 🔒 Forzar HTTPS en producción (Heroku)
if (process.env.NODE_ENV === "production") {
const proto = req.headers["x-forwarded-proto"];
if (proto && proto !== "https") {
res.writeHead(301, {
Location: `https://${req.headers.host}${req.url}`,
});
return res.end();
}
} else if (error.code === "EISDIR") {
const indexPath = path.join(filePath, "index.html");
await sendResponse(res, indexPath);
} else {
console.error("[Server] Error al servir archivo:", error);
res.writeHead(500, { "Content-Type": "text/plain; charset=utf-8" });
res.end("500 - Error interno del servidor");
}
const url = new URL(
req.url ?? "/",
`http://${req.headers.host ?? "localhost"}`
);
// Ruta dinámica: renderizar index con EJS
if (
url.pathname === "/" ||
url.pathname === "/index" ||
url.pathname === "/index.html"
) {
const now = new Date();
const currentDateHuman = now.toLocaleDateString("es-ES", {
month: "long",
year: "numeric",
});
const djsVersion = pkg?.dependencies?.["discord.js"] ?? "15.0.0-dev";
await renderTemplate(res, "index", {
appName: pkg.name ?? "Amayo Bot",
version: pkg.version ?? "2.0.0",
djsVersion,
currentDateHuman,
});
return;
}
const filePath = resolvePath(url.pathname);
if (!filePath.startsWith(publicDir)) {
res.writeHead(403);
res.end("Forbidden");
return;
}
try {
await sendResponse(res, filePath);
} catch (error: any) {
if (error.code === "ENOENT") {
const notFoundPath = path.join(publicDir, "404.html");
try {
await sendResponse(res, notFoundPath, 404);
} catch {
res.writeHead(404, { "Content-Type": "text/plain; charset=utf-8" });
res.end("404 - Recurso no encontrado");
}
} else if (error.code === "EISDIR") {
const indexPath = path.join(filePath, "index.html");
await sendResponse(res, indexPath);
} else {
console.error("[Server] Error al servir archivo:", error);
res.writeHead(500, { "Content-Type": "text/plain; charset=utf-8" });
res.end("500 - Error interno del servidor");
}
}
} catch (error) {
console.error("[Server] Error inesperado:", error);
res.writeHead(500, { "Content-Type": "text/plain; charset=utf-8" });
res.end("500 - Error interno");
}
} catch (error) {
console.error("[Server] Error inesperado:", error);
res.writeHead(500, { "Content-Type": "text/plain; charset=utf-8" });
res.end("500 - Error interno");
}
});
);

108
src/server/views/index.ejs Normal file
View File

@@ -0,0 +1,108 @@
<% const pageTitle = `${appName} | Guía Completa`; %>
<% const head = null; %>
<% const scripts = null; %>
<% const title = pageTitle; %>
<% layout('layouts/layout', { title, head, scripts, appName, version, djsVersion, currentDateHuman }); %>
<header class="relative overflow-hidden ">
<div class="absolute inset-0 bg-gradient-to-b from-indigo-500/5 via-purple-500/5 to-transparent"></div>
<div class="container mx-auto px-4 sm:px-6 lg:px-8 py-20 sm:py-28 relative">
<div class="max-w-5xl mx-auto text-center space-y-8">
<div class="inline-flex items-center gap-3 px-5 py-2.5 rounded-full bg-gradient-to-r from-indigo-500/10 via-purple-500/10 to-pink-500/10 border border-indigo-500/30 backdrop-blur-sm">
<span class="relative flex h-2.5 w-2.5">
<span class="animate-ping absolute inline-flex h-full w-full rounded-full bg-indigo-400 opacity-75"></span>
<span class="relative inline-flex rounded-full h-2.5 w-2.5 bg-gradient-to-r from-indigo-400 to-purple-400"></span>
</span>
<span class="text-sm font-bold tracking-wider uppercase bg-clip-text text-transparent bg-gradient-to-r from-indigo-200 to-purple-200">
<%= appName %> • v<%= version %>
</span>
</div>
<h1 class="text-5xl sm:text-6xl md:text-7xl lg:text-8xl font-black leading-tight">
<span class="block bg-clip-text text-transparent bg-gradient-to-r from-white via-indigo-100 to-purple-100">
Guía Completa
</span>
<span class="block bg-clip-text text-transparent bg-gradient-to-r from-indigo-400 via-purple-400 to-pink-400">
<%= appName %>
</span>
</h1>
<p class="text-xl sm:text-2xl text-slate-300 max-w-3xl mx-auto leading-relaxed font-light">
Sistema completo de <span class="font-semibold text-indigo-300">economía</span>, <span class="font-semibold text-purple-300">minijuegos</span>, <span class="font-semibold text-pink-300">misiones</span> y <span class="font-semibold text-blue-300">IA</span> para Discord
</p>
<div class="flex flex-col sm:flex-row gap-4 justify-center items-center pt-4">
<a href="#primeros-pasos" class="group relative px-10 py-4 text-lg font-bold text-white overflow-hidden rounded-2xl transition-all duration-300 hover:scale-105">
<div class="absolute inset-0 bg-gradient-to-r from-indigo-600 to-purple-600 transition-transform duration-300 group-hover:scale-110"></div>
<div class="absolute inset-0 bg-gradient-to-r from-indigo-500 to-purple-500 opacity-0 group-hover:opacity-100 transition-opacity duration-300"></div>
<span class="relative flex items-center gap-2">
Comenzar ahora
<svg class="w-5 h-5 transition-transform group-hover:translate-x-1" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M13 7l5 5m0 0l-5 5m5-5H6"></path>
</svg>
</span>
</a>
<button id="toggle-nav" class="group px-10 py-4 text-lg font-bold text-white backdrop-blur-xl bg-white/5 border-2 border-white/10 rounded-2xl hover:bg-white/10 hover:border-white/20 hover:scale-105 transition-all duration-300">
<span class="flex items-center gap-2">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"></path>
</svg>
Ver índice
</span>
</button>
</div>
<div class="flex flex-wrap justify-center gap-3 pt-6">
<span class="px-5 py-2 rounded-xl bg-white/5 backdrop-blur-sm border border-white/10 text-sm font-medium text-slate-300 hover:bg-white/10 transition-all">
Discord.js <%= djsVersion %>
</span>
<span class="px-5 py-2 rounded-xl bg-white/5 backdrop-blur-sm border border-white/10 text-sm font-medium text-slate-300 hover:bg-white/10 transition-all">
<%= currentDateHuman %>
</span>
<span class="px-5 py-2 rounded-xl bg-gradient-to-r from-indigo-500/10 to-purple-500/10 border border-indigo-500/30 text-sm font-bold text-indigo-200 hover:from-indigo-500/20 hover:to-purple-500/20 transition-all">
23 Secciones • Creación de Contenido Incluida
</span>
</div>
</div>
</div>
</header>
<div class="container mx-auto px-4 sm:px-6 lg:px-8 py-12 lg:py-16">
<div class="flex min-h-screen flex-col">
<div class="mx-auto flex w-full max-w-6xl flex-1 flex-col gap-10 px-6 pb-16 lg:flex-row lg:px-10">
<%- include('partials/toc') %>
<main class="flex-1">
<div class="mx-auto flex w-full max-w-3xl flex-col gap-8">
<%- include('partials/sections/primeros-pasos') %>
<%- include('partials/sections/comandos-basicos') %>
<%- include('partials/sections/sistema-juego') %>
<%- include('partials/sections/minijuegos') %>
<%- include('partials/sections/inventario-equipo') %>
<%- include('partials/sections/economia') %>
<%- include('partials/sections/tienda') %>
<%- include('partials/sections/crafteo') %>
<%- include('partials/sections/logros') %>
<%- include('partials/sections/misiones') %>
<%- include('partials/sections/racha') %>
<%- include('partials/sections/consumibles') %>
<%- include('partials/sections/cofres') %>
<%- include('partials/sections/encantamientos') %>
<%- include('partials/sections/fundicion') %>
<%- include('partials/sections/ia') %>
<%- include('partials/sections/recordatorios') %>
<%- include('partials/sections/alianzas') %>
<%- include('partials/sections/admin') %>
<%- include('partials/sections/creacion-contenido') %>
<%- include('partials/sections/configuracion') %>
<%- include('partials/sections/estadisticas') %>
<%- include('partials/sections/tips') %>
<%- include('partials/sections/faq') %>
</div>
</main>
</div>
</div>
</div>

View File

@@ -0,0 +1,99 @@
<!DOCTYPE html>
<html lang="es" class="scroll-smooth">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><%= title || `${appName} | Guía Completa` %></title>
<meta name="description" content="Guía completa de Amayo Bot: comandos, minijuegos, economía, misiones, logros, creación de contenido y más">
<script src="https://cdn.tailwindcss.com"></script>
<script>
tailwind.config = {
theme: {
extend: {
animation: {
'gradient': 'gradient 8s linear infinite',
'float': 'float 6s ease-in-out infinite',
'glow': 'glow 3s ease-in-out infinite',
'slide-in': 'slideIn 0.5s ease-out',
},
keyframes: {
gradient: {
'0%, 100%': { backgroundPosition: '0% 50%' },
'50%': { backgroundPosition: '100% 50%' },
},
float: {
'0%, 100%': { transform: 'translateY(0)' },
'50%': { transform: 'translateY(-20px)' },
},
glow: {
'0%, 100%': { opacity: '0.4' },
'50%': { opacity: '0.8' },
},
slideIn: {
'0%': { transform: 'translateY(20px)', opacity: '0' },
'100%': { transform: 'translateY(0)', opacity: '1' },
},
},
},
},
};
</script>
<link rel="stylesheet" href="/assets/css/styles.css">
<% if (head) { %>
<%= head %>
<% } %>
</head>
<body class="min-h-screen bg-gradient-to-br from-slate-950 via-slate-900 to-slate-950 text-slate-100 antialiased">
<!-- Animated Background Blobs -->
<div class="fixed inset-0 overflow-hidden pointer-events-none z-0">
<div class="absolute top-0 left-1/4 w-96 h-96 bg-purple-500/20 rounded-full mix-blend-screen filter blur-3xl animate-float"></div>
<div class="absolute top-1/3 right-1/4 w-96 h-96 bg-indigo-500/20 rounded-full mix-blend-screen filter blur-3xl animate-float" style="animation-delay: 2s;"></div>
<div class="absolute bottom-0 left-1/3 w-96 h-96 bg-pink-500/15 rounded-full mix-blend-screen filter blur-3xl animate-float" style="animation-delay: 4s;"></div>
</div>
<div class="relative z-10">
<%- body %>
</div>
<footer class="border-t border-white/5 bg-slate-950/80 py-10 text-center">
<div class="mx-auto max-w-5xl px-6">
<div class="mb-6">
<p class="text-2xl font-bold text-white mb-2"><%= appName %></p>
<p class="text-sm text-slate-400">Sistema completo de juego, economía y gestión para Discord</p>
</div>
<div class="flex flex-wrap justify-center gap-4 mb-6 text-sm">
<a href="#primeros-pasos" class="text-indigo-300 transition hover:text-indigo-200">Primeros Pasos</a>
<span class="text-slate-600">•</span>
<a href="#comandos-basicos" class="text-indigo-300 transition hover:text-indigo-200">Comandos</a>
<span class="text-slate-600">•</span>
<a href="#minijuegos" class="text-indigo-300 transition hover:text-indigo-200">Minijuegos</a>
<span class="text-slate-600">•</span>
<a href="#faq" class="text-indigo-300 transition hover:text-indigo-200">FAQ</a>
</div>
<div class="border-t border-white/5 pt-6">
<p class="text-xs text-slate-400 mb-3">
Versión <%= version %> • Discord.js <%= djsVersion %> • <%= currentDateHuman %>
</p>
<p class="text-xs text-slate-500">
Amayo © <%= new Date().getFullYear() %> — Documentación para usuarios finales de Discord
</p>
</div>
<div class="mt-6">
<a class="inline-flex items-center gap-2 text-indigo-300 transition hover:text-indigo-200" href="#primeros-pasos">
<span aria-hidden="true">↑</span>
Volver arriba
</a>
</div>
</div>
</footer>
<script src="/assets/js/main.js" type="module"></script>
<% if (scripts) { %>
<%= scripts %>
<% } %>
</body>
</html>

View File

@@ -0,0 +1,102 @@
<header class="relative overflow-hidden ">
<div class="absolute inset-0 bg-gradient-to-b from-indigo-500/5 via-purple-500/5 to-transparent"></div>
<div class="container mx-auto px-4 sm:px-6 lg:px-8 py-20 sm:py-28 relative">
<div class="max-w-5xl mx-auto text-center space-y-8">
<div class="inline-flex items-center gap-3 px-5 py-2.5 rounded-full bg-gradient-to-r from-indigo-500/10 via-purple-500/10 to-pink-500/10 border border-indigo-500/30 backdrop-blur-sm">
<span class="relative flex h-2.5 w-2.5">
<span class="animate-ping absolute inline-flex h-full w-full rounded-full bg-indigo-400 opacity-75"></span>
<span class="relative inline-flex rounded-full h-2.5 w-2.5 bg-gradient-to-r from-indigo-400 to-purple-400"></span>
</span>
<span class="text-sm font-bold tracking-wider uppercase bg-clip-text text-transparent bg-gradient-to-r from-indigo-200 to-purple-200">
<%= appName %> • v<%= version %>
</span>
</div>
<h1 class="text-5xl sm:text-6xl md:text-7xl lg:text-8xl font-black leading-tight">
<span class="block bg-clip-text text-transparent bg-gradient-to-r from-white via-indigo-100 to-purple-100">
Guía Completa
</span>
<span class="block bg-clip-text text-transparent bg-gradient-to-r from-indigo-400 via-purple-400 to-pink-400">
<%= appName %>
</span>
</h1>
<p class="text-xl sm:text-2xl text-slate-300 max-w-3xl mx-auto leading-relaxed font-light">
Sistema completo de <span class="font-semibold text-indigo-300">economía</span>, <span class="font-semibold text-purple-300">minijuegos</span>, <span class="font-semibold text-pink-300">misiones</span> y <span class="font-semibold text-blue-300">IA</span> para Discord
</p>
<div class="flex flex-col sm:flex-row gap-4 justify-center items-center pt-4">
<a href="#primeros-pasos" class="group relative px-10 py-4 text-lg font-bold text-white overflow-hidden rounded-2xl transition-all duration-300 hover:scale-105">
<div class="absolute inset-0 bg-gradient-to-r from-indigo-600 to-purple-600 transition-transform duration-300 group-hover:scale-110"></div>
<div class="absolute inset-0 bg-gradient-to-r from-indigo-500 to-purple-500 opacity-0 group-hover:opacity-100 transition-opacity duration-300"></div>
<span class="relative flex items-center gap-2">
Comenzar ahora
<svg class="w-5 h-5 transition-transform group-hover:translate-x-1" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M13 7l5 5m0 0l-5 5m5-5H6"></path>
</svg>
</span>
</a>
<button id="toggle-nav" class="group px-10 py-4 text-lg font-bold text-white backdrop-blur-xl bg-white/5 border-2 border-white/10 rounded-2xl hover:bg-white/10 hover:border-white/20 hover:scale-105 transition-all duration-300">
<span class="flex items-center gap-2">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"></path>
</svg>
Ver índice
</span>
</button>
</div>
<div class="flex flex-wrap justify-center gap-3 pt-6">
<span class="px-5 py-2 rounded-xl bg-white/5 backdrop-blur-sm border border-white/10 text-sm font-medium text-slate-300 hover:bg-white/10 transition-all">
Discord.js <%= djsVersion %>
</span>
<span class="px-5 py-2 rounded-xl bg-white/5 backdrop-blur-sm border border-white/10 text-sm font-medium text-slate-300 hover:bg-white/10 transition-all">
<%= currentDateHuman %>
</span>
<span class="px-5 py-2 rounded-xl bg-gradient-to-r from-indigo-500/10 to-purple-500/10 border border-indigo-500/30 text-sm font-bold text-indigo-200 hover:from-indigo-500/20 hover:to-purple-500/20 transition-all">
23 Secciones • Creación de Contenido Incluida
</span>
</div>
</div>
</div>
</header>
<div class="container mx-auto px-4 sm:px-6 lg:px-8 py-12 lg:py-16">
<div class="flex min-h-screen flex-col">
<div class="mx-auto flex w-full max-w-6xl flex-1 flex-col gap-10 px-6 pb-16 lg:flex-row lg:px-10">
<%- include('../partials/toc') %>
<main class="flex-1">
<div class="mx-auto flex w-full max-w-3xl flex-col gap-8">
<%- include('../partials/sections/primeros-pasos') %>
<%- include('../partials/sections/comandos-basicos') %>
<%- include('../partials/sections/sistema-juego') %>
<%- include('../partials/sections/minijuegos') %>
<%- include('../partials/sections/inventario-equipo') %>
<%- include('../partials/sections/economia') %>
<%- include('../partials/sections/tienda') %>
<%- include('../partials/sections/crafteo') %>
<%- include('../partials/sections/logros') %>
<%- include('../partials/sections/misiones') %>
<%- include('../partials/sections/racha') %>
<%- include('../partials/sections/consumibles') %>
<%- include('../partials/sections/cofres') %>
<%- include('../partials/sections/encantamientos') %>
<%- include('../partials/sections/fundicion') %>
<%- include('../partials/sections/ia') %>
<%- include('../partials/sections/recordatorios') %>
<%- include('../partials/sections/alianzas') %>
<%- include('../partials/sections/admin') %>
<%- include('../partials/sections/creacion-contenido') %>
<%- include('../partials/sections/configuracion') %>
<%- include('../partials/sections/estadisticas') %>
<%- include('../partials/sections/tips') %>
<%- include('../partials/sections/faq') %>
</div>
</main>
</div>
</div>
</div>

View File

@@ -0,0 +1,4 @@
<section id="admin" class="space-y-6 rounded-3xl border border-red-500/20 bg-slate-900/80 p-8 shadow-2xl shadow-red-500/10 backdrop-blur">
<h2 class="text-3xl sm:text-4xl font-bold mb-3 bg-clip-text text-transparent bg-gradient-to-r from-white to-indigo-200">⚙️ Panel de Administración</h2>
<p class="text-slate-300 text-sm">Contenido en migración a EJS…</p>
</section>

View File

@@ -0,0 +1,4 @@
<section id="alianzas" class="rounded-3xl bg-gradient-to-br from-slate-800/50 to-slate-900/50 backdrop-blur-xl border border-white/10 p-8 shadow-2xl">
<h2 class="text-3xl sm:text-4xl font-bold mb-3 bg-clip-text text-transparent bg-gradient-to-r from-white to-indigo-200">🤝 Sistema de Alianzas</h2>
<p class="text-slate-300 text-sm">Contenido en migración a EJS…</p>
</section>

View File

@@ -0,0 +1,4 @@
<section id="cofres" class="rounded-3xl bg-gradient-to-br from-slate-800/50 to-slate-900/50 backdrop-blur-xl border border-white/10 p-8 shadow-2xl">
<h2 class="text-3xl sm:text-4xl font-bold mb-3 bg-clip-text text-transparent bg-gradient-to-r from-white to-indigo-200">🎁 Cofres y Recompensas</h2>
<p class="text-slate-300 text-sm">Contenido en migración a EJS…</p>
</section>

View File

@@ -0,0 +1,4 @@
<section id="comandos-basicos" class="rounded-3xl bg-gradient-to-br from-slate-800/50 to-slate-900/50 backdrop-blur-xl border border-white/10 p-8 shadow-2xl">
<h2 class="text-3xl sm:text-4xl font-bold mb-3 bg-clip-text text-transparent bg-gradient-to-r from-white to-indigo-200">⚡ Comandos Básicos</h2>
<p class="text-slate-300 text-sm">Contenido en migración a EJS…</p>
</section>

View File

@@ -0,0 +1,4 @@
<section id="configuracion" class="rounded-3xl bg-gradient-to-br from-slate-800/50 to-slate-900/50 backdrop-blur-xl border border-white/10 p-8 shadow-2xl">
<h2 class="text-3xl sm:text-4xl font-bold mb-3 bg-clip-text text-transparent bg-gradient-to-r from-white to-indigo-200">🔧 Configuración del Servidor</h2>
<p class="text-slate-300 text-sm">Contenido en migración a EJS…</p>
</section>

View File

@@ -0,0 +1,4 @@
<section id="consumibles" class="rounded-3xl bg-gradient-to-br from-slate-800/50 to-slate-900/50 backdrop-blur-xl border border-white/10 p-8 shadow-2xl">
<h2 class="text-3xl sm:text-4xl font-bold mb-3 bg-clip-text text-transparent bg-gradient-to-r from-white to-indigo-200">🍖 Consumibles y Pociones</h2>
<p class="text-slate-300 text-sm">Contenido en migración a EJS…</p>
</section>

View File

@@ -0,0 +1,4 @@
<section id="crafteo" class="rounded-3xl bg-gradient-to-br from-slate-800/50 to-slate-900/50 backdrop-blur-xl border border-white/10 p-8 shadow-2xl">
<h2 class="text-3xl sm:text-4xl font-bold mb-3 bg-clip-text text-transparent bg-gradient-to-r from-white to-indigo-200">🛠️ Crafteo y Creación</h2>
<p class="text-slate-300 text-sm">Contenido en migración a EJS…</p>
</section>

View File

@@ -0,0 +1,4 @@
<section id="creacion-contenido" class="rounded-3xl bg-gradient-to-br from-red-900/20 to-orange-900/20 backdrop-blur-xl border border-red-500/30 p-8 shadow-2xl">
<h2 class="text-3xl sm:text-4xl font-bold mb-3 bg-clip-text text-transparent bg-gradient-to-r from-red-200 to-orange-200">🎨 Creación de Contenido</h2>
<p class="text-slate-300 text-sm">Contenido en migración a EJS…</p>
</section>

View File

@@ -0,0 +1,4 @@
<section id="economia" class="rounded-3xl bg-gradient-to-br from-slate-800/50 to-slate-900/50 backdrop-blur-xl border border-white/10 p-8 shadow-2xl">
<h2 class="text-3xl sm:text-4xl font-bold mb-3 bg-clip-text text-transparent bg-gradient-to-r from-white to-indigo-200">💰 Sistema de Economía</h2>
<p class="text-slate-300 text-sm">Contenido en migración a EJS…</p>
</section>

View File

@@ -0,0 +1,4 @@
<section id="encantamientos" class="rounded-3xl bg-gradient-to-br from-slate-800/50 to-slate-900/50 backdrop-blur-xl border border-white/10 p-8 shadow-2xl">
<h2 class="text-3xl sm:text-4xl font-bold mb-3 bg-clip-text text-transparent bg-gradient-to-r from-white to-indigo-200">✨ Encantamientos</h2>
<p class="text-slate-300 text-sm">Contenido en migración a EJS…</p>
</section>

View File

@@ -0,0 +1,4 @@
<section id="estadisticas" class="rounded-3xl bg-gradient-to-br from-slate-800/50 to-slate-900/50 backdrop-blur-xl border border-white/10 p-8 shadow-2xl">
<h2 class="text-3xl sm:text-4xl font-bold mb-3 bg-clip-text text-transparent bg-gradient-to-r from-white to-indigo-200">📊 Estadísticas y Progreso</h2>
<p class="text-slate-300 text-sm">Contenido en migración a EJS…</p>
</section>

View File

@@ -0,0 +1,4 @@
<section id="faq" class="rounded-3xl bg-gradient-to-br from-slate-800/50 to-slate-900/50 backdrop-blur-xl border border-white/10 p-8 shadow-2xl">
<h2 class="text-3xl sm:text-4xl font-bold mb-3 bg-clip-text text-transparent bg-gradient-to-r from-white to-indigo-200">❓ Preguntas Frecuentes</h2>
<p class="text-slate-300 text-sm">Contenido en migración a EJS…</p>
</section>

View File

@@ -0,0 +1,4 @@
<section id="fundicion" class="rounded-3xl bg-gradient-to-br from-slate-800/50 to-slate-900/50 backdrop-blur-xl border border-white/10 p-8 shadow-2xl">
<h2 class="text-3xl sm:text-4xl font-bold mb-3 bg-clip-text text-transparent bg-gradient-to-r from-white to-indigo-200">🔥 Sistema de Fundición</h2>
<p class="text-slate-300 text-sm">Contenido en migración a EJS…</p>
</section>

View File

@@ -0,0 +1,4 @@
<section id="ia" class="rounded-3xl bg-gradient-to-br from-slate-800/50 to-slate-900/50 backdrop-blur-xl border border-white/10 p-8 shadow-2xl">
<h2 class="text-3xl sm:text-4xl font-bold mb-3 bg-clip-text text-transparent bg-gradient-to-r from-white to-indigo-200">🤖 Inteligencia Artificial</h2>
<p class="text-slate-300 text-sm">Contenido en migración a EJS…</p>
</section>

View File

@@ -0,0 +1,4 @@
<section id="inventario-equipo" class="rounded-3xl bg-gradient-to-br from-slate-800/50 to-slate-900/50 backdrop-blur-xl border border-white/10 p-8 shadow-2xl">
<h2 class="text-3xl sm:text-4xl font-bold mb-3 bg-clip-text text-transparent bg-gradient-to-r from-white to-indigo-200">🎒 Inventario y Equipo</h2>
<p class="text-slate-300 text-sm">Contenido en migración a EJS…</p>
</section>

View File

@@ -0,0 +1,4 @@
<section id="logros" class="rounded-3xl bg-gradient-to-br from-slate-800/50 to-slate-900/50 backdrop-blur-xl border border-white/10 p-8 shadow-2xl">
<h2 class="text-3xl sm:text-4xl font-bold mb-3 bg-clip-text text-transparent bg-gradient-to-r from-white to-indigo-200">🏆 Logros</h2>
<p class="text-slate-300 text-sm">Contenido en migración a EJS…</p>
</section>

View File

@@ -0,0 +1,4 @@
<section id="minijuegos" class="rounded-3xl bg-gradient-to-br from-slate-800/50 to-slate-900/50 backdrop-blur-xl border border-white/10 p-8 shadow-2xl">
<h2 class="text-3xl sm:text-4xl font-bold mb-3 bg-clip-text text-transparent bg-gradient-to-r from-white to-indigo-200">🎯 Minijuegos y Actividades</h2>
<p class="text-slate-300 text-sm">Contenido en migración a EJS…</p>
</section>

View File

@@ -0,0 +1,4 @@
<section id="misiones" class="rounded-3xl bg-gradient-to-br from-slate-800/50 to-slate-900/50 backdrop-blur-xl border border-white/10 p-8 shadow-2xl">
<h2 class="text-3xl sm:text-4xl font-bold mb-3 bg-clip-text text-transparent bg-gradient-to-r from-white to-indigo-200">📝 Misiones</h2>
<p class="text-slate-300 text-sm">Contenido en migración a EJS…</p>
</section>

View File

@@ -0,0 +1,39 @@
<section id="primeros-pasos" class="rounded-3xl bg-gradient-to-br from-slate-800/50 to-slate-900/50 backdrop-blur-xl border border-white/10 p-8 shadow-2xl shadow-indigo-500/10 backdrop-blur">
<h2 class="text-3xl sm:text-4xl font-bold mb-3 bg-clip-text text-transparent bg-gradient-to-r from-white to-indigo-200">🚀 Primeros Pasos</h2>
<p class="text-slate-200">
¡Bienvenido a <strong class="text-white">Amayo Bot</strong>! Este bot transforma tu servidor de Discord en una experiencia de juego completa con economía, minijuegos, misiones y mucho más.
</p>
<div class="space-y-4 rounded-2xl border border-indigo-500/30 bg-indigo-500/10 p-5 text-slate-200">
<h3 class="text-lg font-semibold text-indigo-200">✨ ¿Qué puedes hacer con Amayo?</h3>
<ul class="list-disc space-y-2 pl-5 text-sm">
<li><strong class="text-white">Jugar Minijuegos:</strong> Mina recursos, pesca, pelea contra enemigos y cultiva en granjas</li>
<li><strong class="text-white">Economía Completa:</strong> Gana monedas, compra en la tienda, craftea items y gestiona tu inventario</li>
<li><strong class="text-white">Sistema de Progresión:</strong> Sube de nivel, completa misiones, desbloquea logros y mantén tu racha diaria</li>
<li><strong class="text-white">Personalización:</strong> Equipa armas, armaduras y capas para mejorar tus estadísticas</li>
<li><strong class="text-white">IA Conversacional:</strong> Chatea con Gemini AI directamente desde Discord</li>
<li><strong class="text-white">Sistema de Alianzas:</strong> Comparte enlaces de invitación y gana puntos para tu servidor</li>
</ul>
</div>
<div class="grid gap-6 md:grid-cols-2m py-5">
<div class="space-y-3 rounded-2xl border border-white/5 bg-slate-900/60 p-5">
<h3 class="text-lg font-semibold text-white">⚡ Prefix del Bot</h3>
<p class="text-sm text-slate-200 py-5">
El prefix por defecto es <code class="rounded bg-indigo-500/15 px-2 py-1 font-mono text-sm text-indigo-200">!</code>
</p>
<p class="text-xs text-slate-300 mt-2">
Los administradores pueden cambiarlo con <code class="rounded bg-indigo-500/15 px-1.5 py-0.5 font-mono text-xs text-indigo-200">!configuracion</code>
</p>
</div>
<div class="space-y-3 rounded-2xl border border-white/5 bg-slate-900/60 p-5">
<h3 class="text-lg font-semibold text-white">❓ Obtener Ayuda</h3>
<p class="text-sm text-slate-200">
Usa <code class="rounded bg-indigo-500/15 px-2 py-1 font-mono text-sm text-indigo-200">!ayuda</code> para ver todos los comandos disponibles
</p>
<p class="text-xs text-slate-300 mt-2">
También puedes usar <code class="rounded bg-indigo-500/15 px-1.5 py-0.5 font-mono text-xs text-indigo-200">!ayuda &lt;comando&gt;</code> para detalles específicos
</p>
</div>
</div>
</section>

View File

@@ -0,0 +1,4 @@
<section id="racha-diaria" class="rounded-3xl bg-gradient-to-br from-slate-800/50 to-slate-900/50 backdrop-blur-xl border border-white/10 p-8 shadow-2xl">
<h2 class="text-3xl sm:text-4xl font-bold mb-3 bg-clip-text text-transparent bg-gradient-to-r from-white to-indigo-200">🔥 Racha Diaria</h2>
<p class="text-slate-300 text-sm">Contenido en migración a EJS…</p>
</section>

View File

@@ -0,0 +1,4 @@
<section id="recordatorios" class="rounded-3xl bg-gradient-to-br from-slate-800/50 to-slate-900/50 backdrop-blur-xl border border-white/10 p-8 shadow-2xl">
<h2 class="text-3xl sm:text-4xl font-bold mb-3 bg-clip-text text-transparent bg-gradient-to-r from-white to-indigo-200">⏰ Sistema de Recordatorios</h2>
<p class="text-slate-300 text-sm">Contenido en migración a EJS…</p>
</section>

View File

@@ -0,0 +1,4 @@
<section id="sistema-juego" class="rounded-3xl bg-gradient-to-br from-slate-800/50 to-slate-900/50 backdrop-blur-xl border border-white/10 p-8 shadow-2xl">
<h2 class="text-3xl sm:text-4xl font-bold mb-3 bg-clip-text text-transparent bg-gradient-to-r from-white to-indigo-200">🎮 Sistema de Juego</h2>
<p class="text-slate-300 text-sm">Contenido en migración a EJS…</p>
</section>

View File

@@ -0,0 +1,4 @@
<section id="tienda" class="rounded-3xl bg-gradient-to-br from-slate-800/50 to-slate-900/50 backdrop-blur-xl border border-white/10 p-8 shadow-2xl">
<h2 class="text-3xl sm:text-4xl font-bold mb-3 bg-clip-text text-transparent bg-gradient-to-r from-white to-indigo-200">🛒 Tienda y Compras</h2>
<p class="text-slate-300 text-sm">Contenido en migración a EJS…</p>
</section>

View File

@@ -0,0 +1,4 @@
<section id="tips" class="rounded-3xl bg-gradient-to-br from-slate-800/50 to-slate-900/50 backdrop-blur-xl border border-white/10 p-8 shadow-2xl">
<h2 class="text-3xl sm:text-4xl font-bold mb-3 bg-clip-text text-transparent bg-gradient-to-r from-white to-indigo-200">💡 Tips y Trucos</h2>
<p class="text-slate-300 text-sm">Contenido en migración a EJS…</p>
</section>

View File

@@ -0,0 +1,30 @@
<nav id="toc" class="w-full max-w-xs rounded-3xl border border-white/10 bg-slate-900/80 text-left shadow-2xl shadow-indigo-500/20 lg:sticky lg:top-24 lg:block lg:max-h-[calc(100vh-6rem)] lg:w-74 lg:overflow-y-auto">
<div class="text-xs p-6 font-semibold uppercase tracking-[0.3em] text-slate-400">
Índice de Contenidos
</div>
<ul class="ps-8 mt-4 space-y-4 text-sm">
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#primeros-pasos">🚀 Primeros Pasos</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#comandos-basicos">⚡ Comandos Básicos</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#sistema-juego">🎮 Sistema de Juego</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#minijuegos">🎯 Minijuegos y Actividades</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#inventario-equipo">🎒 Inventario y Equipo</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#economia">💰 Sistema de Economía</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#tienda">🛒 Tienda y Compras</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#crafteo">🛠️ Crafteo y Creación</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#logros">🏆 Logros</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#misiones">📝 Misiones</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#racha-diaria">🔥 Racha Diaria</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#consumibles">🍖 Consumibles y Pociones</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#cofres">🎁 Cofres y Recompensas</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#encantamientos">✨ Encantamientos</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#fundicion">🔥 Fundición</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#ia">🤖 Inteligencia Artificial</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#recordatorios">⏰ Recordatorios</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#alianzas">🤝 Sistema de Alianzas</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#admin">⚙️ Administración (Admin)</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#configuracion">🔧 Configuración Servidor</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#estadisticas">📊 Estadísticas</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#tips">💡 Tips y Trucos</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#faq">❓ Preguntas Frecuentes</a></li>
</ul>
</nav>