From fda1b0c5c413b7aa762857db5e2577423b72541a Mon Sep 17 00:00:00 2001 From: Shni Date: Wed, 15 Oct 2025 01:13:26 -0500 Subject: [PATCH] =?UTF-8?q?feat:=20Obtener=20roles=20de=20guild=20desde=20?= =?UTF-8?q?la=20API=20de=20Discord=20y=20actualizar=20la=20interfaz=20de?= =?UTF-8?q?=20configuraci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/server.ts | 25 ++++++++++++++++++++++ src/server/views/pages/dashboard.ejs | 31 ++++++++++++++++++++-------- 2 files changed, 47 insertions(+), 9 deletions(-) diff --git a/src/server/server.ts b/src/server/server.ts index 3eda1e6..8f5da22 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -1167,6 +1167,30 @@ export const server = createServer( } catch { guildConfig = null; } + // Attempt to fetch guild roles via Discord Bot API if token available + let guildRoles: Array<{ id: string; name: string }> = []; + try { + const botToken = process.env.DISCORD_BOT_TOKEN; + if (botToken) { + const rolesRes = await fetch( + `https://discord.com/api/guilds/${encodeURIComponent( + String(guildId) + )}/roles`, + { headers: { Authorization: `Bot ${botToken}` } } + ); + if (rolesRes.ok) { + const rolesJson = await rolesRes.json(); + if (Array.isArray(rolesJson)) { + guildRoles = rolesJson.map((r: any) => ({ + id: String(r.id), + name: String(r.name || r.id), + })); + } + } + } + } catch (err) { + // ignore; fallback to no roles + } // Render dashboard with selected guild context; show dashboard nav await renderTemplate(req, res, "dashboard", { appName: pkg.name ?? "Amayo Bot", @@ -1176,6 +1200,7 @@ export const server = createServer( selectedGuildId: guildId, selectedGuildName, guildConfig, + guildRoles, page, hideNavbar: false, useDashboardNav: true, diff --git a/src/server/views/pages/dashboard.ejs b/src/server/views/pages/dashboard.ejs index 159074d..5c74c29 100644 --- a/src/server/views/pages/dashboard.ejs +++ b/src/server/views/pages/dashboard.ejs @@ -58,8 +58,18 @@
- - + + <% if (typeof guildRoles !== 'undefined' && guildRoles && guildRoles.length) { %> + + <% } else { %> + +
No se pudo obtener roles desde la API. Introduce IDs manualmente separadas por coma.
+ <% } %>
@@ -72,17 +82,20 @@ (function(){ const form = document.getElementById('guildSettingsForm'); const status = document.getElementById('saveStatus'); - form.addEventListener('submit', async (e)=>{ + form.addEventListener('submit', async (e)=>{ e.preventDefault(); status.textContent = 'Guardando...'; const prefix = document.getElementById('prefixInput').value.trim(); const aiRolePrompt = document.getElementById('aiRoleInput').value.trim(); - const staffRaw = document.getElementById('staffInput').value.trim(); - const payload = { - prefix: prefix, - aiRolePrompt: aiRolePrompt.length ? aiRolePrompt : null, - staff: staffRaw ? staffRaw.split(',').map(s=>s.trim()).filter(Boolean) : [], - }; + let staffArr = []; + const staffSelect = document.getElementById('staffSelect'); + if (staffSelect) { + for (const o of staffSelect.selectedOptions) staffArr.push(o.value); + } else { + const staffRaw = (document.getElementById('staffInput') && document.getElementById('staffInput').value) ? document.getElementById('staffInput').value.trim() : ''; + staffArr = staffRaw ? staffRaw.split(',').map(s=>s.trim()).filter(Boolean) : []; + } + const payload = { prefix: prefix, aiRolePrompt: aiRolePrompt.length ? aiRolePrompt : null, staff: staffArr }; try { const res = await fetch(`/api/dashboard/${encodeURIComponent('<%= selectedGuild %>')}/settings`, { method: 'POST',