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.

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 botobuenos días. - Miembros, roles y canales: lee un miembro, un rol o un canal del servidor, para tarjetas como
!whoisy!roleinfo. - Comandos que trabajan juntos: un comando puede ejecutar otro con
execCC, con un retraso y algunos datos.

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

En Discord: la votación tras cuatro clics; un segundo clic en el mismo botón recibe una respuesta privada.
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.
- 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.
.User, .Member, .Channel y .Guild, y lee:
execCC, con cada regla y más ejemplos, está en la documentación del lenguaje en 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.
Ejemplo: un comando !buy que llama a un comando give
Ejemplo: un comando !buy que llama a un comando give
buy cobra las monedas y le pide a give que entregue el artículo:give solo funciona cuando otro comando lo ejecuta, y cuenta los artículos de cada miembro:!buy rose responde Pagaste 50 monedas por un rose. Te quedan 70., y luego give envía @Liam ahora tiene 1 × rose (de buy).
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.

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

En Discord: !customcommand logs vipme, solo los problemas de un comando.
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:

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 infoy 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,exporteinfodicen el comando más parecido cuando el nombre tiene un error de escritura:!customcommand codeshow gretresponde ¿Quisiste decirgreet?
Una función que no existe
Una función que no existe

En Discord: dbget no existe, y el error dice la función que se quería.
Un nombre que no está en los datos
Un nombre que no está en los datos

En Discord: .User.Usrname no da nada, y la pista dice .User.Username.
Un nombre de comando mal escrito
Un nombre de comando mal escrito

En Discord: !customcommand codeshow gret, y Petto pregunta si era greet.
Gestionar tus comandos
!customcommand codetestacepta argumentos después del bloque de código: un bloque y luegored "big cat"prueba el código como si se hubiera escritored "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 listmuestra 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 codeshowmuestra 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.req1pasa 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.
!customcommand codetest
!customcommand codetest

En Discord: una prueba con argumentos después del bloque de código; no se envía nada.
!customcommand info
!customcommand info

En Discord: qué es el comando buy, su tamaño, qué usa y quién lo escribió.
!customcommand list
!customcommand list

En Discord: todos los comandos, de texto o de código, cómo empiezan y su tamaño.
!customcommand codeshow
!customcommand codeshow

En Discord: el código de greet en un bloque que colorea las acciones.
!customcommand rename
!customcommand rename

En Discord: req pasa a ser req1 y conserva su propio prefijo.
!customcommand trigger
!customcommand trigger

En Discord: cómo empieza req y los comandos para cambiarlo.
Al guardar: un prefijo propio
Al guardar: un prefijo propio

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,toLowerytoUpper. - Números:
fdiv,sqrt,cbrt,log,roundCeil,roundFloor,roundEven,clampytoInt64. - Tiempo:
currentTime,toDuration("1h30m"en segundos),humanizeTimeSince,snowflakeToTime,newDate,formatTime(un formato y una zona horaria) yweekday. - Listas y mapas:
sort,sortBy,uniq,first,last,sum,randItem,concat,hasKey,setKey,delKey,merge,values,kindOf,jsonyparseJson. - IDs:
userID,roleIDychannelIDsacan el ID de una mención.
Petto tiene 1,234,567 monedas., luego apple, fig, pear y 5400 segundos.

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.

En Discord: el ejemplo como comando, mencionando a nova.
Rankings
dbRankda el puesto de un miembro en un ranking, como el de monedas.dbBottomda los números más bajos, de 1 a 25 miembros (comodbTop, desde abajo).dbCountdice cuántas claves hay guardadas.

En Discord: chu es segunda en el ranking de monedas.
Acciones
deleteTriggery el nuevodeleteResponseaceptan un retraso de hasta 5 minutos (en segundos).deleteResponseborra 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.addReactionsagrega varias reacciones a la vez (hasta 5).complexMessageacepta"reply" true(el mensaje responde al mensaje del comando) y"silent" true(sin notificación).

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:
ccheck y cdisplay tienen required (true salvo que digas otra cosa), y las que eligen varias cosas tienen min y max.

En Discord: el formulario del ejemplo, construido por Petto a partir de cmodal: un texto, un menú, miembros para elegir y un archivo.
.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 conID,Name,URL,Size,TypeyDescription)..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.

En Discord: lo que publica el código con las respuestas del formulario.
Datos nuevos
.Mentions(los usuarios mencionados, con su nombre y avatar),.MentionedRolesy.MentionedChannels..ServerPrefix,.Nowy.User.CreatedAt.- Más de
.Member:Avatar,Color,HighestRoleID,BoostingSinceeIsOwner. - Más de
.Guild:OwnerID,CreatedAt,BoostCount,BoostTier,Banner,Description,RoleCount,ChannelCountyEmojiCount. - Más de
.Channel:Topic,NSFW,ParentID,TypeeIsThread. - Más de
.Message:CreatedAt,AttachmentsyReplyToID.
Plantillas nuevas
whois: una tarjeta del miembro que mencionas, o tuya.!whois @Liamroleinfo: el color, los miembros y la fecha de creación de un rol.!roleinfo @Rolerank: tu puesto en el ranking de monedas, o el del miembro que mencionas.
!customcommand template whois
!customcommand template whois

En Discord: la plantilla whois instalada.
!whois
!whois

En Discord: la tarjeta de liam, de la plantilla whois.
!roleinfo
!roleinfo

En Discord: el rol Rojo, de la plantilla roleinfo.
!rank
!rank

En Discord: el puesto de shi en el ranking de monedas, de la plantilla rank.
Comandos
!customcommand code
!customcommand code

En Discord: un comando en código guardado después de revisarlo.
!customcommand template
!customcommand template

En Discord: los comandos en código listos, con cómo instalar uno.
!customcommand template vote
!customcommand template vote

En Discord: la plantilla vote instalada como !vote.
!customcommand export
!customcommand export

En Discord: el código para compartir de un comando, listo para pegar en cualquier servidor.
!customcommand import
!customcommand import

En Discord: un código para compartir importado con el nombre hey.
!customcommand trigger
!customcommand trigger

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.
codetestejecuta 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.templatelista 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.exportda un código para compartir que funciona en cualquier servidor, eimportusa uno.- Activadores:
prefix,startswith,exact,containsocommand(el prefijo de Petto). Un servidor puede tener hasta 25 comandos con un activador propio.
Editor de la dashboard
En la dashboard, 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.
Dashboard → Automatización → Comandos en código: el editor con !vote abierto, las plantillas, las funciones, qué lo inicia y la prueba.

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 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. La documentación del lenguaje tiene una página sobre él en 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.

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