diff --git a/src/commands/Community/meta.js b/src/commands/Community/meta.js index 4f9d106..5022812 100644 --- a/src/commands/Community/meta.js +++ b/src/commands/Community/meta.js @@ -1,11 +1,53 @@ -const { SlashCommandBuilder } = require('discord.js'); -const handler = require('../../events/handlers/meta'); - -module.exports = { - data: new SlashCommandBuilder() - .setName('meta') - .setDescription('Escolhe um recurso para editar a meta.'), - async execute(interaction) { - await handler.handleCommand(interaction); - }, -}; +const { + SlashCommandBuilder, + ActionRowBuilder, + StringSelectMenuBuilder, + } = require('discord.js'); + const conn = require('../../../database/db'); + + module.exports = { + data: new SlashCommandBuilder() + .setName('meta') + .setDescription('Escolhe um recurso para editar a meta.'), + + async execute(interaction) { + 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 }); + } + + let metas = {}; + try { + metas = JSON.parse(rows[0].meta); + } catch (err) { + console.error('Erro ao analisar JSON de metas:', err); + return interaction.reply({ content: '❌ Erro ao ler as metas do utilizador.', ephemeral: true }); + } + + const chaves = Object.keys(metas); + if (chaves.length === 0) { + return interaction.reply({ content: '❌ Nenhuma meta definida ainda.', ephemeral: true }); + } + + const options = chaves.map(key => ({ + label: key, + value: key, + })); + + const select = new StringSelectMenuBuilder() + .setCustomId('selecionarRecurso') + .setPlaceholder('Escolhe o recurso...') + .addOptions(options); + + const row = new ActionRowBuilder().addComponents(select); + + await interaction.reply({ + content: '🛠️ Escolhe o recurso que queres editar:', + components: [row], + ephemeral: true, + }); + }, + }; + \ No newline at end of file diff --git a/src/events/handlers/meta.js b/src/events/handlers/meta.js index 50d2a54..2d4e8d2 100644 --- a/src/events/handlers/meta.js +++ b/src/events/handlers/meta.js @@ -1,111 +1,125 @@ // src/events/handlers/meta.js const { - ActionRowBuilder, - StringSelectMenuBuilder, - ButtonBuilder, - ButtonStyle, ModalBuilder, TextInputBuilder, TextInputStyle, + ActionRowBuilder, + StringSelectMenuBuilder, + ButtonBuilder, } = require('discord.js'); const conn = require('../../../database/db'); - async function handleCommand(interaction) { - 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); - - await interaction.reply({ - content: '🛠️ Escolhe o recurso que queres editar:', - components: [row], - ephemeral: true, - }); - } - - async function handleInteraction(interaction) { - const userId = interaction.user.id; - - // Menu de seleção - if (interaction.isStringSelectMenu() && interaction.customId === 'selecionarRecurso') { - const recurso = interaction.values[0]; - - const botao = new ButtonBuilder() - .setCustomId(`editarMeta:${recurso}`) - .setLabel(`Editar meta de "${recurso}"`) - .setStyle(ButtonStyle.Primary); - - const row = new ActionRowBuilder().addComponents(botao); - - return interaction.update({ - content: `🔧 Recurso selecionado: **${recurso}**\nClica no botão abaixo para editar a meta.`, - components: [row], - }); - } - - // Botão que abre o modal - if (interaction.isButton() && interaction.customId.startsWith('editarMeta:')) { - const recurso = interaction.customId.split(':')[1]; - - const modal = new ModalBuilder() - .setCustomId(`modalMeta:${recurso}`) - .setTitle(`Editar meta de "${recurso}"`); - - const input = new TextInputBuilder() - .setCustomId('novoAlvo') - .setLabel('Novo valor da meta (alvo)') - .setStyle(TextInputStyle.Short) - .setPlaceholder('Ex: 1000') - .setRequired(true); - - const row = new ActionRowBuilder().addComponents(input); - modal.addComponents(row); - - return interaction.showModal(modal); - } - - // Submissão do modal - if (interaction.isModalSubmit() && interaction.customId.startsWith('modalMeta:')) { - const recurso = interaction.customId.split(':')[1]; - const novoAlvo = interaction.fields.getTextInputValue('novoAlvo'); - - 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); - - if (!metas[recurso]) { - return interaction.reply({ content: '❌ Recurso não encontrado.', ephemeral: true }); - } - - metas[recurso].alvo = parseInt(novoAlvo, 10); - - await conn.query('UPDATE users SET meta = ? WHERE discord_id = ?', [JSON.stringify(metas), userId]); - - return interaction.reply({ content: `✅ Meta de **${recurso}** atualizada para **${novoAlvo}**.`, ephemeral: true }); - } - } - module.exports = { - handleCommand, - handleInteraction, + 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]; + + const modal = new ModalBuilder() + .setCustomId(`definirMeta-${recurso}`) + .setTitle(`Definir meta para: ${recurso}`); + + const alvoInput = new TextInputBuilder() + .setCustomId('alvo') + .setLabel(`Nova meta para ${recurso}`) + .setStyle(TextInputStyle.Short) + .setPlaceholder('Ex: 1000') + .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; + metas[recurso] = { + alvo: novoAlvo, + atual: atual, + }; + + await conn.query('UPDATE users SET meta = ? WHERE discord_id = ?', [ + JSON.stringify(metas), + userId, + ]); + + return interaction.reply({ + content: `✅ Meta de **${recurso}** atualizada para **${novoAlvo}** (atual: ${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