Pular para o conteúdo principal

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.
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.
Example
mia digita !welcome e o Petto envia um embed rosa com o nome e o avatar de mia e Boas-vindas ao Petto Land

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

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

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

Não sabe por onde começar? O Gerador de Petto Code 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.
Example
  • 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ê: A referência completa do 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.
buy cobra as moedas e pede a give que entregue o item:
buy
give só funciona quando outro comando o executa, e conta os itens de cada membro:
give
!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

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

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

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:
Example
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

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

No Discord: dbget não existe, e o erro diz a função que se queria.

liam testa uma saudação com .User.Usrname e o resultado tem uma dica perguntando se quis dizer .User.Username

No Discord: .User.Usrname não dá nada, e a dica diz .User.Username.

liam pede o código de gret e o Petto diz que não existe e pergunta se quis dizer greet

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

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

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

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

O Petto lista 12 de 125 comandos personalizados, com req começando com o próprio prefixo .req

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

O Petto mostra as duas linhas de código de greet

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

liam renomeia req para req1 e o Petto diz que ainda começa com o próprio prefixo .req1

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

O Petto diz que req começa com o próprio prefixo e lista os comandos de gatilho e os tipos

No Discord: como req começa e os comandos para mudar.

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

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.
Example
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

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.
Example
kira digita !here @nova e o Petto responde que nova está aqui

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.
Example
chu digita !myrank e o Petto responde Você é o #2

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).
Example
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

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

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

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

Exemplo

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.
Example
liam instala o modelo whois e o Petto confirma

No Discord: o modelo whois instalado.

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

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

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

No Discord: o cargo Vermelho, do modelo roleinfo.

shi digita !rank e o Petto responde que shi é o #4 com 120 moedas

No Discord: o lugar de shi no ranking de moedas, do modelo rank.

Comandos

liam salva hello com Hello e o nome de usuário em código, e o Petto confirma

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

O Petto lista os modelos de hello e roll até whois, roleinfo e rank, cada um com o id e o que faz

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

liam instala o modelo vote e o Petto confirma

No Discord: o modelo vote instalado como !vote.

liam exporta hi e o Petto responde com um código de compartilhamento que começa com pc1.

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

liam importa o código pc1. como hey e o Petto confirma

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

liam define o gatilho de greet como prefix ? e o Petto diz que agora começa com ?greet

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

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

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

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

Veja Comandos personalizados para comandos de texto simples e de embed.