{"id":15045003,"url":"https://github.com/amgelo563/enki-bot","last_synced_at":"2026-03-08T01:34:21.106Z","repository":{"id":251981414,"uuid":"839032254","full_name":"Amgelo563/enki-bot","owner":"Amgelo563","description":"A data-driven Discord bot for creating custom message commands.","archived":false,"fork":false,"pushed_at":"2024-10-10T23:19:20.000Z","size":318,"stargazers_count":3,"open_issues_count":4,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-31T04:26:03.529Z","etag":null,"topics":["bot","discord","discord-bot","discord-js","documentation","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Amgelo563.png","metadata":{"files":{"readme":"README-es.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-08-06T20:37:34.000Z","updated_at":"2024-10-10T23:19:23.000Z","dependencies_parsed_at":"2024-09-25T02:05:32.737Z","dependency_job_id":null,"html_url":"https://github.com/Amgelo563/enki-bot","commit_stats":null,"previous_names":["amgelo563/enki-bot"],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Amgelo563%2Fenki-bot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Amgelo563%2Fenki-bot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Amgelo563%2Fenki-bot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Amgelo563%2Fenki-bot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Amgelo563","download_url":"https://codeload.github.com/Amgelo563/enki-bot/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238039755,"owners_count":19406395,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bot","discord","discord-bot","discord-js","documentation","typescript"],"created_at":"2024-09-24T20:51:20.475Z","updated_at":"2025-10-24T22:30:48.341Z","avatar_url":"https://github.com/Amgelo563.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 📚 Enki Bot\n\n**🇪🇸 Viendo en Español** / [🇺🇸 Read in English](README.md)\n\nUn bot de Discord totalmente configurable para crear documentación, permitiendo crear mensajes rápidos (Tags), con soporte de categorías, mensajes anidados, búsqueda personalizable de tags, y más.\n\n### Índice\n* [🔨 Uso](#-uso)\n    * [🏷 Tags](#-Tags)\n        * [Archivo Tag Atlas](#Archivo-Tag-Atlas)\n        * [Archivos de Tags](#Archivos-de-Tags)\n    * [📖 Resources](#-Resources)\n        * [Archivo Resource Atlas](#Archivo-Resource-Atlas)\n* [📁 Globs](#-Globs)\n* [⌨ Schemas](#-Schemas)\n    * [💬 Schema de Mensaje](#-schema-de-mensaje)\n    * [🤖 Schema de Comando](#-schema-de-comando)\n    * [🔍 Schema de Referencia a Tag](#-schema-de-referencia-a-tag)\n* [⚙ Configuración](#-configuración)\n* [🚀 Iniciar el Bot](#-iniciar-el-bot)\n\n## 🔨 Uso\n\nEnki soporta dos tipos de información: Tags (Etiquetas) y Resources (Recursos).\n\n\u003e [!TIP]\n\u003e En este ejemplo configuraremos Enki para un servidor donde ofreces productos.\n\u003e Para este ejemplo, se asume que en `config.conf` el source type es `local` y el `contentFolder` es `content` (o no se especificó, ya que es el valor por defecto).\n\n\u003e [!TIP]\n\u003e Toda la configuración de Enki usa HOCON (`.conf`). [Si deseas saber más sobre este formato, revisa esta guía.](https://gist.github.com/Amgelo563/b1005cdf035d5a44efaf377ece51c702)\n\n---\n\n### 🏷 Tags\n\nUn **Tag** (Etiqueta) es un mensaje que puede tener texto plano, embeds y/o botones, que es ejecutado por un comando. Son cargados por los **Tag Categories** (Categorías de etiquetas), las cuales son definidas en el archivo `tag-atlas.conf`.\n\nEn Discord:\n* La Category es cargada como un comando con una opción para seleccionar el Tag (usando autocompletado).\n* Opcionalmente, cada Tag dentro de la Category puede crear su propio comando, como un alias.\n\n\u003e [!TIP]\n\u003e Por ejemplo puedes crear una category para preguntas frecuentes del servidor y otra para videos, cada una con su propio comando (`/faq \u003ctag\u003e` y `/video \u003ctag\u003e`, respectivamente).\n\u003e ![PlantUML Tags Diagram](http://www.plantuml.com/plantuml/dpng/TO-z3e8m54RtFiKL1oO67PqmleARORZ2PsaihRIt_iJmxW8kQk9uppqvoLT6uI2fiseXBJfGZP0is1K-YJKEola6bErPqrOinuoMWhjiRgqHq5CHNRW-inwT_CHzJfEvOu7suP7D0j6XJuXYl2jMrGzOJs3uobnD0_ydDFyAhZwluping1Ak6QUy0000)\n\n#### Archivo Tag Atlas\n\nEl **Tag Atlas** (Atlas de Tags) es una lista de Tag Categories, donde cada una define los tags, el comando de la Category, qué comando se debería usar para buscar tags, y más.\n\n`content/tag-atlas.conf`\n```json5\n[\n  {\n    // Lista de Globs que corresponden a los tags de la Category, relativo a la carpeta actual.\n    // Revisa la sección de \"Globs\" para más información sobre cómo crearlos.\n    tags: [\"tags/faq/**.conf\"],\n    \n    // Comando a usar para crear tags de esta Category. El name es usado como ID de la Category\n    command: {\n      // Schema de Comando (con opción \"tag\", que corresponde al Tag a buscar).\n      // Revisa la sección de Schemas para ver las opciones disponibles aquí.\n    },\n    \n    // Define qué data puede usar el usuario para buscar tags en el autocompletado, aparte de las keywords del tag.\n    searchBy: {\n      // Si se puede buscar por el contenido en texto plano (content) del tag.\n      content: true,\n      // Si se puede buscar por el contenido de los embeds del tag.\n      embeds: true\n    },\n    \n    // Opcionalmente, el mensaje a usar cuando el comando se usa con un Tag inválido o no se especificó uno.\n    // No lo incluyas o ponlo en `false` si no lo necesitas.\n    // ^ En caso que hagas eso, la opción de \"tag\" será marcada como requerida, y usar un Tag inválido enviará el error definido en la config.\n    message: {\n      // Schema de Mensaje con Botones\n      // Revisa la sección de Schemas para ver las opciones disponibles aquí.\n    }\n  }\n]\n```\n\n#### Archivos de Tags\n\nTras definir la Tag Category, ahora puedes crear tus Tags dentro de los directorios que especificaste.\n\n`content/tags/faq/mi-pregunta.conf`\n```json5\n{\n  // Qué keywords (palabras clave) puede usar el usuario para usar este Tag. Al menos una es necesaria.\n  // Solo la primera keyword será mostrada como tal en el autocompletado, el resto funcionan como aliases internos de buscado.\n  // WARN: La primera keyword será usada como la ID del Tag. Aunque varios tags pueden tener las mismas keywords \"secundarias\",\n  //       la ID debe de ser única.\n  keywords: [\"my-question\"],\n  \n  // Opcionalmente, un comando alias que también sacará este Tag, aparte de poder usarlo dentro del comando de su Category.\n  // Don't include it or set it to `false` if you don't need it.\n  command: {\n    // Schema de Comando (sin opciones).\n    name: \"mi-pregunta\",\n    description: \"Comando que activará el tag mi-pregunta.\"\n  },\n\n  // Opcional, un nombre bonito para el Tag, mostrado junto al summary del mensaje en el autocompletado.\n  displayName: \"My Question\",\n  \n  // El mensaje del tag.\n  message: {\n    // Schema de Mensaje con Botones.\n  }\n}\n```\n\nCon esta configuración, puedes usar:\n* `/faq my-question` - Para usar el Tag \"mi-pregunta\".\n* `/my-question` - Igual que arriba, gracias a la propiedad `command` en `mi-pregunta.conf`.\n\n---\n\n### 📖 Resources\n\nUn **Resource** (Recurso) es un objeto que contiene Tags y Tag Categories. Son definidos en el archivo `resource-atlas.conf`.\n\nEn Discord:\n* Cada recurso es cargado como un comando.\n    * Los Tags \"directos\" del recurso son cargados como subcomandos.\n    * Los Tag Categories son cargados como subcomandos, con una opción para seleccionar el tag.\n* Opcionalmente, cada Tag dentro de una Tag Category puede incluir un alias como un subcomando, como si fuera un Tag directo del Resource.\n\n\u003e [!TIP]\n\u003e Por ejemplo, puedes tener un Resource \"mi-producto\" pudiendo incluir videos, faqs, un Tag de info, etc.\n\u003e ![PlantUML Resource diagram](http://www.plantuml.com/plantuml/png/TOozJiKm38NtF8K9GwSCC39Tn1iWDjJ196vlr2Hk4mUeKD-T_gW380PBnyV-laiHp59ZK3TofKXWATT0c0nN2JwHIkm8z3CLhjaIF4h0ek5Mw5CUFgvU2BuKG9TnXNKJPpDcTjLA0oUZzm-0LvywRe-ugeTov17jWFq6TpYL1bwmXoSKwZdF9xeIKwKYdfF1za_rTbJBBz-xTyJ_6_UpkMj_xlUdQvj5NIYv6iCt)\n\n#### Archivo Resource Atlas\n\nEl **Resource Atlas** (Atlas de Recursos) es una lista de Resources, donde cada uno define sus Tags, Tag Categories y su comando.\n\n```json5\n[\n  {\n    // El comando principal del Resource.\n    command: {\n      // También usado como ID del Resource.\n      name: \"mi-producto\",\n      description: \"Comando principal del Resource mi-producto.\"\n    },\n\n    // Lista de Globs que corresponden a los Tags de la Category, relativo a la carpeta actual.\n    // Revisa la sección de \"Globs\" para más información sobre cómo crearlos.\n    // WARN: Todos los tags incluidos aquí deben tener un comando (`command`) especificado, el cual será usado como su subcommando.\n    tags: [\"my-product/**.conf\"],\n\n    // Sigue el mismo formato que un Tag Atlas\n    categories: [\n      {\n        // Relativo a la carpeta actual.\n        tags: [\n          \"my-product/faq/**.conf\"\n        ],\n        // Aunque la opción se llama \"command\", en este caso sería un subcomando\n        command: {\n          // Schema de Comando (con opción \"tag\", que corresponde al Tag a buscar).\n          // Revisa la sección de Schemas para ver las opciones disponibles aquí.\n        },\n        searchBy: {\n          content: true,\n          embeds: true\n        },\n        // Opcional, al igual que en el Tag Atlas\n        message: {\n          // Schema de Mensaje con Botones\n          // Revisa la sección de Schemas para ver las opciones disponibles aquí.\n        }\n      }\n    ]\n  }\n]\n```\n\nAhora puedes usar:\n* `/my-product \u003ctag\u003e` para usar un Tag de `content/my-product`.\n* `/my-product faq [tag]` para usar un Tag de `content/my-product/faq`.\n\n---\n\n## 📁 Globs\n\nLos **Globs** son patrones para encontrar archivos usando una sintaxis especial. Aquí se especifica los usos más comunes.\n\n\u003e [!TIP]\n\u003e Puedes ver una [explicación más detallada aquí](https://www.npmjs.com/package/glob#glob-primer).\n\u003e Como contexto ahí, Enki solo usa la opción `{ absolute: true }`.\n\n* `*` Coincide 0 o más caracteres en una sola porción de ruta. Por ejemplo, `faq/*.conf` coincide todos los archivos `.conf` solo en la carpeta `faq`, no de forma recursiva.\n* `**` Lo mismo que arriba, pero de forma recursiva. (Coincidiría todos los `.conf` en `faq` y los que estén dentro de carpetas en `faq`).\n* `!(glob|glob)` Excluye los archivos que coincidan con los globs proveídos. Puedes usarlo con otros patrones para excluir archivos anteriormente coincididos. Por ejemplo, `[\"*.conf\", \"!*_ignore.conf\"]` coincidiría todos los archivos `.conf`, excepto los que terminen en `_ignore.conf`.\n* `?` Coincide 1 caracter cualquiera. Por ejemplo, `faq/?.conf` coincidiría `faq/A.conf`, `faq/B.conf`, etc; pero no `faq/AB.conf`.\n\n---\n\n## ⌨ Schemas\n\nLos **Schemas** son formatos que se utilizan frecuentemente en Enki.\n\n### 💬 Schema de Mensaje\n\nEl Schema de Mensaje es usado para configurar mensajes que serán enviados a usuarios.\n\n```json5\n{\n  // WARN: Aunque todas las opciones sean opcionales, todo mensaje tiene que contener o content o embeds (no se pueden omitir ambos, pero sí solo uno).\n\n  // El contenido en texto plano del mensaje, opcional.\n  content: \"Viendo un mensaje\",\n\n  // Los embeds del mensaje, opcional.\n  // Revisa https://discord.com/developers/docs/resources/message#embed-object-embed-limits para ver los límites de\n  // caracteres en cada parte del embed.\n  // Enki también revisará que todas las partes sean válidas, incluyendo la parte de \"sum of characters\".\n  // Todas las partes son opcionales, pero necesita al menos un title, un author, una description, una thumbnail, un field, una image o un footer.\n  embeds: [{\n    title: \"Título del embed\",\n    description: \"Descripción del embed\",\n    url: \"https://embed.url/\",\n\n    // https://www.iso.org/iso-8601-date-and-time-format.html\n    timestamp: \"2024-07-08\",\n\n    color: \"#FFFFFF\",\n    footer: {\n      text: \"Texto del Footer\",\n      // Opcional\n      icon: \"https://footer-icon.url/\",\n    },\n    image: \"https://image.url/\",\n    thumbnail: \"https://thumbnail.url/\",\n    author: {\n      name: \"Nombre del Autor\",\n      // Opcional\n      url: \"https://author.url/\",\n      // Opcional\n      icon: \"https://author-icon.url/\",\n    },\n    fields: [\n      {\n        name: \"Nombre del Field 1\",\n        value: \"Valor del Field 1\",\n        // Opcional\n        inline: false,\n      },\n      {\n        name: \"Nombre del Field 2\",\n        value: \"Valor del Field 2\",\n      }\n    ]\n  }],\n\n  // Lista de rutas (no globs) de archivos a ser enviados con el mensaje, opcional.\n  // Estas rutas pueden ser:\n  // - Relativas a la carpeta actual, si comienzan con ./ (por ejemplo, \"./ruta/relativa/archivo.png\").\n  // - Absolutas (desde la carpeta que contiene src, README, etc), si comienzan con / (por ejemplo, \"/ruta/absoluta/file.png\").\n  files: [\n    \"./ruta/relativa/archivo.png\",\n    \"/ruta/absoluta/file.png\"\n  ],\n\n  // Los botones del mensaje, opcional.\n  // WARN: Solo algunos mensajes soportan botones, normalmente los que no están anidados. Revisa la documentación de cada uno.\n  buttons: [\n    {\n      // Puede ser \"url\", \"tag\" o \"message\". Revisa los siguientes botones para ver ejemplos\n      type: \"url\",\n      // El texto del botón.\n      label: \"Link 1\",\n      // El emoji del botón, opcional.\n      emoji: \"🔗\", \n      // La URL del botón.\n      url: \"https://example.com\",\n    },\n    {\n      type: \"tag\",\n      label: \"Ver un tag relacionado\",\n      emoji: \"❓\",\n      // Schema de Referencia a Tag.\n      tag: {\n        \n      },\n    },\n    {\n      type: \"message\",\n      label: \"Mira este otro mensaje\",\n      emoji: \"👀\",\n      // Usado internamente, debe ser único entre todos los mensajes (botones \"message\") de este botón.\n      id: \"unMensaje\",\n      message: {\n        // Schema de Mensaje Sin Botones\n        content: \"Otro contenido de mensaje\",\n        embeds: [{\n          title: \"Otro embed\",\n          // etc\n        }]\n      }\n    }\n  ],\n\n  // Un resumen opcional del mensaje, usado para el autocompletado.\n  // Si no se especifica, el resumen se generará automáticamente a partir del content y/o titles de los embeds.\n  summary: \"Mi mensaje\",\n  \n  // Variantes de este mensaje que el usuario puede seleccionar manualmente, disponible para mensajes de Tags.\n  // Si se especifica, la opción \"variant\" de la config será puesta al comando del Tag o a su Category.\n  // Puede ser usado para crear versiones en otros idiomas, o que dependan de la versión del usuario, etc.\n  // Puedes usar la sintaxis de `include` de HOCON para crear variantes en otros archivos.\n  variants: {\n    english: {\n      // Schema de Mensaje con Botones.\n    },\n  }\n}\n```\n\n### 🤖 Schema de Comando\n\nEl Schema de Comando es usado para configura sub/comandos y sus opciones.\n\n```json5\n{\n  // El nombre del comando.\n  name: \"mi-comando\",\n  \n  // La descripción del comando.\n  description: \"Mi comando.\",\n  \n  // Opcional, datos usados para clientes de Discord en un idioma en específico.\n  // Revisa https://discord-api-types.dev/api/0.37.92/discord-api-types-rest/common/enum/Locale#Index para ver todos los idiomas disponibles.\n  locale: {\n    EnglishUS: {\n      name: \"my-command\",\n      description: \"My command.\"\n    }\n  },\n  \n  // Las opciones del comando. Algunos las tienen, otros no, dependen del contexto y están documentados los que sí.\n  options: {\n    unaOpcion: {\n      name: \"opción\",\n      description: \"La descripción de esta opción.\",\n      \n      // Igual que el locale del comando, también opcional.\n      locale: {\n        EnglishUS: {\n          name: \"option\",\n          description: \"This option's description.\"\n        }\n      }\n    }\n  },\n\n  // Opcional, los \"integration types\" del comando. Sobreescribe los defaultIntegrations de la config.\n  // En esencia, dónde puede ser instalado el comando.\n  // Revisa https://discord-api-types.dev/api/discord-api-types-v10/enum/ApplicationIntegrationType.\n  integrationTypes: [\n    \"GuildInstall\", // Puede ser instalado en una Guild.\n    \"UserInstall\", // Puede ser instalado en un Usuario.\n  ],\n\n  // Opcional, los \"interaction contexts\" del comando. Sobreescribe los defaultContexts de la config.\n  // En esencia, dónde el comando puede ser usado luego de ser instalado en uno de sus integrationTypes.\n  // Revisa https://discord-api-types.dev/api/discord-api-types-v10/enum/InteractionContextType.\n  interactionContexts: [\n    \"BotDM\", // Puede ser usado en el DM del bot.\n    \"PrivateChannel\", // Puede ser usado en DMs de otros usuarios, incluyendo grupos de DM, luego de ser instalados en un Usuario.\n    \"Guild\", // Puede ser usado en una Guild, luego de ser instalado en una.\n  ],\n}\n```\n\n\u003e [!CAUTION]\n\u003e Tu aplicación debe soportar los `integrationTypes` que quieras usar. Puedes cambiar esto en [los ajustes de tu app](https://discord.com/developers/applications),\n\u003e en **Installation**: **Installation Contexts**.\n\u003e\n\u003e Si usas un integrationType que tu aplicación no soporta, vas a recibir un error.\n\n### 🔍 Schema de Referencia a Tag\n\nEl Schema de Referencia a Tag es usado cuando se \"refiere\" a un Tag o su variante. Actualmente solo se usa para botones de tipo \"tag\".\n\n\u003e [!CAUTION]\n\u003e Las referencias son revisadas al iniciar para ver si el Tag/Category/Resource existe.\n\u003e Esto incluye referencias a Categorys (sin especificar un Tag) y la Category no tiene un mensaje configurado.\n\n\u003e [!TIP]\n\u003e Como recordatorio:\n\u003e * La ID de una Tag Category o un Resource son sus nombres de sus comandos.\n\u003e * La ID de un Tag es su primer keyword.\n\nOpciones disponibles para referencias:\n\n#### Tags del Tag Atlas\n\nReferirse a un message de una Tag Category.\n\n```json5\n{\n  category: \"mi-categoría\"\n}\n```\n\nReferirse a un Tag de una Tag Category.\n\n```json5\n{\n  category: \"mi-categoría\",\n  tag: \"mi-tag\"\n}\n```\n\n#### Tags del Resource Atlas\n\nReferirse a un message de una Tag Category de un Resource.\n\n```json5\n{\n  resource: \"recurso\",\n  category: \"tag-category\",\n}\n```\n\nReferirse a un Tag de un Resource.\n\n```json5\n{\n  resource: \"recurso\",\n  tag: \"mi-tag\"\n}\n```\n\nReferirse a un Tag de una Tag Category de un Resource.\n\n```json5\n{\n  resource: \"recurso\",\n  category: \"tag-category\",\n  tag: \"mi-tag\"\n}\n```\n\n## ⚙ Configuración\n\nEl archivo `config.conf` te permite configurar el comportamiento o mensajes del bot.\n\n```json5\n{\n  // Token del Bot.\n  token: \"TOKEN\",\n\n  // Si es que el bot debe actualizar sus comandos. Puedes establecerlo a `false` mientras testeas.\n  updateCommands: true,\n  \n  // Define dónde están los atlases.\n  source: {\n    // Puede ser \"local\" o \"git\".\n    type: \"\",\n    \n    // La carpeta donde los atlases se encuentran.\n    // Con el type en \"local\", es relativo a la carpeta raíz (donde se encuentra el package.json), y por defecto es \"content\".\n    // Con el type en \"git\", es relativo a la carpeta raíz del repositorio de git. No contiene un valor por defecto, si no se especifica se usa la misma carpeta raíz del repositorio. \n    contentFolder: \"content\",\n    \n    // Las siguientes opciones solo son usadas con el type en \"git\".\n    \n    // La URL del repositorio de git a clonar. Debe terminar en `.git`.\n    gitUrl: \"\",\n    \n    // Opcionalmente, la carpeta donde los clones de repositorios se guardarán. Por defecto es \"__clone__\".\n    cloneFolder: \"\",\n  },\n  \n  // Contiene los mensajes de error.\n  errors: {\n    // Mensaje usado cuando el usuario especifica un Tag no existente. Puede incluir botones.\n    tagNotFound: {\n      content: \"Tag desconocido.\"\n    },\n    \n    // Mensaje para errores genéricos detectados por el bot. Puede incluir botones.\n    generic: {\n      content: \"Ha ocurrido un error. Por favor contáctese con el administrador.\"\n    }\n  },\n  \n  // Contiene opciones para comandos.\n  options: {\n    // Schema de Opción de Comando para seleccionar una variante, solo usado para Tags que lo tengan.\n    variant: {\n      name: \"variante\",\n      description: \"Selecciona una variante de este tag.\"\n    },\n    // Schema de Opción de Comando para escoger si el mensaje del Tag debería ser mostrado solo para el que lo invoca.\n    // Útil para cerciorarse del contenido de un Tag antes de mandarlo.\n    hide: {\n      name: \"esconder\",\n      description: \"Si es que se debería mostrar el contenido de este Tag solo para ti.\"\n    }\n  },\n\n  // Los integrationTypes por defecto para todos los comandos, a no ser que pongan unos manualmente.\n  // En esencia, dónde puede ser instalado el comando.\n  // Revisa https://discord-api-types.dev/api/discord-api-types-v10/enum/ApplicationIntegrationType.\n  // Opcional para backwards compatibility, por defecto: [\"GuildInstall\"]. Será requerido en la siguiente versión mayor.\n  defaultIntegrations: [\n    \"GuildInstall\", // Puede ser instalado en una Guild.\n    \"UserInstall\", // Puede ser instalado en un Usuario.\n  ],\n\n  // Los interactionContexts por defecto para todos los comandos, a no ser que pongan unos manualmente.\n  // En esencia, dónde el comando puede ser usado luego de ser instalado en uno de sus integrationTypes.\n  // Revisa https://discord-api-types.dev/api/discord-api-types-v10/enum/InteractionContextType.\n  // Opcional para backwards compatibility, por defecto: [\"Guild\", \"BotDM\", \"PrivateChannel\"]. Será requerido en la siguiente versión mayor.\n  defaultContexts: [\n    \"BotDM\", // Puede ser usado en el DM del bot.\n    \"PrivateChannel\", // Puede ser usado en DMs de otros usuarios, incluyendo grupos de DM, luego de ser instalados en un Usuario.\n    \"Guild\", // Puede ser usado en una Guild, luego de ser instalado en una.\n  ],\n}\n```\n\n\u003e [!CAUTION]\n\u003e Tu aplicación debe soportar los `integrationTypes` que quieras usar. Puedes cambiar esto en [los ajustes de tu app](https://discord.com/developers/applications),\n\u003e en **Installation**: **Installation Contexts**.\n\u003e\n\u003e Si usas un integrationType que tu aplicación no soporta, vas a recibir un error.\n\n## 🚀 Iniciar el Bot\n\nEnki requiere al menos Node.js 20.\n\n1. Usa `npm install` para instalar las dependencias.\n2. Usa `npm run build` para compilar el bot.\n3. Rellena tu `config.conf`, tus atlases y tu contenido.\n4. Usa `npm run start` para iniciar el bot.\n\nOpcionalmente, puedes usar `npm run start:parse` para solo iniciar la fase de \"parseo\" del bot, es decir que solo se cargarán los archivos (asegurándose que sean válidos), pero no se iniciará el bot como tal.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famgelo563%2Fenki-bot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Famgelo563%2Fenki-bot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famgelo563%2Fenki-bot/lists"}