diff --git a/src/commands/Community/meta.js b/src/commands/Community/meta.js index 57320bf..4f9d106 100644 --- a/src/commands/Community/meta.js +++ b/src/commands/Community/meta.js @@ -1,29 +1,11 @@ -// src/commands/community/meta.js -const { - SlashCommandBuilder, - ActionRowBuilder, - ButtonBuilder, - ButtonStyle, - } = require('discord.js'); - - module.exports = { - data: new SlashCommandBuilder() - .setName('meta') - .setDescription('Edita uma meta de recurso'), - - async execute(interaction) { - const row = new ActionRowBuilder().addComponents( - new ButtonBuilder() - .setCustomId('abrirDropdownMetas') - .setLabel('Editar metas') - .setStyle(ButtonStyle.Primary) - ); - - await interaction.reply({ - content: '🛠️ Clica no botão abaixo para editar uma das tuas metas:', - components: [row], - ephemeral: true, - }); - }, - }; - \ No newline at end of file +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); + }, +}; diff --git a/src/events/handlers/meta.js b/src/events/handlers/meta.js index 515cb17..50d2a54 100644 --- a/src/events/handlers/meta.js +++ b/src/events/handlers/meta.js @@ -1,107 +1,111 @@ -// events/interactionCreate.js +// src/events/handlers/meta.js const { - ModalBuilder, - TextInputBuilder, - TextInputStyle, ActionRowBuilder, StringSelectMenuBuilder, ButtonBuilder, + ButtonStyle, + ModalBuilder, + TextInputBuilder, + TextInputStyle, } = 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 = { - 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); - 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')); - 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); - } - - 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, - }); - } - } - } - }, + handleCommand, + handleInteraction, }; \ No newline at end of file