| Bots de conversa | Exemples | Dades pràctiques | Recursos CITCEA | |
| Google Apps Script | Projectes | Interacció | Inici |
Si tenim uns quants bots de conversa, és probable que algunes de les funcions les fem servir en tots ells. En aquest cas, pot ser recomanable guardar les funcions en una biblioteca; de manera que no estiguin copiades a tots els nostres scripts. Això ens fa els fitxers més manejables i ens permet que les millores a les funcions habituals només les haguem de fer una vegada i ja estiguin disponibles en tots els scripts.
Anem a veure primer com crear una biblioteca amb unes funcions i després com fer servir aquestes funcions en els nostres scripts. Agafem com a exemple un script relativament senzill:
var token = "^^34328844:AAFIpk-e7j3UZtYQYQaTduf4hEhnDqIcNXI";
var telegramUrl = "https://api.telegram.org/bot" + token; // Url que comunica el nostre bot amb Telegram
function hora(Id){ // Funció que retorna l'hora actual
var ara = new Date();
var Hora = ara.getHours();
var Minut = ara.getMinutes();
var resultat = "Ara són les " + Hora + "." + Minut + " h";
sendText(Id,resultat);
}
function sendText(chatId,text_env,keyBoard){ // Funció que prepara per enviar 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);
}
function dades(id,nom){ // Funció que retorna el nom de l'usuari
var resultat = "El teu nom a Telegram és <i>" + nom + "</i>"; // El nom en cursiva
sendText(id,resultat);
}
function doPost(e){ // Funció que rep les dades que envia Telegram
var acabat = false;
var data = JSON.parse(e.postData.contents); // Llegeix les dades rebudes per JSON i les guarda
var text = data.message.text; // Comanda enviada
var id = data.message.chat.id; // Identificador de la finestra d'on prové el missatge
var id_usuari = data.message.from.id; // Identificador de l'usuari
var id_missatge = data.message.message_id; // Identificador del missatge
var lang = data.message.from.language_code ; // Idioma de l'usuari
var nom_usr = data.message.from.first_name ; // Nom de l'usuari
var location = data.message.location; // Localització de l'usuari (si es sap)
var comanda = text.split("@"); // El signe @ separa la comanda dels paràmetres
var cmd = comanda[0];
var par = comanda[1];
if(cmd == '/hora'){
hora(id_usuari);
acabat = true;
}
if(cmd == '/nom'){
dades(id_usuari,nom_usr);
acabat = true;
}
if(!acabat){
var resposta = "Comanda desconeguda";
sendText(id,resposta);
}
}
Les funcions que pensem que podem fer servir en altres scripts (hora i sendText) i la instrucció que crea l'adreça URL de Telegram els posarem a la biblioteca (és el tros que hem marcat en color) mentre que la resta es quedarà a l'script.
El primer que haurem de fer serà crear un script, ja sigui aïllat o vinculat a un full de càlcul. Aquest script serà el que contindrà la biblioteca i, per tant, només tindrà les funcions que cridarem des d'altres scripts. Aquest codi el posarem dins una classe i li farem alguns canvis. Ens quedarà com es mostra a continuació, on hem marcat en color les coses que han estat modificades.
var bib_bots = function(token){
var telegramUrl = "https://api.telegram.org/bot" + token; // Url que comunica el nostre bot amb Telegram
this.hora = function(Id){ // Funció que retorna l'hora actual
var ara = new Date();
var Hora = ara.getHours();
var Minut = ara.getMinutes();
var resultat = "Ara són les " + Hora + "." + Minut + " h";
this.sendText(Id,resultat);
}
// Funció que prepara per enviar un text o un teclat a Telegram
this.sendText = function(chatId,text_env,keyBoard){
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);
}
}
Observem que hem fet tres tipus de canvis. Hem posat tot el conjunt dins una classe (que hem anomenat bib_bots) i que és una funció que conté les altres funcions i les instruccions que han d'estar a la biblioteca però són generals (no estan a cap de les funcions). En aquest cas, la classe tindrà un paràmetre (token) que és el que necessitem per a la instrucció que no pertany a cap funció.
Hem canviat la sintaxi de la definició de les dues funcions, posant this davant del nom per indicar que pertanyen a la pròpia classe. Finalment, en aquelles funcions que cridem també els hem posat this al davant, ja que també pertanyen a la pròpia classe.
Un cop acabada de crear la biblioteca, la publicarem de la mateixa manera que publiquem un script. En el cas de les biblioteques, no ens interessa l'adreça URL on s'ha publicat sinó la clau del projecte. Per obtenir-la, anirem a la pestanya Fitxer i seleccionarem Propietats del projecte. A la finestra que se'ns obrirà, buscarem la clau del projecte a la pestanya Informació. Aquesta clau serà una cosa similar a ^^gCpo49tU9Iyf_2kw9rB9kenVAfpvlNP que copiarem i guardarem.
A l'script en el que volem fer servir la biblioteca, hem d'anar a la pestanya Recursos i picar a Biblioteques.... Se'ns obrirà una finestra en la que hi posarem la clau que hem obtingut. També indicarem quina versió de la biblioteca s'ha d'agafar; en principi, la darrera.

Atenció: Si més endavant modifiquem l'script que conté la biblioteca, es seguirà executant la versió que tinguem assenyalada en aquesta finestra. Ens surt com a identificador el nom que hem posat a l'script però, si ho preferim, podem canviar-lo. Aquest identificador és el que farem servir per referir-nos a la biblioteca.
Ara prepararem la nova versió de l'script que fa servir les funcions de la biblioteca. D'entrada, hem de suprimir aquelles línies que hem posat ja a la biblioteca. Un cop fet això, caldrà fer-hi algunes modificacions; que hem marcat en color. La més important és crear un objecte de la classe que tenim a la biblioteca, d'aquesta manera també passem el paràmetre (token, en el nostre cas) que necessitem a la biblioteca. A les funcions també els haurem d'indicar que pertanyen a la classe que correspon a la biblioteca (de fet, passen a ser mètodes de la classe), posant-hi davant l'identificador d'aquesta que hem posat al requadre. Fixem-nos que a la funció dades no ho hem de posar, perquè no està a la biblioteca.
var token = "^^34328844:AAFIpk-e7j3UZtYQYQaTduf4hEhnDqIcNXI";
var bbot = new bibbots.bib_bots(token); // Creem l'objecte
function dades(id,nom){ // Funció que retorna el nom de l'usuari
var resultat = "El teu nom a Telegram és <i>" + nom + "</i>"; // El nom en cursiva
bbot.sendText(id,resultat);
}
function doPost(e){ // Funció que rep les dades que envia Telegram
var acabat = false;
var data = JSON.parse(e.postData.contents); // Llegeix les dades rebudes per JSON i les guarda
var text = data.message.text; // Comanda enviada
var id = data.message.chat.id; // Identificador de la finestra d'on prové el missatge
var id_usuari = data.message.from.id; // Identificador de l'usuari
var id_missatge = data.message.message_id; // Identificador del missatge
var lang = data.message.from.language_code ; // Idioma de l'usuari
var nom_usr = data.message.from.first_name ; // Nom de l'usuari
var location = data.message.location; // Localització de l'usuari (si es sap)
var comanda = text.split("@"); // El signe @ separa la comanda dels paràmetres
var cmd = comanda[0];
var par = comanda[1];
if(cmd == '/hora'){
bbot.hora(id_usuari);
acabat = true;
}
if(cmd == '/nom'){
dades(id_usuari,nom_usr);
acabat = true;
}
if(!acabat){
var resposta = "Comanda desconeguda";
bbot.sendText(id,resposta);
}
}
Per provar les funcions de la biblioteca podem fer servir el mode de depuraració amb una funció de prova. Posarem aquesta funció en el mateix fitxer que la biblioteca però fora de la classe.

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