> ## Documentation Index
> Fetch the complete documentation index at: https://wiki.petto.sbs/llms.txt
> Use this file to discover all available pages before exploring further.

# Petto Code

> Escribe comandos personalizados en código: embeds, botones, menús, formularios, reacciones, datos guardados y tus propios prefijos, revisados antes de guardarse.

## Resumen

**Petto Code** es un lenguaje pequeño para comandos personalizados. Escribes texto normal y pones lo que cambia dentro de `{{ }}`: variables, `if`, bucles, más de 150 funciones, embeds, menciones y tiempo. Un solo comando puede tener un sistema completo: un mensaje con botones, un formulario que aparece, algo que pasa cuando alguien reacciona, y datos que se recuerdan.

> [!NOTE]
>
> Los comandos personalizados en código están **abiertos para todos los servidores**. Cualquiera que pueda gestionar comandos puede escribirlos, y un servidor Free puede tener hasta 125 comandos personalizados, un servidor Premium hasta 250. La documentación completa, en inglés, español y portugués, está en **[code.petto.sbs](https://code.petto.sbs)**.

```text Ejemplo theme={null}
{{ sendMessage nil (cembed
  "author" (or .Member.DisplayName .User.Username)
  "authorIcon" .User.Avatar
  "description" (printf "¡Bienvenido a **%s**!" .Guild.Name)
  "color" "#ff91c2") }}
```

![mia escribe !welcome y Petto envía un embed rosa con el nombre y el avatar de mia y Bienvenido a Petto Land](https://mintcdn.com/wikipetto/L9chBgQbuvvlCD9p/images/discord/automation/es/petto-code-example.webp?fit=max\&auto=format\&n=L9chBgQbuvvlCD9p\&q=85\&s=510047e36f2a5b08688bd7025ab5c0dd)

En Discord: el código del ejemplo, ejecutado por el motor de Petto cuando mia lo usa.

## Qué puede hacer

* **Embeds y mensajes** con campos, colores, imágenes y el avatar junto al autor.
* **Botones y menús** que ejecutan código (votaciones, botones de roles, tiendas).
* **Formularios** que aparecen (modales) con campos de texto.
* **Reacciones** que ejecutan código: un mensaje con reacciones que cambian el mensaje, dan o quitan un rol, o responden en el canal.
* **Datos guardados**: contadores, puntos, rankings, tiempos de espera y listas, para el servidor o para cada miembro.
* **Tu propio prefijo o palabras**: empieza un comando con `?hola`, `oye bot` o `buenos días`.
* **Miembros, roles y canales**: lee un miembro, un rol o un canal del servidor, para tarjetas como `!whois` y `!roleinfo`.
* **Comandos que trabajan juntos**: un comando puede ejecutar otro con `execCC`, con un retraso y algunos datos.

![shi escribe !vote con una pregunta sobre una noche de películas y Petto responde con un embed de Votación y los botones Sí y No](https://mintcdn.com/wikipetto/Z-XTVemdYTr1KRaH/images/discord/automation/es/petto-code.webp?fit=max\&auto=format\&n=Z-XTVemdYTr1KRaH\&q=85\&s=8031754a149b717b555351edb1594198)

En Discord: la plantilla vote (`!customcommand template vote`) en uso: un embed con dos botones.

![El embed de votación ahora dice Sí 3, No 1, y Petto le responde a liam en privado que ya votó eso](https://mintcdn.com/wikipetto/L9chBgQbuvvlCD9p/images/discord/automation/es/petto-code-vote-click.webp?fit=max\&auto=format\&n=L9chBgQbuvvlCD9p\&q=85\&s=c02f926d7fd97901cd3b854115110f5b)

En Discord: la votación tras cuatro clics; un segundo clic en el mismo botón recibe una respuesta privada.

> [!TIP]
>
> ¿No sabes por dónde empezar? El [Generador de Petto Code](https://wiki.petto.sbs/es/automation/petto-code-generator.md) crea comandos con formularios y te deja probarlos antes de instalarlos.

## Trabajar con otros comandos

### Ejecutar otro comando

`execCC` hace que un comando ejecute otro comando con código del mismo servidor: una tienda puede pedirle a un comando `give` que entregue lo que se compró, o un comando puede ejecutar un recordatorio unos minutos después.

```text Ejemplo theme={null}
{{ execCC "give" }}
{{ execCC "remind" 300 }}
{{ execCC "give" 0 (sdict "item" "rose" "price" 50) }}
```

* **El nombre** del otro comando. Un prefijo delante (`!give`) se ignora, y no importan mayúsculas ni minúsculas.
* **Un retraso** en segundos, de 0 a 300 (5 minutos). Con 0, el otro comando se ejecuta justo después de que este haya terminado y Petto haya hecho sus acciones. Los comandos en espera se guardan en memoria, así que si Petto se reinicia olvida los que todavía no se habían ejecutado.
* **Datos**: cualquier valor (un texto, un número, una lista o un mapa). Como JSON puede tener como máximo 2000 caracteres.

El otro comando se ejecuta con los mismos `.User`, `.Member`, `.Channel` y `.Guild`, y lee:

| Dato | Qué es |
| - | - |
| `.Trigger` | `"exec"` |
| `.ExecData` | Los datos que pasó `execCC`, o nada |
| `.ExecBy` | El nombre del comando que ejecutó este |

La referencia completa de `execCC`, con cada regla y más ejemplos, está en la documentación del lenguaje en [code.petto.sbs](https://code.petto.sbs).

Lo que imprime se envía como un mensaje normal en el canal. Un comando puede usar `execCC` **dos veces por uso**, y una cadena puede tener **3 comandos** (A → B → C; una llamada a un cuarto se rechaza). Funciona desde comandos escritos, botones, menús, formularios y reacciones. Un comando que no existe, no tiene código o está demasiado profundo en una cadena no rompe el comando que lo llamó: el problema va a [`!customcommand logs`](#problemas-de-los-comandos).

> [accordion] Ejemplo: un comando !buy que llama a un comando give
>
> `buy` cobra las monedas y le pide a `give` que entregue el artículo:
>
> ```text buy theme={null}
> {{ $prices := sdict "rose" 50 "cake" 120 }}
> {{ if not .Args }}Uso: {{ .Prefix }}{{ .Cmd }} rose (50 monedas) o cake (120 monedas){{ return }}{{ end }}
> {{ $item := lower (index .Args 0) }}
> {{ $price := index $prices $item }}
> {{ if not $price }}No hay {{ $item }} en la tienda.{{ return }}{{ end }}
> {{ $coins := or (dbGet "coins" .User.ID) 0 }}
> {{ if lt $coins $price }}Tienes {{ $coins }} monedas, un {{ $item }} cuesta {{ $price }}.{{ return }}{{ end }}
> {{ $left := dbIncr "coins" (sub 0 $price) .User.ID }}
> Pagaste {{ $price }} monedas por un **{{ $item }}**. Te quedan {{ $left }}.
> {{ execCC "give" 0 (sdict "item" $item "price" $price) }}
> ```
>
> `give` solo funciona cuando otro comando lo ejecuta, y cuenta los artículos de cada miembro:
>
> ```text give theme={null}
> {{ if ne .Trigger "exec" }}Este comando lo usan otros comandos, como {{ .ServerPrefix }}buy.{{ return }}{{ end }}
> {{ $item := .ExecData.item }}
> {{ $count := dbIncr (print "item:" $item) 1 .User.ID }}
> {{ sendMessage nil (cembed
>   "title" "🎁 Entregado"
>   "description" (printf "%s ahora tiene %d × %s (de %s)." .User.Mention $count $item .ExecBy)
>   "color" "#57f287") }}
> ```
>
> `!buy rose` responde *Pagaste 50 monedas por un **rose**. Te quedan 70.*, y luego `give` envía *@Liam ahora tiene 1 × rose (de buy).*
>
> ![liam escribe !buy rose, Petto responde que pagó 50 monedas y le quedan 70, y luego un embed verde Entregado dice que liam ahora tiene 1 rose de buy](https://mintcdn.com/wikipetto/L9chBgQbuvvlCD9p/images/discord/automation/es/petto-code-buy.webp?fit=max\&auto=format\&n=L9chBgQbuvvlCD9p\&q=85\&s=1cb1c30187c90880f46b8b604a15e445)
>
> En Discord: !buy rose responde, y luego give, ejecutado por execCC, envía su mensaje.

### Problemas de los comandos

`!customcommand logs` muestra los últimos 15 problemas de los comandos en código del servidor, y `!customcommand logs <name>` solo los de un comando: errores en el código, fallos, acciones que no se hicieron y llamadas a `execCC` que se rechazaron. Cada uno dice el comando, qué lo inició (`command`, `button`, `select`, `modal`, `reaction` o `exec`), quién lo usó, cuándo, y el mensaje.

![Tres problemas: pick con un índice fuera de la lista, vipme con un rol que no se puede dar y shop con un execCC a un comando que no existe, cada uno con quién lo usó y cuándo](https://mintcdn.com/wikipetto/L9chBgQbuvvlCD9p/images/discord/automation/es/petto-code-logs.webp?fit=max\&auto=format\&n=L9chBgQbuvvlCD9p\&q=85\&s=0df3a2cb49d978ed80ffe9a4953ed4ca)

En Discord: !customcommand logs, los últimos problemas de los comandos en código, los más nuevos primero.

![Los problemas de vipme: algunas acciones no se hicieron, un rol con permisos de moderación no se puede dar con un comando](https://mintcdn.com/wikipetto/L9chBgQbuvvlCD9p/images/discord/automation/es/petto-code-logs-one.webp?fit=max\&auto=format\&n=L9chBgQbuvvlCD9p\&q=85\&s=7c0369c65e5474f3049eee5aa6e71d2a)

En Discord: !customcommand logs vipme, solo los problemas de un comando.

Es el lugar donde mirar cuando nadie vio el error, como en un comando ejecutado por `execCC` o una reacción. Petto guarda en memoria los últimos 50 problemas de cada servidor, así que un reinicio los borra. Necesita **Gestionar servidor**, como el resto de `!customcommand`.

### Quién usó el comando

`.Message.CommandUserID` es el ID de la persona que usó el comando que envió un mensaje. En un comando escrito es quien lo escribió. En una **reacción**, Petto lo recuerda junto con el mensaje, así que el código sabe quién lo pidió aunque haya reaccionado otra persona. En un botón o un menú bloqueado para un miembro, es ese miembro.

Con esto, **solo quien lo pidió** también funciona para las reacciones:

```text Ejemplo theme={null}
{{ if eq .Trigger "command" }}
  {{ sendMessage nil (complexMessage
       "embed" (cembed "description" (print .User.Mention " pide: " .RawArgs))
       "reactions" (cslice "🎀")) }}
{{ return }}{{ end }}
{{ if ne .Message.CommandUserID .User.ID }}{{ removeReaction }}{{ return }}{{ end }}
{{ updateMessage (cembed "description" "¡Entregado!" "color" "#57f287") }}
```

A cualquier otra persona que reaccione con 🎀 se le quita la reacción.

![chu pide un banner, la tarjeta de Petto tiene una reacción de moño, y después la misma tarjeta dice Entregado en verde](https://mintcdn.com/wikipetto/L9chBgQbuvvlCD9p/images/discord/automation/es/petto-code-who-asked.webp?fit=max\&auto=format\&n=L9chBgQbuvvlCD9p\&q=85\&s=4ca31181e183d2e24dc86258c0d28773)

En Discord: la tarjeta antes y después; el 🎀 de for se quitó, el de chu cambió la tarjeta a ¡Entregado!

### ¿Quisiste decir?, y pistas

* Una función que no existe dice la que probablemente quisiste usar: `No hay ninguna función llamada "dbget". ¿Quisiste decir dbGet?`
* `!customcommand codetest`, `!customcommand info` y la revisión y la prueba de la dashboard dan **pistas**: funciones que no existen y nombres que no están en los datos (`.User.Usrname`, *¿Quisiste decir .User.Username?*), incluso en una parte del código que no se ejecutó. Leer un nombre que no está sigue sin dar nada; no es un error.
* `codeshow`, `export` e `info` dicen el comando más parecido cuando el nombre tiene un error de escritura: `!customcommand codeshow gret` responde *¿Quisiste decir `greet`?*

> [accordion] Una función que no existe
>
> ![liam prueba dbget y Petto responde que no hay ninguna función llamada dbget, si quería decir dbGet, con la línea y la columna](https://mintcdn.com/wikipetto/L9chBgQbuvvlCD9p/images/discord/automation/es/petto-code-didyoumean-function.webp?fit=max\&auto=format\&n=L9chBgQbuvvlCD9p\&q=85\&s=371571e79eb4951c49ac53d217636eca)
>
> En Discord: dbget no existe, y el error dice la función que se quería.

> [accordion] Un nombre que no está en los datos
>
> ![liam prueba un saludo con .User.Usrname y el resultado tiene una pista que pregunta si quería decir .User.Username](https://mintcdn.com/wikipetto/L9chBgQbuvvlCD9p/images/discord/automation/es/petto-code-hints.webp?fit=max\&auto=format\&n=L9chBgQbuvvlCD9p\&q=85\&s=ea7600a9df554fbe993c9e7c94589447)
>
> En Discord: .User.Usrname no da nada, y la pista dice .User.Username.

> [accordion] Un nombre de comando mal escrito
>
> ![liam pide el código de gret y Petto dice que no existe y pregunta si quería decir greet](https://mintcdn.com/wikipetto/L9chBgQbuvvlCD9p/images/discord/automation/es/petto-code-didyoumean-name.webp?fit=max\&auto=format\&n=L9chBgQbuvvlCD9p\&q=85\&s=bfc99d5178188c57b1bd4ec164e11fae)
>
> En Discord: !customcommand codeshow gret, y Petto pregunta si era greet.

### Gestionar tus comandos

* **`!customcommand codetest`** acepta argumentos después del bloque de código: un bloque y luego `red "big cat"` prueba el código como si se hubiera escrito `red "big cat"` después del comando. Describe cada mensaje que enviaría (su texto, su embed, sus botones y menús, y sus reacciones) y cada acción, las pistas, y los pasos y el tiempo que usó. El código sin bloque es todo código, como antes.
* **`!customcommand info <name>`** dice qué es un comando: texto o código, cómo empieza, su tamaño (de los 10 000 caracteres de código), quién lo escribió, las funciones que usa, y si usa datos guardados, botones, menús, reacciones, formularios, roles, mensajes directos, miembros del servidor u otros comandos.
* **`!customcommand list`** muestra una página a la vez, ordenada por nombre, con lo que es cada comando (código o texto), cómo se escribe y qué tan grande es.
* **`!customcommand codeshow`** muestra el código en un bloque que colorea las acciones `{{ }}`.
* **`!customcommand rename <name> <new name>`** cambia el nombre y mantiene el código, el activador (también su propio prefijo, así que `.req1` pasa a ser `.req`) y los datos guardados. Un nombre que es un comando real de Petto u otro comando personalizado se rechaza. Los mensajes que el comando envió antes, con botones o reacciones, mantienen el nombre anterior y dejan de responder.
* **`!customcommand trigger <name>`** sin un tipo muestra cómo empieza el comando y los comandos para cambiarlo. Avisa cuando nada cambia, y cuál era el prefijo antes cuando cambia.
* Al guardar un comando, Petto avisa cuando su primer comentario dice que se usa con un prefijo propio (como `{{/* req: .req <lo que pides> */}}`) y el comando no lo tiene, y da el comando que lo configura.

> [accordion] !customcommand codetest
>
> ![liam prueba código con red y big cat después, y el resultado dice que enviaría un embed con un big cat de color red y una reacción de gato](https://mintcdn.com/wikipetto/L9chBgQbuvvlCD9p/images/discord/automation/es/petto-code-codetest-args.webp?fit=max\&auto=format\&n=L9chBgQbuvvlCD9p\&q=85\&s=6cd2a2c3f8ffa77743df38c85c8f7492)
>
> En Discord: una prueba con argumentos después del bloque de código; no se envía nada.

> [accordion] !customcommand info
>
> ![La info de buy: código, empieza con el prefijo del servidor, su tamaño de 10000 caracteres, usa datos guardados y otros comandos, sus funciones y escrito por liam](https://mintcdn.com/wikipetto/L9chBgQbuvvlCD9p/images/discord/automation/es/petto-code-info.webp?fit=max\&auto=format\&n=L9chBgQbuvvlCD9p\&q=85\&s=c1d596f64008a012e3fcd1afadf38da2)
>
> En Discord: qué es el comando buy, su tamaño, qué usa y quién lo escribió.

> [accordion] !customcommand list
>
> ![Petto lista 12 de 125 comandos personalizados, con req que empieza con su propio prefijo .req](https://mintcdn.com/wikipetto/L9chBgQbuvvlCD9p/images/discord/automation/es/petto-code-list.webp?fit=max\&auto=format\&n=L9chBgQbuvvlCD9p\&q=85\&s=62ecdcf3ccd8bafc36ef9d9326ca7368)
>
> En Discord: todos los comandos, de texto o de código, cómo empiezan y su tamaño.

> [accordion] !customcommand codeshow
>
> ![Petto muestra las dos líneas de código de greet](https://mintcdn.com/wikipetto/L9chBgQbuvvlCD9p/images/discord/automation/es/petto-code-codeshow.webp?fit=max\&auto=format\&n=L9chBgQbuvvlCD9p\&q=85\&s=1b6f32719c87994341b4e8f57cca6013)
>
> En Discord: el código de greet en un bloque que colorea las acciones.

> [accordion] !customcommand rename
>
> ![liam renombra req a req1 y Petto dice que sigue empezando con su propio prefijo .req1](https://mintcdn.com/wikipetto/L9chBgQbuvvlCD9p/images/discord/automation/es/petto-code-rename.webp?fit=max\&auto=format\&n=L9chBgQbuvvlCD9p\&q=85\&s=e7eeb51b7468955701099f7f46eaeac8)
>
> En Discord: req pasa a ser req1 y conserva su propio prefijo.

> [accordion] !customcommand trigger
>
> ![Petto dice que req empieza con su propio prefijo y lista los comandos de activador y los tipos](https://mintcdn.com/wikipetto/L9chBgQbuvvlCD9p/images/discord/automation/es/petto-code-trigger-show.webp?fit=max\&auto=format\&n=L9chBgQbuvvlCD9p\&q=85\&s=fad1d2881a0a79b46822af85c70a5c23)
>
> En Discord: cómo empieza req y los comandos para cambiarlo.

> [accordion] Al guardar: un prefijo propio
>
> ![liam guarda req2 con un primer comentario que dice .req, y la respuesta de Petto avisa con los comandos de activador y de renombrar](https://mintcdn.com/wikipetto/L9chBgQbuvvlCD9p/images/discord/automation/es/petto-code-prefix-warning.webp?fit=max\&auto=format\&n=L9chBgQbuvvlCD9p\&q=85\&s=d54cd43114616dc010761521980c796a)
>
> En Discord: el comentario dice .req, el comando no lo tiene, y Petto da el comando que lo pone.

## Novedades en Petto Code

Petto Code ahora tiene **más de 150 funciones**. Muchas de las nuevas tienen los mismos nombres que en YAGPDB, así que el código escrito para ese bot es **más fácil de traer**.

### Funciones nuevas

* **Texto**: `joinStr`, `trimPrefix`, `trimSuffix`, `trimSpace`, `inFold`, `capitalize`, `repeat`, `truncate`, `padLeft`, `padRight`, `count`, `indexOf`, `reverse`, `urlescape`, `urlunescape`, `escapeMarkdown`, `formatNumber`, `toString`, `toLower` y `toUpper`.
* **Números**: `fdiv`, `sqrt`, `cbrt`, `log`, `roundCeil`, `roundFloor`, `roundEven`, `clamp` y `toInt64`.
* **Tiempo**: `currentTime`, `toDuration` (`"1h30m"` en segundos), `humanizeTimeSince`, `snowflakeToTime`, `newDate`, `formatTime` (un formato y una zona horaria) y `weekday`.
* **Listas y mapas**: `sort`, `sortBy`, `uniq`, `first`, `last`, `sum`, `randItem`, `concat`, `hasKey`, `setKey`, `delKey`, `merge`, `values`, `kindOf`, `json` y `parseJson`.
* **IDs**: `userID`, `roleID` y `channelID` sacan el ID de una mención.

```text Ejemplo theme={null}
{{ capitalize "petto" }} tiene {{ formatNumber 1234567 }} monedas.
{{ joinStr ", " (sort (cslice "pear" "apple" "fig")) }}
{{ toDuration "1h30m" }} segundos
```

Esto imprime `Petto tiene 1,234,567 monedas.`, luego `apple, fig, pear` y `5400 segundos`.

![El resultado imprime Petto tiene 1,234,567 monedas, apple, fig, pear y 5400 segundos](https://mintcdn.com/wikipetto/L9chBgQbuvvlCD9p/images/discord/automation/es/petto-code-functions.webp?fit=max\&auto=format\&n=L9chBgQbuvvlCD9p\&q=85\&s=f8ebc6d9f6c3674cfca9fd4c2c5ec88f)

En Discord: el ejemplo probado con !customcommand codetest.

### Miembros, roles y canales

`getMember`, `getRole` y `getChannel` leen un miembro, un rol o un canal del servidor a partir de un ID o una mención. `targetHasRole` dice si un miembro tiene un rol. **Solo leen**, solo del servidor donde se ejecuta el comando, y un comando puede leer **como máximo 10** por uso.

```text Ejemplo theme={null}
{{ with .Mentions }}
  {{ $m := getMember (index . 0).ID }}
  {{ if $m }}{{ $m.DisplayName }} está aquí.{{ end }}
{{ end }}
```

![kira escribe !here @nova y Petto responde que nova está aquí](https://mintcdn.com/wikipetto/L9chBgQbuvvlCD9p/images/discord/automation/es/petto-code-getmember.webp?fit=max\&auto=format\&n=L9chBgQbuvvlCD9p\&q=85\&s=061a267af50cedd65d3457b9fdebf97a)

En Discord: el ejemplo como comando, mencionando a nova.

### Rankings

* `dbRank` da el puesto de un miembro en un ranking, como el de monedas.
* `dbBottom` da los números más bajos, de 1 a 25 miembros (como `dbTop`, desde abajo).
* `dbCount` dice cuántas claves hay guardadas.

```text Ejemplo theme={null}
{{ with dbRank "coins" .User.ID }}Estás en el puesto **#{{ . }}**.{{ else }}Todavía no tienes monedas.{{ end }}
```

![chu escribe !myrank y Petto responde Eres el #2](https://mintcdn.com/wikipetto/L9chBgQbuvvlCD9p/images/discord/automation/es/petto-code-rank.webp?fit=max\&auto=format\&n=L9chBgQbuvvlCD9p\&q=85\&s=dd9d82c5abba94c03dec737cca0cef40)

En Discord: chu es segunda en el ranking de monedas.

### Acciones

* `deleteTrigger` y el nuevo `deleteResponse` aceptan un **retraso de hasta 5 minutos** (en segundos). `deleteResponse` borra la respuesta del comando, 10 segundos después si no das un retraso. Solo funciona cuando el comando se escribe, no en un botón, un menú, un formulario o una reacción.
* `addReactions` agrega varias reacciones a la vez (hasta 5).
* `complexMessage` acepta `"reply" true` (el mensaje responde al mensaje del comando) y `"silent" true` (sin notificación).

```text Ejemplo theme={null}
¡Guardado!{{ deleteTrigger 5 }}{{ deleteResponse 10 }}
{{ sendMessage nil (complexMessage "content" "Entendido." "reply" true "silent" true) }}
```

![El resultado imprime Guardado y borraría el mensaje a los 5 segundos, la respuesta a los 10 segundos y enviaría Entendido como respuesta sin notificación](https://mintcdn.com/wikipetto/L9chBgQbuvvlCD9p/images/discord/automation/es/petto-code-actions.webp?fit=max\&auto=format\&n=L9chBgQbuvvlCD9p\&q=85\&s=8c5cfcd8ee84c0e6da9327d1913ddb0a)

En Discord: lo que haría el ejemplo, en una prueba: los dos borrados con sus esperas y la respuesta silenciosa.

### Formularios con todas las partes

Un formulario (`cmodal`) puede tener hasta **5 partes**, al menos una que la gente rellene. Cada parte va bajo una **etiqueta** (hasta 45 caracteres) y puede tener una `description` (hasta 100). Además de `ctext` hay:

| Función | Parte | Claves destacadas |
| - | - | - |
| `cmenu` | Un menú de opciones | `options` (`(cslice "Rosa" "pink" "Suave" true)`: etiqueta, valor, descripción, elegida desde el principio), `min`, `max`, `placeholder` |
| `cusers`, `croles`, `cmentions` | Miembros, roles, o miembros y roles para elegir | `min`, `max` (hasta 25), `placeholder` |
| `cchannels` | Canales para elegir | `types`: `(cslice "text" "voice")`, entre `text`, `voice`, `announcement`, `category`, `stage`, `forum`, `media`, `thread` |
| `cfile` | Archivos para subir | `min`, `max` (hasta 10) |
| `cradio` | Botones de opción: se elige uno | `options` (de 2 a 10, una puede venir elegida) |
| `cchecks` | Un grupo de casillas | `options` (hasta 10), `min`, `max` |
| `ccheck` | Una casilla | `default` |
| `cdisplay` | Un texto que solo informa (funciona el Markdown) | `cdisplay "Lee esto primero"` |

Todas las partes menos `ccheck` y `cdisplay` tienen `required` (true salvo que digas otra cosa), y las que eligen varias cosas tienen `min` y `max`.

```text Ejemplo theme={null}
{{ showModal (cmodal "id" "about" "title" "Sobre ti" "fields" (cslice
  (cdisplay "Solo tarda un minuto.")
  (ctext "id" "name" "label" "Nombre" "description" "Cómo te llamamos")
  (cmenu "id" "color" "label" "Color favorito" "options" (cslice (cslice "Rosa" "pink") (cslice "Azul" "blue")))
  (cusers "id" "friends" "label" "Amigos" "max" 3 "required" false)
  (cfile "id" "photo" "label" "Una foto" "required" false)
  )) }}
```

![El formulario Sobre ti con la nota Solo toma un minuto, un campo Nombre con su descripción, el menú Color favorito, Amigos y Una foto](https://mintcdn.com/wikipetto/L9chBgQbuvvlCD9p/images/discord/automation/es/petto-code-form-modal.webp?fit=max\&auto=format\&n=L9chBgQbuvvlCD9p\&q=85\&s=dda930aaa90c6575aae76191caf603b3)

En Discord: el formulario del ejemplo, construido por Petto a partir de cmodal: un texto, un menú, miembros para elegir y un archivo.

Cuando se envía el formulario, el comando corre otra vez con `.Trigger` en `"modal"` y las respuestas están en:

* `.Fields.<id>`: un **texto** (`ctext`, `cradio`), una **lista de valores** (`cmenu`, `cchecks`), una **lista de IDs** (`cusers`, `croles`, `cmentions`, `cchannels`), **true o false** (`ccheck`) o una **lista de archivos** (`cfile`, cada uno con `ID`, `Name`, `URL`, `Size`, `Type` y `Description`).
* `.FieldText.<id>`: lo mismo, **listo para imprimir**: IDs como menciones, listas unidas, ✅ o ❌, los enlaces de los archivos.
* `.Files`: todos los archivos del formulario en una lista.

![Un embed titulado Kira con el color pink y los amigos chu y shi como menciones](https://mintcdn.com/wikipetto/L9chBgQbuvvlCD9p/images/discord/automation/es/petto-code-form-result.webp?fit=max\&auto=format\&n=L9chBgQbuvvlCD9p\&q=85\&s=6b055d51ef806ca4d880f7c9904b04ab)

En Discord: lo que publica el código con las respuestas del formulario.

```text Ejemplo theme={null}
{{ sendMessage nil (cembed "title" (index .FieldText "name") "description" (print "Color: " (index .FieldText "color") "\nAmigos: " (or (index .FieldText "friends") "-"))) }}
```

### Datos nuevos

* `.Mentions` (los usuarios mencionados, con su nombre y avatar), `.MentionedRoles` y `.MentionedChannels`.
* `.ServerPrefix`, `.Now` y `.User.CreatedAt`.
* Más de `.Member`: `Avatar`, `Color`, `HighestRoleID`, `BoostingSince` e `IsOwner`.
* Más de `.Guild`: `OwnerID`, `CreatedAt`, `BoostCount`, `BoostTier`, `Banner`, `Description`, `RoleCount`, `ChannelCount` y `EmojiCount`.
* Más de `.Channel`: `Topic`, `NSFW`, `ParentID`, `Type` e `IsThread`.
* Más de `.Message`: `CreatedAt`, `Attachments` y `ReplyToID`.

### Plantillas nuevas

* `whois`: una tarjeta del miembro que mencionas, o tuya. `!whois @Liam`
* `roleinfo`: el color, los miembros y la fecha de creación de un rol. `!roleinfo @Role`
* `rank`: tu puesto en el ranking de monedas, o el del miembro que mencionas.

```javascript Ejemplo theme={null}
!customcommand template whois
!customcommand template rank
```

> [accordion] !customcommand template whois
>
> ![liam instala la plantilla whois y Petto lo confirma](https://mintcdn.com/wikipetto/L9chBgQbuvvlCD9p/images/discord/automation/es/petto-code-template-install.webp?fit=max\&auto=format\&n=L9chBgQbuvvlCD9p\&q=85\&s=284651df13257272e84199321fb0d469)
>
> En Discord: la plantilla whois instalada.

> [accordion] !whois
>
> ![chu escribe !whois @liam y Petto envía una tarjeta con el avatar de liam, el usuario, el ID, la antigüedad de la cuenta, la fecha de entrada y los roles](https://mintcdn.com/wikipetto/L9chBgQbuvvlCD9p/images/discord/automation/es/petto-code-whois.webp?fit=max\&auto=format\&n=L9chBgQbuvvlCD9p\&q=85\&s=58ad6f1d61263850c1350a0b91206d7f)
>
> En Discord: la tarjeta de liam, de la plantilla whois.

> [accordion] !roleinfo
>
> ![kira escribe !roleinfo @Rojo y Petto envía una tarjeta roja con sus miembros, color, posición, si se puede mencionar y la fecha de creación](https://mintcdn.com/wikipetto/L9chBgQbuvvlCD9p/images/discord/automation/es/petto-code-roleinfo.webp?fit=max\&auto=format\&n=L9chBgQbuvvlCD9p\&q=85\&s=b816d10b27b01adc0c23e5e325a6981e)
>
> En Discord: el rol Rojo, de la plantilla roleinfo.

> [accordion] !rank
>
> ![shi escribe !rank y Petto responde que shi es el #4 con 120 monedas](https://mintcdn.com/wikipetto/L9chBgQbuvvlCD9p/images/discord/automation/es/petto-code-rank-template.webp?fit=max\&auto=format\&n=L9chBgQbuvvlCD9p\&q=85\&s=5954d5069424530202c4a44f9fe465a4)
>
> En Discord: el puesto de shi en el ranking de monedas, de la plantilla rank.

## Comandos

```javascript Sintaxis theme={null}
!customcommand code <name> <code>
!customcommand codeshow <name>
!customcommand codetest <code> [arguments]
!customcommand info <name>
!customcommand list
!customcommand rename <name> <new name>
!customcommand logs [name]
!customcommand template [id] [name]
!customcommand export <name>
!customcommand import <share code> [name]
!customcommand trigger <name> [type] [text]
```

```javascript Ejemplo theme={null}
!customcommand code hello ¡Hola {{ .User.Username }}!
!customcommand template vote
!customcommand trigger hello prefix ?
!customcommand rename req1 req
!customcommand logs give
```

> [accordion] !customcommand code
>
> ![liam guarda hello con Hello y el nombre de usuario en código, y Petto lo confirma](https://mintcdn.com/wikipetto/L9chBgQbuvvlCD9p/images/discord/automation/es/petto-code-code.webp?fit=max\&auto=format\&n=L9chBgQbuvvlCD9p\&q=85\&s=d8ec159d754ccf361f0c23cc2d08cba5)
>
> En Discord: un comando en código guardado después de revisarlo.

> [accordion] !customcommand template
>
> ![Petto lista las plantillas desde hello y roll hasta whois, roleinfo y rank, cada una con su id y lo que hace](https://mintcdn.com/wikipetto/L9chBgQbuvvlCD9p/images/discord/automation/es/petto-code-template-list.webp?fit=max\&auto=format\&n=L9chBgQbuvvlCD9p\&q=85\&s=4b4372060430767f0ed063b934518306)
>
> En Discord: los comandos en código listos, con cómo instalar uno.

> [accordion] !customcommand template vote
>
> ![liam instala la plantilla vote y Petto lo confirma](https://mintcdn.com/wikipetto/L9chBgQbuvvlCD9p/images/discord/automation/es/petto-code-template-vote.webp?fit=max\&auto=format\&n=L9chBgQbuvvlCD9p\&q=85\&s=f640afbc49bb13d135900f4b1a4c2295)
>
> En Discord: la plantilla vote instalada como !vote.

> [accordion] !customcommand export
>
> ![liam exporta hi y Petto responde con un código para compartir que empieza con pc1.](https://mintcdn.com/wikipetto/L9chBgQbuvvlCD9p/images/discord/automation/es/petto-code-export.webp?fit=max\&auto=format\&n=L9chBgQbuvvlCD9p\&q=85\&s=be0da294492c059f6a72786c173bc7b8)
>
> En Discord: el código para compartir de un comando, listo para pegar en cualquier servidor.

> [accordion] !customcommand import
>
> ![liam importa el código pc1. como hey y Petto lo confirma](https://mintcdn.com/wikipetto/L9chBgQbuvvlCD9p/images/discord/automation/es/petto-code-import.webp?fit=max\&auto=format\&n=L9chBgQbuvvlCD9p\&q=85\&s=bbf9cec81e6a9de0e902583d586c5d0e)
>
> En Discord: un código para compartir importado con el nombre hey.

> [accordion] !customcommand trigger
>
> ![liam pone el activador de greet en prefix ? y Petto dice que ahora empieza con ?greet](https://mintcdn.com/wikipetto/L9chBgQbuvvlCD9p/images/discord/automation/es/petto-code-trigger-set.webp?fit=max\&auto=format\&n=L9chBgQbuvvlCD9p\&q=85\&s=7cd128d7627e2cc10eeb6405f5996fed)
>
> En Discord: greet ahora empieza con ?, su propio prefijo.

* El código **se revisa antes de guardarse**. Un error dice la línea y la columna, y no se guarda nada.
* `codetest` ejecuta el código como si hubieras usado el comando y muestra lo que imprimiría y haría. **No se envía ni se guarda nada.**
* `template` lista comandos ya hechos (votación, solicitud, reclamo, sugerencia, reporte, perfil, botón de rol, rol por reacción, whois, roleinfo, rank y más) e instala uno.
* `export` da un código para compartir que funciona en cualquier servidor, e `import` usa uno.
* Activadores: `prefix`, `startswith`, `exact`, `contains` o `command` (el prefijo de Petto). Un servidor puede tener hasta 25 comandos con un activador propio.

## Editor de la dashboard

En la [dashboard](https://petto.sbs/dash), **Automatización** → **Comandos en código** es un editor de verdad: revisa tu código mientras escribes (con colores, números de línea y sugerencias), tiene las plantillas y todas las funciones, **Qué lo inicia** para el activador, **Abrir en el generador**, y **Probar**, que dibuja lo que enviaría el comando, como en Discord, con lo que haría. Una prueba no envía ni guarda nada. Al guardar se siguen las mismas reglas que en Discord.

![La página Comandos en código con los comandos rank, vote y whois, el código de vote con colores y números de línea, El código está bien, el activador y la caja Probar](https://mintcdn.com/wikipetto/1Wz8dc-Kr9ITtTNY/images/dashboard/automation/es/petto-code-dashboard.webp?fit=max\&auto=format\&n=1Wz8dc-Kr9ITtTNY\&q=85\&s=cda607f973ea12704f59822d17ba96ae)

Dashboard → Automatización → Comandos en código: el editor con !vote abierto, las plantillas, las funciones, qué lo inicia y la prueba.

![La caja Probar después de ejecutar vote con pizza esta noche: el mensaje de liam, el embed de votación de Petto con los botones Sí y No, Lo que haría, y los pasos y el tiempo](https://mintcdn.com/wikipetto/1Wz8dc-Kr9ITtTNY/images/dashboard/automation/es/petto-code-dashboard-test.webp?fit=max\&auto=format\&n=1Wz8dc-Kr9ITtTNY\&q=85\&s=c93469398bd50de7d1da81716c7e0090)

Dashboard → Automatización → Comandos en código: una prueba de !vote, dibujada como en Discord, con lo que haría.

## Generador de Petto Code

El **[Generador de Petto Code](https://wiki.petto.sbs/es/automation/petto-code-generator.md)** es una web que escribe Petto Code por ti: elige embeds, botones, menús, formularios, reacciones, roles, monedas y activadores con formularios, prueba el comando en un canal de pruebas que ejecuta el motor real, y copia el comando `!customcommand code` o un código para compartir para `!customcommand import`. También lee códigos para compartir, así que puedes ver el código de uno antes de usarlo.

Ábrelo en **[codegen.petto.sbs](https://codegen.petto.sbs)**. La documentación del lenguaje tiene una página sobre él en [code.petto.sbs/generator](https://code.petto.sbs/generator).

## Límites y seguridad

El código nunca habla con Discord por sí solo. Pide acciones, y Petto hace solo las que podría hacer la persona que escribió el código: nunca se da un rol con permisos de moderación, `@everyone` y `@here` nunca notifican, y un mensaje a otro canal necesita permiso para escribir ahí. Hay límites de 10 000 caracteres, 10 000 pasos, 250 ms de ejecución, 25 lecturas y escrituras de datos guardados por uso y 500 valores guardados por servidor.

![for escribe !vipme, Petto responde con un brillo y luego que algunas acciones no se hicieron porque no se puede dar un rol con permisos de moderación](https://mintcdn.com/wikipetto/L9chBgQbuvvlCD9p/images/discord/automation/es/petto-code-safety.webp?fit=max\&auto=format\&n=L9chBgQbuvvlCD9p\&q=85\&s=c1d63bca202b215715a6901b02252356)

En Discord: un comando intenta dar el rol Moderadores; Petto no lo hace, y dice por qué.

Mira [Comandos personalizados](https://wiki.petto.sbs/es/automation/custom-commands.md) para comandos de texto simple y embeds.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.