Telegram bots en golang (III)

¡Nómadas! ¿Con ganas de hacer la primera versión de nuestro Bot?

Recordaros que si habéis llegado aquí y echáis en falta los post anteriores podéis encontrarlos en:

En entradas anteriores vimos que es Telegram y sus Bots y también como se estructura un proyecto en Golang y probamos el ejemplo que nos ofrecen en la librería que usamos para programar los Bots.

En esta tercera entrada vamos a cambiar el código de necesario del ejemplo y así, cambiar la funcionalidad del bot.

La calculadora Bot

Desde Cibernómadas vamos a implementar una calculadora básica. Pero vosotros podéis implementar lo que tengáis en mente.

Para recordar el punto donde nos quedamos veamos el siguiente código:

Tenemos que implementar la calculadora entre las líneas de la 29 a la 36. Pero primero deberemos de saber como funcionan los comandos en Telegram.

Podríamos definir los comandos como mensajes especiales que son interpretados por el Bot. Estos mensajes empiezan con / y les segue el comando. Opcionalmente pueden llevar parámentos, por ejemplo, /suma 1 2.

Funcionalidad básica

Lo segundo que tenemos que tener en mente y deberemos de pensar, es que funcionalidades debe tener la calculado. Desde Cibernómadas vamos a implementar las cuatro operaciones básicas, suma, resta, multiplicación y división.

Suma: La suma la definiremos con el comando /suma. Además recibirá dos parámetros, los números a sumar.

Resta: La resta seguirá una dinámica parecida a la suma. En este caso el comando será /resta.

Multiplicación: La multiplicación también tendrá dos parámetros de entrada y el comando será /mult.

División: Por último la división. Usaremos el comando /div junto con los dos parámetros.

Te puede interesar  Go con Gin, el mega tutorial (IV)

En algunos comandos habrá que tener en cuenta los valores que se proporcionan, por ejemplo no será posible dividir un número por cero.

También es muy interesante definir el comando /start pues es el primer comando que se manda de forma automática cuando un usuario inicia el bot. Como resultado del comando /start mostraremos un mensaje indicando el funcionamiento de la calculadora.

Programación de la calculadora

Repasando los comentado anteriormente, necesitamos comprobar comandos y para ello la librería nos ofrece el método IsCommand(). Este método se aplicaría sobre el mensaje recibido para comprobar si es un comando o no, y en caso de serlo procesarlo. Por lo que todo el código que implementa la calculadora quedara dentro del bloque if del método IsCommand().

Como también hemos comentado los comandos deberán tener los operandos para poder realizar la operación correctamente. Éstos serán argumentos al comando proporcionado. Por suerte la librería nos sigue ofreciendo un método para el tipo Message que comprueba y devuelve los argumentos de un comando. El método en concreto es: CommandArguments().

El problema viene que el método CommandArguments() devuelve un string o cadena del texto que hay justo después del comando. Por ejemplo, para el comando /suma 123 123 obtendremos una cadena «123 123». Por lo que para sumar ambos números deberemos hacer varias operaciones y comprobaciones.

Antes de continuar hay que plantear los casos extremos como: qué ocurre si introducimos más de un espacio entre los operandos o por el contrario, qué ocurre si solo se proporciona un operando. ¿O si no se proporciona ninguno? Para estos casos debemos pensar que hacer. Lo habitual es normalizar la entrada del usuario, si no se puede normalizar entonces, lo recomendable sería avisar al usuario que los datos proporcionados no son correctos.

Te puede interesar  Go con Gin, el mega tutorial (III)

Con lo anterior en mente  organizamos el código y preparar un algoritmo para extraer los operandos de la cadena devuelta del método CommandArguments().

Algoritmo

La idea eque vamos a usar es la siguiente:

  1. Obtener el argumento del comando.
  2. Sanear el argumento para que se ajuste a nuestro formato. «operandoA operandoB».
  3. Separar los operandos por el espacio central y obtener una lista de dos operandos.
  4. Validar los argumentos.
  5. Realizar la operación oportuna.
  6. Devolver los resultados al usuario

Los puntos 2 y 3 los podemos completar la siguiente función:

En la línea 2 compilamos una expresión regular, así comprobaremos el formato reemplazando los posibles espacios centrales por uno único. De este modo saneamos la entra, tal como hemos comentado antes. En la línea 3 es donde realmente se hace el saneamiento de la entrada y en la línea 4 partimos la entrada por en espacio central.

Hay que remarcar que haciendo la limpieza de los argumentos de este modo normalizados cualquier número de operandos a un único espacio entre ellos. Esto puede ser útil si más tarde queremos permitir más operandos en un único comando.

Normalizar la entrada

El punto 1 es tan sencillo como añadir una llamada a la función normalizaCadena con el resultado de llamar a CommandArguments.

Como podéis ver el último caso, para el comando start, no procesamos los argumentos, pues solo responderemos con un mensaje indicando como usar la calculadora. Pero esto lo implementaremos al final.

Ahora mismo ya tenemos en la variable args los arguments en formato lista proporcionados por el usuario. Éstos pueden ser cualquier valor que el usuario quiera usar, por ejemplo números, que será lo habitual, pero también pueden introducir letras o símbolos extraños que no podremos operar. Así que habrá que hacer varias comprobaciones. Esto se corresponde con el punto 4.

Te puede interesar  Telegram bots en golang

Validar argumentos

La validación la realizamos en dos partes y por qué esto, pues muy sencillo, como Go es un lenguaje de tipado fuerte no podemos reutilizar las variables para cuando un operando sea entero o flotante. Así que las funciones que validan los operandos son las siguientes:

No voy a explicar cada línea porque se hará muy pesado, pero resumiendo, la validación se hace del siguiente modo:

  1. Se comprueba si el número de argumentos es igual a 2.
  2. Se intenta convertir la cadena en un número entero.
  3. Si no puede ser, se intenta convertir la cadena a número flotante.
  4. En caso de producirse un error se devuelve un error para notificar al usuario.
  5. En caso de que vaya todo bien, devolvemos los dos operandos.

Resultado

Ahora solo nos quedaría, a falta de una comprobación, realizar las operaciones según el comando. ¿Y qué comprobación nos queda por realizar? Bien, ¿Qué ocurre cuando se divide un entero por cero? Pues que da un valor indeterminado y no podemos resolverlo, así que no vamos a permitir dividir por cero.

 

 

Comando start

Dividir Multiplicación Comando suma con flotantesComando resta

A continuación disponéis de código completo para que podáis hacer vuestras pruebas, modificarlo y aprender con él.

Con esto nos despedimos, pero no si daros «deberes» e introducir el siguiente post sobre Bots en Telegram. Como «deberes» os proponemos ampliar el número de argumentos que pueda recibir un comando. Por otra parte, decir que la versión que hemos desarrollado no es la más optima, así que os esperamos en la siguiente entrada de Bots de Telegram.

Un saludo.

Telegram bots en golang (III)
Etiquetado en:         

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *