diff --git a/package-lock.json b/package-lock.json
index fd09b07..0ecbb55 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -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",
diff --git a/package.json b/package.json
index 3b88e0a..f4ec7ae 100644
--- a/package.json
+++ b/package.json
@@ -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"
diff --git a/src/server/public/index_modern_test.html b/src/server/public/index_modern_test.html
deleted file mode 100644
index 2f4feca..0000000
--- a/src/server/public/index_modern_test.html
+++ /dev/null
@@ -1,210 +0,0 @@
-
-
-
-
-
- Amayo Bot | Guía Completa - Diseño Moderno
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Amayo Bot • v0.11.20
-
-
-
-
-
-
- Guía Completa
-
-
- Amayo Bot
-
-
-
-
-
- Sistema completo de economía , minijuegos , misiones y IA para Discord
-
-
-
-
-
-
-
-
- Discord.js 15.0-dev
-
-
- Enero 2025
-
-
- 23 Secciones Completas
-
-
-
-
-
-
-
-
-
-
-
-
-
- 🚀 Primeros Pasos
-
-
-
-
-
-
- ¡Bienvenido a Amayo Bot ! Este bot transforma tu servidor en una experiencia de juego completa.
-
-
-
-
-
- ✨
- Características Principales
-
-
-
-
🎮
-
-
Minijuegos Épicos
-
Mina, pesca, pelea y cultiva recursos
-
-
-
-
💰
-
-
Economía Completa
-
Tienda, crafteo e inventario
-
-
-
-
🏆
-
-
Progresión & Logros
-
Misiones, logros y rachas diarias
-
-
-
-
-
-
-
-
-
- ⚡
-
Prefix: !
-
-
Personalizable con !configuracion
-
-
-
-
- ❓
-
Ayuda
-
-
Usa !ayuda para ver comandos
-
-
-
-
-
-
-
✨ Este es el nuevo diseño ultra moderno ✨
-
¿Te gusta este estilo? Todas las 23 secciones tendrán este diseño con:
-
- Glassmorphism
- Hover Effects
- Gradientes
- Animaciones
- 100% Tailwind
-
-
-
-
-
-
-
-
-
diff --git a/src/server/server.ts b/src/server/server.ts
index e4abfb0..755588e 100644
--- a/src/server/server.ts
+++ b/src/server/server.ts
@@ -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;
+} = {};
+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 = {
".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 = {},
+ 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");
}
-});
+);
diff --git a/src/server/views/index.ejs b/src/server/views/index.ejs
new file mode 100644
index 0000000..847fb7a
--- /dev/null
+++ b/src/server/views/index.ejs
@@ -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 }); %>
+
+
+
+
+
+
+
+
+
+
+
+
+ <%= appName %> • v<%= version %>
+
+
+
+
+
+ Guía Completa
+
+
+ <%= appName %>
+
+
+
+
+ Sistema completo de economía , minijuegos , misiones y IA para Discord
+
+
+
+
+
+
+ Discord.js <%= djsVersion %>
+
+
+ <%= currentDateHuman %>
+
+
+ 23 Secciones • Creación de Contenido Incluida
+
+
+
+
+
+
+
+
+
+
+ <%- include('partials/toc') %>
+
+
+
+ <%- 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') %>
+
+
+
+
+
diff --git a/src/server/views/layouts/layout.ejs b/src/server/views/layouts/layout.ejs
new file mode 100644
index 0000000..6a4b7e6
--- /dev/null
+++ b/src/server/views/layouts/layout.ejs
@@ -0,0 +1,99 @@
+
+
+
+
+
+ <%= title || `${appName} | Guía Completa` %>
+
+
+
+
+ <% if (head) { %>
+ <%= head %>
+ <% } %>
+
+
+
+
+
+
+
+ <%- body %>
+
+
+
+
+
+
<%= appName %>
+
Sistema completo de juego, economía y gestión para Discord
+
+
+
+
+
+
+ Versión <%= version %> • Discord.js <%= djsVersion %> • <%= currentDateHuman %>
+
+
+ Amayo © <%= new Date().getFullYear() %> — Documentación para usuarios finales de Discord
+
+
+
+
+
+
+
+
+ <% if (scripts) { %>
+ <%= scripts %>
+ <% } %>
+
+
diff --git a/src/server/views/pages/index.ejs b/src/server/views/pages/index.ejs
new file mode 100644
index 0000000..bc75e1d
--- /dev/null
+++ b/src/server/views/pages/index.ejs
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+ <%= appName %> • v<%= version %>
+
+
+
+
+
+ Guía Completa
+
+
+ <%= appName %>
+
+
+
+
+ Sistema completo de economía , minijuegos , misiones y IA para Discord
+
+
+
+
+
+
+ Discord.js <%= djsVersion %>
+
+
+ <%= currentDateHuman %>
+
+
+ 23 Secciones • Creación de Contenido Incluida
+
+
+
+
+
+
+
+
+
+
+ <%- include('../partials/toc') %>
+
+
+
+ <%- 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') %>
+
+
+
+
+
diff --git a/src/server/views/partials/sections/admin.ejs b/src/server/views/partials/sections/admin.ejs
new file mode 100644
index 0000000..37e89a7
--- /dev/null
+++ b/src/server/views/partials/sections/admin.ejs
@@ -0,0 +1,4 @@
+
+ ⚙️ Panel de Administración
+ Contenido en migración a EJS…
+
diff --git a/src/server/views/partials/sections/alianzas.ejs b/src/server/views/partials/sections/alianzas.ejs
new file mode 100644
index 0000000..b1e244d
--- /dev/null
+++ b/src/server/views/partials/sections/alianzas.ejs
@@ -0,0 +1,4 @@
+
+ 🤝 Sistema de Alianzas
+ Contenido en migración a EJS…
+
diff --git a/src/server/views/partials/sections/cofres.ejs b/src/server/views/partials/sections/cofres.ejs
new file mode 100644
index 0000000..f5d255d
--- /dev/null
+++ b/src/server/views/partials/sections/cofres.ejs
@@ -0,0 +1,4 @@
+
+ 🎁 Cofres y Recompensas
+ Contenido en migración a EJS…
+
diff --git a/src/server/views/partials/sections/comandos-basicos.ejs b/src/server/views/partials/sections/comandos-basicos.ejs
new file mode 100644
index 0000000..8fc657e
--- /dev/null
+++ b/src/server/views/partials/sections/comandos-basicos.ejs
@@ -0,0 +1,4 @@
+
+ ⚡ Comandos Básicos
+ Contenido en migración a EJS…
+
diff --git a/src/server/views/partials/sections/configuracion.ejs b/src/server/views/partials/sections/configuracion.ejs
new file mode 100644
index 0000000..f42f4eb
--- /dev/null
+++ b/src/server/views/partials/sections/configuracion.ejs
@@ -0,0 +1,4 @@
+
+ 🔧 Configuración del Servidor
+ Contenido en migración a EJS…
+
diff --git a/src/server/views/partials/sections/consumibles.ejs b/src/server/views/partials/sections/consumibles.ejs
new file mode 100644
index 0000000..b5963e3
--- /dev/null
+++ b/src/server/views/partials/sections/consumibles.ejs
@@ -0,0 +1,4 @@
+
+ 🍖 Consumibles y Pociones
+ Contenido en migración a EJS…
+
diff --git a/src/server/views/partials/sections/crafteo.ejs b/src/server/views/partials/sections/crafteo.ejs
new file mode 100644
index 0000000..220e11b
--- /dev/null
+++ b/src/server/views/partials/sections/crafteo.ejs
@@ -0,0 +1,4 @@
+
+ 🛠️ Crafteo y Creación
+ Contenido en migración a EJS…
+
diff --git a/src/server/views/partials/sections/creacion-contenido.ejs b/src/server/views/partials/sections/creacion-contenido.ejs
new file mode 100644
index 0000000..960cbfe
--- /dev/null
+++ b/src/server/views/partials/sections/creacion-contenido.ejs
@@ -0,0 +1,4 @@
+
+ 🎨 Creación de Contenido
+ Contenido en migración a EJS…
+
diff --git a/src/server/views/partials/sections/economia.ejs b/src/server/views/partials/sections/economia.ejs
new file mode 100644
index 0000000..58875d5
--- /dev/null
+++ b/src/server/views/partials/sections/economia.ejs
@@ -0,0 +1,4 @@
+
+ 💰 Sistema de Economía
+ Contenido en migración a EJS…
+
diff --git a/src/server/views/partials/sections/encantamientos.ejs b/src/server/views/partials/sections/encantamientos.ejs
new file mode 100644
index 0000000..8501bc0
--- /dev/null
+++ b/src/server/views/partials/sections/encantamientos.ejs
@@ -0,0 +1,4 @@
+
+ ✨ Encantamientos
+ Contenido en migración a EJS…
+
diff --git a/src/server/views/partials/sections/estadisticas.ejs b/src/server/views/partials/sections/estadisticas.ejs
new file mode 100644
index 0000000..a742da4
--- /dev/null
+++ b/src/server/views/partials/sections/estadisticas.ejs
@@ -0,0 +1,4 @@
+
+ 📊 Estadísticas y Progreso
+ Contenido en migración a EJS…
+
diff --git a/src/server/views/partials/sections/faq.ejs b/src/server/views/partials/sections/faq.ejs
new file mode 100644
index 0000000..a1227ff
--- /dev/null
+++ b/src/server/views/partials/sections/faq.ejs
@@ -0,0 +1,4 @@
+
+ ❓ Preguntas Frecuentes
+ Contenido en migración a EJS…
+
diff --git a/src/server/views/partials/sections/fundicion.ejs b/src/server/views/partials/sections/fundicion.ejs
new file mode 100644
index 0000000..320c1a4
--- /dev/null
+++ b/src/server/views/partials/sections/fundicion.ejs
@@ -0,0 +1,4 @@
+
+ 🔥 Sistema de Fundición
+ Contenido en migración a EJS…
+
diff --git a/src/server/views/partials/sections/ia.ejs b/src/server/views/partials/sections/ia.ejs
new file mode 100644
index 0000000..ae43298
--- /dev/null
+++ b/src/server/views/partials/sections/ia.ejs
@@ -0,0 +1,4 @@
+
+ 🤖 Inteligencia Artificial
+ Contenido en migración a EJS…
+
diff --git a/src/server/views/partials/sections/inventario-equipo.ejs b/src/server/views/partials/sections/inventario-equipo.ejs
new file mode 100644
index 0000000..55d9bd1
--- /dev/null
+++ b/src/server/views/partials/sections/inventario-equipo.ejs
@@ -0,0 +1,4 @@
+
+ 🎒 Inventario y Equipo
+ Contenido en migración a EJS…
+
diff --git a/src/server/views/partials/sections/logros.ejs b/src/server/views/partials/sections/logros.ejs
new file mode 100644
index 0000000..e3e2f4e
--- /dev/null
+++ b/src/server/views/partials/sections/logros.ejs
@@ -0,0 +1,4 @@
+
+ 🏆 Logros
+ Contenido en migración a EJS…
+
diff --git a/src/server/views/partials/sections/minijuegos.ejs b/src/server/views/partials/sections/minijuegos.ejs
new file mode 100644
index 0000000..b1fd29c
--- /dev/null
+++ b/src/server/views/partials/sections/minijuegos.ejs
@@ -0,0 +1,4 @@
+
+ 🎯 Minijuegos y Actividades
+ Contenido en migración a EJS…
+
diff --git a/src/server/views/partials/sections/misiones.ejs b/src/server/views/partials/sections/misiones.ejs
new file mode 100644
index 0000000..4bbdf33
--- /dev/null
+++ b/src/server/views/partials/sections/misiones.ejs
@@ -0,0 +1,4 @@
+
+ 📝 Misiones
+ Contenido en migración a EJS…
+
diff --git a/src/server/views/partials/sections/primeros-pasos.ejs b/src/server/views/partials/sections/primeros-pasos.ejs
new file mode 100644
index 0000000..80aa881
--- /dev/null
+++ b/src/server/views/partials/sections/primeros-pasos.ejs
@@ -0,0 +1,39 @@
+
+ 🚀 Primeros Pasos
+
+ ¡Bienvenido a Amayo Bot ! Este bot transforma tu servidor de Discord en una experiencia de juego completa con economía, minijuegos, misiones y mucho más.
+
+
+
+
✨ ¿Qué puedes hacer con Amayo?
+
+ Jugar Minijuegos: Mina recursos, pesca, pelea contra enemigos y cultiva en granjas
+ Economía Completa: Gana monedas, compra en la tienda, craftea items y gestiona tu inventario
+ Sistema de Progresión: Sube de nivel, completa misiones, desbloquea logros y mantén tu racha diaria
+ Personalización: Equipa armas, armaduras y capas para mejorar tus estadísticas
+ IA Conversacional: Chatea con Gemini AI directamente desde Discord
+ Sistema de Alianzas: Comparte enlaces de invitación y gana puntos para tu servidor
+
+
+
+
+
+
⚡ Prefix del Bot
+
+ El prefix por defecto es !
+
+
+ Los administradores pueden cambiarlo con !configuracion
+
+
+
+
❓ Obtener Ayuda
+
+ Usa !ayuda para ver todos los comandos disponibles
+
+
+ También puedes usar !ayuda <comando> para detalles específicos
+
+
+
+
diff --git a/src/server/views/partials/sections/racha.ejs b/src/server/views/partials/sections/racha.ejs
new file mode 100644
index 0000000..d45cf3c
--- /dev/null
+++ b/src/server/views/partials/sections/racha.ejs
@@ -0,0 +1,4 @@
+
+ 🔥 Racha Diaria
+ Contenido en migración a EJS…
+
diff --git a/src/server/views/partials/sections/recordatorios.ejs b/src/server/views/partials/sections/recordatorios.ejs
new file mode 100644
index 0000000..a7bfdb7
--- /dev/null
+++ b/src/server/views/partials/sections/recordatorios.ejs
@@ -0,0 +1,4 @@
+
+ ⏰ Sistema de Recordatorios
+ Contenido en migración a EJS…
+
diff --git a/src/server/views/partials/sections/sistema-juego.ejs b/src/server/views/partials/sections/sistema-juego.ejs
new file mode 100644
index 0000000..89357de
--- /dev/null
+++ b/src/server/views/partials/sections/sistema-juego.ejs
@@ -0,0 +1,4 @@
+
+ 🎮 Sistema de Juego
+ Contenido en migración a EJS…
+
diff --git a/src/server/views/partials/sections/tienda.ejs b/src/server/views/partials/sections/tienda.ejs
new file mode 100644
index 0000000..8f78ef0
--- /dev/null
+++ b/src/server/views/partials/sections/tienda.ejs
@@ -0,0 +1,4 @@
+
+ 🛒 Tienda y Compras
+ Contenido en migración a EJS…
+
diff --git a/src/server/views/partials/sections/tips.ejs b/src/server/views/partials/sections/tips.ejs
new file mode 100644
index 0000000..571f913
--- /dev/null
+++ b/src/server/views/partials/sections/tips.ejs
@@ -0,0 +1,4 @@
+
+ 💡 Tips y Trucos
+ Contenido en migración a EJS…
+
diff --git a/src/server/views/partials/toc.ejs b/src/server/views/partials/toc.ejs
new file mode 100644
index 0000000..457bacb
--- /dev/null
+++ b/src/server/views/partials/toc.ejs
@@ -0,0 +1,30 @@
+
+
+ Índice de Contenidos
+
+
+