168 lines
5.2 KiB
TypeScript
168 lines
5.2 KiB
TypeScript
|
|
import logger from "../../core/lib/logger";
|
||
|
|
import {
|
||
|
|
ModalSubmitInteraction,
|
||
|
|
MessageFlags,
|
||
|
|
PermissionFlagsBits,
|
||
|
|
EmbedBuilder
|
||
|
|
} from 'discord.js';
|
||
|
|
import { prisma } from '../../core/database/prisma';
|
||
|
|
|
||
|
|
export default {
|
||
|
|
customId: 'ld_points_modal',
|
||
|
|
run: async (interaction: ModalSubmitInteraction) => {
|
||
|
|
if (!interaction.guild) {
|
||
|
|
return interaction.reply({
|
||
|
|
content: '❌ Solo disponible en servidores.',
|
||
|
|
flags: MessageFlags.Ephemeral
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
// Verificar permisos
|
||
|
|
const member = await interaction.guild.members.fetch(interaction.user.id);
|
||
|
|
if (!member.permissions.has(PermissionFlagsBits.ManageGuild)) {
|
||
|
|
return interaction.reply({
|
||
|
|
content: '❌ Solo los administradores pueden gestionar puntos.',
|
||
|
|
flags: MessageFlags.Ephemeral
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
try {
|
||
|
|
// Extraer el userId del customId (formato: ld_points_modal:userId)
|
||
|
|
const userId = interaction.customId.split(':')[1];
|
||
|
|
if (!userId) {
|
||
|
|
return interaction.reply({
|
||
|
|
content: '❌ Error al identificar el usuario.',
|
||
|
|
flags: MessageFlags.Ephemeral
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
// Obtener valores del modal
|
||
|
|
const totalInput = interaction.fields.getTextInputValue('total_points').trim();
|
||
|
|
const weeklyInput = interaction.fields.getTextInputValue('weekly_points').trim();
|
||
|
|
const monthlyInput = interaction.fields.getTextInputValue('monthly_points').trim();
|
||
|
|
|
||
|
|
// Si no se ingresó nada, retornar
|
||
|
|
if (!totalInput && !weeklyInput && !monthlyInput) {
|
||
|
|
return interaction.reply({
|
||
|
|
content: '❌ Debes ingresar al menos un valor para modificar.',
|
||
|
|
flags: MessageFlags.Ephemeral
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
// Obtener o crear el registro de stats del usuario
|
||
|
|
let stats = await prisma.partnershipStats.findUnique({
|
||
|
|
where: {
|
||
|
|
userId_guildId: {
|
||
|
|
userId,
|
||
|
|
guildId: interaction.guild.id
|
||
|
|
}
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
if (!stats) {
|
||
|
|
// Crear nuevo registro si no existe
|
||
|
|
stats = await prisma.partnershipStats.create({
|
||
|
|
data: {
|
||
|
|
userId,
|
||
|
|
guildId: interaction.guild.id,
|
||
|
|
totalPoints: 0,
|
||
|
|
weeklyPoints: 0,
|
||
|
|
monthlyPoints: 0
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
// Función para parsear el input y calcular el nuevo valor
|
||
|
|
const calculateNewValue = (input: string, currentValue: number): number => {
|
||
|
|
if (!input) return currentValue;
|
||
|
|
|
||
|
|
const firstChar = input[0];
|
||
|
|
const numValue = parseInt(input.substring(1)) || 0;
|
||
|
|
|
||
|
|
if (firstChar === '+') {
|
||
|
|
return Math.max(0, currentValue + numValue);
|
||
|
|
} else if (firstChar === '-') {
|
||
|
|
return Math.max(0, currentValue - numValue);
|
||
|
|
} else if (firstChar === '=') {
|
||
|
|
return Math.max(0, numValue);
|
||
|
|
} else {
|
||
|
|
// Si no tiene símbolo, tratar como valor absoluto
|
||
|
|
const parsedValue = parseInt(input);
|
||
|
|
return isNaN(parsedValue) ? currentValue : Math.max(0, parsedValue);
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
// Calcular nuevos valores
|
||
|
|
const newTotalPoints = calculateNewValue(totalInput, stats.totalPoints);
|
||
|
|
const newWeeklyPoints = calculateNewValue(weeklyInput, stats.weeklyPoints);
|
||
|
|
const newMonthlyPoints = calculateNewValue(monthlyInput, stats.monthlyPoints);
|
||
|
|
|
||
|
|
// Actualizar en base de datos
|
||
|
|
const updatedStats = await prisma.partnershipStats.update({
|
||
|
|
where: {
|
||
|
|
userId_guildId: {
|
||
|
|
userId,
|
||
|
|
guildId: interaction.guild.id
|
||
|
|
}
|
||
|
|
},
|
||
|
|
data: {
|
||
|
|
totalPoints: newTotalPoints,
|
||
|
|
weeklyPoints: newWeeklyPoints,
|
||
|
|
monthlyPoints: newMonthlyPoints
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
// Obtener nombre del usuario
|
||
|
|
let userName = 'Usuario';
|
||
|
|
try {
|
||
|
|
const targetMember = await interaction.guild.members.fetch(userId);
|
||
|
|
userName = targetMember.displayName || targetMember.user.username;
|
||
|
|
} catch {
|
||
|
|
try {
|
||
|
|
const user = await interaction.client.users.fetch(userId);
|
||
|
|
userName = user.username;
|
||
|
|
} catch {
|
||
|
|
userName = userId;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Crear embed de confirmación
|
||
|
|
const embed = new EmbedBuilder()
|
||
|
|
.setColor(0x00ff00)
|
||
|
|
.setTitle('✅ Puntos Actualizados')
|
||
|
|
.setDescription(`Se han actualizado los puntos de **${userName}**`)
|
||
|
|
.addFields(
|
||
|
|
{
|
||
|
|
name: '📊 Puntos Totales',
|
||
|
|
value: `${stats.totalPoints} → **${newTotalPoints}**`,
|
||
|
|
inline: true
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: '📅 Puntos Semanales',
|
||
|
|
value: `${stats.weeklyPoints} → **${newWeeklyPoints}**`,
|
||
|
|
inline: true
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name: '🗓️ Puntos Mensuales',
|
||
|
|
value: `${stats.monthlyPoints} → **${newMonthlyPoints}**`,
|
||
|
|
inline: true
|
||
|
|
}
|
||
|
|
)
|
||
|
|
.setFooter({ text: `Modificado por ${interaction.user.username}` })
|
||
|
|
.setTimestamp();
|
||
|
|
|
||
|
|
await interaction.reply({
|
||
|
|
embeds: [embed],
|
||
|
|
flags: MessageFlags.Ephemeral
|
||
|
|
});
|
||
|
|
|
||
|
|
} catch (e) {
|
||
|
|
logger.error({ err: e }, 'Error en ldPointsModal');
|
||
|
|
await interaction.reply({
|
||
|
|
content: '❌ Error al actualizar los puntos.',
|
||
|
|
flags: MessageFlags.Ephemeral
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
};
|