> ## 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

> Escreva comandos personalizados em código: embeds, botões, menus, formulários, reações, dados salvos e seus próprios prefixos, verificados antes de salvar.

## Visão geral

**Petto Code** é uma pequena linguagem para comandos personalizados. Você escreve um texto normal e coloca o que muda dentro de `{{ }}`: variáveis, `if`, loops, mais de 150 funções, embeds, menções e tempo. Um só comando pode conter um sistema inteiro: uma mensagem com botões, um formulário que aparece na tela, algo que acontece quando alguém reage e dados que ficam guardados.

> [!NOTE]
>
> Os comandos personalizados em código estão **abertos para todos os servidores**. Qualquer pessoa que possa gerenciar comandos pode escrevê-los, e um servidor Free pode ter até 125 comandos personalizados, um servidor Premium até 250. A documentação completa, em inglês, espanhol e português, está em **[code.petto.sbs](https://code.petto.sbs)**.

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

![mia digita !welcome e o Petto envia um embed rosa com o nome e o avatar de mia e Boas-vindas ao Petto Land](https://mintcdn.com/wikipetto/ii5NsO0foe6CCGwz/images/discord/automation/pt-br/petto-code-example.webp?fit=max\&auto=format\&n=ii5NsO0foe6CCGwz\&q=85\&s=bd9dae49c25816e5097788ea955fd4ae)

No Discord: o código do exemplo, executado pelo motor do Petto quando mia usa.

## O que dá para fazer

* **Embeds e mensagens** com campos, cores, imagens e o avatar ao lado do autor.
* **Botões e menus** que executam código (votações, botões de cargo, lojas).
* **Formulários** que aparecem na tela (modais) com campos de texto.
* **Reações** que executam código: uma mensagem com reações que mudam a mensagem, dão ou tiram um cargo ou respondem no canal.
* **Dados salvos**: contadores, pontos, rankings, intervalos e listas, para o servidor ou para cada membro.
* **Seu próprio prefixo ou palavras**: comece um comando com `?hello`, `hey bot` ou `good morning`.
* **Membros, cargos e canais**: leia um membro, um cargo ou um canal do servidor, para cartões como `!whois` e `!roleinfo`.
* **Comandos que trabalham juntos**: um comando pode executar outro com `execCC`, com um atraso e alguns dados.

![shi escreve !vote com uma pergunta sobre uma noite de filmes e Petto responde com um embed de Votação e os botões Sim e Não](https://mintcdn.com/wikipetto/LoL7QuPJ71yd9F_N/images/discord/automation/pt-br/petto-code.webp?fit=max\&auto=format\&n=LoL7QuPJ71yd9F_N\&q=85\&s=e82aa047905e226dba5e2c63057cc7e7)

No Discord: o modelo vote (`!customcommand template vote`) em uso: um embed com dois botões.

![O embed de votação agora diz Sim 3, Não 1, e o Petto responde a liam em privado que ele já votou nisso](https://mintcdn.com/wikipetto/OcAUaBAyli2de5qV/images/discord/automation/pt-br/petto-code-vote-click.webp?fit=max\&auto=format\&n=OcAUaBAyli2de5qV\&q=85\&s=a6ca9e0ab75996c92055ce1bcd841348)

No Discord: a votação depois de quatro cliques; um segundo clique no mesmo botão recebe uma resposta privada.

> [!TIP]
>
> Não sabe por onde começar? O [Gerador de Petto Code](https://wiki.petto.sbs/pt-br/automation/petto-code-generator.md) monta comandos com formulários e deixa você testá-los antes de instalar.

## Trabalhando com outros comandos

### Executar outro comando

`execCC` faz um comando executar outro comando com código do mesmo servidor: uma loja pode pedir a um comando `give` que entregue o que foi comprado, ou um comando pode executar um lembrete alguns minutos depois.

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

* **O nome** do outro comando. Um prefixo na frente (`!give`) é ignorado, e maiúsculas ou minúsculas não fazem diferença.
* **Um atraso** em segundos, de 0 a 300 (5 minutos). Com 0, o outro comando é executado logo depois que este termina e o Petto faz as ações dele. Os comandos em espera ficam na memória, então se o Petto reiniciar ele esquece os que ainda não tinham sido executados.
* **Dados**: qualquer valor (um texto, um número, uma lista ou um mapa). Em JSON, pode ter no máximo 2.000 caracteres.

O outro comando é executado com os mesmos `.User`, `.Member`, `.Channel` e `.Guild`, e lê:

| Dado | O que é |
| - | - |
| `.Trigger` | `"exec"` |
| `.ExecData` | Os dados que o `execCC` passou, ou nada |
| `.ExecBy` | O nome do comando que executou este |

A referência completa do `execCC`, com todas as regras e mais exemplos, está na documentação da linguagem em [code.petto.sbs](https://code.petto.sbs).

O que ele imprime é enviado como uma mensagem normal no canal. Um comando pode usar `execCC` **duas vezes por uso**, e uma cadeia pode ter **3 comandos** (A → B → C; uma chamada a um quarto é recusada). Funciona a partir de comandos digitados, botões, menus, formulários e reações. Um comando que não existe, não tem código ou está fundo demais em uma cadeia não quebra o comando que o chamou: o problema vai para [`!customcommand logs`](#problemas-dos-comandos).

> [accordion] Exemplo: um comando !buy que chama um comando give
>
> `buy` cobra as moedas e pede a `give` que entregue o item:
>
> ```text buy theme={null}
> {{ $prices := sdict "rose" 50 "cake" 120 }}
> {{ if not .Args }}Use: {{ .Prefix }}{{ .Cmd }} rose (50 coins) or cake (120 coins){{ return }}{{ end }}
> {{ $item := lower (index .Args 0) }}
> {{ $price := index $prices $item }}
> {{ if not $price }}There is no {{ $item }} in the shop.{{ return }}{{ end }}
> {{ $coins := or (dbGet "coins" .User.ID) 0 }}
> {{ if lt $coins $price }}You have {{ $coins }} coins, a {{ $item }} costs {{ $price }}.{{ return }}{{ end }}
> {{ $left := dbIncr "coins" (sub 0 $price) .User.ID }}
> You paid {{ $price }} coins for a **{{ $item }}**. You have {{ $left }} left.
> {{ execCC "give" 0 (sdict "item" $item "price" $price) }}
> ```
>
> `give` só funciona quando outro comando o executa, e conta os itens de cada membro:
>
> ```text give theme={null}
> {{ if ne .Trigger "exec" }}This command is used by other commands, like {{ .ServerPrefix }}buy.{{ return }}{{ end }}
> {{ $item := .ExecData.item }}
> {{ $count := dbIncr (print "item:" $item) 1 .User.ID }}
> {{ sendMessage nil (cembed
>   "title" "🎁 Delivered"
>   "description" (printf "%s now has %d × %s (from %s)." .User.Mention $count $item .ExecBy)
>   "color" "#57f287") }}
> ```
>
> `!buy rose` responde *You paid 50 coins for a **rose**. You have 70 left.*, e depois `give` envia *@Liam now has 1 × rose (from buy).*
>
> ![liam digita !buy rose, o Petto responde que pagou 50 moedas e sobraram 70, e depois um embed verde Entregue diz que liam agora tem 1 rose de buy](https://mintcdn.com/wikipetto/ii5NsO0foe6CCGwz/images/discord/automation/pt-br/petto-code-buy.webp?fit=max\&auto=format\&n=ii5NsO0foe6CCGwz\&q=85\&s=85a157723127e1c2353191066e01e891)
>
> No Discord: !buy rose responde, e depois give, executado pelo execCC, envia a mensagem.

### Problemas dos comandos

`!customcommand logs` mostra os últimos 15 problemas dos comandos em código do servidor, e `!customcommand logs <name>` só os de um comando: erros no código, falhas, ações que não foram feitas e chamadas de `execCC` que foram recusadas. Cada um mostra o comando, o que o iniciou (`command`, `button`, `select`, `modal`, `reaction` ou `exec`), quem o usou, quando e a mensagem.

![Três problemas: pick com um índice fora da lista, vipme com um cargo que não pode ser dado e shop com um execCC para um comando que não existe, cada um com quem usou e quando](https://mintcdn.com/wikipetto/ii5NsO0foe6CCGwz/images/discord/automation/pt-br/petto-code-logs.webp?fit=max\&auto=format\&n=ii5NsO0foe6CCGwz\&q=85\&s=868507a96c4990b8cebe8bb9962f1912)

No Discord: !customcommand logs, os últimos problemas dos comandos em código, os mais novos primeiro.

![Os problemas de vipme: algumas ações não foram feitas, um cargo com permissões de moderação não pode ser dado por um comando](https://mintcdn.com/wikipetto/ii5NsO0foe6CCGwz/images/discord/automation/pt-br/petto-code-logs-one.webp?fit=max\&auto=format\&n=ii5NsO0foe6CCGwz\&q=85\&s=178f0ac9722264bb719069413899ebe5)

No Discord: !customcommand logs vipme, só os problemas de um comando.

É o lugar para olhar quando ninguém viu o erro, como em um comando executado por `execCC` ou por uma reação. O Petto guarda na memória os últimos 50 problemas de cada servidor, então reiniciar apaga esses registros. Precisa de **Gerenciar servidor**, como o resto do `!customcommand`.

### Quem usou o comando

`.Message.CommandUserID` é o ID da pessoa que usou o comando que enviou uma mensagem. Em um comando digitado, é quem o digitou. Em uma **reação**, o Petto guarda esse ID junto com a mensagem, então o código sabe quem pediu mesmo que outra pessoa tenha reagido. Em um botão ou menu travado para um membro, é esse membro.

Com isso, **só quem pediu** funciona também para reações:

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

Se qualquer outra pessoa reagir com 🎀, a reação dela é removida.

![chu pede um banner, o cartão do Petto tem uma reação de laço, e depois o mesmo cartão diz Entregue em verde](https://mintcdn.com/wikipetto/OcAUaBAyli2de5qV/images/discord/automation/pt-br/petto-code-who-asked.webp?fit=max\&auto=format\&n=OcAUaBAyli2de5qV\&q=85\&s=f154fe0d6f7bb70b1d90de4c4feee6a2)

No Discord: o cartão antes e depois; o 🎀 de for foi tirado, o de chu mudou o cartão para Entregue!

### Você quis dizer, e dicas

* Uma função que não existe mostra a que você provavelmente quis usar: `Não existe nenhuma função chamada "dbget". Você quis dizer dbGet?`
* `!customcommand codetest`, `!customcommand info` e a verificação e o teste do dashboard dão **dicas**: funções que não existem e nomes que não estão nos dados (`.User.Usrname`, *Você quis dizer .User.Username?*), mesmo em uma parte do código que não foi executada. Ler um nome que não existe continua dando nada, não é um erro.
* `codeshow`, `export` e `info` mostram o comando mais parecido quando o nome tem um erro de digitação: `!customcommand codeshow gret` responde *Você quis dizer greet?*

> [accordion] Uma função que não existe
>
> ![liam testa dbget e o Petto responde que não existe função chamada dbget, se quis dizer dbGet, com a linha e a coluna](https://mintcdn.com/wikipetto/ii5NsO0foe6CCGwz/images/discord/automation/pt-br/petto-code-didyoumean-function.webp?fit=max\&auto=format\&n=ii5NsO0foe6CCGwz\&q=85\&s=256df0afddcfef0f768ef5482cc0f83e)
>
> No Discord: dbget não existe, e o erro diz a função que se queria.

> [accordion] Um nome que não está nos dados
>
> ![liam testa uma saudação com .User.Usrname e o resultado tem uma dica perguntando se quis dizer .User.Username](https://mintcdn.com/wikipetto/ii5NsO0foe6CCGwz/images/discord/automation/pt-br/petto-code-hints.webp?fit=max\&auto=format\&n=ii5NsO0foe6CCGwz\&q=85\&s=387fccf0c7167fe9e867408c57656cc2)
>
> No Discord: .User.Usrname não dá nada, e a dica diz .User.Username.

> [accordion] Um nome de comando com erro
>
> ![liam pede o código de gret e o Petto diz que não existe e pergunta se quis dizer greet](https://mintcdn.com/wikipetto/ii5NsO0foe6CCGwz/images/discord/automation/pt-br/petto-code-didyoumean-name.webp?fit=max\&auto=format\&n=ii5NsO0foe6CCGwz\&q=85\&s=0bbf08ab92ed908f3ec28cbbe053af09)
>
> No Discord: !customcommand codeshow gret, e o Petto pergunta se era greet.

### Gerenciando seus comandos

* **`!customcommand codetest`** aceita argumentos depois do bloco de código: um bloco e depois `red "big cat"` testa o código como se `red "big cat"` tivesse sido digitado depois do comando. Ele descreve cada mensagem que enviaria (o texto, o embed, os botões e menus e as reações) e cada ação, as dicas, e os passos e o tempo usados. Código sem bloco é todo código, como antes.
* **`!customcommand info <name>`** diz o que é um comando: texto ou código, como ele começa, o tamanho (dos 10.000 caracteres de código), quem o escreveu, as funções que usa e se usa dados salvos, botões, menus, reações, formulários, cargos, mensagens diretas, membros do servidor ou outros comandos.
* **`!customcommand list`** mostra uma página por vez, em ordem de nome, com o que cada comando é (código ou texto), como é digitado e o tamanho dele.
* **`!customcommand codeshow`** mostra o código em um bloco que colore as ações `{{ }}`.
* **`!customcommand rename <name> <new name>`** muda o nome e mantém o código, o gatilho (o prefixo próprio também, então `.req1` vira `.req`) e os dados salvos. Um nome que é um comando real do Petto ou outro comando personalizado é recusado. As mensagens que o comando enviou antes, com botões ou reações, mantêm o nome antigo e param de responder.
* **`!customcommand trigger <name>`** sem um tipo mostra como o comando começa e os comandos para mudar isso. Avisa quando nada muda, e qual era o prefixo antes quando muda.
* Ao salvar um comando, o Petto avisa quando o primeiro comentário diz que ele é usado com um prefixo próprio (como `{{/* req: .req <what you ask> */}}`) e o comando não o tem, e dá o comando que o define.

> [accordion] !customcommand codetest
>
> ![liam testa código com red e big cat depois, e o resultado diz que enviaria um embed com um big cat na cor red e uma reação de gato](https://mintcdn.com/wikipetto/ii5NsO0foe6CCGwz/images/discord/automation/pt-br/petto-code-codetest-args.webp?fit=max\&auto=format\&n=ii5NsO0foe6CCGwz\&q=85\&s=fe8e25c678586a95c486f85176b8559e)
>
> No Discord: um teste com argumentos depois do bloco de código; nada é enviado.

> [accordion] !customcommand info
>
> ![A info de buy: código, começa com o prefixo do servidor, o tamanho de 10000 caracteres, usa dados salvos e outros comandos, as funções e escrito por liam](https://mintcdn.com/wikipetto/ii5NsO0foe6CCGwz/images/discord/automation/pt-br/petto-code-info.webp?fit=max\&auto=format\&n=ii5NsO0foe6CCGwz\&q=85\&s=c3ca3a5bdf918b4fdc3b3eba022e9670)
>
> No Discord: o que é o comando buy, o tamanho, o que ele usa e quem escreveu.

> [accordion] !customcommand list
>
> ![O Petto lista 12 de 125 comandos personalizados, com req começando com o próprio prefixo .req](https://mintcdn.com/wikipetto/ii5NsO0foe6CCGwz/images/discord/automation/pt-br/petto-code-list.webp?fit=max\&auto=format\&n=ii5NsO0foe6CCGwz\&q=85\&s=57336a4c4ad7058cdb4fd3c5087a2cae)
>
> No Discord: todos os comandos, de texto ou de código, como começam e o tamanho.

> [accordion] !customcommand codeshow
>
> ![O Petto mostra as duas linhas de código de greet](https://mintcdn.com/wikipetto/ii5NsO0foe6CCGwz/images/discord/automation/pt-br/petto-code-codeshow.webp?fit=max\&auto=format\&n=ii5NsO0foe6CCGwz\&q=85\&s=f7cdf019b7f381b7472e9c5e0c248eed)
>
> No Discord: o código de greet em um bloco que colore as ações.

> [accordion] !customcommand rename
>
> ![liam renomeia req para req1 e o Petto diz que ainda começa com o próprio prefixo .req1](https://mintcdn.com/wikipetto/ii5NsO0foe6CCGwz/images/discord/automation/pt-br/petto-code-rename.webp?fit=max\&auto=format\&n=ii5NsO0foe6CCGwz\&q=85\&s=9d5db97d543431290d9634ca53075eb9)
>
> No Discord: req vira req1 e mantém o próprio prefixo.

> [accordion] !customcommand trigger
>
> ![O Petto diz que req começa com o próprio prefixo e lista os comandos de gatilho e os tipos](https://mintcdn.com/wikipetto/OcAUaBAyli2de5qV/images/discord/automation/pt-br/petto-code-trigger-show.webp?fit=max\&auto=format\&n=OcAUaBAyli2de5qV\&q=85\&s=3c362f1aa837e086b92374fa2c00f73d)
>
> No Discord: como req começa e os comandos para mudar.

> [accordion] Ao salvar: um prefixo próprio
>
> ![liam salva req2 com um primeiro comentário que diz .req, e a resposta do Petto avisa com os comandos de gatilho e de renomear](https://mintcdn.com/wikipetto/ii5NsO0foe6CCGwz/images/discord/automation/pt-br/petto-code-prefix-warning.webp?fit=max\&auto=format\&n=ii5NsO0foe6CCGwz\&q=85\&s=b40d55451caee847dce6d49b9a258ce5)
>
> No Discord: o comentário diz .req, o comando não tem, e o Petto dá o comando que coloca.

## Novidades no Petto Code

O Petto Code agora tem **mais de 150 funções**. Muitas das novas têm os mesmos nomes que no YAGPDB, então o código escrito para ele é **mais fácil de trazer**.

### Novas funções

* **Texto**: `joinStr`, `trimPrefix`, `trimSuffix`, `trimSpace`, `inFold`, `capitalize`, `repeat`, `truncate`, `padLeft`, `padRight`, `count`, `indexOf`, `reverse`, `urlescape`, `urlunescape`, `escapeMarkdown`, `formatNumber`, `toString`, `toLower` e `toUpper`.
* **Números**: `fdiv`, `sqrt`, `cbrt`, `log`, `roundCeil`, `roundFloor`, `roundEven`, `clamp` e `toInt64`.
* **Tempo**: `currentTime`, `toDuration` (`"1h30m"` em segundos), `humanizeTimeSince`, `snowflakeToTime`, `newDate`, `formatTime` (um formato e um fuso horário) e `weekday`.
* **Listas e mapas**: `sort`, `sortBy`, `uniq`, `first`, `last`, `sum`, `randItem`, `concat`, `hasKey`, `setKey`, `delKey`, `merge`, `values`, `kindOf`, `json` e `parseJson`.
* **IDs**: `userID`, `roleID` e `channelID` tiram o ID de uma menção.

```text Example theme={null}
{{ capitalize "petto" }} has {{ formatNumber 1234567 }} coins.
{{ joinStr ", " (sort (cslice "pear" "apple" "fig")) }}
{{ toDuration "1h30m" }} seconds
```

Isso imprime `Petto has 1,234,567 coins.`, depois `apple, fig, pear` e `5400 seconds`.

![O resultado imprime Petto tem 1,234,567 moedas, apple, fig, pear e 5400 segundos](https://mintcdn.com/wikipetto/ii5NsO0foe6CCGwz/images/discord/automation/pt-br/petto-code-functions.webp?fit=max\&auto=format\&n=ii5NsO0foe6CCGwz\&q=85\&s=fd302d05d47357a223b44f5824b181f5)

No Discord: o exemplo testado com !customcommand codetest.

### Membros, cargos e canais

`getMember`, `getRole` e `getChannel` leem um membro, um cargo ou um canal do servidor a partir de um ID ou de uma menção. `targetHasRole` diz se um membro tem um cargo. Elas **só leem**, só do servidor onde o comando é executado, e um comando pode ler **no máximo 10** por uso.

```text Example theme={null}
{{ with .Mentions }}
  {{ $m := getMember (index . 0).ID }}
  {{ if $m }}{{ $m.DisplayName }} is here.{{ end }}
{{ end }}
```

![kira digita !here @nova e o Petto responde que nova está aqui](https://mintcdn.com/wikipetto/ii5NsO0foe6CCGwz/images/discord/automation/pt-br/petto-code-getmember.webp?fit=max\&auto=format\&n=ii5NsO0foe6CCGwz\&q=85\&s=3e69769fa51a0323d7044c87dd7458ca)

No Discord: o exemplo como comando, mencionando nova.

### Rankings

* `dbRank` dá a posição de um membro em um ranking, como o de moedas.
* `dbBottom` dá os números mais baixos, de 1 a 25 membros (como `dbTop`, mas de baixo para cima).
* `dbCount` diz quantas chaves estão salvas.

```text Example theme={null}
{{ with dbRank "coins" .User.ID }}You are **#{{ . }}**.{{ else }}No coins yet.{{ end }}
```

![chu digita !myrank e o Petto responde Você é o #2](https://mintcdn.com/wikipetto/ii5NsO0foe6CCGwz/images/discord/automation/pt-br/petto-code-rank.webp?fit=max\&auto=format\&n=ii5NsO0foe6CCGwz\&q=85\&s=3837f7f6c86673d7d5270f525166b3e4)

No Discord: chu é a segunda no ranking de moedas.

### Ações

* `deleteTrigger` e o novo `deleteResponse` aceitam um **atraso de até 5 minutos** (em segundos). `deleteResponse` apaga a resposta do comando, 10 segundos depois se você não der um atraso. Só funciona quando o comando é digitado, não em um botão, menu, formulário ou reação.
* `addReactions` adiciona várias reações de uma vez (até 5).
* `complexMessage` aceita `"reply" true` (a mensagem responde à mensagem do comando) e `"silent" true` (sem notificação).

```text Example theme={null}
Saved!{{ deleteTrigger 5 }}{{ deleteResponse 10 }}
{{ sendMessage nil (complexMessage "content" "Got it." "reply" true "silent" true) }}
```

![O resultado imprime Salvo e apagaria a mensagem depois de 5 segundos, a resposta depois de 10 segundos e enviaria Entendi como resposta sem notificação](https://mintcdn.com/wikipetto/ii5NsO0foe6CCGwz/images/discord/automation/pt-br/petto-code-actions.webp?fit=max\&auto=format\&n=ii5NsO0foe6CCGwz\&q=85\&s=09db365a47d71bea5e3b4cfb62d8be56)

No Discord: o que o exemplo faria, em um teste: as duas exclusões com as esperas e a resposta silenciosa.

### Formulários com todas as partes

Um formulário (`cmodal`) pode ter até **5 partes**, pelo menos uma que as pessoas preencham. Cada parte fica sob um **rótulo** (até 45 caracteres) e pode ter uma `description` (até 100). Além de `ctext` há:

| Função | Parte | Chaves principais |
| - | - | - |
| `cmenu` | Um menu de opções | `options` (`(cslice "Rosa" "pink" "Suave" true)`: rótulo, valor, descrição, escolhida desde o início), `min`, `max`, `placeholder` |
| `cusers`, `croles`, `cmentions` | Membros, cargos, ou membros e cargos para escolher | `min`, `max` (até 25), `placeholder` |
| `cchannels` | Canais para escolher | `types`: `(cslice "text" "voice")`, entre `text`, `voice`, `announcement`, `category`, `stage`, `forum`, `media`, `thread` |
| `cfile` | Arquivos para enviar | `min`, `max` (até 10) |
| `cradio` | Botões de opção: escolhe-se um | `options` (de 2 a 10, uma pode vir escolhida) |
| `cchecks` | Um grupo de caixas | `options` (até 10), `min`, `max` |
| `ccheck` | Uma caixa | `default` |
| `cdisplay` | Um texto que só informa (o Markdown funciona) | `cdisplay "Leia isto primeiro"` |

Todas as partes, menos `ccheck` e `cdisplay`, têm `required` (true, a menos que você diga outra coisa), e as que escolhem várias coisas têm `min` e `max`.

```text Exemplo theme={null}
{{ showModal (cmodal "id" "about" "title" "Sobre você" "fields" (cslice
  (cdisplay "Leva só um minuto.")
  (ctext "id" "name" "label" "Nome" "description" "Como chamamos você")
  (cmenu "id" "color" "label" "Cor favorita" "options" (cslice (cslice "Rosa" "pink") (cslice "Azul" "blue")))
  (cusers "id" "friends" "label" "Amigos" "max" 3 "required" false)
  (cfile "id" "photo" "label" "Uma foto" "required" false)
  )) }}
```

![O formulário Sobre você com a nota Leva só um minuto, um campo Nome com a descrição, o menu Cor favorita, Amigos e Uma foto](https://mintcdn.com/wikipetto/ii5NsO0foe6CCGwz/images/discord/automation/pt-br/petto-code-form-modal.webp?fit=max\&auto=format\&n=ii5NsO0foe6CCGwz\&q=85\&s=a6815e2c32af2e933246b902eda79a83)

No Discord: o formulário do exemplo, montado pelo Petto a partir do cmodal: um texto, um menu, membros para escolher e um arquivo.

Quando o formulário é enviado, o comando roda de novo com `.Trigger` em `"modal"` e as respostas estão em:

* `.Fields.<id>`: um **texto** (`ctext`, `cradio`), uma **lista de valores** (`cmenu`, `cchecks`), uma **lista de IDs** (`cusers`, `croles`, `cmentions`, `cchannels`), **true ou false** (`ccheck`) ou uma **lista de arquivos** (`cfile`, cada um com `ID`, `Name`, `URL`, `Size`, `Type` e `Description`).
* `.FieldText.<id>`: o mesmo, **pronto para imprimir**: IDs como menções, listas unidas, ✅ ou ❌, os links dos arquivos.
* `.Files`: todos os arquivos do formulário em uma lista.

![Um embed com o título Kira com a cor pink e os amigos chu e shi como menções](https://mintcdn.com/wikipetto/ii5NsO0foe6CCGwz/images/discord/automation/pt-br/petto-code-form-result.webp?fit=max\&auto=format\&n=ii5NsO0foe6CCGwz\&q=85\&s=be3926b5c7b69b4f05f17b7fe3905570)

No Discord: o que o código publica com as respostas do formulário.

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

### Novos dados

* `.Mentions` (os usuários mencionados, com nome e avatar), `.MentionedRoles` e `.MentionedChannels`.
* `.ServerPrefix`, `.Now` e `.User.CreatedAt`.
* Mais de `.Member`: `Avatar`, `Color`, `HighestRoleID`, `BoostingSince` e `IsOwner`.
* Mais de `.Guild`: `OwnerID`, `CreatedAt`, `BoostCount`, `BoostTier`, `Banner`, `Description`, `RoleCount`, `ChannelCount` e `EmojiCount`.
* Mais de `.Channel`: `Topic`, `NSFW`, `ParentID`, `Type` e `IsThread`.
* Mais de `.Message`: `CreatedAt`, `Attachments` e `ReplyToID`.

### Novos modelos

* `whois`: um cartão do membro que você mencionar, ou seu. `!whois @Liam`
* `roleinfo`: a cor, os membros e a data de criação de um cargo. `!roleinfo @Cargo`
* `rank`: sua posição no ranking de moedas, ou a posição do membro que você mencionar.

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

> [accordion] !customcommand template whois
>
> ![liam instala o modelo whois e o Petto confirma](https://mintcdn.com/wikipetto/OcAUaBAyli2de5qV/images/discord/automation/pt-br/petto-code-template-install.webp?fit=max\&auto=format\&n=OcAUaBAyli2de5qV\&q=85\&s=d78e9ea13269de0e6cf6368b0048cd7a)
>
> No Discord: o modelo whois instalado.

> [accordion] !whois
>
> ![chu digita !whois @liam e o Petto envia um cartão com o avatar de liam, o usuário, o ID, a idade da conta, a data de entrada e os cargos](https://mintcdn.com/wikipetto/OcAUaBAyli2de5qV/images/discord/automation/pt-br/petto-code-whois.webp?fit=max\&auto=format\&n=OcAUaBAyli2de5qV\&q=85\&s=2511909420748bf5a4a6abddfdf9261e)
>
> No Discord: o cartão de liam, do modelo whois.

> [accordion] !roleinfo
>
> ![kira digita !roleinfo @Vermelho e o Petto envia um cartão vermelho com os membros, a cor, a posição, se pode ser mencionado e a data de criação](https://mintcdn.com/wikipetto/ii5NsO0foe6CCGwz/images/discord/automation/pt-br/petto-code-roleinfo.webp?fit=max\&auto=format\&n=ii5NsO0foe6CCGwz\&q=85\&s=48f9c2f88651fbce8654490fb1f5fac1)
>
> No Discord: o cargo Vermelho, do modelo roleinfo.

> [accordion] !rank
>
> ![shi digita !rank e o Petto responde que shi é o #4 com 120 moedas](https://mintcdn.com/wikipetto/ii5NsO0foe6CCGwz/images/discord/automation/pt-br/petto-code-rank-template.webp?fit=max\&auto=format\&n=ii5NsO0foe6CCGwz\&q=85\&s=38b1e7387f0455fb72693af5ff1e4be4)
>
> No Discord: o lugar de shi no ranking de moedas, do modelo rank.

## Comandos

```javascript Syntax 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 Example theme={null}
!customcommand code hello Hello {{ .User.Username }}!
!customcommand template vote
!customcommand trigger hello prefix ?
!customcommand rename req1 req
!customcommand logs give
```

> [accordion] !customcommand code
>
> ![liam salva hello com Hello e o nome de usuário em código, e o Petto confirma](https://mintcdn.com/wikipetto/ii5NsO0foe6CCGwz/images/discord/automation/pt-br/petto-code-code.webp?fit=max\&auto=format\&n=ii5NsO0foe6CCGwz\&q=85\&s=2dcf03ef13bb9b4f535fdc0501df9fa4)
>
> No Discord: um comando em código salvo depois da verificação.

> [accordion] !customcommand template
>
> ![O Petto lista os modelos de hello e roll até whois, roleinfo e rank, cada um com o id e o que faz](https://mintcdn.com/wikipetto/OcAUaBAyli2de5qV/images/discord/automation/pt-br/petto-code-template-list.webp?fit=max\&auto=format\&n=OcAUaBAyli2de5qV\&q=85\&s=316806480710c8a728a4c4edd73e53f9)
>
> No Discord: os comandos em código prontos, com como instalar um.

> [accordion] !customcommand template vote
>
> ![liam instala o modelo vote e o Petto confirma](https://mintcdn.com/wikipetto/OcAUaBAyli2de5qV/images/discord/automation/pt-br/petto-code-template-vote.webp?fit=max\&auto=format\&n=OcAUaBAyli2de5qV\&q=85\&s=9678bc92e8e2c26cc8d1246d730e6935)
>
> No Discord: o modelo vote instalado como !vote.

> [accordion] !customcommand export
>
> ![liam exporta hi e o Petto responde com um código de compartilhamento que começa com pc1.](https://mintcdn.com/wikipetto/ii5NsO0foe6CCGwz/images/discord/automation/pt-br/petto-code-export.webp?fit=max\&auto=format\&n=ii5NsO0foe6CCGwz\&q=85\&s=a30c034c78088bbda80edc9ec0a40235)
>
> No Discord: o código de compartilhamento de um comando, pronto para colar em qualquer servidor.

> [accordion] !customcommand import
>
> ![liam importa o código pc1. como hey e o Petto confirma](https://mintcdn.com/wikipetto/ii5NsO0foe6CCGwz/images/discord/automation/pt-br/petto-code-import.webp?fit=max\&auto=format\&n=ii5NsO0foe6CCGwz\&q=85\&s=5aa37f0a819c07967362260fd0349e2f)
>
> No Discord: um código de compartilhamento importado com o nome hey.

> [accordion] !customcommand trigger
>
> ![liam define o gatilho de greet como prefix ? e o Petto diz que agora começa com ?greet](https://mintcdn.com/wikipetto/OcAUaBAyli2de5qV/images/discord/automation/pt-br/petto-code-trigger-set.webp?fit=max\&auto=format\&n=OcAUaBAyli2de5qV\&q=85\&s=2026e9731d343c75d3841d4fe13ec9e6)
>
> No Discord: greet agora começa com ?, o próprio prefixo.

* O código é **verificado antes de ser salvo**. Um erro mostra a linha e a coluna, e nada é salvo.
* `codetest` executa o código como se você tivesse usado o comando e mostra o que ele imprimiria e faria. **Nada é enviado nem salvo.**
* `template` lista comandos prontos (votação, pedido, reivindicar, sugestão, denúncia, perfil, botão de cargo, cargo por reação, whois, roleinfo, rank e mais) e instala um deles.
* `export` dá um código de compartilhamento que funciona em qualquer servidor, e `import` usa um.
* Gatilhos: `prefix`, `startswith`, `exact`, `contains` ou `command` (o prefixo do Petto). Um servidor pode ter até 25 comandos com gatilho próprio.

## Editor do dashboard

No [dashboard](https://petto.sbs/dash), **Automação** → **Comandos em código** é um editor de verdade: ele verifica seu código enquanto você escreve (com cores, números de linha e sugestões), tem os modelos e todas as funções, **O que o inicia** para o gatilho, **Abrir no gerador**, e **Testar**, que desenha o que o comando enviaria, como no Discord, com o que ele faria. Um teste não envia nem salva nada. Salvar segue as mesmas regras que no Discord.

![A página Comandos em código com os comandos rank, vote e whois, o código de vote com cores e números de linha, O código está certo, o gatilho e a caixa Testar](https://mintcdn.com/wikipetto/1Wz8dc-Kr9ITtTNY/images/dashboard/automation/pt-br/petto-code-dashboard.webp?fit=max\&auto=format\&n=1Wz8dc-Kr9ITtTNY\&q=85\&s=1b9367c677e2ea9ce51474942dca447c)

Dashboard → Automação → Comandos em código: o editor com !vote aberto, os modelos, as funções, o que o inicia e o teste.

![A caixa Testar depois de executar vote com pizza hoje à noite: a mensagem de liam, o embed de votação do Petto com os botões Sim e Não, O que faria, e os passos e o tempo](https://mintcdn.com/wikipetto/1Wz8dc-Kr9ITtTNY/images/dashboard/automation/pt-br/petto-code-dashboard-test.webp?fit=max\&auto=format\&n=1Wz8dc-Kr9ITtTNY\&q=85\&s=5eab01824e0c055af8103826dcbc6f82)

Dashboard → Automação → Comandos em código: um teste do !vote, desenhado como no Discord, com o que ele faria.

## Gerador de Petto Code

O **[Gerador de Petto Code](https://wiki.petto.sbs/pt-br/automation/petto-code-generator.md)** é um site que escreve Petto Code para você: escolha embeds, botões, menus, formulários, reações, cargos, moedas e gatilhos com formulários, teste o comando em um canal de teste que executa o motor de verdade e copie o comando `!customcommand code` ou um código de compartilhamento para `!customcommand import`. Ele também lê códigos de compartilhamento, então você pode ver o código de um antes de usá-lo.

Abra em **[codegen.petto.sbs](https://codegen.petto.sbs)**. A documentação da linguagem tem uma página sobre ele em [code.petto.sbs/generator](https://code.petto.sbs/generator).

## Limites e segurança

O código nunca fala com o Discord sozinho. Ele pede ações, e o Petto só faz as que a pessoa que escreveu o código poderia fazer: um cargo com permissões de moderação nunca é dado, `@everyone` e `@here` nunca notificam, e uma mensagem para outro canal precisa de permissão para escrever lá. Os limites são 10.000 caracteres, 10.000 passos, 250 ms de execução, 25 leituras e escritas de dados salvos por uso e 500 valores salvos por servidor.

![for digita !vipme, o Petto responde com um brilho e depois que algumas ações não foram feitas porque um cargo com permissões de moderação não pode ser dado](https://mintcdn.com/wikipetto/ii5NsO0foe6CCGwz/images/discord/automation/pt-br/petto-code-safety.webp?fit=max\&auto=format\&n=ii5NsO0foe6CCGwz\&q=85\&s=19215ebdbf4f2b86b26d1dbf286ddb47)

No Discord: um comando tenta dar o cargo Moderadores; o Petto não dá, e diz por quê.

Veja [Comandos personalizados](https://wiki.petto.sbs/pt-br/automation/custom-commands.md) para comandos de texto simples e de embed.


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