8.0 KiB
8.0 KiB
🎨 Implementación de DisplayComponents y Comandos Admin
✅ Nuevos Comandos Administrativos Creados
1. !logro-crear (src/commands/messages/admin/logroCrear.ts)
Editor interactivo completo para crear logros usando DisplayComponents.
Características:
- ✅ Preview visual con DisplayComponents
- ✅ Modales interactivos para editar cada sección
- ✅ Sections: Base, Requisitos, Recompensas
- ✅ Validación de JSON para requisitos y recompensas
- ✅ Botones de navegación intuitivos
- ✅ Auto-guardado con confirmación
Uso:
!logro-crear <key>
Display Components utilizados:
- Container (type 17) - Contenedor principal con accent_color
- Section (type 9) - Secciones organizadas
- TextDisplay (type 10) - Contenido de texto formateado
- Separator (type 14) - Divisores visuales
- Modales con Label + TextInput para entrada de datos
- TextDisplay en modales para instrucciones
2. !mision-crear (src/commands/messages/admin/misionCrear.ts)
Editor interactivo completo para crear misiones usando DisplayComponents.
Características:
- ✅ Preview visual con DisplayComponents
- ✅ Modales para Base, Requisitos y Recompensas
- ✅ Soporte para tipos: daily, weekly, permanent, event
- ✅ Validación de JSON
- ✅ Emojis contextuales según tipo de misión
Uso:
!mision-crear <key>
🎨 DisplayComponents - Guía de Uso
Tipos de Componentes Implementados
// Container - Contenedor principal (type 17)
{
type: 17,
accent_color: 0xFFD700, // Color hex
components: [ /* otros componentes */ ]
}
// Section - Sección con contenido (type 9)
{
type: 9,
components: [ /* TextDisplay, etc */ ]
}
// TextDisplay - Texto formateado (type 10)
{
type: 10,
content: "**Bold** *Italic* `Code` ```json\n{}\n```"
}
// Separator - Divisor visual (type 14)
{
type: 14,
divider: true
}
// Thumbnail - Imagen/thumbnail (type 11)
{
type: 11,
media: { url: "https://..." }
}
Modales con DisplayComponents
const modal = {
title: 'Título del Modal',
customId: 'modal_id',
components: [
// TextDisplay para instrucciones
{
type: ComponentType.TextDisplay,
content: 'Instrucciones aquí'
},
// Label con TextInput
{
type: ComponentType.Label,
label: 'Campo a llenar',
component: {
type: ComponentType.TextInput,
customId: 'field_id',
style: TextInputStyle.Short, // o Paragraph
required: true,
value: 'Valor actual',
placeholder: 'Placeholder...'
}
}
]
} as const;
await interaction.showModal(modal);
Responder a Modal Submits
const submit = await interaction.awaitModalSubmit({
time: 5 * 60_000
}).catch(() => null);
if (!submit) return;
const value = submit.components.getTextInputValue('field_id');
// Actualizar display
await submit.deferUpdate();
await message.edit({ display: newDisplay });
📊 Estructura de Display
Los comandos admin siguen esta estructura:
┌─────────────────────────────┐
│ Container (accent_color) │
├─────────────────────────────┤
│ Section: Título │
├─────────────────────────────┤
│ Separator (divider) │
├─────────────────────────────┤
│ Section: Campos Base │
├─────────────────────────────┤
│ Separator │
├─────────────────────────────┤
│ Section: Requisitos (JSON) │
├─────────────────────────────┤
│ Separator │
├─────────────────────────────┤
│ Section: Recompensas (JSON) │
└─────────────────────────────┘
🔧 Integración con Comandos Existentes
Próximos comandos a actualizar con DisplayComponents:
- !inventario - Lista de items visual con thumbnails
- !tienda - Catálogo visual de items
- !player - Stats del jugador en formato visual
- !item-crear - Mejorar con DisplayComponents
- !area-crear - Mejorar con DisplayComponents
- !mob-crear - Mejorar con DisplayComponents
Patrón recomendado para actualizar comandos:
// 1. Crear función de display
function createDisplay(data: any) {
return {
display: {
type: 17,
accent_color: 0xCOLOR,
components: [
// Secciones aquí
]
}
};
}
// 2. Enviar con botones
const msg = await channel.send({
...createDisplay(data),
components: [
{
type: ComponentType.ActionRow,
components: [ /* botones */ ]
}
]
});
// 3. Collector para interacciones
const collector = msg.createMessageComponentCollector({ ... });
// 4. Actualizar display al cambiar datos
await msg.edit(createDisplay(updatedData));
🎯 Ventajas de DisplayComponents
vs. Embeds tradicionales:
- ✅ Más moderno y visual
- ✅ Mejor separación de secciones
- ✅ Dividers nativos
- ✅ Accent color personalizable
- ✅ Mejor para contenido largo
- ✅ Soporte nativo en discord.js dev
vs. Texto plano:
- ✅ Muchísimo más visual
- ✅ Organización clara
- ✅ Professional look
- ✅ Mejor UX para el usuario
- ✅ Más información en menos espacio
📝 Notas de Implementación
Tipos de Componente (ComponentType):
17- Container9- Section10- TextDisplay14- Separator11- Thumbnail2- Button (ActionRow)3- Select Menu4- TextInput (en modales)40- Label (wrapper para inputs en modales)
Best Practices:
-
Usar accent_color para dar contexto visual
- Logros: 0xFFD700 (dorado)
- Misiones: 0x5865F2 (azul Discord)
- Errores: 0xFF0000 (rojo)
- Éxito: 0x00FF00 (verde)
-
Separators con divider: true entre secciones importantes
-
TextDisplay soporta Markdown:
- Bold, Italic,
Code json code blocks- Listas, etc.
- Bold, Italic,
-
Modales siempre usan
as constpara type safety -
awaitModalSubmit debe tener timeout y catch
-
Siempre hacer deferUpdate() antes de editar mensaje tras modal
🚀 Testing
Comandos a probar:
# Crear logro
!logro-crear test_achievement
# Crear misión
!mision-crear test_quest
# Verificar que los displays se ven correctamente
# Verificar que los modales funcionan
# Verificar que el guardado funciona
# Verificar que los datos se persisten en DB
Verificar en Discord:
- Los DisplayComponents se renderizan correctamente
- Los separators dividen las secciones
- El accent_color se muestra
- Los botones son clickeables
- Los modales se abren
- Los TextDisplay en modales son visibles
- Los datos se guardan correctamente
📚 Recursos
- Ejemplo oficial:
example.ts.txten la raíz del proyecto - Tipos:
src/core/types/displayComponents.ts - Discord.js types:
node_modules/discord.js/typings/index.d.ts - API Types:
node_modules/discord-api-types/
⚠️ Limitaciones Conocidas
- DisplayComponents son beta en discord.js
- No todas las features están documentadas
- Algunos componentes pueden no funcionar en mobile
- TextDisplay tiene límite de caracteres (~2000)
- Containers tienen límite de componentes (~25)
🎯 Próximos Pasos
- ✅ Comandos admin para logros y misiones - COMPLETADO
- ⬜ Actualizar !inventario con DisplayComponents
- ⬜ Actualizar !tienda con DisplayComponents
- ⬜ Actualizar !player con DisplayComponents
- ⬜ Mejorar !item-crear, !area-crear, !mob-crear
- ⬜ Crear comando !ranking con DisplayComponents
- ⬜ Crear comando !logros con DisplayComponents mejorado
- ⬜ Crear comando !misiones con DisplayComponents mejorado