2025-09-20 03:15:16 -05:00
import { CommandMessage } from "../../../core/types/commands" ;
// @ts-ignore
import { EmbedBuilder , ButtonStyle , MessageFlags , ChannelType } from "discord.js" ;
export const command : CommandMessage = {
2025-09-20 03:31:03 -05:00
name : "listar-canales-alianza" ,
2025-09-20 03:15:16 -05:00
type : "message" ,
2025-09-20 03:31:03 -05:00
aliases : [ "listchannels-alliance" , "listalchannel" , "channelsally" , "alliancechannels" ] ,
2025-09-20 03:15:16 -05:00
cooldown : 5 ,
// @ts-ignore
run : async ( message , args , client ) = > {
// Obtener canales configurados existentes con estadísticas
const existingChannels = await client . prisma . allianceChannel . findMany ( {
where : { guildId : message.guildId ! } ,
include : {
_count : {
select : {
pointsHistory : true
}
}
} ,
orderBy : {
createdAt : 'desc'
}
} ) ;
// Obtener estadísticas generales
const totalPointsHistory = await client . prisma . pointHistory . count ( {
where : { guildId : message.guildId ! }
} ) ;
const availableBlocks = await client . prisma . blockV2Config . count ( {
where : { guildId : message.guildId ! }
} ) ;
if ( existingChannels . length === 0 ) {
// Embed cuando no hay canales configurados
const noChannelsEmbed = new EmbedBuilder ( )
. setTitle ( "📋 Canales de Alianza Configurados" )
. setDescription ( "```\n🗂️ Lista vacía\n```\n\n📭 **No hay canales configurados** para alianzas en este servidor.\n\n🚀 **¿Quieres empezar?**\n• Usa `!setchannel-alliance` para configurar tu primer canal\n• Crea bloques con `!blockcreate <nombre>`" )
. setColor ( 0x36393f )
. addFields ( [
{
name : "📊 Estadísticas Generales" ,
value : ` 🧩 **Bloques disponibles:** ${ availableBlocks } \ n📈 **Puntos totales otorgados:** ${ totalPointsHistory } ` ,
inline : false
}
] )
. setFooter ( {
text : ` 📅 ${ new Date ( ) . toLocaleDateString ( 'es-ES' , {
year : 'numeric' ,
month : 'long' ,
day : 'numeric'
} ) } `
} )
. setTimestamp ( ) ;
const helpRow = {
type : 1 ,
components : [
{
type : 2 ,
style : ButtonStyle.Success ,
label : "➕ Configurar Canal" ,
custom_id : "setup_first_channel" ,
emoji : { name : "🔧" }
} ,
{
type : 2 ,
style : ButtonStyle.Secondary ,
label : "📖 Ayuda" ,
custom_id : "show_setup_help" ,
emoji : { name : "❓" }
}
]
} ;
const response = await message . reply ( {
embeds : [ noChannelsEmbed ] ,
components : [ helpRow ]
} ) ;
// Collector para botones de ayuda
const collector = response . createMessageComponentCollector ( {
time : 300000 ,
filter : ( i ) = > i . user . id === message . author . id
} ) ;
collector . on ( "collect" , async ( interaction ) = > {
if ( interaction . customId === "setup_first_channel" ) {
await interaction . reply ( {
content : "🔧 **Configurar Canal**\n\nUsa el comando: `!setchannel-alliance`\n\nEste comando te guiará paso a paso para configurar tu primer canal de alianzas." ,
flags : 64 // Ephemeral
} ) ;
} else if ( interaction . customId === "show_setup_help" ) {
await interaction . reply ( {
content : "📖 **Guía de Configuración**\n\n**Paso 1:** Crear un bloque\n`!blockcreate mi-alianza`\n\n**Paso 2:** Configurar canal\n`!setchannel-alliance`\n\n**Paso 3:** ¡Listo!\nLos usuarios ganarán puntos automáticamente." ,
flags : 64 // Ephemeral
} ) ;
}
} ) ;
return ;
}
// Crear descripción detallada de canales
let channelListDescription = "```\n📋 Lista de Canales Configurados\n```\n\n" ;
const channelDetails = await Promise . all (
existingChannels . map ( async ( config : any , index : number ) = > {
const channel = message . guild ! . channels . cache . get ( config . channelId ) ;
const channelName = channel ? ` # ${ channel . name } ` : "❌ *Canal Eliminado*" ;
const status = config . isActive ? "🟢 **Activo**" : "🔴 **Inactivo**" ;
const pointsCount = config . _count . pointsHistory ;
// Obtener información del bloque
const blockInfo = await client . prisma . blockV2Config . findFirst ( {
where : {
guildId : message.guildId ! ,
name : config.blockConfigName
} ,
select : { name : true , id : true }
} ) ;
const blockStatus = blockInfo ? "✅ Válido" : "⚠️ Bloque Eliminado" ;
const createdDate = new Date ( config . createdAt ) . toLocaleDateString ( 'es-ES' , {
day : '2-digit' ,
month : '2-digit' ,
year : 'numeric'
} ) ;
return {
index : index + 1 ,
channelName ,
status ,
pointsCount ,
blockName : config.blockConfigName ,
blockStatus ,
createdDate ,
isValid : ! ! channel && ! ! blockInfo
} ;
} )
) ;
// Agrupar por estado
2025-09-20 15:19:41 -05:00
//@ts-ignore
2025-09-20 03:15:16 -05:00
const activeChannels = channelDetails . filter ( c = > c . status . includes ( "Activo" ) ) ;
2025-09-20 15:19:41 -05:00
//@ts-ignore
2025-09-20 03:15:16 -05:00
const inactiveChannels = channelDetails . filter ( c = > c . status . includes ( "Inactivo" ) ) ;
// Construir embed principal
const mainEmbed = new EmbedBuilder ( )
. setTitle ( "📋 Canales de Alianza Configurados" )
. setDescription ( ` ${ channelListDescription } 📊 **Resumen:** ${ existingChannels . length } canal(es) configurado(s) \ n🟢 **Activos:** ${ activeChannels . length } • 🔴 **Inactivos:** ${ inactiveChannels . length } ` )
. setColor ( 0x5865f2 )
. setThumbnail ( message . guild ! . iconURL ( { size : 128 } ) || null )
. setFooter ( {
text : ` 📅 Actualizado • ${ message . guild ! . name } ` ,
iconURL : message.guild ! . iconURL ( { size : 32 } ) || undefined
} )
. setTimestamp ( ) ;
// Añadir campos de canales activos
if ( activeChannels . length > 0 ) {
2025-09-20 15:19:41 -05:00
//@ts-ignore
2025-09-20 03:15:16 -05:00
const activeList = activeChannels . slice ( 0 , 10 ) . map ( c = >
` ** ${ c . index } .** ${ c . channelName } \ n ` +
` └ \` ${ c . blockName } \` • ${ c . blockStatus } \ n ` +
` └ 📈 ** ${ c . pointsCount } ** puntos otorgados \ n ` +
` └ 📅 Desde: ${ c . createdDate } `
) . join ( '\n\n' ) ;
mainEmbed . addFields ( [
{
name : ` 🟢 Canales Activos ( ${ activeChannels . length } ) ` ,
value : activeList || "Ninguno" ,
inline : false
}
] ) ;
}
// Añadir campos de canales inactivos (si los hay)
if ( inactiveChannels . length > 0 ) {
2025-09-20 15:19:41 -05:00
//@ts-ignore
2025-09-20 03:15:16 -05:00
const inactiveList = inactiveChannels . slice ( 0 , 5 ) . map ( c = >
` ** ${ c . index } .** ${ c . channelName } \ n ` +
` └ \` ${ c . blockName } \` • ${ c . blockStatus } `
) . join ( '\n\n' ) ;
mainEmbed . addFields ( [
{
name : ` 🔴 Canales Inactivos ( ${ inactiveChannels . length } ) ` ,
value : inactiveList || "Ninguno" ,
inline : false
}
] ) ;
}
// Añadir estadísticas generales
mainEmbed . addFields ( [
{
name : "📊 Estadísticas del Servidor" ,
2025-09-20 15:19:41 -05:00
//@ts-ignore
2025-09-20 03:15:16 -05:00
value : ` 🧩 **Bloques disponibles:** ${ availableBlocks } \ n📈 **Total puntos otorgados:** ${ totalPointsHistory } \ n⚡ **Canales más activos:** ${ channelDetails . sort ( ( a , b ) = > b . pointsCount - a . pointsCount ) . slice ( 0 , 3 ) . map ( ( c , i ) = > ` ${ i + 1 } . ${ c . channelName . replace ( /[#❌*]/g , '' ) . trim ( ) } ` ) . join ( ', ' ) || 'N/A' } ` ,
inline : false
}
] ) ;
// Botones de acción
const actionRow1 = {
type : 1 ,
components : [
{
type : 2 ,
style : ButtonStyle.Success ,
label : "➕ Añadir Canal" ,
custom_id : "add_channel" ,
emoji : { name : "🔧" }
} ,
{
type : 2 ,
style : ButtonStyle.Danger ,
label : "🗑️ Eliminar Canal" ,
custom_id : "remove_channel" ,
emoji : { name : "🗑️" }
} ,
{
type : 2 ,
style : ButtonStyle.Primary ,
label : "🔄 Actualizar" ,
custom_id : "refresh_list" ,
emoji : { name : "🔄" }
}
]
} ;
const actionRow2 = {
type : 1 ,
components : [
{
type : 2 ,
style : ButtonStyle.Secondary ,
label : "📊 Estadísticas" ,
custom_id : "show_stats" ,
emoji : { name : "📈" }
} ,
{
type : 2 ,
style : ButtonStyle.Secondary ,
label : "🧩 Ver Bloques" ,
custom_id : "show_blocks" ,
emoji : { name : "🧩" }
} ,
{
type : 2 ,
style : ButtonStyle.Secondary ,
label : "❓ Ayuda" ,
custom_id : "show_help" ,
emoji : { name : "📖" }
}
]
} ;
const response = await message . reply ( {
embeds : [ mainEmbed ] ,
components : [ actionRow1 , actionRow2 ]
} ) ;
// Collector para manejar interacciones
const collector = response . createMessageComponentCollector ( {
time : 600000 , // 10 minutos
filter : ( i ) = > i . user . id === message . author . id
} ) ;
collector . on ( "collect" , async ( interaction ) = > {
switch ( interaction . customId ) {
case "add_channel" :
await interaction . reply ( {
content : "➕ **Añadir Canal**\n\nUsa el comando: `!setchannel-alliance`\n\nEste comando te guiará para configurar un nuevo canal de alianzas." ,
flags : 64 // Ephemeral
} ) ;
break ;
case "remove_channel" :
await interaction . reply ( {
content : "🗑️ **Eliminar Canal**\n\nUsa el comando: `!removechannel-alliance`\n\nEste comando te permitirá eliminar canales de la configuración de alianzas." ,
flags : 64 // Ephemeral
} ) ;
break ;
case "refresh_list" :
await interaction . reply ( {
content : "🔄 **Lista Actualizada**\n\nUsa el comando nuevamente: `!listchannels-alliance`\n\nEsto mostrará la información más reciente." ,
flags : 64 // Ephemeral
} ) ;
break ;
case "show_stats" :
2025-09-20 15:19:41 -05:00
//@ts-ignore
2025-09-20 03:15:16 -05:00
const detailedStats = channelDetails . map ( c = >
` • ${ c . channelName } : ** ${ c . pointsCount } ** puntos `
) . join ( '\n' ) ;
await interaction . reply ( {
content : ` 📊 **Estadísticas Detalladas** \ n \ n**Puntos por Canal:** \ n ${ detailedStats } \ n \ n**Total del Servidor:** ${ totalPointsHistory } puntos ` ,
flags : 64 // Ephemeral
} ) ;
break ;
case "show_blocks" :
const blocksList = await client . prisma . blockV2Config . findMany ( {
where : { guildId : message.guildId ! } ,
select : { name : true , id : true }
} ) ;
const blocksText = blocksList . length > 0
? blocksList . map ( ( block : any , i : number ) = > ` ${ i + 1 } . \` ${ block . name } \` ` ) . join ( '\n' )
: "No hay bloques configurados" ;
await interaction . reply ( {
content : ` 🧩 **Bloques Disponibles ( ${ blocksList . length } )** \ n \ n ${ blocksText } \ n \ n💡 Crea bloques con: \` !blockcreate <nombre> \` ` ,
flags : 64 // Ephemeral
} ) ;
break ;
case "show_help" :
await interaction . reply ( {
content : ` 📖 **Ayuda - Sistema de Alianzas** \ n \ n**Comandos principales:** \ n• \` !setchannel-alliance \` - Configurar canal \ n• \` !removechannel-alliance \` - Eliminar canal \ n• \` !listchannels-alliance \` - Ver configurados \ n \ n**Comandos de bloques:** \ n• \` !blockcreate <nombre> \` - Crear bloque \ n• \` !blockeditv2 <nombre> \` - Editar bloque \ n• \` !embedlist \` - Ver todos los bloques ` ,
flags : 64 // Ephemeral
} ) ;
break ;
}
} ) ;
collector . on ( "end" , async ( ) = > {
try {
await response . edit ( {
components : [ ] // Remover botones cuando expire
} ) ;
} catch ( error ) {
// Ignorar errores si el mensaje fue eliminado
}
} ) ;
}
}