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.

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 botougood morning. - Membros, cargos e canais: leia um membro, um cargo ou um canal do servidor, para cartões como
!whoise!roleinfo. - Comandos que trabalham juntos: um comando pode executar outro com
execCC, com um atraso e alguns dados.

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

No Discord: a votação depois de quatro cliques; um segundo clique no mesmo botão recebe uma resposta privada.
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.
- 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.
.User, .Member, .Channel e .Guild, e lê:
execCC, com todas as regras e mais exemplos, está na documentação da linguagem em 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.
Exemplo: um comando !buy que chama um comando give
Exemplo: um comando !buy que chama um comando give
buy cobra as moedas e pede a give que entregue o item:give só funciona quando outro comando o executa, e conta os itens de cada membro:!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).
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.

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

No Discord: !customcommand logs vipme, só os problemas de um comando.
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:

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 infoe 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,exporteinfomostram o comando mais parecido quando o nome tem um erro de digitação:!customcommand codeshow gretresponde Você quis dizer greet?
Uma função que não existe
Uma função que não existe

No Discord: dbget não existe, e o erro diz a função que se queria.
Um nome que não está nos dados
Um nome que não está nos dados

No Discord: .User.Usrname não dá nada, e a dica diz .User.Username.
Um nome de comando com erro
Um nome de comando com erro

No Discord: !customcommand codeshow gret, e o Petto pergunta se era greet.
Gerenciando seus comandos
!customcommand codetestaceita argumentos depois do bloco de código: um bloco e depoisred "big cat"testa o código como sered "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 listmostra 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 codeshowmostra 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.req1vira.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.
!customcommand codetest
!customcommand codetest

No Discord: um teste com argumentos depois do bloco de código; nada é enviado.
!customcommand info
!customcommand info

No Discord: o que é o comando buy, o tamanho, o que ele usa e quem escreveu.
!customcommand list
!customcommand list

No Discord: todos os comandos, de texto ou de código, como começam e o tamanho.
!customcommand codeshow
!customcommand codeshow

No Discord: o código de greet em um bloco que colore as ações.
!customcommand rename
!customcommand rename

No Discord: req vira req1 e mantém o próprio prefixo.
!customcommand trigger
!customcommand trigger

No Discord: como req começa e os comandos para mudar.
Ao salvar: um prefixo próprio
Ao salvar: um prefixo próprio

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,toLoweretoUpper. - Números:
fdiv,sqrt,cbrt,log,roundCeil,roundFloor,roundEven,clampetoInt64. - Tempo:
currentTime,toDuration("1h30m"em segundos),humanizeTimeSince,snowflakeToTime,newDate,formatTime(um formato e um fuso horário) eweekday. - Listas e mapas:
sort,sortBy,uniq,first,last,sum,randItem,concat,hasKey,setKey,delKey,merge,values,kindOf,jsoneparseJson. - IDs:
userID,roleIDechannelIDtiram o ID de uma menção.
Petto has 1,234,567 coins., depois apple, fig, pear e 5400 seconds.

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.

No Discord: o exemplo como comando, mencionando nova.
Rankings
dbRankdá a posição de um membro em um ranking, como o de moedas.dbBottomdá os números mais baixos, de 1 a 25 membros (comodbTop, mas de baixo para cima).dbCountdiz quantas chaves estão salvas.

No Discord: chu é a segunda no ranking de moedas.
Ações
deleteTriggere o novodeleteResponseaceitam um atraso de até 5 minutos (em segundos).deleteResponseapaga 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.addReactionsadiciona várias reações de uma vez (até 5).complexMessageaceita"reply" true(a mensagem responde à mensagem do comando) e"silent" true(sem notificação).

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

No Discord: o formulário do exemplo, montado pelo Petto a partir do cmodal: um texto, um menu, membros para escolher e um arquivo.
.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 comID,Name,URL,Size,TypeeDescription)..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.

No Discord: o que o código publica com as respostas do formulário.
Novos dados
.Mentions(os usuários mencionados, com nome e avatar),.MentionedRolese.MentionedChannels..ServerPrefix,.Nowe.User.CreatedAt.- Mais de
.Member:Avatar,Color,HighestRoleID,BoostingSinceeIsOwner. - Mais de
.Guild:OwnerID,CreatedAt,BoostCount,BoostTier,Banner,Description,RoleCount,ChannelCounteEmojiCount. - Mais de
.Channel:Topic,NSFW,ParentID,TypeeIsThread. - Mais de
.Message:CreatedAt,AttachmentseReplyToID.
Novos modelos
whois: um cartão do membro que você mencionar, ou seu.!whois @Liamroleinfo: a cor, os membros e a data de criação de um cargo.!roleinfo @Cargorank: sua posição no ranking de moedas, ou a posição do membro que você mencionar.
!customcommand template whois
!customcommand template whois

No Discord: o modelo whois instalado.
!whois
!whois

No Discord: o cartão de liam, do modelo whois.
!roleinfo
!roleinfo

No Discord: o cargo Vermelho, do modelo roleinfo.
!rank
!rank

No Discord: o lugar de shi no ranking de moedas, do modelo rank.
Comandos
!customcommand code
!customcommand code

No Discord: um comando em código salvo depois da verificação.
!customcommand template
!customcommand template

No Discord: os comandos em código prontos, com como instalar um.
!customcommand template vote
!customcommand template vote

No Discord: o modelo vote instalado como !vote.
!customcommand export
!customcommand export

No Discord: o código de compartilhamento de um comando, pronto para colar em qualquer servidor.
!customcommand import
!customcommand import

No Discord: um código de compartilhamento importado com o nome hey.
!customcommand trigger
!customcommand trigger

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.
codetestexecuta o código como se você tivesse usado o comando e mostra o que ele imprimiria e faria. Nada é enviado nem salvo.templatelista 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.exportdá um código de compartilhamento que funciona em qualquer servidor, eimportusa um.- Gatilhos:
prefix,startswith,exact,containsoucommand(o prefixo do Petto). Um servidor pode ter até 25 comandos com gatilho próprio.
Editor do dashboard
No dashboard, 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.
Dashboard → Automação → Comandos em código: o editor com !vote aberto, os modelos, as funções, o que o inicia e o teste.

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 é 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. A documentação da linguagem tem uma página sobre ele em 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.

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