Bots de conversa de Telegram amb Google Apps Script

Bots de conversa Exemples Dades pràctiques   Recursos CITCEA
Google Apps Script Projectes Interacció   Inici

Rita

Es tracta de què l'alumne pugui escollir una assignatura de les proposades i, a partir d'aquí, comenci a fer una sèrie d'exercicis organitzats aleatòriament que hagin estat preparats prèviament pel professor.

El professor ha d'escriure a un full de càlcul una llista amb els noms d'usuari dels alumnes que podran accedir al bot de Rita, és a dir, a treballar a la seva assignatura. A un full de càlcul diferent, haurà de preparar una llista d'operacions, problemes o preguntes amb les seves respectives solucions correctes i un conjunt d'opcions incorrectes. Aquestes últimes són necessàries per mostrar a l'alumne com a opció d'elecció de resposta.

El programa de l'script és el següent:

var token = "^^53920153:AAEVdYx2WnugBaDB9Y4jNt6IRvH_9Ij2MgU"; // API Token de Telegram 
var telegramUrl = "https://api.telegram.org/bot" + token;  // Url que comunica el nostre bot amb Telegram 
var webAppUrl = "https://script.google.com/macros/s/^^fycbwA7Pk2IuLG7T9l-dbje2Ush3UdC8icF0WWQVDkVqf5GT4AN1gkvmyyiPQEm1ojOlII/exec";
function setWebhook(){
  var url = telegramUrl + "/setWebhook?url=" + webAppUrl;
  var response = UrlFetchApp.fetch(url);
}
var IdFull = "^^g8FhFHS-jaedX_BPPwaVyTtYOJdhA5NdlogKx_DOIA";
var num_ex = 0;
var correcte = 0;
var opcio = 0;
// Funció que envia un text a Telegram
function sendText(chatId,text_env){  
  var cont = {
    method: "post",
    payload: {
      method: "sendMessage",
      chat_id: String(chatId),
      text: text_env,
      parse_mode: "HTML"
    }
  }
  UrlFetchApp.fetch(telegramUrl + '/', cont);
}
function sendText_tecles(chatId,text_env,keyBoard){  // Funció que envia un text o un teclat a Telegram 
  keyBoard = keyBoard || 0;
  if(keyBoard.inline_keyboard || keyBoard.keyboard){
    var data = {
      method: "post",
      payload: {
        method: "sendMessage",
        chat_id: String(chatId),
        text: text_env,
        parse_mode: "HTML",
        reply_markup: JSON.stringify(keyBoard)
      }
    }
  } else {
    var data = {
      method: "post",
      payload: {
        method: "sendMessage",
        chat_id: String(chatId),
        text: text_env,
        parse_mode: "HTML"
      }
    }
  }
  UrlFetchApp.fetch( telegramUrl + '/', data);
}
//Dades usuari
function doPost(e){ // Funció que rep les dades enviades, mitjançant post, per Telegram
  var data = JSON.parse(e.postData.contents);  // Llegeix les dades rebudes per JSON i les guarda
  if (data.callback_query){  // Si és la resposta a un teclat
    var text = data.callback_query.data;  // Resposta del teclat
    var id = data.callback_query.from.id;  // Identificador de la finestra on s'ha escrit el missatge
    var cmd = text;
  }
  if (data.message){  // Si és una comanda normal
    var text = data.message.text;  // Comanda enviada
    var id = data.message.chat.id;  // Identificador de la finestra d'on prové el missatge  
    var nom_usuari = data.message.from.username ;  // Nom de l'usuari
  }
  if(text.indexOf(' ') > -1){
    var comanda = text.split(" ");  // El signe @ separa la comanda dels paràmetres 
    var cmd = comanda[0];  // Comanda
    var par = comanda[1];  // Paràmetre 
    num_ex = comanda[2]; // num exe al que estem
    opcio = comanda[3]; // opcio triada
    correcte = comanda[4]; // opcio correcte
    var porta_be = comanda[5];//recompte de les que porta be
  } else {
    var cmd = text;
    var par = "";
  }
  if (cmd == '/catala'){
    var resposta = "Actualment no està disponible";
    sendText(id,resposta);
  }
  if (cmd == '/ang'){
    var resposta = "Actualment no està disponible";
    sendText(id,resposta);
  }
  if (cmd == '/geo'){
    var resposta = "Actualment no està disponible";
    sendText(id,resposta);
  }
  if (cmd == '/mates'){
    if (par == "" ){
      var tecles = {"inline_keyboard":[
        [{"text":"Exercicis","callback_data":"/mates ex"},{"text":"Quiz","callback_data":"/mates quiz"}]//,
      ]};
      var titol = "Què vols fer ?";
      sendText_tecles(id,titol,tecles); 
    }
    if (par == 'ex'){
      if (isNaN(num_ex)){
        var num_ex = 0;
        exercici(id,num_ex);
      } else {
        comprobar_ex(id,num_ex,opcio,correcte);
        exercici(id,num_ex);
      }
    }
    if (par == 'quiz'){
      if (isNaN(num_ex)){
        var num_ex = 0;
        var porta_be = 0;
        quiz(id,num_ex,porta_be);
      } else {
        comprobar_quiz(id,num_ex,opcio,correcte,porta_be);
      }
    }
  }  
  if (cmd == '/start'){
    var resposta = "Aprèn amb Rita ??";
    sendText(id,resposta);
    comprobar(nom_usuari,id);
  } 
}
function comprobar(nom_usuari,id){
  var sh = SpreadsheetApp.openById(IdFull);
  var sheet = sh.getSheets(); 
  var dades = sheet[1].getDataRange().getValues();  
  var rang = sheet[1].getLastRow();
  var aturar = 0;
  if (rang > 1){ 
    for (var i in dades){
      var filera = dades[i];
      var nom = filera[0] ;
      if (nom==nom_usuari){  // L'hem trobat
        var aturar = 1 ;
        var tecles = {"inline_keyboard":[
          [{"text":"Català","callback_data":"/catala"},{"text":"Anglès","callback_data":"/ang"}],
          [{"text":"Matemàtiques","callback_data":"/mates"},{"text":"Geografia","callback_data":"/geo"}]
        ]};
        var titol = "Tria una assignatura ??";
        sendText_tecles(id,titol,tecles);  
      }
    }    
  } 
  if (aturar!=1){
    var resposta = "No pertanys a aquesta classe";
    sendText(id,resposta);
  }
}
function quiz(id,num_ex,porta_be){
  var sh = SpreadsheetApp.openById(IdFull);  // Agafem el full
  var sheet = sh.getSheets(); 
  var dades = sheet[2].getDataRange().getValues();
  var rang = sheet[2].getLastRow();  // Agafem les dades per buscar l'usuari
  var n_ex = +rang -1;
  num_ex = +num_ex +1 ;
  if (n_ex >= num_ex){
    if (rang > 1){    // Si és 1 només hi ha els títols 
      var filera = dades[num_ex];
      var titol = filera[0] ;
      var Opcio_A = filera[2];
      var Opcio_B = filera[3];
      var Opcio_C = filera[4];
      var Opcio_D = filera[5];
      correcte = filera[1];
      var opc_num_a = "/mates quiz " + num_ex + " a " + correcte + " " + porta_be;
      var opc_num_b = "/mates quiz " + num_ex + " b " + correcte + " " + porta_be;
      var opc_num_c = "/mates quiz " + num_ex + " c " + correcte + " " + porta_be;
      var opc_num_d = "/mates quiz " + num_ex + " d " + correcte + " " + porta_be;
      var tecles = {"inline_keyboard":[
            [{"text":Opcio_A,"callback_data":opc_num_a},{"text":Opcio_B,"callback_data":opc_num_b}],
            [{"text":Opcio_C,"callback_data":opc_num_c},{"text":Opcio_D,"callback_data":opc_num_d}]
          ]};
      sendText_tecles(id,titol,tecles); 
    }
  } else {
    var resposta = "Has fet bé " + porta_be + "/" + n_ex ;
    sendText(id,resposta);
  }
}
function exercici(id,num_ex){
  var sh = SpreadsheetApp.openById(IdFull);  // Agafem el full
  var sheet = sh.getSheets(); 
  var dades = sheet[0].getDataRange().getValues();
  var rang = sheet[0].getLastRow();  // Agafem les dades per buscar l'usuari
  if (rang > 1){    // Si és 1 només hi ha els títols 
    num_ex = +num_ex +1 ;
    var filera = dades[num_ex];
    var titol = filera[0] ;
    var Opcio_A = filera[2];
    var Opcio_B = filera[3];
    var Opcio_C = filera[4];
    var Opcio_D = filera[5];
    correcte = filera[1];
    var opc_num_a = "/mates ex " + num_ex + " a " + correcte;
    var opc_num_b = "/mates ex " + num_ex + " b " + correcte;
    var opc_num_c = "/mates ex " + num_ex + " c " + correcte;
    var opc_num_d = "/mates ex " + num_ex + " d " + correcte;
    var tecles = {"inline_keyboard":[
        [{"text":Opcio_A,"callback_data":opc_num_a},{"text":Opcio_B,"callback_data":opc_num_b}],
        [{"text":Opcio_C,"callback_data":opc_num_c},{"text":Opcio_D,"callback_data":opc_num_d}]
      ]};
    sendText_tecles(id,titol,tecles);  // Envia el teclat
  }
}
function comprobar_ex(id,num_ex,opcio,correcte){
  var sh = SpreadsheetApp.openById(IdFull);  // Agafem el full
  var sheet = sh.getSheets(); 
  var dades = sheet[0].getDataRange().getValues();
  var rang = sheet[0].getLastRow();  // Agafem les dades per buscar l'usuari
  if (rang > 1){    // Si és 1 només hi ha els títols 
    if (opcio == 'a'){
      var filera = dades[num_ex];
      var resposta_alum = filera[2];
      if (resposta_alum==correcte){
        var resposta = "? Resposta correcta ";
        sendText(id,resposta);
      } else {
        var resposta = "? Resposta incorrecta, la resposta és " + correcte;
        sendText(id,resposta);
      }
    }
    if (opcio == 'b'){
      var filera = dades[num_ex];
      var resposta_alum = filera[3];
      if (resposta_alum==correcte){
        var resposta = "? Resposta correcta ";
        sendText(id,resposta)
      } else {
        var resposta = "? Resposta incorrecta, la resposta és " + correcte;
        sendText(id,resposta);
      }
    }
    if (opcio == 'c'){
      var filera = dades[num_ex];
      var resposta_alum = filera[4];
      if (resposta_alum==correcte){
        var resposta = "? Resposta correcta ";
        sendText(id,resposta);
      } else {
        var resposta = "? Resposta incorrecta, la resposta és " + correcte;
        sendText(id,resposta);
      }
    }
    if (opcio == 'd'){
      var filera = dades[num_ex];
      var resposta_alum = filera[5];
      if (resposta_alum==correcte){
        var resposta = "? Resposta correcta ";
        sendText(id,resposta);
      } else {
        var resposta = "? Resposta incorrecta, la resposta és " + correcte;
        sendText(id,resposta);
      }
    }
  }
}
function comprobar_quiz(id,num_ex,opcio,correcte,porta_be){
  var sh = SpreadsheetApp.openById(IdFull);  // Agafem el full
  var sheet = sh.getSheets(); 
  var dades = sheet[2].getDataRange().getValues();
  var rang = sheet[2].getLastRow();  // Agafem les dades per buscar l'usuari
  if (rang > 1){    // Si és 1 només hi ha els títols 
    if (opcio == 'a'){
      var filera = dades[num_ex];
      var resposta_alum = filera[2];
      if (resposta_alum==correcte){
        porta_be = +porta_be + 1;
        quiz(id,num_ex,porta_be);
      } else {
        porta_be = porta_be;
        quiz(id,num_ex,porta_be);
      } 
    }
    if (opcio == 'b'){
      var filera = dades[num_ex];
      var resposta_alum = filera[3];
      if (resposta_alum==correcte){
        porta_be = +porta_be + 1;
        quiz(id,num_ex,porta_be); 
      } else {
        porta_be = porta_be;
        quiz(id,num_ex,porta_be); 
      } 
    }
    if (opcio == 'c'){
      var filera = dades[num_ex];
      var resposta_alum = filera[4];
      if (resposta_alum==correcte){
        porta_be = +porta_be + 1;
        quiz(id,num_ex,porta_be);  
      } else {
        porta_be = porta_be;
        quiz(id,num_ex,porta_be); 
      } 
    }
    if (opcio == 'd'){
      var filera = dades[num_ex];
      var resposta_alum = filera[5];
      if (resposta_alum==correcte){
        porta_be = +porta_be + 1;
        quiz(id,num_ex,porta_be);
      } else {
        porta_be = porta_be;
        quiz(id,num_ex,porta_be); 
      }
    }
  }
}

 

 

 

 

 

 

 

 

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.