Saltar al contenido principal

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.
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.
Ejemplo
mia escribe !welcome y Petto envía un embed rosa con el nombre y el avatar de mia y Bienvenido a Petto Land

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

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

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

¿No sabes por dónde empezar? El Generador de Petto Code 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.
Ejemplo
  • 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: La referencia completa de 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.
buy cobra las monedas y le pide a give que entregue el artículo:
buy
give solo funciona cuando otro comando lo ejecuta, y cuenta los artículos de cada miembro:
give
!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

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

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

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

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

En Discord: dbget no existe, y el error dice la función que se quería.

liam prueba un saludo con .User.Usrname y el resultado tiene una pista que pregunta si quería decir .User.Username

En Discord: .User.Usrname no da nada, y la pista dice .User.Username.

liam pide el código de gret y Petto dice que no existe y pregunta si quería decir greet

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

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

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

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

Petto lista 12 de 125 comandos personalizados, con req que empieza con su propio prefijo .req

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

Petto muestra las dos líneas de código de greet

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

liam renombra req a req1 y Petto dice que sigue empezando con su propio prefijo .req1

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

Petto dice que req empieza con su propio prefijo y lista los comandos de activador y los tipos

En Discord: cómo empieza req y los comandos para cambiarlo.

liam guarda req2 con un primer comentario que dice .req, y la respuesta de Petto avisa con los comandos de activador y de renombrar

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

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.
Ejemplo
kira escribe !here @nova y Petto responde que nova está aquí

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.
Ejemplo
chu escribe !myrank y Petto responde Eres el #2

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

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

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

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

Ejemplo

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.
Ejemplo
liam instala la plantilla whois y Petto lo confirma

En Discord: la plantilla whois instalada.

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

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

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

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

shi escribe !rank y Petto responde que shi es el #4 con 120 monedas

En Discord: el puesto de shi en el ranking de monedas, de la plantilla rank.

Comandos

liam guarda hello con Hello y el nombre de usuario en código, y Petto lo confirma

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

Petto lista las plantillas desde hello y roll hasta whois, roleinfo y rank, cada una con su id y lo que hace

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

liam instala la plantilla vote y Petto lo confirma

En Discord: la plantilla vote instalada como !vote.

liam exporta hi y Petto responde con un código para compartir que empieza con pc1.

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

liam importa el código pc1. como hey y Petto lo confirma

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

liam pone el activador de greet en prefix ? y Petto dice que ahora empieza con ?greet

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

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

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

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

Mira Comandos personalizados para comandos de texto simple y embeds.