From: Javier Sancho Date: Wed, 27 Dec 2017 11:43:40 +0000 (+0100) Subject: Midgaard Bot post X-Git-Url: https://git.jsancho.org/?a=commitdiff_plain;h=dabb43901b6ab4f62df27e6890806b6d638f24f5;p=blog.git Midgaard Bot post --- diff --git a/posts/20171227-midgaard_bot.html b/posts/20171227-midgaard_bot.html new file mode 100644 index 0000000..8cab6c8 --- /dev/null +++ b/posts/20171227-midgaard_bot.html @@ -0,0 +1,26 @@ +title: Midgaard Bot, conectando a un MUD con Telegram +date: 2017-12-27 11:51 +--- +
+

Un compañero de trabajo, Vlad Nicu, está desarrollando un bot de Telegram para ofrecer información sobre criptomonedas (precio, etc). Tras hablar con él me entró el gusanillo de escribir un bot para conectar con un MUD (Multi User Dungeon) usando Telegram. Cuando era joven estuve mucho tiempo enganchado a este tipo de juegos online y me pareció divertido desarrollar algo del estilo.

+ +

Puestos a probar cosas decidí usar Golang y así practicar un poco con este lenguaje y sus gorrutinas. Como lenguaje, pienso que tiene muchas cosas que se podrían mejorar. En cuanto a la concurrencia nada que objetar, por supuesto. Es el punto fuerte de Go y se nota. Sí que es cierto que da la impresión de que la gente abusa de los canales y de las gorrutinas. He visto muchos ejemplos cuando me documentaba de problemas que se podrían haber resuelto simplemente con llamadas a funciones, sin usar tanta parafernalia.

+ +

El código fuente de midgaard_bot está disponible bajo licencia GPLv3.

+ +

Cuando el bot arranca, lanza una gorrutina que se queda escuchando los mensajes que le llegan desde Telegram. Cuando llega un mensaje comprueba si tiene una sesión abierta para el chat desde el que llega el mensaje. Lo normal es que cuando se trate del primer mensaje del chat no tenga sesión.

+ +

En el caso de no tener sesión, el bot lanza una nueva gorrutina para conectar por telnet al MUD y servir de conector entre Telegram y el juego.

+ +

Para controlar en qué momento la conexión telnet ha acabado de mandar un mensaje completo, y por lo tanto poder mandarlo a Telegram para que lo reciba el jugador, tuve que implementar un buffer que recogiera los datos que iban llegando desde el MUD y usar un timeout de 500 milisegundos, tras el cual se entiende que el mensaje está completo y se puede mandar. No es ninguna maravilla pero para conexiones locales funciona bien.

+ +

Cuando ya tenemos el mensaje completo lo mandamos a una gorrutina específica que se encarga de recibir mensajes desde las sesiones abiertas y los reenvía a Telegram.

+ +

Durante el desarrollo me ocurrió una cosa graciosa que me tuvo en jaque un buen rato y que te hace pensar en cómo funcionan en realidad las gorrutinas. La gorrutina que controla la sesión escribía un mensaje en un canal y se quedaba colgada. El problema estaba que aún no había implementado la otra parte del programa que leía de ese canal y los canales de Go son bloqueantes.

+ +

Al pensar en los canales yo tenía una idea de ellos similar a los mensajes de Erlang, que tienes un proceso que manda mensajes de forma asíncrona y y la ejecución sigue de forma independiente. Pero en Golang no es así, los canales no son "tuberías", son puntos de unión entre gorrutinas. Si escribes un mensaje en un canal, te quedas bloqueado hasta que otra gorrutina lee ese canal y libera a la gorrutina que ha escrito ese mensaje.

+ +

Cosas curiosas que tiene la concurrencia usando estos mecanismos.

+ +

Midgaard Bot está sin acabar y no creo que continue con su desarrollo, ya que mi objetivo era ver si podía conectar con el MUD a través de Telegram y eso ya está conseguido. Pero si alguien quiere seguir, en el repositorio están todas las bases para hacerlo crecer.

+