martes, 16 de mayo de 2017

Bot de Telegram!

Empecé a crear un bot de telegram más bien por curiosidad ya que su utilidad no creo que le valga a mucha gente XD. En esta entrada anoto algunas pautas y links para la creación de bots usando python.



El bot en principio permite utilizar los comandos /cs y /hots para enviar un mensaje con mentions (x.ej: @pepito) al grupo en que se encuentra. La finalidad es que los usuarios mencionados reciban una notificación aunque tengan el grupo silenciado. En mi grupo de colegas se suelen hacer estas menciones para convocar partida a algún juego, de ahí que se hayan implementado estas llamadas directamente con mensaje para 2 videojuegos diferentes.

El bot permite a los usuarios unirse o salirse de las menciones usando, por ejemplo: /joincs y /leavecs. Funciona incluso con usuarios que NO tienen activo un @alias para las menciones.

Se utiliza Mongo para guardar los grupos de usuarios que quieren ser mencionados. Las colecciones creadas en la base de datos van referidas al grupo de telegram en el que reside el bot, y su creación es automática cuando se une algún usuario.

Me gustaría implementar la creación de calls con /nombre personalizado por parte de los usuarios de cada grupo de telegram, así como temporizar las mentions, elegir los mensajes y más cositas. Pero esto será dentro de unas semanas.

Por el momento, anoto algunas pautas para la creación de bots:

Creación

Conviene empezar por crear un nuevo bot en telegram:
https://core.telegram.org/bots#botfather

La forma de interactuar con telegram será a través de api y, en la creación del bot en este paso, habremos recibido un token que tendremos que usar en nuestras peticiones.

Extra (apis)

Para saber los métodos implementados y sus parámetros, tendremos que consultar la documentación de la api oficial de bots de telegram (enlace al final del párrafo). Esto nos sirve para saber cómo hay que preguntarle las cosas a la api. Hay buenos ejemplos de cantidad de llamadas:
https://core.telegram.org/bots/api

Una forma rápida de probar estas llamadas es utilizar directamente el navegador, o una aplicación como Postman, que facilita mucho la construcción de llamadas "a mano" al desglosar los parámetros, vemos un ejemplo en Postman de llamada a la api de steam, donde arriba tenemos la URL, seguida por los parámetros que la forman, claramente separados uno a uno por clave y valor, y abajo el resultado devuelto en formato Json.



Python, libs y apis

Para nuestra aplicación he utilizado 2 apis diferentes.

La api oficial la utilizamos a través de esta librería de python (python-telegram-bot), esta librería tiene algunas funciones que nos facilitarán interactuar con la api y gracias a ella será sencillo implementar nuestro programa, interesa ver los ejemplos del enlace:
https://github.com/python-telegram-bot/python-telegram-bot

Podemos hacer gran catidad de cosas con ésta librería que utiliza por defecto la api oficial y seguramente resulta suficiente para muchas aplicaciones.

Sin embargo, la api oficial tiene ciertas limitaciones y estas son cubiertas por otra api no-oficial, que puede hacer prácticamente todo lo que puede hacer un usuario real que interactúa directamente con el chat. En nuestro caso, lo que NO puede hacer la api oficial es referenciar un nombre/texto a un determinado usuario, crear un link. Es posible llamar a usuarios que tienen un username escribiendo simplemente @alias, pero cuando éstos no tienen un alias elegido, no podemos mencionarlos mediante la api oficial, mientras que utilizando telegram como usuarios, sabemos que sí podemos mencionarlos ya que se genera un enlace al usuario al escribir su nombre o el nombre con el que tenemos guardado el contacto. La API de pwrtelegram permite hacer esto y mucho más.

La api NO-oficial:
https://pwrtelegram.xyz

Por no rehacer, he mantenido llamadas a ambas, de hecho, a la API no-oficial solamente la llamamos para enviar mensajes que contengan "mentions" a usuarios, y se está usando totalmente a pelo, es decir, se construye la url concatenando strings y se hace get usando la librería requests.

Ejemplo

(habrá que introducir el token nuestro que nos hayan dado al crear el bot!)
Ejemplo para el siguiente método que escribe el mensaje 'HEY YOU' con link al usuario con ID 101374607 en el chat con ID 98123871 (estos datos de IDs se deben haber obtenido previamente, si has echado un ojo a los ejemplos de la librería python-telegram-bit, seguro que sabes como obtener estos datos!) :


Url construida del ejemplo (método sendmessage cuyos parámetros son: char_id, text, parse_mode y mtproto):
https://api.pwrtelegram.xyz/bot39518XXXX:xxxxXXxAQUITUTOKENXxxxXxXxxxxXxxxxx/sendmessage?chat_id=98123871&text=<a href="mention:101374607">HEY YOU</a>&parse_mode=HTML&mtproto=true

Tras ejecutarse el bot mandará el mensaje al chat, el mensaje (HEY YOU) se podrá clickar y accederíamos al perfil del usuario con el ID de la mention (recibiría notificación con éste mensaje).



Recursos

La documentación de la api oficial resulta algo liosa, y he encontrado mucho más útil los consejos y publicaciones del canal de telegram de pwrtelegram directamente. Buscad el canal en telegram como @pwrtelegram y, por otro lado, un canal para uso de los bots de telegram con python:
https://t.me/pythontelegrambotgroup

Estos 2 canales, junto con la información de la librería python-telegram-bot, han resultado serme de mucha utilidad.


Mi bot

Para acabar...
En telegram se puede encontrar mi bot buscando @uborzbot
Dejo link al código: Link a git!

jueves, 11 de mayo de 2017

Imprimiendo objetos de videojuegos

 

Intro

 

Vamos a tratar de extraer modelos de items o personajes de videojuegos, convertirlos a un formato de objeto imprimible y crearlos en la realidad.


Antes de usar el blog como cajón sin fondo, solía hacer documentos de texto con anotaciones sobre las cosas, lo que pasa que siempre se acaban perdiendo :(. Copypasteo y completo las notas sobre los pasos a seguir y los enlaces. Tengo que decir que ando desconectado de éste mundillo de hace un buen puñado de meses y seguro que ahora mismo tendremos herramientas mejores a las mencionadas. En cualquier caso, lo guardo por si pudiese resultar de interés.

 El proceso se puede separar en 2 partes.
  • Extracción del fichero del videojuego: Puede ser necesario extraer y decompilar contenido del videojuego.
  • Conversión del archivo a cuerpo sólido. 
Nota: En mi caso, he creado una máscara de un personaje de Dota 2. Hay que tener en cuenta que la extracción/decompilación es un proceso para un determinado juego o motor concreto. Aunque recojo los pasos seguidos para extraer y decompilar, ésto valdría solamente para juegos de source y seguramente no funcione para Dota tras las actualizaciones al motor gráfico.

 

Extracción (Específica para juego/motor)

 

Ésta puede ser la parte más compleja, porque las herramientas a utilizar dependerán del juego, afortunadamente hay tutoriales para importar modelos de muchísimos juegos. Mis pruebas las he realizado con Dota 2, para ello he seguido la primera parte de ésta guía, no es necesario seguirla entera porque está obsoleta, para el caso de Dota 2 los formatos de los ficheros han cambiado el último año por causa de la actualización del motor gráfico.

Vamos a extraer en primer lugar los archivos .vpk (Valve PAK) para ello se utiliza GFCScape. Tras bajarlo e instalarlo, lo abrimos y a través de File -> Open, buscamos en "nuestra instalación de Steam\steamapps\common\dota 2 beta\game\dota" el fichero “pak01_dir.vpk” y lo abrimos, tras ello, aparecerá un árbol en el menú de la izquierda, click derecho en "root" y pulsamos Extract, elegimos un directorio y comenzamos, llevará unos minutos.


Descompilación (Específica)

 

Con el paso anterior obtendríamos archivos de 3 tipos diferentes en la carpeta de "models", los que nos interesan a nosotros son los .MDL, que tedremos que descompilarlos a un formato que nuestros software de diseño pueda interpretar. Para ello utilizaremos StudioCompiler, que necesita de un SDK para obtener los ficheros SMD, usaremos el de Alien Swarm, en Steam, Library -> Tools, podemos encontrarlo.



* En la página de Cannonfodder podemos encontrar otros compiladores para juegos de Valve.

Tras lanzar StudioCompiler, vamos a la pestaña Model Decompile, y definimos el directorio del SDK en el botón de Configure. Tras eso, simplemente rellenar los campos del fichero model y del directorio de output.






Se generará un fichero SMD.

Creación del fichero STL

 

3DSMax

Buscamos conseguir un precioso fichero STL para poder laminarlo e imprimirlo. En este caso tenemos de partida un SMD de valve, se usa 3DS Max para importarlo y poder generar (exportar) un STL. 3DSMax tiene plugins para importar casi cualquier cosa que le eches...

Una característica de los objetos creados para videojuegos es que no tienen "cuerpo", son solamente superficies y no suelen conformar un "objeto" cerrado, es como el envoltorio de un caramelo, una lámina sin grosor ninguno. 3DSMax nos permite coger esta lámina y "extruirla", darle cuerpo, para ello nos resulta muy útil la función "Shell", que "tira" de cada cara de la figura en una dirección perpendicular a ella. Link!


Podría ser que nuestra figura quede con pequeños extraños en las intersecciones de las nuevas caras resultado del Shell. Haciendo que haya "agujeros" entre caras que hacen que la pieza no quede completamente cerrada como una figura con cuerpo, por lo que estaríamos en una situación parecida a la anterior.

 

Modelrepair

Una herramienta que puede resultar útil para corregir ésto es:
https://modelrepair.azurewebsites.net/


Netfabb

Ésta es la herramienta que siempre he utilizado para "partir" modelos de piezas grandes en piezas más pequeñas.

Otra cosa que ofrece Netfabb es que también puede fixear los agujeros de la figura. Sería con las funciones Extras -> Repair. Hace más de un año que no lo utilizo y estoy viendo que ahora es parte de autodesk, seguramente será capaz de muchas más cosas.


Resultado

 

Tras imprimir todas las piezas en PLA, se ensamblaron con termofusible, poniendo algunos refuerzos de piezas desechadas o material de soporte por dentro en las uniones. Los agujeros de los ojos se hicieron a mano utilizando una Versatip de Dremel, como cortar mantequilla, por cierto... Las uniones de las piezas en la cara exterior se rellena con masilla/plaste. Un par de manos de lija + pintura y lista. A esta máscara le metí una tira de leds con una arduino que los hace ir cambiando lentamente entre colores que me molan, pero eso quizás para otra entrada, que esto tiene que acabar en algún momento.

Dejo enlace a la máscara en Thingiverse por si alguien la quiere imprimir: Link! 

El resultado se puede ver en la primera foto! Y aquí va una de su conversión en lamparita:



Links a cholón

 

https://www.autodesk.com/education/free-software/3ds-max
https://www.autodesk.com/education/free-software/netfabb
https://web.archive.org/web/20130630101519/http://wyksblog.com/getting-started-dota-2-cosmetics
https://modelrepair.azurewebsites.net/
https://developer.valvesoftware.com/wiki/3DS_Max
http://www.chaosincarnate.net/cannonfodder/cftools.php 
http://www.thingiverse.com/thing:952560