This commit is contained in:
Bxio 2025-05-02 00:44:54 +01:00
parent d3c97d7971
commit bc861f8e4f

View File

@ -5,124 +5,101 @@ const {
StringSelectMenuBuilder, StringSelectMenuBuilder,
ButtonBuilder, ButtonBuilder,
EmbedBuilder, EmbedBuilder,
} = require('discord.js'); } = require('discord.js');
const conn = require('../../../database/db'); 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('Escolhe um recurso para editar a meta.'),
async execute(interaction) { async execute(interaction) {
await interaction.deferReply({ ephemeral: true }); await interaction.deferReply({ ephemeral: true });
try {
const [usersRows] = await conn.execute('SELECT u.id, u.discord_id, u.discord_username, u.nig, u.meta, c.name AS nomedocargo FROM users u JOIN choices c ON u.cargo = c.value ORDER BY c.id DESC');
const embed = new EmbedBuilder().setColor("#00b0f4");
// Adiciona cada usuário como um campo no embed
usersRows.forEach(row => {
let metas = {};
try {
if (row.meta) {
metas = JSON.parse(row.meta);
}
} catch (err) {
console.warn('JSON mal formatado para usuário:', row.discord_username);
}
let metasText = '';
for (const [nomejson, dados] of Object.entries(metas)) {
if (typeof dados === 'object' && dados !== null && 'alvo' in dados && 'atual' in dados) {
metasText += `* *${nomejson}:* \`${dados.atual} / ${dados.alvo}\`\n`;
} else {
metasText += `* *${nomejson}:* \`formato inválido\`\n`;
}
}
embed.addFields({
name: '',
value: `\n\n> **${row.nig}** \n > <@${row.discord_id}>\n **Cargo:** \`${row.nomedocargo}\` \n**Meta Semanal:** \n${metasText}\n\n`,
inline: true
});
});
await interaction.editReply({ embeds: [embed] });
} catch (error) {
console.error('Erro ao buscar usuários:', error);
await interaction.editReply({ content: '❌ Erro ao carregar informações dos usuários.' });
}
try {
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.editReply({ content: '❌ Nenhuma meta encontrada.', ephemeral: true });
}
let metas = {};
try { try {
metas = JSON.parse(rows[0].meta); const [usersRows] = await conn.execute('SELECT u.id, u.discord_id, u.discord_username, u.nig, u.meta, c.name AS nomedocargo FROM users u JOIN choices c ON u.cargo = c.value ORDER BY c.id DESC');
} catch (err) { const embed = new EmbedBuilder().setColor("#00b0f4");
console.error('Erro ao analisar JSON de metas:', err);
return interaction.editReply({ content: '❌ Erro ao ler as metas do utilizador.', ephemeral: true }); // Adiciona cada usuário como um campo no embed
} usersRows.forEach(row => {
let metas = {};
const chaves = Object.keys(metas);
if (chaves.length === 0) { try {
return interaction.editReply({ content: '❌ Nenhuma meta definida ainda.', ephemeral: true }); if (row.meta) {
} metas = JSON.parse(row.meta);
}
const options = chaves.map(key => ({ } catch (err) {
label: key, console.warn('JSON mal formatado para usuário:', row.discord_username);
value: key, }
}));
let metasText = '';
const select = new StringSelectMenuBuilder() for (const [nomejson, dados] of Object.entries(metas)) {
.setCustomId('selecionarRecurso') if (typeof dados === 'object' && dados !== null && 'alvo' in dados && 'atual' in dados) {
.setPlaceholder('Escolhe o recurso...') metasText += `* *${nomejson}:* \`${dados.atual} / ${dados.alvo}\`\n`;
.addOptions(options); } else {
metasText += `* *${nomejson}:* \`formato inválido\`\n`;
const rowSelect = new ActionRowBuilder().addComponents(select); }
const rowButton = new ActionRowBuilder().addComponents( }
new ButtonBuilder()
.setCustomId('mostrarDropdown') embed.addFields({
.setLabel('Escolher Recurso') name: '',
.setStyle(1) value: `\n\n> **${row.nig}** \n > <@${row.discord_id}>\n **Cargo:** \`${row.nomedocargo}\` \n**Meta Semanal:** \n${metasText}\n\n`,
); inline: true
});
await interaction.editReply({
content: '🛠️ Clica no botão para escolher o recurso:',
components: [rowButton],
ephemeral: true,
});
// Espera pelo clique no botão
const filter = (i) => i.customId === 'mostrarDropdown' && i.user.id === interaction.user.id;
const collector = interaction.channel.createMessageComponentCollector({ filter, time: 15000 });
collector.on('collect', async (i) => {
if (i.customId === 'mostrarDropdown') {
await i.update({
content: '🛠️ Agora escolhe o recurso:',
components: [rowSelect],
}); });
}
}); await interaction.editReply({ embeds: [embed] });
collector.on('end', (collected) => { } catch (error) {
if (collected.size === 0) { console.error('Erro ao buscar usuários:', error);
interaction.editReply({ content: '❌ O tempo para escolher o recurso expirou.' }); await interaction.editReply({ content: '❌ Erro ao carregar informações dos usuários.' });
} }
});
try {
} catch (error) { const userId = interaction.user.id;
console.error('Erro ao buscar usuários:', error); const [rows] = await conn.query('SELECT meta FROM users WHERE discord_id = ?', [userId]);
await interaction.editReply({ content: '❌ Erro ao carregar informações dos usuários.' });
} if (!rows.length || !rows[0].meta) {
}, return interaction.editReply({ 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.editReply({ content: '❌ Erro ao ler as metas do utilizador.', ephemeral: true });
}
const chaves = Object.keys(metas);
if (chaves.length === 0) {
return interaction.editReply({ 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 rowSelect = new ActionRowBuilder().addComponents(select);
const rowButton = new ActionRowBuilder().addComponents(
new ButtonBuilder()
.setCustomId('mostrarDropdown')
.setLabel('Escolher Recurso')
.setStyle(1) // Usando o valor numérico para PRIMARY (1)
);
await interaction.editReply({
content: '🛠️ Clica no botão para escolher o recurso:',
components: [rowButton],
ephemeral: true,
});
// Espera pelo clique no botão
const filter = (i) => i.customId === 'mostrarDropdown' && i.user.id === interaction.user.id;
const collector = interaction.channel.createMessageComponentCollector({ filter, time: 15000