← Volver al panelGuía de comandos personalizados

Modo avanzado

Todo lo que necesitás para escribir comandos personalizados a mano. Si solo querés mandar un mensaje, una tarjeta o dar un rol, el modo simple lo hace sin código.

Qué es un comando#

Un comando personalizado es un pequeño programa que el bot ejecuta cuando alguien escribe un texto en tu servidor, por ejemplo !hola. El lenguaje se parece a JavaScript, pero es mucho más chico: tiene solo lo necesario para mandar mensajes y tarjetas, consultar miembros y dar roles.

Código
ReplyMessage({
    message: "¡Hola! Soy el bot de este servidor",
})

Cómo se activa#

El comando se activa cuando un mensaje contiene su texto de activación. Si el comando usa menciones, el texto puede ir antes o después de la mención:

En Discord
!darrol @Serez Dev
@Serez Dev !darrol

Distingue mayúsculas y minúsculas. Si varios comandos coinciden, se ejecuta el de texto más largo. Las menciones de roles, @everyone y @here no cuentan como menciones de miembros.

Estructura del código#

Un programa tiene una o más instrucciones, normalmente una por línea. El punto y coma es opcional; el formatter lo quita.

Código
const role = Role("371826690424569866")
const member = GetMember("123456789012345678")

Los saltos de línea dentro de paréntesis, objetos y arrays no terminan la instrucción, así que podés repartir una llamada larga en varias líneas.

Mayúsculas y minúsculas

Los nombres distinguen mayúsculas: GetMember existe, getMember no.

Comentarios

Código
// Comentario de una línea
/*
 * Comentario de varias líneas.
 * No pueden anidarse.
 */
ReplyMessage({
    message: "Hola",
})

Valores#

Texto (strings)

Con comillas dobles o simples; el formatter las pasa a dobles. Para unir textos se usa +.

Código
const first = "Hola"
const second = 'Mundo'
const greeting = first + ", " + second
EscrituraResultado
\nSalto de línea
\tTabulación
\"Comilla doble
\'Comilla simple
\\Barra invertida
\uFFFFCarácter Unicode (cuatro dígitos hexadecimales)

Números, booleanos y null

Código
const attempts = 0
const average = 4.5
const offset = -5
const enabled = true
const nothing = null

No hay notación exponencial (1e6). null representa la ausencia de un valor.

Objetos

Las propiedades van sin comillas. La coma final es válida y recomendada.

Código
const card = {
    title: "Panel informativo",
    description: "Contenido del panel",
}

SendEmbed(card)

Arrays

Los elementos se leen por posición, empezando en cero.

Código
const roleIds = ["371826690424569866", "371826690424569867"]
AddRole(GetAuthor(), Role(roleIds[0]))

Variables#

let crea una variable que se puede cambiar; const, una que no. Las dos necesitan un valor inicial.

Código
let attempts = 0
attempts += 1
attempts++

const message = "Hola"
Incorrecto
const message = "Hola"
message = "Otro mensaje"
El editor marca: No se puede reasignar la constante message

Una variable existe solo dentro del bloque { } donde se declaró.

Un objeto guardado en una const sí puede cambiar sus propiedades; lo que no se puede es reemplazarlo entero:

Código
const config = {
    message: "Mensaje inicial",
}

config.message = "Mensaje actualizado"
SendMessage(config)

Propiedades y operadores#

Las propiedades se leen con punto o con corchetes, y se pueden encadenar.

Código
const author = GetAuthor()

ReplyMessage({
    message: "Hola, " + author.displayName + ". Tu ID es " + author.id,
})

Operadores

OperadoresUso
+ - * / %Aritmética. + también une textos (dos textos o dos números).
=== !==Igualdad estricta. No existen == ni !=.
< <= > >=Comparación entre dos números o dos textos.
&& || !Lógicos, solo con valores verdadero o falso.
= += -=Asignación.
++ --Sumar o restar 1 a una variable numérica.
( )Agrupar para cambiar el orden de evaluación.

Condiciones#

Los paréntesis y las llaves son obligatorios.

Código
const author = GetAuthor()
const role = Role("371826690424569866")

if (author.bot) {
    ReplyMessage({
        message: "Los bots no pueden usar este comando",
    })
} else if (HasRole(author, role)) {
    ReplyMessage({
        message: "Ya tenés el rol",
    })
} else {
    AddRole(author, role)
}

Miembros y menciones#

Quién escribió y a quién mencionó

GetAuthor() devuelve a quien escribió el comando. GetMentionedMember() devuelve al primer miembro mencionado y GetMentionedMembers(), a todos. Las tres siempre devuelven un valor, así que se usan directamente.

Código
AddRole(GetMentionedMember(), Role("371826690424569866"))
ReplyMessage({
    message: "Rol entregado",
})
Mención obligatoria. Si el código usa GetMentionedMember o GetMentionedMembers en cualquier parte, aunque sea dentro de un if, el comando exige una mención. Sin ella, el bot responde con un error y no ejecuta nada, así que un comando nunca queda hecho a medias.

Buscar a un miembro por su ID

GetMember("id") puede devolver null si la persona no está en el servidor. Antes de usar el resultado hay que descartarlo; dentro del if, el editor ya sabe que existe.

Código
const member = GetMember("123456789012345678")

if (member === null) {
    ReplyMessage({
        message: "No se encontró el miembro",
    })
} else {
    AddRole(member, Role("371826690424569866"))
}
Incorrecto
const member = GetMember("123456789012345678")
AddRole(member, Role("371826690424569866"))
El editor marca: member requiere Member y recibió Member | Null
La comprobación de null tiene que ser la condición completa del if. Si además necesitás otra condición, anidá los if en vez de unirlas con &&.

Recorrer listas#

El único bucle es for...of: recorre una lista. continue pasa al siguiente elemento y break termina el recorrido.

Código
for (const member of GetMentionedMembers()) {
    if (member.bot) {
        continue
    }

    AddRole(member, Role("371826690424569866"))
}
Código
let found = false

for (const member of GetMembers()) {
    if (member.id === "123456789012345678") {
        found = true
        break
    }
}

if (found) {
    ReplyMessage({
        message: "Miembro encontrado",
    })
}

IDs de Discord#

Los IDs de canales, roles y usuarios se escriben como texto, entre comillas, y tienen entre 17 y 20 dígitos. Para copiar un ID en Discord, activá el modo desarrollador y usá «Copiar ID».

Código
SendMessage({
    channel: Channel("123456789012345678"),
    message: "Anuncio",
})
Incorrecto
Channel(123456789012345678)
El editor marca: channelId requiere String y recibió Number

Funciones#

Estas son todas las funciones disponibles. Los nombres se escriben exactamente así.

Referencia

Crea una referencia controlada a partir de un identificador.

Channel

Referencia

Crea una referencia de canal a partir de un ID de Discord.

Channel(channelId: String): ChannelReference
Devuelve:
ChannelReference
Parámetros:
channelId String (ID de Discord (17 a 20 dígitos))
Ejemplo
Channel("123456789012345678")

Role

Referencia

Crea una referencia de rol a partir de un ID de Discord.

Role(roleId: String): RoleReference
Devuelve:
RoleReference
Parámetros:
roleId String (ID de Discord (17 a 20 dígitos))
Ejemplo
Role("371826690424569866")

Consulta

Obtiene un valor controlado para utilizar dentro del programa.

GetMember

Consulta

Obtiene un miembro mediante su ID. Puede devolver null.

GetMember(userId: String): Member | Null
Devuelve:
Member | Null — puede ser null: descartalo antes de usarlo.
Parámetros:
userId String (ID de Discord (17 a 20 dígitos))
Ejemplo
const member = GetMember("123456789012345678")
Ejemplo
const member = GetMember("123456789012345678")
if (member !== null) {
    ReplyMessage({ message: member.displayName })
}

GetMembers

Consulta

Obtiene una colección de miembros disponibles.

GetMembers(): Array<Member>
Devuelve:
Array<Member>
Ejemplo
const members = GetMembers()

GetAuthor

Consulta

Obtiene el miembro que escribió el mensaje que activó el comando.

GetAuthor(): Member
Devuelve:
Member
Ejemplo
const author = GetAuthor()
Ejemplo
AddRole(GetAuthor(), Role("371826690424569866"))

GetMentionedMember

Consulta

Obtiene el primer miembro mencionado en el mensaje, según el orden del texto. Ignora menciones de roles, @everyone, @here y usuarios que no pertenecen al servidor. El comando exige una mención: si el mensaje no menciona a ningún miembro, no se ejecuta.

GetMentionedMember(): Member
Devuelve:
Member
El comando exige que el mensaje mencione al menos a un miembro.
Ejemplo
const target = GetMentionedMember()
Ejemplo
AddRole(GetMentionedMember(), Role("371826690424569866"))

GetMentionedMembers

Consulta

Obtiene todos los miembros mencionados en el orden del texto, sin duplicados. Ignora menciones de roles, @everyone, @here y usuarios que no pertenecen al servidor. El comando exige una mención: si el mensaje no menciona a ningún miembro, no se ejecuta, por lo que el array nunca está vacío.

GetMentionedMembers(): Array<Member>
Devuelve:
Array<Member>
El comando exige que el mensaje mencione al menos a un miembro.
Ejemplo
const members = GetMentionedMembers()
Ejemplo
for (const member of GetMentionedMembers()) {
    AddRole(member, Role("371826690424569866"))
}

HasRole

Consulta

Indica si un miembro contiene la referencia de rol indicada.

HasRole(member: Member, role: RoleReference): Boolean
Devuelve:
Boolean
Parámetros:
member Member, role RoleReference
Ejemplo
HasRole(member, Role("371826690424569866"))

Acción

Representa una acción disponible en el lenguaje.

AddRole

Acción

Solicita agregar un rol a un miembro.

AddRole(member: Member, role: RoleReference): Void
Devuelve:
Void
Parámetros:
member Member, role RoleReference
Ejemplo
AddRole(member, Role("371826690424569866"))

SendMessage

Acción

Envía un mensaje al canal indicado o al canal actual cuando channel se omite.

SendMessage(config: SendMessageConfig): Void
Devuelve:
Void
Parámetros:
config SendMessageConfig
Ejemplo
SendMessage({ message: "Hola" })
Ejemplo
SendMessage({ channel: Channel("123456789012345678"), message: "Hola" })

ReplyMessage

Acción

Responde con texto al mensaje que originó el comando.

ReplyMessage(config: ReplyMessageConfig): Void
Devuelve:
Void
Parámetros:
config ReplyMessageConfig
Ejemplo
ReplyMessage({ message: "Rol agregado" })

SendEmbed

Acción

Envía un embed al canal indicado o al canal actual cuando channel se omite.

SendEmbed(config: SendEmbedConfig): Void
Devuelve:
Void
Parámetros:
config SendEmbedConfig
Ejemplo
SendEmbed({ description: "Información" })
Ejemplo
SendEmbed({ image: "https://example.com/banner.png" })
Ejemplo
SendEmbed({ channel: Channel("123456789012345678"), message: "Aviso", title: "Novedad", image: "https://example.com/banner.png" })

ReplyEmbed

Acción

Responde al mensaje de origen con un embed.

ReplyEmbed(config: ReplyEmbedConfig): Void
Devuelve:
Void
Parámetros:
config ReplyEmbedConfig
Ejemplo
ReplyEmbed({ description: "Contenido de la respuesta" })
Ejemplo
ReplyEmbed({ image: "https://example.com/banner.png" })

Tipos y configuraciones#

Valores del servidor

Los devuelven las funciones y son de solo lectura: se pueden leer, pero no modificar.

ChannelReference

PropiedadTipoObligatoriaReglas
idStringSíID de Discord (17 a 20 dígitos) · Solo lectura

RoleReference

PropiedadTipoObligatoriaReglas
idStringSíID de Discord (17 a 20 dígitos) · Solo lectura

Member

PropiedadTipoObligatoriaReglas
idStringSíID de Discord (17 a 20 dígitos) · Solo lectura
displayNameStringSíSolo lectura
botBooleanSíSolo lectura
rolesArray<RoleReference>SíSolo lectura

Configuraciones de mensajes y tarjetas

Son los objetos que reciben SendMessage, SendEmbed y las demás acciones. Solo admiten las propiedades de la tabla. Los colores usan el formato #RRGGBB y los enlaces tienen que empezar con http:// o https://.

EmbedAuthor

PropiedadTipoObligatoriaReglas
nameStringSí1 a 256 caracteres
iconStringNo1 a 2048 caracteres · URL http:// o https://
urlStringNo1 a 2048 caracteres · URL http:// o https://

EmbedFooter

PropiedadTipoObligatoriaReglas
textStringSí1 a 2048 caracteres
iconStringNo1 a 2048 caracteres · URL http:// o https://

SendMessageConfig

PropiedadTipoObligatoriaReglas
channelChannelReferenceNo—
messageStringSí1 a 2000 caracteres

ReplyMessageConfig

PropiedadTipoObligatoriaReglas
messageStringSí1 a 2000 caracteres

SendEmbedConfig

Requiere al menos una de: titledescriptioncolorurlimageauthorfooter

PropiedadTipoObligatoriaReglas
channelChannelReferenceNo—
messageStringNo1 a 2000 caracteres
titleStringNo1 a 256 caracteres
descriptionStringNo1 a 4096 caracteres
colorStringNoColor #RRGGBB
urlStringNo1 a 2048 caracteres · URL http:// o https://
imageStringNo1 a 2048 caracteres · URL http:// o https://
authorEmbedAuthorNo—
footerEmbedFooterNo—

ReplyEmbedConfig

Requiere al menos una de: titledescriptioncolorurlimageauthorfooter

PropiedadTipoObligatoriaReglas
messageStringNo1 a 2000 caracteres
titleStringNo1 a 256 caracteres
descriptionStringNo1 a 4096 caracteres
colorStringNoColor #RRGGBB
urlStringNo1 a 2048 caracteres · URL http:// o https://
imageStringNo1 a 2048 caracteres · URL http:// o https://
authorEmbedAuthorNo—
footerEmbedFooterNo—

Recetas#

Mensaje en otro canal

Código
SendMessage({
    channel: Channel("123456789012345678"),
    message: "El evento comienza en diez minutos",
})

Tarjeta con texto e imagen

Código
SendEmbed({
    title: "Actualización",
    description: "Se publicó una nueva versión",
    color: "#5865F2",
    image: "https://example.com/release.png",
    footer: {
        text: "Servidor oficial",
    },
})

Dar un rol a quien escribe, si todavía no lo tiene

Código
const author = GetAuthor()
const role = Role("371826690424569866")

if (HasRole(author, role)) {
    ReplyMessage({
        message: "Ya tenés el rol",
    })
} else {
    AddRole(author, role)
    ReplyMessage({
        message: "Rol agregado",
    })
}

Mencionar a alguien en el mensaje

Discord muestra como mención cualquier texto con la forma <@ID>. Se arma uniendo el ID con +. Funciona en el mensaje y en la descripción de una tarjeta. En el modo simple es lo mismo que escribir {autor} o {mencionado}.

Código
AddRole(GetMentionedMember(), Role("371826690424569866"))
ReplyMessage({
    message: "<@" + GetAuthor().id + "> le dio el rol a <@" + GetMentionedMember().id + ">",
})

Solo un rol puede usar el comando

La autorización se comprueba sobre quien escribe (GetAuthor()), nunca sobre la persona mencionada.

Código
if (HasRole(GetAuthor(), Role("111111111111111111"))) {
    AddRole(GetMentionedMember(), Role("371826690424569866"))
} else {
    ReplyMessage({
        message: "No tenés permiso para usar este comando",
    })
}

Errores frecuentes#

El editor marca estos errores mientras escribís. Debajo de cada ejemplo está el mensaje exacto que vas a ver.

Claves entre comillas

Incorrecto
SendMessage({
    "message": "Hola",
})
El editor marca: La propiedad message debe escribirse sin comillas

Tarjeta sin contenido propio

message y channel no cuentan como contenido de la tarjeta.

Incorrecto
SendEmbed({
    message: "Solo texto externo",
})
El editor marca: SendEmbed requiere al menos un atributo propio del embed

Propiedad que no existe

Incorrecto
SendEmbed({
    title: "Hola",
    thumbnail: "https://example.com/icon.png",
})
El editor marca: SendEmbed no admite la propiedad thumbnail

Función escrita con otro nombre

Incorrecto
sendMessage({
    message: "Hola",
})
El editor marca: La función sendMessage no existe

Igualdad con == o template strings

Incorrecto
const same = 1 == 1
El editor marca: == no está disponible. Utilizar ===
Incorrecto
const greeting = `Hola ${name}`
El editor marca: Los template strings no están disponibles; utilizá comillas y +

Formato#

El botón Formatear del editor (o Shift+Alt+F) ordena el código con estas reglas, sin cambiar lo que hace ni borrar comentarios:

  • Indentación de 4 espacios.
  • Strings con comillas dobles.
  • Sin punto y coma.
  • Una instrucción por línea.
  • Espacios alrededor de los operadores y después de cada coma.
  • Objetos con propiedades en varias líneas, una propiedad por línea, con coma final.
  • Llave de apertura en la misma línea; else junto a la llave de cierre.
  • Hasta 2 líneas en blanco seguidas.