]> git.jsancho.org Git - blog.git/commitdiff
Midgaard Bot post (uncomplete)
authorJavier Sancho <jsf@jsancho.org>
Wed, 27 Dec 2017 18:54:07 +0000 (19:54 +0100)
committerJavier Sancho <jsf@jsancho.org>
Wed, 27 Dec 2017 18:54:07 +0000 (19:54 +0100)
posts/20171227-midgaard_bot.html [new file with mode: 0644]

diff --git a/posts/20171227-midgaard_bot.html b/posts/20171227-midgaard_bot.html
new file mode 100644 (file)
index 0000000..8307d2e
--- /dev/null
@@ -0,0 +1,26 @@
+title: Midgaard Bot, conneting to a MUD with Telegram
+date: 2017-12-27 11:51
+---
+<div>
+  <p>A colleague of mine, Vlad Nicu, is developing a Telegram bot to offer information about cryptocurrencies (price, etc). After talking with him, I had the idea of writing a bot to connect to a MUD (Multi User Dungeon) using Telegram. When I was young, I spent a long time playing with this type of online games and I thought it'd be fun to develop something similar.</p>
+
+  <p>I decided to use Golang to practice a little with this language and its goroutines. I think it has a lot of things that could be improved, but, undoubtedly, concurrency is its strongest feature. From my point of view, sometimes people abuse of channels and goroutines. I have seen a lot of examples of problems that could be resolved only with function calls, without all the goroutines system.</p>
+
+  <p>The <a href="https://git.jsancho.org/?p=midgaard_bot.git;a=summary">source code of midgaard_bot</a> is available under GPLv3 license.</p>
+
+  <p>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.</p>
+
+  <p>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.</p>
+
+  <p>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.</p>
+
+  <p>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.</p>
+
+  <p>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.</p>
+
+  <p>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.</p>
+
+  <p>Cosas curiosas que tiene la concurrencia usando estos mecanismos.</p>
+
+  <p>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.</p>
+</div>