This commit is contained in:
Bxio 2025-05-01 22:46:10 +01:00
parent 6238013cee
commit 0e5208f051
2 changed files with 112 additions and 126 deletions

View File

@ -1,29 +1,11 @@
// src/commands/community/meta.js const { SlashCommandBuilder } = require('discord.js');
const { const handler = require('../../events/handlers/meta');
SlashCommandBuilder,
ActionRowBuilder,
ButtonBuilder,
ButtonStyle,
} = require('discord.js');
module.exports = { module.exports = {
data: new SlashCommandBuilder() data: new SlashCommandBuilder()
.setName('meta') .setName('meta')
.setDescription('Edita uma meta de recurso'), .setDescription('Escolhe um recurso para editar a meta.'),
async execute(interaction) { async execute(interaction) {
const row = new ActionRowBuilder().addComponents( await handler.handleCommand(interaction);
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,
});
}, },
}; };

View File

@ -1,21 +1,16 @@
// events/interactionCreate.js // src/events/handlers/meta.js
const { const {
ModalBuilder,
TextInputBuilder,
TextInputStyle,
ActionRowBuilder, ActionRowBuilder,
StringSelectMenuBuilder, StringSelectMenuBuilder,
ButtonBuilder, ButtonBuilder,
ButtonStyle,
ModalBuilder,
TextInputBuilder,
TextInputStyle,
} = require('discord.js'); } = require('discord.js');
const conn = require('../../../database/db'); const conn = require('../../../database/db');
module.exports = { async function handleCommand(interaction) {
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 userId = interaction.user.id;
const [rows] = await conn.query('SELECT meta FROM users WHERE discord_id = ?', [userId]); const [rows] = await conn.query('SELECT meta FROM users WHERE discord_id = ?', [userId]);
@ -24,6 +19,7 @@ const {
} }
const metas = JSON.parse(rows[0].meta); const metas = JSON.parse(rows[0].meta);
const options = Object.keys(metas).map(key => ({ const options = Object.keys(metas).map(key => ({
label: key, label: key,
value: key, value: key,
@ -36,72 +32,80 @@ const {
const row = new ActionRowBuilder().addComponents(select); const row = new ActionRowBuilder().addComponents(select);
return interaction.reply({ await interaction.reply({
content: '📦 Escolhe o recurso que queres editar:', content: '🛠️ Escolhe o recurso que queres editar:',
components: [row], components: [row],
ephemeral: true, ephemeral: true,
}); });
} }
// 🔵 Quando escolhe o recurso → mostrar o modal async function handleInteraction(interaction) {
const userId = interaction.user.id;
// Menu de seleção
if (interaction.isStringSelectMenu() && interaction.customId === 'selecionarRecurso') { if (interaction.isStringSelectMenu() && interaction.customId === 'selecionarRecurso') {
const recurso = interaction.values[0]; const recurso = interaction.values[0];
const modal = new ModalBuilder() const botao = new ButtonBuilder()
.setCustomId(`definirMeta-${recurso}`) .setCustomId(`editarMeta:${recurso}`)
.setTitle(`Definir meta para: ${recurso}`); .setLabel(`Editar meta de "${recurso}"`)
.setStyle(ButtonStyle.Primary);
const alvoInput = new TextInputBuilder() const row = new ActionRowBuilder().addComponents(botao);
.setCustomId('alvo')
.setLabel(`Nova meta para ${recurso}`) 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) .setStyle(TextInputStyle.Short)
.setPlaceholder('Ex: 1000') .setPlaceholder('Ex: 1000')
.setRequired(true); .setRequired(true);
const row = new ActionRowBuilder().addComponents(alvoInput); const row = new ActionRowBuilder().addComponents(input);
modal.addComponents(row);
return interaction.showModal(modal); return interaction.showModal(modal);
} }
// 🟢 Quando envia o modal → salvar no banco // Submissão do modal
if (interaction.isModalSubmit()) { if (interaction.isModalSubmit() && interaction.customId.startsWith('modalMeta:')) {
const [prefix, recurso] = interaction.customId.split('-'); const recurso = interaction.customId.split(':')[1];
const novoAlvo = interaction.fields.getTextInputValue('novoAlvo');
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]); const [rows] = await conn.query('SELECT meta FROM users WHERE discord_id = ?', [userId]);
if (!rows.length || !rows[0].meta) {
let metas = {}; return interaction.reply({ content: '❌ Nenhuma meta encontrada.', ephemeral: true });
if (rows.length > 0 && rows[0].meta) {
metas = JSON.parse(rows[0].meta);
} }
const atual = metas[recurso]?.atual ?? 0; const metas = JSON.parse(rows[0].meta);
metas[recurso] = {
alvo: novoAlvo, if (!metas[recurso]) {
atual: atual return interaction.reply({ content: '❌ Recurso não encontrado.', ephemeral: true });
}; }
await conn.query('UPDATE users SET meta = ? WHERE discord_id = ?', [ metas[recurso].alvo = parseInt(novoAlvo, 10);
JSON.stringify(metas),
userId, 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 });
return interaction.reply({ }
content: `✅ Meta de **${recurso}** atualizada para **${novoAlvo}** (atual: ${atual})`, }
ephemeral: true,
}); module.exports = {
} catch (err) { handleCommand,
console.error('Erro ao atualizar metas:', err); handleInteraction,
return interaction.reply({
content: '❌ Ocorreu um erro ao salvar a meta.',
ephemeral: true,
});
}
}
}
},
}; };