This commit is contained in:
Bxio 2025-05-01 22:40:31 +01:00
parent 3880dcb5bf
commit 6238013cee
2 changed files with 112 additions and 93 deletions

View File

@ -2,39 +2,25 @@
const { const {
SlashCommandBuilder, SlashCommandBuilder,
ActionRowBuilder, ActionRowBuilder,
StringSelectMenuBuilder, ButtonBuilder,
ButtonStyle,
} = require('discord.js'); } = require('discord.js');
const conn = require('../../../database/db');
module.exports = { module.exports = {
data: new SlashCommandBuilder() data: new SlashCommandBuilder()
.setName('meta') .setName('meta')
.setDescription('Escolhe um recurso para editar a meta.'), .setDescription('Edita uma meta de recurso'),
async execute(interaction) { async execute(interaction) {
const userId = interaction.user.id; const row = new ActionRowBuilder().addComponents(
const [rows] = await conn.query('SELECT meta FROM users WHERE discord_id = ?', [userId]); new ButtonBuilder()
.setCustomId('abrirDropdownMetas')
if (!rows.length || !rows[0].meta) { .setLabel('Editar metas')
return interaction.reply({ content: '❌ Nenhuma meta encontrada.', ephemeral: true }); .setStyle(ButtonStyle.Primary)
} );
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({ await interaction.reply({
content: '🛠️ Escolhe o recurso que queres editar:', content: '🛠️ Clica no botão abaixo para editar uma das tuas metas:',
components: [row], components: [row],
ephemeral: true, ephemeral: true,
}); });

View File

@ -1,5 +1,12 @@
// events/interactionCreate.js // events/interactionCreate.js
const { ModalBuilder, TextInputBuilder, TextInputStyle, ActionRowBuilder } = require('discord.js'); const {
ModalBuilder,
TextInputBuilder,
TextInputStyle,
ActionRowBuilder,
StringSelectMenuBuilder,
ButtonBuilder,
} = require('discord.js');
const conn = require('../../../database/db'); const conn = require('../../../database/db');
module.exports = { module.exports = {
@ -7,11 +14,39 @@ module.exports = {
async execute(interaction, client) { async execute(interaction, client) {
if (interaction.isCommand()) return; if (interaction.isCommand()) return;
// 🟡 Quando o usuário escolhe o recurso no menu // 🟡 Quando o user clica no botão "Editar metas"
if (interaction.isStringSelectMenu() && interaction.customId === 'selecionarRecurso') { if (interaction.isButton() && interaction.customId === 'abrirDropdownMetas') {
const recurso = interaction.values[0]; // Ex: 'carvao', 'enxofre' 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];
// Cria o modal com base no recurso escolhido
const modal = new ModalBuilder() const modal = new ModalBuilder()
.setCustomId(`definirMeta-${recurso}`) .setCustomId(`definirMeta-${recurso}`)
.setTitle(`Definir meta para: ${recurso}`); .setTitle(`Definir meta para: ${recurso}`);
@ -24,12 +59,10 @@ module.exports = {
.setRequired(true); .setRequired(true);
const row = new ActionRowBuilder().addComponents(alvoInput); const row = new ActionRowBuilder().addComponents(alvoInput);
modal.addComponents(row); return interaction.showModal(modal);
return await interaction.showModal(modal);
} }
// 🟢 Quando o usuário envia o modal // 🟢 Quando envia o modal → salvar no banco
if (interaction.isModalSubmit()) { if (interaction.isModalSubmit()) {
const [prefix, recurso] = interaction.customId.split('-'); const [prefix, recurso] = interaction.customId.split('-');
@ -45,7 +78,6 @@ module.exports = {
metas = JSON.parse(rows[0].meta); metas = JSON.parse(rows[0].meta);
} }
// Atualiza só o recurso selecionado
const atual = metas[recurso]?.atual ?? 0; const atual = metas[recurso]?.atual ?? 0;
metas[recurso] = { metas[recurso] = {
alvo: novoAlvo, alvo: novoAlvo,
@ -57,14 +89,14 @@ module.exports = {
userId, userId,
]); ]);
await interaction.reply({ return interaction.reply({
content: `✅ Meta de **${recurso}** atualizada para **${novoAlvo}** (atual: ${atual})`, content: `✅ Meta de **${recurso}** atualizada para **${novoAlvo}** (atual: ${atual})`,
ephemeral: true, ephemeral: true,
}); });
} catch (err) { } catch (err) {
console.error('Erro ao atualizar metas:', err); console.error('Erro ao atualizar metas:', err);
await interaction.reply({ return interaction.reply({
content: '❌ Erro ao salvar a meta.', content: '❌ Ocorreu um erro ao salvar a meta.',
ephemeral: true, ephemeral: true,
}); });
} }
@ -72,3 +104,4 @@ module.exports = {
} }
}, },
}; };