Files
amayo/src/commands/messages/alliaces/embedDelete.ts

218 lines
8.5 KiB
TypeScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { CommandMessage } from "../../../core/types/commands";
export const command: CommandMessage = {
name: "eliminar-embed",
type: "message",
aliases: ["embed-eliminar", "borrar-embed", "embeddelete"],
cooldown: 10,
run: async (message: any, args: string[], client: any) => {
if (!message.member?.permissions.has("Administrator")) {
await message.reply("❌ No tienes permisos de Administrador.");
return;
}
// Obtener todos los bloques del servidor
const blocks = await client.prisma.blockV2Config.findMany({
where: { guildId: message.guildId! },
select: { name: true, id: true }
});
if (blocks.length === 0) {
const noBlocksEmbed = {
color: 0xf04747,
title: "🗂️ Panel de Eliminación de Bloques",
description: "📭 **No hay bloques disponibles**\n\nNo se encontraron bloques para eliminar en este servidor.\n\nPuedes crear nuevos bloques usando `!blockcreate`.",
footer: {
text: "Sistema de gestión de bloques • Amayo Bot"
}
};
await message.reply({
embeds: [noBlocksEmbed]
});
return;
}
// Crear opciones para el select menu
const selectOptions = blocks.slice(0, 25).map((block: any, index: number) => ({
label: block.name,
value: block.name,
description: `ID: ${block.id}`,
emoji: index < 10 ? { name: `${index + 1}️⃣` } : { name: "📄" }
}));
// Crear embed principal de eliminación
const deleteEmbed = {
color: 0xff6b35,
title: "🗑️ Panel de Eliminación de Bloques",
description: `📊 **${blocks.length} bloque(s) encontrado(s)**\n\n⚠ **ADVERTENCIA:** La eliminación es permanente e irreversible.\n\nSelecciona el bloque que deseas eliminar del menú de abajo:`,
footer: {
text: "Selecciona un bloque para eliminar • Timeout: 5 minutos"
}
};
const actionRow = {
type: 1,
components: [
{
type: 3, // StringSelect
custom_id: "delete_block_select",
placeholder: "🗑️ Selecciona un bloque para eliminar...",
min_values: 1,
max_values: 1,
options: selectOptions
}
]
};
const cancelRow = {
type: 1,
components: [
{
type: 2, // Button
style: 4, // Danger
label: "❌ Cancelar",
custom_id: "cancel_delete"
}
]
};
const panelMessage = await message.reply({
embeds: [deleteEmbed],
components: [actionRow, cancelRow]
});
const collector = panelMessage.createMessageComponentCollector({
time: 300000, // 5 minutos
filter: (i: any) => i.user.id === message.author.id
});
collector.on("collect", async (interaction: any) => {
if (interaction.customId === "cancel_delete") {
const canceledEmbed = {
color: 0x36393f,
title: "❌ Operación Cancelada",
description: "La eliminación de bloques ha sido cancelada.\nNingún bloque fue eliminado.",
footer: { text: "Operación cancelada por el usuario" }
};
await interaction.update({
embeds: [canceledEmbed],
components: []
});
collector.stop("cancelled");
return;
}
if (interaction.customId === "delete_block_select" && interaction.isStringSelectMenu()) {
const selectedBlock = interaction.values[0];
const confirmationEmbed = {
color: 0xf04747,
title: "⚠️ CONFIRMAR ELIMINACIÓN",
description: `🗑️ **Bloque a eliminar:** \`${selectedBlock}\`\n\n❗ **ESTA ACCIÓN ES IRREVERSIBLE**\n\nUna vez eliminado, no podrás recuperar:\n• Toda la configuración del bloque\n• Los componentes y contenido\n• Las imágenes y colores personalizados\n\n¿Estás seguro de que quieres continuar?`,
footer: { text: "⚠️ Acción irreversible - Piénsalo bien" }
};
const confirmationRow = {
type: 1,
components: [
{
type: 2,
style: 4, // Danger
label: "🗑️ SÍ, ELIMINAR",
custom_id: `confirm_delete_${selectedBlock}`
},
{
type: 2,
style: 2, // Secondary
label: "↩️ Volver Atrás",
custom_id: "back_to_selection"
}
]
};
await interaction.update({
embeds: [confirmationEmbed],
components: [confirmationRow]
});
return;
}
if (interaction.customId.startsWith("confirm_delete_")) {
const blockName = interaction.customId.replace("confirm_delete_", "");
try {
await client.prisma.blockV2Config.delete({
where: {
guildId_name: {
guildId: message.guildId!,
name: blockName,
},
},
});
const successEmbed = {
color: 0x57f287,
title: "✅ Eliminación Exitosa",
description: `🗑️ **Bloque eliminado:** \`${blockName}\`\n\n✨ El bloque ha sido eliminado permanentemente de la base de datos.\n\n📋 Para ver los bloques restantes, usa: \`!embedlist\`\n📝 Para crear un nuevo bloque, usa: \`!blockcreate\``,
footer: { text: "Bloque eliminado exitosamente" }
};
await interaction.update({
embeds: [successEmbed],
components: []
});
collector.stop("success");
} catch (error) {
const errorEmbed = {
color: 0xf04747,
title: "❌ Error en la Eliminación",
description: `🔍 **Bloque no encontrado:** \`${blockName}\`\n\n💭 Posibles causas:\n• El bloque ya fue eliminado\n• Error de conexión con la base de datos\n• El nombre del bloque cambió\n\n🔄 Intenta refrescar la lista con \`!embedlist\``,
footer: { text: "Error de eliminación" }
};
await interaction.update({
embeds: [errorEmbed],
components: []
});
collector.stop("error");
}
return;
}
if (interaction.customId === "back_to_selection") {
await interaction.update({
embeds: [deleteEmbed],
components: [actionRow, cancelRow]
});
return;
}
});
collector.on("end", async (collected: any, reason: string) => {
if (reason === "time") {
const timeoutEmbed = {
color: 0x36393f,
title: "⏰ Tiempo Agotado",
description: "El panel de eliminación ha expirado por inactividad.\nUsa el comando nuevamente si necesitas eliminar bloques.",
footer: { text: "Panel expirado por inactividad" }
};
try {
await panelMessage.edit({
embeds: [timeoutEmbed],
components: []
});
} catch (error) {
// Mensaje ya eliminado o error de edición
}
}
});
},
};