HERO, telegram bot, Rotaciones

HERO, telegram bot, Rotaciones

#Rotaciones Como vimos en el artículo anterior, las rotaciones son forma de que un grupo de heros alternan sus guardias. De forma que no siempre uno es el que esté de guardia (salvo que sea el único empleado) y que el resto de heros o personal de informática pueden realizar sus tareas sin la preocupación de que lo van a interrumpir. Con el bot el resto de empleados no tiene que saber quien esta de guardia esta semana, de forma que quien realmente sabe quién está de guardia es el bot, así que sabe a quién notificar.

Almacenando y recuperando heros

Para poder tener nuestra lista de heros necesitamos una base de datos para poder consultar y realizar las rotaciones. Por lo que te necesitaras tener mysql instalado, de forma que conectemos la base de datos y almacenemos esta información.

Los datos de coneccion de la base de datos

crearemos un archivo que no brinde la posibilidad de conectarnos con la base de datos, luego lo importaremos a nuestro programa principal para poder hacer consultas a la base de datos.

const mysql = require('mysql');
const util = require('util');

const POOL = mysql.createPool({
        "host"  :   "localhost",
        "user"  :   "usuario",
        "password"  :   "contraseña",
        "database"  :   "hero"
});

POOL.getConnection((err, conn)=>{
    if(err){
        if(err.code === 'PROTOCOL_CONNECTION_LOST'){
            console.error("LA CONECCION CON LA BASE DE DATOS FUE CERRADA!!");
        }
        if(err.code === 'ER_COUNT_ERROR'){
            console.error("");
        }
        if(err.code === 'ECONNREFUSED'){
            console.error("LA CONECCION CON LA BASE DE DATOS FUE RECHAZADA");
        }
    }
    if(conn){
        conn.release();
        console.log('la base de datos fue conectada!!');
        return;
    }
});

//ahora las cueris pueden usar promesas
POOL.query = util.promisify(POOL.query);

module.exports = POOL;

la base de datos hero contendrá una tabla la cual contendrá dos valores el chat_id y el nombre del usuario. te dejo un sql donde se crear estas estructuras.

Registrando heros

Para registrar el chat_id del hero, para poder contactar con el vamos a crear un comando para registrar el chat de dicho usuario, de forma que podamos contactar con el ante un incidente.

const { Telegraf } = require('telegraf');
const configuracion = require('../configuracion.json');
const bot = new Telegraf(configuracion.telegram);

const database = require('./database');

//comando de registro
bot.command('registrar', (ctx)=>{
    if(ctx.chat.type == "private"){
        //es un chat privado vamos a proceder a registrar este usuario
        let chatId = ctx.chat.id;
        let nombre = ctx.chat.username;
        database.query('INSERT INTO `hero` (`nombre`, `chat_id`) VALUES (?, ?)',[nombre, chatId], (error, results)=>{
            if (error){
                console.log(error);
                ctx.reply("Usted ya esta registrado como un hero!!");
            } else ctx.reply("Se ha registrado como hero!!");
        });
    }
});

bot.launch();

De esta manera obtenemos el chat_id, y el nombre del usuario, ademas de que el usuario se tiene que contactar con el bot por privado, ya que es necesario que no sea un grupo (según mi forma de plantearlo).

Notificando al hero, ante un incidente

Ahora tenemos que que ante una petición contactar con los heros. Para esto tenemos que definir las rotaciones la forma mas cómoda es hacer una consulta a la base de datos obteniendo todos los heros, luego obtener el numero de la semana, y sacar el modulo de la cantidad de heros que hay. indiceHero = numeroDeSemana % cantidadDeHero De esta manera por ejemplo si hay 2 heros, las semanas pares se las queda el primer hero y las impares el segundo, de esta manera se van rotando las guardias. Para esto uso el modulo de node moment, el cual tiene una función para obtener el numero de la semana. Usando el modulo de telegraf mandamos un mensaje privado con la promesa bot.telegram.sendMessage(id_chat, mensaje) de forma que mandamos un mensaje al chat_id registrado del hero. Modificando el codigo de hero anterior:

//llamamos los modulos de telegraf, octonode y moment
var github = require('octonode');
const { Telegraf } = require('telegraf')
var moment = require('moment'); // require

moment().format(); 

const configuracion = require('../configuracion.json');
const bot = new Telegraf(configuracion.telegram);

const database = require('./database');

//instanciamos el repositorio donde realizaremos los issues
const client = github.client(configuracion.github);
var repo = client.repo('francoZuniga32/hero-bot');

bot.command('hero', (ctx)=>{
    //este comando sirve para contactar al hero
    var reply = "El comando ingresado no esta completo \n el formato es: /hero -u usuario-github -t titulo -m mensaje";
    var mensaje = ctx.message.text;
    var comandosSeparados = mensaje.split('-');

    if(comandosSeparados.length >= 4){
        var user = comandosSeparados[1].slice(2);
        var titulo = comandosSeparados[2].slice(2);
        var body = comandosSeparados[3].slice(2);
        console.log(titulo);
        //creamos el issue
        repo.createIssue({
            owner: user,
            title: titulo,
            body: body
        }, (ctx)=>{
            console.log(ctx);
        });
        //contactamos al hero de la semana
        database.query("SELECT * FROM hero", (err, heros)=>{
            if(err) console.log(err);
            else{
                console.log(heros);
                if(heros.length > 0) {
                    let indiceHero = moment().week() % heros.length;
                    bot.telegram.sendMessage(heros[indiceHero].chat_id, "Se registro un incidente !!").then((result) => {
                        console.log(result);
                    }).catch((err) => {
                    console.log(err);
                    });
                }else{
                    ctx.reply("no hay heros registrados");
                }
                console.log(ctx.chat);
            }
        });
        reply = "casdasd";
    }
    ctx.reply(reply);
});

bot.launch();

Conclusiones

De esta manera vamos a poder contactar con el hero en cuestión cuando alguien ejecute un /hero sin que el programador, gerente o product owner tengan que saber quien esta de guardia, molestando a todo el equipo de desarrollo, y dejando que el problema se resuelva a medias (o no se resuelva), De esta menera solo nos queda:

  • Notificar a un hero de que es su guardia esta semana.
  • Intercambiar cardias entre heros, por lo que necesitamos un grupo de telegram que sea el hero-command.
  • Mejorar la interfaz de el bot (comando de registro, hero, y rotaciones, agregando mejoras a los usuarios).

Con esto dejo un link en github para poder seguir este proyecto. github.com/francoZuniga32/hero-bot.


Espero que este post te sea de ayuda, puedas apoyarme invitándome un cafe , o puedes seguirme en instagram y ver mi dia como programador, y estudiante.

GitHub followers Instagram cafesito