From 6238013cee396b9c86a32c3ae329d3dbaa20caa3 Mon Sep 17 00:00:00 2001 From: Bxio Date: Thu, 1 May 2025 22:40:31 +0100 Subject: [PATCH] --- src/commands/Community/meta.js | 34 ++----- src/events/handlers/meta.js | 171 ++++++++++++++++++++------------- 2 files changed, 112 insertions(+), 93 deletions(-) diff --git a/src/commands/Community/meta.js b/src/commands/Community/meta.js index 35a73b1..57320bf 100644 --- a/src/commands/Community/meta.js +++ b/src/commands/Community/meta.js @@ -2,39 +2,25 @@ const { SlashCommandBuilder, ActionRowBuilder, - StringSelectMenuBuilder, + ButtonBuilder, + ButtonStyle, } = require('discord.js'); - const conn = require('../../../database/db'); module.exports = { data: new SlashCommandBuilder() .setName('meta') - .setDescription('Escolhe um recurso para editar a meta.'), + .setDescription('Edita uma meta de recurso'), 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 }); - } - - 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); + const row = new ActionRowBuilder().addComponents( + new ButtonBuilder() + .setCustomId('abrirDropdownMetas') + .setLabel('Editar metas') + .setStyle(ButtonStyle.Primary) + ); await interaction.reply({ - content: '🛠️ Escolhe o recurso que queres editar:', + content: '🛠️ Clica no botão abaixo para editar uma das tuas metas:', components: [row], ephemeral: true, }); diff --git a/src/events/handlers/meta.js b/src/events/handlers/meta.js index b456014..515cb17 100644 --- a/src/events/handlers/meta.js +++ b/src/events/handlers/meta.js @@ -1,74 +1,107 @@ // events/interactionCreate.js -const { ModalBuilder, TextInputBuilder, TextInputStyle, ActionRowBuilder } = require('discord.js'); -const conn = require('../../../database/db'); - -module.exports = { - name: 'interactionCreate', - async execute(interaction, client) { - if (interaction.isCommand()) return; - - // 🟡 Quando o usuário escolhe o recurso no menu - if (interaction.isStringSelectMenu() && interaction.customId === 'selecionarRecurso') { - const recurso = interaction.values[0]; // Ex: 'carvao', 'enxofre' - - // Cria o modal com base no recurso escolhido - 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 await interaction.showModal(modal); - } - - // 🟢 Quando o usuário envia o modal - if (interaction.isModalSubmit()) { - const [prefix, recurso] = interaction.customId.split('-'); - - if (prefix === 'definirMeta' && recurso) { - const novoAlvo = Number(interaction.fields.getTextInputValue('alvo')); +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; - - 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 [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, + }); } - - // Atualiza só o recurso selecionado - 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, - ]); - - await interaction.reply({ - content: `✅ Meta de **${recurso}** atualizada para **${novoAlvo}** (atual: ${atual})`, - ephemeral: true, - }); - } catch (err) { - console.error('Erro ao atualizar metas:', err); - await interaction.reply({ - content: '❌ Erro ao salvar a meta.', - ephemeral: true, - }); } } - } - }, -}; + }, + }; + \ No newline at end of file