Files
amayo/DISPLAYCOMPONENTS_IMPLEMENTATION.md

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:

  1. !inventario - Lista de items visual con thumbnails
  2. !tienda - Catálogo visual de items
  3. !player - Stats del jugador en formato visual
  4. !item-crear - Mejorar con DisplayComponents
  5. !area-crear - Mejorar con DisplayComponents
  6. !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 - Container
  • 9 - Section
  • 10 - TextDisplay
  • 14 - Separator
  • 11 - Thumbnail
  • 2 - Button (ActionRow)
  • 3 - Select Menu
  • 4 - TextInput (en modales)
  • 40 - Label (wrapper para inputs en modales)

Best Practices:

  1. Usar accent_color para dar contexto visual

    • Logros: 0xFFD700 (dorado)
    • Misiones: 0x5865F2 (azul Discord)
    • Errores: 0xFF0000 (rojo)
    • Éxito: 0x00FF00 (verde)
  2. Separators con divider: true entre secciones importantes

  3. TextDisplay soporta Markdown:

    • Bold, Italic, Code
    • json code blocks
    • Listas, etc.
  4. Modales siempre usan as const para type safety

  5. awaitModalSubmit debe tener timeout y catch

  6. 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:

  1. Los DisplayComponents se renderizan correctamente
  2. Los separators dividen las secciones
  3. El accent_color se muestra
  4. Los botones son clickeables
  5. Los modales se abren
  6. Los TextDisplay en modales son visibles
  7. Los datos se guardan correctamente

📚 Recursos

  • Ejemplo oficial: example.ts.txt en 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

  1. DisplayComponents son beta en discord.js
  2. No todas las features están documentadas
  3. Algunos componentes pueden no funcionar en mobile
  4. TextDisplay tiene límite de caracteres (~2000)
  5. Containers tienen límite de componentes (~25)

🎯 Próximos Pasos

  1. Comandos admin para logros y misiones - COMPLETADO
  2. Actualizar !inventario con DisplayComponents
  3. Actualizar !tienda con DisplayComponents
  4. Actualizar !player con DisplayComponents
  5. Mejorar !item-crear, !area-crear, !mob-crear
  6. Crear comando !ranking con DisplayComponents
  7. Crear comando !logros con DisplayComponents mejorado
  8. Crear comando !misiones con DisplayComponents mejorado