This commit is contained in:
parent
0e5208f051
commit
75acc05ae3
@ -1,11 +1,53 @@
|
|||||||
const { SlashCommandBuilder } = require('discord.js');
|
const {
|
||||||
const handler = require('../../events/handlers/meta');
|
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,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
data: new SlashCommandBuilder()
|
|
||||||
.setName('meta')
|
|
||||||
.setDescription('Escolhe um recurso para editar a meta.'),
|
|
||||||
async execute(interaction) {
|
|
||||||
await handler.handleCommand(interaction);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|||||||
@ -1,111 +1,125 @@
|
|||||||
// src/events/handlers/meta.js
|
// src/events/handlers/meta.js
|
||||||
const {
|
const {
|
||||||
ActionRowBuilder,
|
|
||||||
StringSelectMenuBuilder,
|
|
||||||
ButtonBuilder,
|
|
||||||
ButtonStyle,
|
|
||||||
ModalBuilder,
|
ModalBuilder,
|
||||||
TextInputBuilder,
|
TextInputBuilder,
|
||||||
TextInputStyle,
|
TextInputStyle,
|
||||||
|
ActionRowBuilder,
|
||||||
|
StringSelectMenuBuilder,
|
||||||
|
ButtonBuilder,
|
||||||
} = require('discord.js');
|
} = require('discord.js');
|
||||||
const conn = require('../../../database/db');
|
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 = {
|
module.exports = {
|
||||||
handleCommand,
|
name: 'interactionCreate',
|
||||||
handleInteraction,
|
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,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
Loading…
x
Reference in New Issue
Block a user