Saltar a contenido

¿Qué son las expresiones?

Las expresiones te permitirán realizar operaciones dentro de los mensajes y modificarlos dinámicamente, así como en acciones, algunos de sus usos son: realizar cálculos aritméticos como {2 + 2}, operaciones de comparación como {5 == 5}, representar variables y variables primitivas como {balance} o {first_name}, y mucho más. VisualMaker te informará siempre que puedas utilizar expresiones.

¿Cómo se usan las expresiones?

Las expresiones siempre deben ser representadas entre llaves { }, así VisualMaker entenderá que quieres usar una expresión.

En su interior se pueden usar (o no), espacios, es lo mismo {3 + 5} que { 3+5 }.

Tipos de valores

  • strings o cadenas de texto: textos como tal, se representan entre comillas dobles "esto es un texto", o comillas simples 'esto también es un texto'.
  • números: los números se representan tal cual, sin comillas, 10 es un número entero, 34.87 también es un número, en este caso decimal.
  • fechas: las fechas son strings con un formato en particular, se representan como "DD-MM-YYYY HH:MM:SS.m" (HH:MM:SS.m es opcional), por ejemplo "31-12-2024 23:59:59.123456", internamente las fechas son strings, por lo que deben ir siempre entre comillas.
  • booleanos: True cuando algo es verdadero, False cuando algo es falso.
  • None: valor que hace referencia a nada, o no existe.

Operadores aritméticos

Los operadores aritméticos te permitirán realizar cálculos matemáticos dentro de tus mensajes, devolverá el resultado del cálculo como valor numérico, los operadores aritméticos son los siguientes:

  • +: suma
  • -: resta
  • *: multiplicación
  • /: división
  • %: módulo
  • **: potencia
  • //: cociente

Operadores de comparación

Los operadores de comparación te permitirán realizar evaluaciones, devolverá True si la comparación es verdadera, o False si es falsa, son los siguientes:

  • ==: igual que, ejemplo: {2 + 1 == 3}, devolverá True, ya que 2 + 1 es igual a 3.
  • !=: diferente que, ejemplo: {"hola" != "hola"}, devolverá False, ya que hola no es diferente a hola.
  • >: mayor que, ejemplo: {10 > 5}, devolverá True, ya que 10 sí es mayor que 5.
  • <: menor que, ejemplo: {2 < 5}, devolverá True, ya que 2 sí es menor que 5.
  • >=: mayor o igual que, ejemplo: {3 >= 3}, devolverá True, ya que 3 no es mayor, pero sí igual que 3.
  • <=: menor o igual que, ejemplo: {2 <= 3}, también devolverá True, ya que 2 no es igual, pero sí es menor que 3.

Ejemplos de uso de expresiones

  • {2 + 5} ➡️ 7 (operación de suma)
  • {5 - 1} ➡️ 4 (operación de resta)
  • {5 * 5} ➡️ 25 (operación de multiplicación)
  • {8 / 2} ➡️ 4 (operación de división)
  • {2 * (3 + 1)} ➡️ 8 (operación combinada, también puedes usar paréntesis)
  • {balance == 10} ➡️ True | False (operación de comparación igual que, devolverá True si valor de la variable balance es 10, en caso contrario devolverá False)
  • {first_name != "John"} ➡️ True | False (operación de comparación diferente que, devolverá True si la variable primitiva fist_name es diferente a John, en caso contrario devolverá False)
  • {"28-02-2024" > "28-02-2023"} ➡️ True (operación de comparación mayor que, comparando dos fechas, devolverá True, ya que la fecha 28-02-2024 es mayor que la fecha 28-02-2023.)
  • "El resultado de 3 + 2 es {3 + 2}" ➡️ "El resultado de 3 + 2 es 5"

Funciones

Las funciones te permiten realizar operaciones aún más poderosas dentro de las expresiones, a continuación se listan todas las funciones de VisualMaker.

Las funciones reciben argumentos entre paréntesis, separados por coma, para llamar a una función se hace de la siguiente forma:

funcion(argumento1, argumento2)

min()

Recibe números como argumentos y retorna el número más pequeño, no hay límite en la cantidad de argumentos.

Argumentos: números, sín límite.

Ejemplo:

{min(5, 7, 2, 6.1, 3)} ➡️ 2

max()

Recibe números como argumentos y retorna el número más alto, no hay límite en la cantidad de argumentos.

Argumentos: números, sín límite.

Ejemplo:

{max(5, 7, 2, 6.1, 3)} ➡️ 7

round()

Redondea un número.

Argumento 1: número a redondear.

Argumento 2 (opcional): cantidad de decimales que debe tener el número redondeado.

Ejemplos:

{round(12.8649)} ➡️ 13

{round(12.8649, 2)} ➡️ 12.86

ceil()

Redondea un número hacia arriba.

Argumento 1: número a redondear.

Ejemplo:

{ceil(8.5649)} ➡️ 9

floor()

Redondea un número hacia abajo.

Argumento 1: número a redondear.

Ejemplo:

{floor(8.5649)} ➡️ 8

random()

Devuelve un número aleatorio entre el número del argumento 1 y el número del argumento 2. El número devuelto tendrá una cantidad de decimales similar al argumento con mayor decimales.

Argumento 1: número desde el que empezar.

Argumento 2: número en el que terminar.

Ejemplos:

{random(1, 10)} ➡️ 3 (número aleatorio entre 1 y 10)

{random(1.001, 2)} ➡️ 1.329 (número aleatorio entre 1.001 y 2, el número devuelto tendrá 3 decimales)

absolute()

Devuelve el valor absoluto del número pasado como argumento.

Argumento 1: número.

Ejemplo:

{absolute(-5)} ➡️ 5

pick_one()

Recibe cualquier tipo de elementos como argumentos y retorna uno al azar, no hay límite en la cantidad de argumentos.

Argumento 1: todo tipo de elementos.

Ejemplo:

{pick_one(5, "texto", True, 16)} ➡️ "texto" (elemento devuelto al azar)

pick_by_index()

Elige un elemento de una lista, tupla o string utilizando un índice especificado.

Argumento 1: lista, tupla o string de la cual se desea elegir un elemento.

Argumento 2: índice del elemento a seleccionar, debe ser un número entero.

Ejemplos:

{pick_by_index(("John", "Mary", 10), 0)} ➡️ "John" (elementos pasados en formato de tupla ( ), devuelve "John", ya que se encuentra en el índice 0, es el primer elemento)

{pick_by_index(["John", "Mary", 10], 1)} ➡️ "Mary" (elementos pasados en formato de lista [ ], devuelve "Mary", ya que se encuentra en el índice 1, es el segundo elemento)

{pick_by_index("texto", 3)} ➡️ "t" (único elemento pasado como string, devuelve "t", ya que si cuentas los caracteres de izquierda a derecha, empezando por 0 y terminando por 3, el resultado es t)

Índices

Los índices siempre comienzan por el número 0.

startswith()

Devuelve True si un texto dado comienza con un subtexto específico, en caso contrario devuelve False.

Argumento 1: texto que se desea verificar.

Argumento 2: subtexto que se quiere verificar si es el inicio del texto.

Ejemplo:

{startswith("esto es un string", "esto")} ➡️ True ("esto es un string" sí empieza por "esto")

endswith()

Devuelve True si un texto dado termina con un subtexto específico, en caso contrario devuelve False.

Argumento 1: texto que se desea verificar.

Argumento 2: subtexto que se quiere verificar si es el final del texto.

Ejemplo:

{endswith("esto es un string", "ing")} ➡️ True ("esto es un string" sí termina por "ing")

capitalize()

Devuelve una copia del texto con la primera letra en mayúscula y el resto en minúscula.

Argumento 1: texto a capitalizar.

Ejemplo:

{capitalize("john")} ➡️ "John"

capitalize_all()

Convierte el primer carácter de cada palabra de un texto dado en mayúscula.

Argumento 1: texto a capitalizar.

Ejemplo:

{capitalize("mi nombre es john")} ➡️ "Mi Nombre Es John"

len()

Esta función devuelve la longitud del texto proporcionado, tupla o lista proporcionado.

Argumento 1: string, lista, o tupla del cual se desea conocer la longitud.

Ejemplos:

{len("esto es un string")} ➡️ 17 (tiene una longitud de 17 caracteres)

{len(("elem1", "elem2", "elem3"))} ➡️ 3 (la tupla tiene 3 elementos)

replace()

Tiene como objetivo reemplazar todas las ocurrencias de un string específico en un texto dado.

Argumento 1: Es el string que se busca y se reemplaza en el texto.

Argumento 2: Es el string por el cual se reemplaza.

Argumento 3: Es el texto donde se encuentra la cadena a reemplazar.

Ejemplo:

{replace("soleado", "lluvioso", "Hoy es un día soleado.")} ➡️ "Hoy es un día lluvioso."

slice()

Esta función tiene como objetivo realizar un corte (slice) en un texto dado, devolviendo una porción específica del mismo.

Argumento 1: Es el texto del cual se realizará el corte.

Argumento 2: Es el índice de inicio del corte. Si se omite o se proporciona un valor `None`, se tomará el inicio del texto.

Argumento 3: Es el índice de fin del corte. Si se omite o se proporciona un valor `None`, se tomará el final del texto.

Ejemplo:

{slice("Hola Mundo", 2, 6)} ➡️ "la M"

is_inside()

Devuelve True si un elemento está presente dentro de un contenedor dado, que puede ser una tupla, una lista o un string, devuelve False si no está.

Argumento 1: Es el elemento que se busca dentro del contenedor.

Argumento 2: Es el contenedor (tupla, lista o string) en el cual se realiza la búsqueda.

Ejemplos:

{is_inside("John", ("John", "Mary", 10))} ➡️ True (busca si "John" está entre los elementos pasados en formato de tupla ( ))

{is_inside("Pablo", ["John", "Mary", 10])} ➡️ False (busca si "Pablo" está entre los elementos pasados en formato de lista [ ])

{is_inside("ex", "texto")} ➡️ True (busca si "ex" está dentro de "texto")

is_string()

Devuelve True si el argumento es una cadena de texto (string), de lo contrario, devuelve False.

Argumento 1: objeto que se desea verificar si es una cadena.

Ejemplo: {is_string("hello")} ➡️ True

is_numeric()

Devuelve True si el argumento es numérico, es decir, si puede ser convertido a un número flotante (float) sin errores. Si el argumento no es numérico devuelve False.

Argumento 1: objeto que se desea verificar si es numérico.

Ejemplos:

{is_numeric(123)} ➡️ True

{is_numeric("3.14")} ➡️ True

{is_numeric("hello")} ➡️ False

is_bool()

Devuelve True si el argumento es un booleano, es decir, si es True o False. Si el argumento no es un booleano, la función devuelve False.

Argumento 1: objeto que se desea verificar si es un booleano.

Ejemplos:

{is_bool(True)} ➡️ True

{is_bool("False")} ➡️ False ("False" está entre comillas, por lo que no es un booleano, sino un string)

to_string()

Convierte un objeto dado en su representación como cadena de texto (string).

Argumento 1: objeto que se desea convertir en un string.

Ejemplos:

{to_string(123)} ➡️ "123"

{to_string(True)} ➡️ "True"

to_number()

Convierte el objeto en un número flotante. Si la conversión es exitosa, devuelve el número resultante.

Argumento 1: objeto que se desea convertir en un número.

Ejemplo:

{to_number("3.14")} ➡️ 3.14

to_integer()

Convierte el objeto en un número entero. Si la conversión es exitosa, devuelve el número resultante.

Argumento 1: objeto que se desea convertir en un número entero.

Ejemplo:

{to_integer(3.14)} ➡️ 3

to_upper()

Devuelve un texto dado en mayúsculas.

Argumento 1: texto que se desea convertir a mayúsculas.

Ejemplo:

{to_upper("hola mundo")} ➡️ "HOLA MUNDO"

to_lower()

Devuelve un texto dado en minúsculas.

Argumento 1: texto que se desea convertir a minúsculas.

Ejemplo:

{to_lower("HOLA MUNDO")} ➡️ "hola mundo"

fix()

Ajusta el número de decimales de un número dado, se remueven los ceros al final. Retorna un valor numérico en formato de número.

Argumento 1: número del cual se desea ajustar los decimales. Puede ser un número o un string que represente un número.

Argumento 2: cantidad de decimales a la que se desea limitar el número.

Ejemplos:

{fix(3.141592653589793, 2)} ➡️ 3.14

{fix(10.124054, 4)} ➡️ 10.124

hardfix()

Ajusta el número de decimales de un número dado, se mantienen los ceros al final. Retorna un valor numérico en formato de string.

Argumento 1: número del cual se desea ajustar los decimales. Puede ser un número o un string que represente un número.

Argumento 2: cantidad de decimales a la que se desea limitar el número.

Ejemplos:

{hardfix(10.124054, 4)} ➡️ "10.1240"

{hardfix(8.31, 8)} ➡️ "8.31000000"

count()

Devuelve el número de veces que el subtexto aparece dentro del texto.

Argumento 1: texto en el cual se desea buscar el subtexto.

Argumento 2: subtexto que se desea contar dentro del texto.

Ejemplos:

{count("hello world", "o")} ➡️ 2

{count("abababab", "ab")} ➡️ 4

find()

Devuelve la posición de la primera ocurrencia del subtexto dentro del texto. Si el subtexto no se encuentra, la función devuelve None.

Argumento 1: texto es el texto en el cual se desea buscar el subtexto.

Argumento 2: subtexto que se desea encontrar dentro del texto.

Ejemplo: {find("hello world", "world")} ➡️ 6

condition()

Evalúa una condición y devuelve un valor basado en si la condición es verdadera (True) o falsa (False).

Argumento 1: condición que se evaluará. Debe ser una expresión que se pueda evaluar como verdadera o falsa.

Argumento 2: valor que se devuelve si la condición es verdadera.

Argumento 3: valor que se devuelve si la condición es falsa.

Ejemplos:

{condition(5 > 3, "Verdadero", "Falso")} ➡️ "Verdadero"

{condition(2 == 7, "es verdadero", "es falso")} ➡️ "es falso"

date_now()

Devuelve la fecha y hora actual de acuerdo con una zona horaria establecida en el bot. No acepta argumentos.

Ejemplo:

{date_now()} ➡️ "01-03-2024 00:07:48.030700"

date_utcnow()

Devuelve la fecha y hora actual de acuerdo al horario UTC. No acepta argumentos.

Ejemplo:

{date_utcnow()} ➡️ "01-03-2024 03:08:28.429305"

date_format()

Esta función formatea una fecha y hora en el formato especificado.

Argumento 1: fecha y hora que se desea formatear.

Argumento 2: formato deseado para la fecha y hora. Por defecto, es 'day-month-YEAR HOUR:minute:second.micro'.
Formatos

Utiliza YEAR para el año de 4 dígitos, o year para el año con 2 dígitos.

Utiliza HOUR para la hora de 24 horas, o hour para la hora de 12 horas.

Utiliza time para poner AM o PM.

Ejemplos:

{date_format("01-03-2024 00:07:48.030700", "day/month/YEAR")} ➡️ "01/03/2024"

{date_format("01-03-2024 00:07:48.030700", "dia day, del mes month, del año YEAR")} ➡️ "dia 01, del mes 03, del año 2024"

{date_format("01-03-2024 00:07:48.030700", "hour:minute time")} ➡️ "12:07 AM"

{date_format(date_joined, "month-year")} ➡️ "03-24" (de acuerdo a la fecha en la cual se unió al bot)

apply_time_zone()

Aplica una zona horaria del bot a una fecha y hora.

Argumento 1: fecha y hora que se desea ajustar a la zona horaria.

Ejemplo:

{apply_time_zone("01-03-2024 00:07:48.030700")} ➡️ "01-03-2024 02:07:48.030700" (asumiendo que la zona horaria del bot es +2)

time_passed()

Calcula el tiempo transcurrido desde una fecha dada hasta el momento actual, según el horario UTC.

Argumento 1: fecha de la cual se desea calcular el tiempo transcurrido.

Argumento 2 (opcional): unidad de medida del tiempo transcurrido que se desea obtener. Por defecto es 'seconds', pero también puede ser 'minutes', 'hours', o 'days'.
Otras formas de medida

minutes: minute, m

seconds: second, s

hours: hour, h

days: day, d

Ejemplo:

{time_passed("29-02-2024", "days")} ➡️ 1.02588 (asumiendo que hoy es 01-03-2014)

time_left()

Calcula el tiempo restante hasta una fecha dada desde el momento actual, según el horario UTC.

Argumento 1: fecha hasta la cual se desea calcular el tiempo restante.

Argumento 2 (opcional): unidad de medida del tiempo restante que se desea obtener. Por defecto es 'seconds', pero también puede ser 'minutes', 'hours', o 'days'.
Otras formas de medida

minutes: minute, m

seconds: second, s

hours: hour, h

days: day, d

Ejemplo:

{time_left("02-03-2024", "days")} ➡️ 0.97458 (asumiendo que hoy es 01-03-2014)

time_add()

Agrega una cantidad específica de tiempo a una fecha dada y la devuelve.

Argumento 1: fecha a la cual se desea agregar tiempo.

Argumento 2: cantidad de tiempo que se desea agregar, debe ser un número flotante.

Argumento 3: unidad de medida del tiempo que se desea agregar. Por defecto, es 'seconds', pero también puede ser 'minutes', 'hours', o 'days'.
Otras formas de medida

minutes: minute, m

seconds: second, s

hours: hour, h

days: day, d

Ejemplo:

{time_add("01-03-2024 00:07:48.030700", 30, "days")} ➡️ "31-03-2024 00:07:48.030700"

time_diff()

Calcula la diferencia de tiempo entre dos fechas dadas.

Argumento 1: primera fecha y hora.

Argumento 2: segunda fecha y hora.

Argumento 3: unidad de medida en la que se desea expresar la diferencia de tiempo. Por defecto, es 'seconds', pero también puede ser 'minutes', 'hours', o 'days'.
Otras formas de medida

minutes: minute, m

seconds: second, s

hours: hour, h

days: day, d

Ejemplos:

{time_diff("01-03-2024", "02-03-2024", "days")} ➡️ 1

{time_diff("02-03-2024", "01-03-2024", "days")} ➡️ -1

progress_bar()

Genera una barra de progreso visual basada en un porcentaje dado.

Argumento 1: porcentaje de progreso completado. Debe ser un valor numérico entre 0 y 100.

Argumento 2: longitud total de la barra de progreso. Debe ser un número entero positivo que represente la cantidad de bloques que componen la barra.

Argumento 3 (opcional): carácter que representa los bloques completados en la barra de progreso. Por defecto, es "🟩".

Argumento 4 (opcional): carácter que representa los bloques pendientes en la barra de progreso. Por defecto, es "⬜".

Ejemplos:

{progress_bar(30, 10)} ➡️ 🟩🟩🟩⬜️⬜️⬜️⬜️⬜️⬜️⬜️

{progress_bar(60, 10, "*", "-")} ➡️ ******----

urlencode()

Esta función toma una cadena (string) y codifica los caracteres especiales según las reglas de URL.

Argumento 1: string que se desea codificar.

Argumento 2 (opcional): string de caracteres que se consideran seguros y no se codificarán. Por defecto, incluye los caracteres ":/&=?".

Ejemplo:

{urlencode("https://www.example.com/search?q=visualmaker bot creator")} ➡️ "https://www.example.com/search?q=visualmaker%20bot%20creator"

urldecode()

Esta función toma una cadena (string) codificada en URL y la decodifica según las reglas de URL.

Argumento 1: string codificada en URL que se desea decodificar.

Argumento 2 (opcional): esquema de codificación utilizado para decodificar la cadena. Por defecto, es 'utf-8'.

Ejemplo:

{urlencode("https://www.example.com/search?q=visualmaker%20bot%20creator")} ➡️ "https://www.example.com/search?q=visualmaker bot creator"

loop()

Utiliza esta función para representar cursores como ref_list (listado de referidos de un usuario) y bot_top_ref (listado de los usuarios con más referidos del bot), y otros datos, en el formato deseado. Esta función consume 3 ejecuciones con su uso.

Argumento 1: data, el cursor o los datos que se desean representar.

Argumento 2: text, una cadena de texto en el formato deseado para la representación.

Argumento 3 (opcional): page, un número entero que indica la página desde la cual comenzar. Por defecto, es 0 (la primera página).

Argumento 4 (opcional): max_per_page, un número entero que indica el máximo de elementos a representar por página. Por defecto, es 10 para cursores y 50 para otros tipos de datos.

Argumento 5 (opcional): values, una tupla de cadenas de texto que ayudan a mejorar la representación del texto.
Información

Puedes acceder a los detalles de cada usuario o elemento a través de item.<variable_primitiva>, vea las variables primitivas aquí.

Lo que verás en los ejemplos como \n, significa nueva línea, es para representar al siguiente usuario debajo.

Ejemplos:

{loop(ref_list, '{item.first_name}\n', page=0)}: devolverá un listado mostrando el nombre de los últimos 10 referidos del usuario que ejecutó la función, uno debajo del otro, empezando por la primera pagina.

{loop(ref_list, '{item.first_name}\n', page=1)}: devolverá un listado mostrando el nombre de los últimos 10 referidos del usuario que ejecutó la función, uno debajo del otro, pero ahora será la segunda página.

{loop(ref_list, '@{item.username}\n', max_per_page=3)}: devolverá un listado mostrando el nombre de usuario de los últimos 3 referidos del usuario que ejecutó la función, uno debajo del otro.

{loop(bot_top_ref, '{} {item.first_name} ({item.id})\n', max_per_page=3, values=('1️⃣', '2️⃣', '3️⃣'))}: devolverá un listado mostrando el nombre y el ID entre paréntesis de los 3 usuarios con más referidos en el bot, además se formatea para darle un aspecto mas atractivo, mostrará algo como lo siguiente...

1️⃣ John (1234567)

2️⃣ Mary (2345678)

3️⃣ Pedro (3456789)

filter()

Esta función filtra los elementos de una lista o diccionario basándose en una condición especificada.

Argumento 1: condición que se evaluará para cada elemento del iterable. La condición debe ser una cadena de texto (string).

Argumento 2: lista o diccionario del cual se desean filtrar los elementos. Si es un diccionario, se utilizarán los valores del diccionario para la evaluación de la condición.

Ejemplos:

{filter('x > 5', [3, 7, 2, 9, 6, 1, 8])} ➡️ [7, 9, 6, 8]: devuelve una lista con los elementos mayores que 5.

{filter("x % 2 == 0", [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])} ➡️ [2, 4, 6, 8, 10]: devuelve una lista con todos los números pares.

{filter('len(x) > 5', ['apple', 'banana', 'orange', 'strawberry', 'grape'])} ➡️ ['banana', 'orange', 'strawberry']: lista con los elementos que tienen más de 5 caracteres.

{filter('x.edad > 25', {'Alice': {'edad': 30, 'genero': 'F'}, 'Bob': {'edad': 22, 'genero': 'M'}, 'Charlie': {'edad': 35, 'genero': 'M'}})} ➡️ [{'edad': 30, 'genero': 'F'}, {'edad': 35, 'genero': 'M'}]: filtrar un diccionario de personas para obtener las que tienen más de 25 años.

{filter('x.estado == True', {'123': {'nombre': 'John', 'estado': True}, '456': {'nombre': 'Mary', 'estado': False}, '789': {'nombre': 'Pedro', 'estado': True}})} ➡️ [{'nombre': 'John', 'estado': True}, {'nombre': 'Pedro', 'estado': True}]: devuelve una lista con todos los diccionarios que tienen estado como True.

reduce()

Esta función reduce los elementos de una lista o diccionario a un solo valor basado en una condición específica.

Argumento 1: condición que define cómo se va a reducir el iterable. La condición debe ser una cadena de texto (string).

Argumento 2: lista o diccionario que se va a reducir.

Ejemplos:

{reduce('x + y', [1, 2, 3, 4, 5])} ➡️ 15: devuelve la suma de todos los elementos de la lista.

{reduce('x + y', ['hello', ' ', 'world', '!'])} ➡️ "hello world!": reducir una lista de cadenas a su concatenación.

{reduce('max(x, y)', {'Alice': 25, 'Bob': 35, 'Charlie': 30})} ➡️ 35: 35 es la edad máxima.

{reduce('condition(x.estado == True, x, y)', {'123': {'nombre': 'John', 'estado': False}, '456': {'nombre': 'Mary', 'estado': True}})} ➡️ {'nombre': 'Mary', 'estado': True}: devuelve el diccionario que tiene estado como True.