diff --git a/src/events/handlers/meta.js b/src/events/handlers/meta.js index 42dd89d..25e439d 100644 --- a/src/events/handlers/meta.js +++ b/src/events/handlers/meta.js @@ -6,137 +6,137 @@ const { ActionRowBuilder, StringSelectMenuBuilder, ButtonBuilder, - } = require('discord.js'); - const conn = require('../../../database/db'); - - module.exports = { +} = require('discord.js'); +const conn = require('../../../database/db'); + +module.exports = { name: 'interactionCreate', async execute(interaction, client) { - if (interaction.isCommand()) return; - - // 🟡 Quando o user clica no botão "Editar metas" - if (interaction.isButton() && interaction.customId === 'abrirDropdownMetas') { - const userId = interaction.user.id; - const [rows] = await conn.query('SELECT meta FROM users WHERE discord_id = ?', [userId]); - - if (!rows.length || !rows[0].meta) { - return interaction.reply({ content: '❌ Nenhuma meta encontrada.', ephemeral: true }); - } - - const metas = JSON.parse(rows[0].meta); - const options = Object.keys(metas).map(key => ({ - label: key, - value: key, - })); - - const select = new StringSelectMenuBuilder() - .setCustomId('selecionarRecurso') - .setPlaceholder('Escolhe o recurso...') - .addOptions(options); - - const row = new ActionRowBuilder().addComponents(select); - - /* return interaction.reply({ - content: '📦 Escolhe o recurso que queres editar:', - components: [row], - ephemeral: true, - }); */ - } - - // 🔵 Quando escolhe o recurso → mostrar o modal - if (interaction.isStringSelectMenu() && interaction.customId === 'selecionarRecurso') { - const recurso = interaction.values[0]; - - // Obter o valor atual do recurso - const userId = interaction.user.id; - const [rows] = await conn.query('SELECT meta FROM users WHERE discord_id = ?', [userId]); - - if (!rows.length || !rows[0].meta) { - return interaction.reply({ content: '❌ Nenhuma meta encontrada.', ephemeral: true }); - } - - const metas = JSON.parse(rows[0].meta); - - // Verificar se o recurso existe e obter o valor atual - const recursoData = metas[recurso]; - const atual = recursoData ? recursoData.atual : 0; - - const modal = new ModalBuilder() - .setCustomId(`definirMeta-${recurso}`) - .setTitle(`Adicionar ou editar meta para ${recurso}`); - - const alvoInput = new TextInputBuilder() - .setCustomId('alvo') - .setLabel(`Nova meta para ${recurso}`) - .setStyle(TextInputStyle.Short) - .setPlaceholder(`Ex: 1000 (Atual: ${atual})`) - .setRequired(true); - - const row = new ActionRowBuilder().addComponents(alvoInput); - modal.addComponents(row); - return interaction.showModal(modal); - } - - // 🟢 Quando envia o modal → salvar no banco - if (interaction.isModalSubmit()) { - const [prefix, recurso] = interaction.customId.split('-'); - - if (prefix === 'definirMeta' && recurso) { - const novoAlvo = Number(interaction.fields.getTextInputValue('alvo')); - - // ✅ Verificar se é número válido ≥ 0 - if (isNaN(novoAlvo) || novoAlvo < 0) { - return interaction.reply({ - content: '❌ Por favor insere um número válido (maior ou igual a zero).', - ephemeral: true, - }); - } - - const userId = interaction.user.id; - - try { + if (interaction.isCommand()) return; + + // 🟡 Quando o user clica no botão "Editar metas" + if (interaction.isButton() && interaction.customId === 'abrirDropdownMetas') { + const userId = interaction.user.id; const [rows] = await conn.query('SELECT meta FROM users WHERE discord_id = ?', [userId]); - - let metas = {}; - if (rows.length > 0 && rows[0].meta) { - metas = JSON.parse(rows[0].meta); + + if (!rows.length || !rows[0].meta) { + return interaction.reply({ content: '❌ Nenhuma meta encontrada.', ephemeral: true }); } - - // ✅ Verificar se o recurso ainda existe - if (!(recurso in metas)) { - return interaction.reply({ - content: `❌ O recurso **${recurso}** já não está disponível.`, + + const metas = JSON.parse(rows[0].meta); + const options = Object.keys(metas).map(key => ({ + label: key, + value: key, + })); + + const select = new StringSelectMenuBuilder() + .setCustomId('selecionarRecurso') + .setPlaceholder('Escolhe o recurso...') + .addOptions(options); + + const row = new ActionRowBuilder().addComponents(select); + + // Resposta com o menu suspenso + return interaction.reply({ + content: '📦 Escolhe o recurso que queres editar:', + components: [row], ephemeral: true, - }); - } - - const atual = metas[recurso]?.atual ?? 0; - - const novoValor = atual + novoAlvo; // Somar ao valor atual - - metas[recurso] = { - alvo: novoAlvo, - atual: novoValor, // Não alterar o valor atual ao atualizar o alvo - }; - - await conn.query('UPDATE users SET meta = ? WHERE discord_id = ?', [ - JSON.stringify(metas), - userId, - ]); - - return interaction.reply({ - content: `✅ Meta de **${recurso}** atualizada para **${novoValor}** (antes: ${atual})`, - ephemeral: true, }); - } catch (err) { - console.error('Erro ao atualizar metas:', err); - return interaction.reply({ - content: '❌ Ocorreu um erro ao salvar a meta.', - ephemeral: true, - }); - } } - } + + // 🔵 Quando escolhe o recurso → mostrar o modal + if (interaction.isStringSelectMenu() && interaction.customId === 'selecionarRecurso') { + const recurso = interaction.values[0]; + + // Obter o valor atual do recurso + const userId = interaction.user.id; + const [rows] = await conn.query('SELECT meta FROM users WHERE discord_id = ?', [userId]); + + if (!rows.length || !rows[0].meta) { + return interaction.reply({ content: '❌ Nenhuma meta encontrada.', ephemeral: true }); + } + + const metas = JSON.parse(rows[0].meta); + + // Verificar se o recurso existe e obter o valor atual + const recursoData = metas[recurso]; + const atual = recursoData ? recursoData.atual : 0; + + const modal = new ModalBuilder() + .setCustomId(`definirMeta-${recurso}`) + .setTitle(`Adicionar ou editar meta para ${recurso}`); + + const alvoInput = new TextInputBuilder() + .setCustomId('alvo') + .setLabel(`Nova meta para ${recurso}`) + .setStyle(TextInputStyle.Short) + .setPlaceholder(`Ex: 1000 (Atual: ${atual})`) + .setRequired(true); + + const row = new ActionRowBuilder().addComponents(alvoInput); + modal.addComponents(row); + return interaction.showModal(modal); + } + + // 🟢 Quando envia o modal → salvar no banco + if (interaction.isModalSubmit()) { + const [prefix, recurso] = interaction.customId.split('-'); + + if (prefix === 'definirMeta' && recurso) { + const novoAlvo = Number(interaction.fields.getTextInputValue('alvo')); + + // ✅ Verificar se é número válido ≥ 0 + if (isNaN(novoAlvo) || novoAlvo < 0) { + return interaction.reply({ + content: '❌ Por favor insere um número válido (maior ou igual a zero).', + ephemeral: true, + }); + } + + const userId = interaction.user.id; + + try { + const [rows] = await conn.query('SELECT meta FROM users WHERE discord_id = ?', [userId]); + + let metas = {}; + if (rows.length > 0 && rows[0].meta) { + metas = JSON.parse(rows[0].meta); + } + + // ✅ Verificar se o recurso ainda existe + if (!(recurso in metas)) { + return interaction.reply({ + content: `❌ O recurso **${recurso}** já não está disponível.`, + ephemeral: true, + }); + } + + const atual = metas[recurso]?.atual ?? 0; + + const novoValor = atual + novoAlvo; // Somar ao valor atual + + metas[recurso] = { + alvo: novoAlvo, + atual: novoValor, // Não alterar o valor atual ao atualizar o alvo + }; + + await conn.query('UPDATE users SET meta = ? WHERE discord_id = ?', [ + JSON.stringify(metas), + userId, + ]); + + return interaction.reply({ + content: `✅ Meta de **${recurso}** atualizada para **${novoValor}** (antes: ${atual})`, + ephemeral: true, + }); + } catch (err) { + console.error('Erro ao atualizar metas:', err); + return interaction.reply({ + content: '❌ Ocorreu um erro ao salvar a meta.', + ephemeral: true, + }); + } + } + } }, - }; - \ No newline at end of file +};