// src/events/handlers/meta.js const { ModalBuilder, TextInputBuilder, TextInputStyle, ActionRowBuilder, StringSelectMenuBuilder, ButtonBuilder, } = 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 { 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, }); } } } }, };