Skip to content
This repository has been archived by the owner on Jan 21, 2023. It is now read-only.

Commit

Permalink
Cambios de la versión v1.0.0
Browse files Browse the repository at this point in the history
  • Loading branch information
UlisesGascon committed Sep 24, 2016
1 parent a4bd43c commit c7befb5
Show file tree
Hide file tree
Showing 9 changed files with 806 additions and 73 deletions.
62 changes: 58 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
![shieldsIO](https://img.shields.io/david/UlisesGascon/Nodejs-hangouts-robot.svg)

# Nodejs-hangouts-robot
Robot de chat para Google hangouts desarrollado con Node.js. Permite el uso de la Terminal/Consola, entre otras cosas
Robot de chat para Google hangouts desarrollado con Node.js. Permite el uso de la Terminal/Consola, Twitter, Alchemy Api... entre otras cosas...

![foto](img/Robotito_chat.png)

Expand All @@ -29,7 +29,7 @@ botPassword: "PASS"
```
- Instalamos las dependencias y ejecutamos
```
npm install && node robot
npm install && node index
```
- Preguntamos al robot *Quien soy?* en el chat y respondera con algo parecido a esto
```
Expand All @@ -45,13 +45,32 @@ usuarioAutorizado: "loremloremymaslorem1123@public.talk.google.com",


### Eventos Automáticos
- Las siguientes comunicaciones solo son relevantes a *config.usuarioAutorizado*, que será quien recibirá los mensajes.

Las siguientes comunicaciones solo son relevantes a *config.usuarioAutorizado*, que será quien recibirá los mensajes.

- Al arrancar la aplicación de Node... el robot saluda *Hola de nuevo, Jefe!*
- Al cerrar la aplicación vía Ctrl+C... el robot se despide *Me piro! Ya no me quieres como antes...*
- Al terminarse de manera natural la ejecucción... el robot se despide *Me piro! Vaciones por fín!*
- Al tener un error inesperado y cerrarse... el robot se despide *Me piro! Cierre inesperado...*


### Capturas



![captura_1](img/captura_1.png)



![captura_2](img/captura_2.png)



### Manejo de servicios externos:

Twitter y Alchemy pueden ser desactivados/activados desde *config.json*


### Preguntas y respuestas posibles:

Nota:
Expand All @@ -61,6 +80,10 @@ Si deseas cambiarlo, solo tienes que reescribir las cadenas de texto en las line
**Por defecto...**
- Si nuestro mensaje no cumple al menos uno de los siguientes casos, por defecto el robot nos respondera *No te entiendo... Explicate mejor, Humano!*

**Ayuda**
- Responde con un listado de ids (preguntas/respuestas) disponibles.
- Puedes ampliar los detalles (descripción, ejemplo, etc..) de un id en particular enviando `ayuda {id}`

**Hola (Expresión regular)**
- Se dispara cuando nuestro mensaje empieza con la palabra Hola/hola.
- Responde con *Hola Humano! Qué tal?*
Expand All @@ -77,9 +100,40 @@ Si deseas cambiarlo, solo tienes que reescribir las cadenas de texto en las line
**Quien soy?**
- Responde con tu ID en formato *lorelipsum1234lorem12@public.talk.google.com* que es lo necesario para configurar el *usuarioAutorizado* en *config.js*

**Timestamp**
**hora**
- Responde con la fecha y la hora en formato *MM/DD/YYYY, HH:MM:SS AM/PM*

**Tweet**
- Envia un tweet directamente. Puedes usar #hashtags y @menciones

**System info**
- Información del sistema(Kernel, Uptime, etc...) y su uso (Disco duro, memoria, cpu, procesos...)

**Echo**
- Devuelve el mensaje.


**Alchemy (Estatus)**
- Nos permite saber cuantas llamdas nos quedan a la API de Alchemy.


**Alchemy (Reconocimiento Facial)**
- Podemos enviar la URL de una foto y Alchemy relaizará un analisis.
- Nos devuelve la información sobre lso personajes famosos que aparecen o datos biometricos relevantes si no.


**Alchemy (Idioma)**
- Reconoce el idioma de un texto o url.
- Nos devuelve información relevante sobre el idioma, incluido un enlace a Wikipedia.


**Alchemy (sentimiento)**
- Análisis de sentimiento de un texto o url


**Alchemy (emociones)**
- Analisis por emociones de un texto o url


**Terminal**
- Se dispara cuando nuestro mensaje empieza con la palabra Terminal/terminal.
Expand Down
194 changes: 194 additions & 0 deletions alchemy.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,194 @@
var AlchemyAPI = require('alchemy-api'),
config = require('./config'),
alchemy = new AlchemyAPI(config.alchemyApi.key);

/**
* Se verifica que el servicio este habilitado en cofig.js
* @param {function} botSend - Función que maneja los envios
* @param {string} from - Representa al usuario que lanzo la petición
*/

function validarEstado(botSend, from, callback) {
if (config.hangouts.services.alchemy) {
if(callback && typeof callback === "function"){
callback();
} else {
console.log("[ERROR][Alchemy] El Callback no esta presente o no es una función.");
}
} else {
botSend(from, "Alchemy Api ha sido desactivada por el jefe");
}
}

/**
* Función que envía al solicitante el estado del API (errores, estado real)
* @param {function} botSend - Función que maneja los envios
* @param {string} from - Representa al usuario que lanzo la petición
*/

exports.estado = function(botSend, from) {
validarEstado(botSend, from, function(){
alchemy.apiKeyInfo({}, function(err, response) {
if (err) {
botSend(from, "Tenemos un error: \n" + err);
} else {
botSend(from, '- Estado: ' + response.status + '\n- Consumido: ' + response.consumedDailyTransactions + '\n- Limite: ' + response.dailyTransactionLimit);
}
});
});
};



/**
* Función que envía al solicitante el analisis de una fotografía (errores, famosos, datos biométricos)
* Se cubren todos los posibles casos: fotos sin personas, personas famosas, personas no famosas, multiples personas...
* @param {function} botSend - Función que maneja los envios
* @param {string} from - Representa al usuario que lanzo la petición
* @param {string} message - Representa el mensaje enviado por el usuario en la petición
*/

exports.reconocimientoFacial = function(botSend, from, message) {
validarEstado(botSend, from, function(){

alchemy.imageFaces(message, {}, function(err, response) {
if (err) {
console.log(err);
botSend(from, err);
} else {
var imageFaces = response.imageFaces;

if (response.status === "OK") {
if (imageFaces.length !== 0) {
// Información mínima disponible
var respuesta = "";
for (var i = 0; i < imageFaces.length; i++) {

if (imageFaces[i].identity) {
// Es un famoso
respuesta += "- " + imageFaces[i].identity.name + " (" + imageFaces[i].identity.score + "%) " + imageFaces[i].identity.disambiguated.subType[1];
respuesta += "\n";

} else {
// No es un famoso
respuesta += "- Anónimo. Estimo una edad entorno a " + imageFaces[i].age.ageRange + " y es " + (imageFaces[i].gender.gender === 'MALE' ? 'Hombre' : 'Mujer');
respuesta += "\n";
}

}
botSend(from, "Yo veo... \n" + respuesta);
} else {
// Sin información mínima disponible
botSend(from, "¿De qué personas me hablas?");
}

} else {
botSend(from, "Mala suerte!\nAlchemy me ha mandado datos incorrectos.");
}
}
});

});
};




/**
* Función para detectar el idioma
* @param {function} botSend - Función que maneja los envios
* @param {string} from - Representa al usuario que lanzo la petición
* @param {string} message - Representa el mensaje enviado por el usuario en la petición
*/

exports.idioma = function(botSend, from, message) {
validarEstado(botSend, from, function(){
alchemy.language(message, {}, function(err, response) {
if (err) {
// Error de Conexión
console.log(err);
botSend(from, err);
} else {
if (response.language === "unknown") {
botSend(from, "Que idioma es ese?!");
} else {
botSend(from, "Eso es " + response.language);
if (response["iso-639-2"] && response["native-speakers"]) {
botSend(from, "- ISO 639: " + response["iso-639-2"] + "\n- Hablantes: " + response["native-speakers"]);
}
if (response.wikipedia) {
botSend(from, response.wikipedia);
}
}
}
});
});
};



/**
* Función para detectar el sentimeinto
* @param {function} botSend - Función que maneja los envios
* @param {string} from - Representa al usuario que lanzo la petición
* @param {string} message - Representa el mensaje enviado por el usuario en la petición
*/

exports.sentimiento = function(botSend, from, message) {
validarEstado(botSend, from, function(){
alchemy.sentiment(message, {}, function(err, response) {
if (err) {
console.log(err);
botSend(from, err);
} else {
var sentiment = "";

if (response.status === "OK") {
sentiment += "- Idioma: " + response.language;
if (response.docSentiment) {
sentiment += "\n- Tipo: " + response.docSentiment.type;
if (response.docSentiment.score) {
sentiment += " (" + response.docSentiment.score + ")";
}
}
botSend(from, sentiment);
} else {
botSend(from, "Alchemy me ha mandado datos incorrectos.\n"+response.statusInfo);
}
}
});
});
};



/**
* Función para detectar las emociones
* @param {function} botSend - Función que maneja los envios
* @param {string} from - Representa al usuario que lanzo la petición
* @param {string} message - Representa el mensaje enviado por el usuario en la petición
*/

exports.emociones = function(botSend, from, message) {
validarEstado(botSend, from, function(){
alchemy.emotions(message, {}, function(err, response) {
if (err) {
console.log(err);
botSend(from, err);
} else {
if (response.status === "OK") {
var emotionsData = "Mi análisis:\n";
emotionsData += "- Idioma: " + response.language + "\n";
emotionsData += "- Enfado (" + response.docEmotions.anger + ")\n";
emotionsData += "- Repugnancia (" + response.docEmotions.disgust + ")\n";
emotionsData += "- Miedo (" + response.docEmotions.fear + ")\n";
emotionsData += "- Alegría (" + response.docEmotions.joy + ")\n";
emotionsData += "- Tristeza (" + response.docEmotions.sadness + ")\n";
botSend(from, emotionsData);
} else {
botSend(from, "Alchemy me ha mandado datos incorrectos.\n"+response.statusInfo);
}
}
});
});
};
25 changes: 21 additions & 4 deletions config.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,27 @@ var pjson = require('./package.json');
var config = {
version: pjson.version,
creador: pjson.author,
usuarioId: "",
usuarioAutorizado: "",
botEmail: "",
botPassword: ""
// Habgouts
hangouts: {
usuarioId: "",
usuarioAutorizado: "",
botEmail: "",
botPassword: "",
services: {
twitter: true,
alchemy: true
}
},
alchemyApi: {
key: ""
},
//Twitter
twitter : {
consumer_key: "",
consumer_secret: "",
access_token_key: "",
access_token_secret: ""
}
};

module.exports = config;
Binary file added img/captura_1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added img/captura_2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
16 changes: 16 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
var hangouts = require("./robot");

hangouts.response({
id: "ciao",
condition: function(msg){
return "ciao" === msg;
},
action: function(from, msg){
return "Ciao... amigo!";
},
// Opcionales
admin: false, // Requiere ser Admin?. Valor por defecto False.
special: false, // Asíncrono? Valor por defecto False
description: "Nos despedimos...",
sample: "ciao"
});
26 changes: 20 additions & 6 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,14 +1,28 @@
{
"name": "Nodejs-hangouts-robot",
"version": "0.0.1",
"description": "Robot de chat para Google Hangouts desarrollado con Node.js. Permite el uso de la Terminal/Consola y más...",
"main": "robot.js",
"name": "simple-hangouts-bot",
"homepage": "https://github.com/UlisesGascon/simple-hangouts-bot",
"version": "1.0.0",
"description": "Robot de chat para Google Hangouts desarrollado con Node.js. Permite el uso de la Terminal/Consola, Tweeter, Alchemy y más...",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Ulises Gascon",
"author": {
"name": "Ulises Gascón",
"url": "https://github.com/UlisesGascon"
},
"keywords": [
"chatbot",
"hangouts",
"chat",
"bot",
"alchemy"
],
"repository": "UlisesGascon/simple-hangouts-bot",
"license": "GPL-3.0",
"dependencies": {
"hangouts-bot": "^0.2.1"
"hangouts-bot": "^0.2.1",
"alchemy-api": "^1.3.2",
"twitter": "1.3.0"
}
}
Loading

0 comments on commit c7befb5

Please sign in to comment.