ZoeApi/controllers/alexaController.js

1384 lines
65 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

require('../connections/mysql-server');
require('../helpers/CheckToken');
const formidable = require('formidable');
const express = require('express');
const router = express.Router();
var { spawn } = require('child_process');
let bodyParser = require('body-parser');
router.use(bodyParser.json({
verify: function getRawBody(req, res, buf) {
req.rawBody = buf.toString();
}
}));
var routes = function () {
// #region Alexa expressions
router.get('/getCurrentExpression/:idusers/:idunits', verifyJWT, (req, res) => {
let idusers = req.params.idusers;
let idunits = req.params.idunits;
execSQLQuery(`SELECT idexpressions AS Epressao, role AS Modo FROM alexaexpression WHERE idusers = ${idusers} AND idunits = ${idunits};`, res, req.originalUrl);
})
router.get('/listAlexaintents', verifyJWT, (req, res) => {
execSQLQuery(`SELECT * FROM alexaintents;`, res, req.originalUrl);
})
router.patch('/updateCurrentExpression', verifyJWT, (req, res) => {
let idusers = req.body.idusers;
let idunits = req.body.idunits;
let role = req.body.role;
let idexpressions = req.body.idexpressions;
execSQLQuery(`UPDATE alexaexpression SET role = ${role}, idexpressions = ${idexpressions} WHERE idusers = ${idusers} AND idunits = ${idunits};`, res, req.originalUrl);
})
// #endregion
// #region Alexa intents
router.get('/listAlexaintents', verifyJWT, (req, res) => {
execSQLQuery(`SELECT * FROM alexaintents;`, res, req.originalUrl);
})
router.get('/getAlexaintent/:idalexaintents', verifyJWT, (req, res) => {
let idalexaintents = req.params.idalexaintents;
execSQLQuery(`SELECT * FROM alexaintents WHERE idalexaintents = ${idalexaintents};`, res, req.originalUrl);
})
router.get('/getReqIntent/:idalexaintents', verifyJWT, (req, res) => {
const idalexaintents = req.params.idalexaintents;
execSQLQuery(`SELECT
ait.reqIntent
FROM alexanextintents ani
inner join alexaintents ait on ait.idalexaintents = ani.idalexaintents_next
where ani.idalexaintents = ${idalexaintents};`, res, req.originalUrl);
});
router.get('/getFirstIntentofTree/:idconversationtree', verifyJWT, (req, res) => {
let idconversationtree = req.params.idconversationtree;
execSQLQuery(`
SELECT ai.reqIntent
FROM alexanextintents an
INNER JOIN alexaintents ai ON ai.idalexaintents = an.idalexaintents
WHERE an.idconversationtree = ${idconversationtree} LIMIT 1;`, res, req.originalUrl);
})
router.get('/deleteAlexaintent/:idalexaintents', verifyJWT, (req, res) => {
let idalexaintents = req.params.idalexaintents;
execSQLQuery(`DELETE FROM alexaintents WHERE idalexaintents = ${idalexaintents};`, res, req.originalUrl);
})
router.post('/insertAlexaintent', verifyJWT, (req, res) => {
const reqIntent = req.body.reqIntent;
const resIntent = req.body.resIntent;
const exampleResponse = req.body.exampleResponse;
const endSession = req.body.endSession ? 1 : 0;
const askRobot = req.body.askRobot ? 1 : 0;
execSQLQuery(`INSERT INTO alexaintents(reqIntent, resIntent, endSession, exampleResponse, askRobot)
VALUES ("${reqIntent}","${resIntent}", ${endSession}, "${exampleResponse}", ${askRobot});`, res, req.originalUrl);
})
router.patch('/updateAlexaintent', verifyJWT, (req, res) => {
const idalexaintents = req.body.idalexaintents;
const reqIntent = req.body.reqIntent;
const resIntent = req.body.resIntent;
const exampleResponse = req.body.exampleResponse;
const endSession = req.body.endSession ? 1 : 0;
const askRobot = req.body.askRobot ? 1 : 0;
execSQLQuery(`UPDATE alexaintents SET
reqIntent = "${reqIntent}",
resIntent = "${resIntent}",
endSession = ${endSession},
exampleResponse = "${exampleResponse}",
askRobot = ${askRobot}
WHERE
idalexaintents = ${idalexaintents};`, res, req.originalUrl);
})
// #endregion
// #region Alexa next intents
router.get('/listAlexanextintents', verifyJWT, (req, res) => {
execSQLQuery(`SELECT * FROM alexanextintents;`, res, req.originalUrl);
})
router.get('/deleteAlexanextintent/:idconversationtree', verifyJWT, (req, res) => {
let idconversationtree = req.params.idconversationtree;
execSQLQuery(`DELETE FROM alexanextintents WHERE idconversationtree = ${idconversationtree};`, res, req.originalUrl);
})
router.post('/insertAlexanextintent', verifyJWT, (req, res) => {
const idalexaintents = req.body.idalexaintents;
const idalexaintents_next = req.body.idalexaintents_next;
const idconversationtree = req.body.idconversationtree;
execSQLQuery(`INSERT INTO alexanextintents (idalexaintents, idalexaintents_next, idconversationtree)
VALUES (${idalexaintents},${idalexaintents_next}, ${idconversationtree});`, res, req.originalUrl);
})
router.get('/getconnectionsbyid/:idalexaintents', verifyJWT, (req, res) => {
let idalexaintents = req.params.idalexaintents;
execSQLQuery(`SELECT * FROM alexanextintents WHERE idalexaintents = ${idalexaintents};`, res, req.originalUrl);
})
router.get('/getnextintents/:idalexaintents/:campo', verifyJWT, (req, res) => {
let idalexaintents = req.params.idalexaintents;
let campo = req.params.campo;
execSQLQuery(`
SELECT
ai.idalexaintents,
ai.reqIntent,
ai.resIntent,
an.idalexaintents_next,
ai.endsession,
ai.exampleResponse,
ai.askRobot
FROM
alexanextintents an
RIGHT JOIN
alexaintents ai ON an.idalexaintents = ai.idalexaintents
WHERE ${campo} = ${idalexaintents};`, res, req.originalUrl);
})
router.get('/getConnectionsbytree/:idconversationtree', verifyJWT, (req, res) => {
let idconversationtree = req.params.idconversationtree;
execSQLQuery(`
SELECT
ai.idalexaintents,
ai.reqIntent,
ai.resIntent,
an.idalexaintents_next,
ai.endsession,
ai.exampleResponse,
ai.askRobot
FROM
alexanextintents an
RIGHT JOIN
alexaintents ai ON an.idalexaintents = ai.idalexaintents
WHERE idconversationtree = ${idconversationtree};
`, res, req.originalUrl);
})
// #endregion
// #region Alexa Sentences
router.post('/insertAlexasentence', verifyJWT, (req, res) => {
const idalexaintents = req.body.idalexaintents;
const sentence = req.body.sentence;
execSQLQuery(`INSERT INTO alexasentences(idalexaintents, sentence) VALUES (${idalexaintents},"${sentence}");`, res, req.originalUrl);
})
router.patch('/updateAlexasentence', verifyJWT, (req, res) => {
const idalexasentences = req.body.idalexasentences;
const sentence = req.body.sentence;
execSQLQuery(`UPDATE alexasentences SET sentence = "${sentence}" WHERE idalexasentences = ${idalexasentences};`, res, req.originalUrl);
})
router.get('/deleteAlexasentence/:idalexasentences', verifyJWT, (req, res) => {
let idalexasentences = req.params.idalexasentences;
execSQLQuery(`DELETE FROM alexasentences WHERE idalexasentences = ${idalexasentences};`, res, req.originalUrl);
})
router.get('/getListAlexasentence', verifyJWT, (req, res) => {
execSQLQuery(`SELECT * FROM alexasentences;`, res, req.originalUrl);
})
router.get('/getAlexasentencebyintent/:idalexaintents', verifyJWT, (req, res) => {
let idalexaintents = req.params.idalexaintents;
execSQLQuery(`SELECT * FROM alexasentences WHERE idalexaintents = ${idalexaintents};`, res, req.originalUrl);
})
router.get('/deleteAlexasentences/:idalexaintents', verifyJWT, (req, res) => {
let idalexaintents = req.params.idalexaintents;
execSQLQuery(`DELETE FROM alexasentences WHERE idalexaintents = ${idalexaintents};`, res, req.originalUrl);
})
router.post('/deleteAlexasentenceBySentence', verifyJWT, (req, res) => {
let sentence = req.body.sentence;
let sqlQry = `DELETE FROM alexasentences WHERE sentence = "${sentence}";`;
execSQLQuery(sqlQry, res, req.originalUrl);
})
// #endregion
// #region Árvore de conversação
router.post('/insertConversationtree', verifyJWT, (req, res) => {
const idconversationtree = req.body.idconversationtree;
const description = req.body.description;
execSQLQuery(`INSERT INTO alexaconversationtree (description) VALUES ("${description}");`, res, req.originalUrl);
})
router.patch('/updateConversationtree', verifyJWT, (req, res) => {
const idconversationtree = req.body.idconversationtree;
const description = req.body.description;
execSQLQuery(`UPDATE alexaconversationtree SET description = "${description}" WHERE idconversationtree = ${idconversationtree};`, res, req.originalUrl);
})
router.get('/listConversationtree', verifyJWT, (req, res) => {
execSQLQuery(`SELECT * FROM alexaconversationtree;`, res, req.originalUrl);
})
router.get('/getConversationtree/:idconversationtree', verifyJWT, (req, res) => {
let idconversationtree = req.params.idconversationtree;
execSQLQuery(`SELECT * FROM alexaconversationtree WHERE idconversationtree = ${idconversationtree};`, res, req.originalUrl);
})
router.get('/deleteConversationtree/:idconversationtree', verifyJWT, (req, res) => {
let idconversationtree = req.params.idconversationtree;
execSQLQuery(`DELETE FROM alexaconversationtree WHERE idconversationtree = ${idconversationtree};`, res, req.originalUrl);
})
// #endregion
// #region Variaveis
router.post('/insertVariables', verifyJWT, (req, res) => {
const idalexavariables = req.body.idalexavariables;
const description = req.body.description;
execSQLQuery(`INSERT INTO alexavariables (description) VALUES ('${description}');`, res, req.originalUrl);
})
router.patch('/updateVariables', verifyJWT, (req, res) => {
const idalexavariables = req.body.idalexavariables;
const description = req.body.description;
execSQLQuery(`UPDATE alexavariables SET description = '${description}' WHERE idalexavariables = ${idalexavariables};`, res, req.originalUrl);
})
router.get('/listVariables', verifyJWT, (req, res) => {
execSQLQuery(`SELECT * FROM alexavariables;`, res, req.originalUrl);
})
router.get('/getVariable/:idalexavariables', verifyJWT, (req, res) => {
let idalexavariables = req.params.idalexavariables;
execSQLQuery(`SELECT * FROM alexavariables WHERE idalexavariables = ${idalexavariables};`, res, req.originalUrl);
})
// #endregion
// #region Variaveis de usuário
router.post('/insertUserVariables', verifyJWT, (req, res) => {
const idalexauservariables = req.body.idalexauservariables;
const idalexavariables = req.body.idalexavariables;
const valuecli = req.params.valuecli;
const idusers = req.params.idusers;
const idunits = req.params.idunits;
execSQLQuery(`INSERT INTO alexauservariables (idalexavariables, valuecli, idusers, idunits)
VALUES (${idalexavariables}, '${valuecli}', ${idusers}, ${idunits});`, res, req.originalUrl);
})
router.patch('/updateUserVariables', verifyJWT, (req, res) => {
const idalexauservariables = req.body.idalexauservariables;
const idalexavariables = req.body.idalexavariables;
const valuecli = req.params.valuecli;
const idusers = req.params.idusers;
const idunits = req.params.idunits;
execSQLQuery(`
UPDATE alexauservariables SET
idalexavariables = ${idalexavariables},
valuecli = '${valuecli}',
idusers = ${idusers},
iduntis = ${idunits}
WHERE idalexauservariables = ${idalexauservariables};`, res, req.originalUrl);
})
router.get('/listUserVariables', verifyJWT, (req, res) => {
execSQLQuery(`SELECT * FROM alexauservariables;`, res, req.originalUrl);
})
router.get('/getUserVariable/:idalexavariables', verifyJWT, (req, res) => {
let idalexauservariables = req.params.idalexauservariables;
execSQLQuery(`SELECT * FROM alexauservariables WHERE idalexauservariables = ${idalexauservariables};`, res, req.originalUrl);
})
// #endregion
// #region Requisição do robô
const FraseNaoEntendeu = "Sorry, I didn't understand you. Could you repeat please?";
const VelocidadePadrao = 0.85;
router.post('/recognizeAudio/:token', (req, res) => {
let token = req.params.token;
if(token != Variables("tk_fixed")) {
res.status(500).send({ status: 'expired' });
return;
}
console.log("/RecognizeAudio");
// RECEBE DADOS DA REQUISIÇÃO
let form = new formidable.IncomingForm();
form.maxFileSize = 1024 * 1024 * 1024;
form.on('file', function(name, file) { });
form.on('error', function(err) { });
form.on('aborted', function() { });
form.parse(req, function(err, fields, files) {
const fs = require('fs');
var Modo = fields.Modo;
var SessaoID = fields.SessaoID;
var CaminhoArquivo;
var UltimoIntentID = fields.UltimoIntentID;
var Vezes = fields.Vezes;
var ArvoreID = fields.ArvoreID;
var Matricula = fields.Matricula;
var IDUnidade = fields.IDUnidade;
var IDAula = fields.IDAula || 0;
var Intencao = fields.Intencao || "";
var Velocidade = fields.Velocidade || VelocidadePadrao;
try {
CaminhoArquivo = files.Arquivo.path;
}
catch (e) {
console.log("Sem audio na entrada");
}
// CRIA VARIAVEL COM A DATA ATUAL PARA RENOMEAR O ARQUIVO COM A IDENTIFICACAO DO ALUNO
let date_ob = new Date();
let DataHoje = date_ob.getDate() + "-" + (date_ob.getMonth() + 1) + "-" + date_ob.getFullYear() + "-" + date_ob.getHours() + "-" + date_ob.getMinutes() + "-" + date_ob.getSeconds();
var NomeArquivo = Matricula + "_" + IDUnidade + "_" + IDAula + "_" + DataHoje + ".mp3";
if (Intencao.length > 2) { // SE A INTECAO ESCOLHIDA JA ESTIVER NO CORPO DA REQUISICAO
if (Modo == "exercise") { // SE O MODO EXERCICIO
console.log("Exercício de pronúncia - Robot");
EnviaResposta(Intencao, NomeArquivo, res, 0, Intencao, 0, 0, 0, 1, Velocidade);
}
else if (Modo == "conversation") { // SE O MODO FOR CONVERSAOCAO LIVRE
console.log("Conversação livre");
// ENVIA A PERGUNTA PARA MITSUKU
EnviaPerguntaMitsuku(Intencao, SessaoID, function(Resposta) {
EnviaResposta(Resposta, NomeArquivo, res, 0, Resposta, Vezes, 0, 0, 1, Velocidade);
});
}
else { // (classroom) SE O MODO FOR SALA DE AULA
let sqlQry1 = `SELECT * FROM alexaintents WHERE reqIntent = "${Intencao}";`;
mysqlConnection.query(sqlQry1, function (error, results, fields) {
if (results.length > 0) {
EnviaResposta(results[0].resIntent, NomeArquivo, res, results[0].idalexaintents, results[0].exampleResponse, 0, results[0].endSession, results[0].askRobot, 1, Velocidade);
}
})
}
}
else { // SE TIVER QUE PROCESSAR A FRASE DO ALUNO
// COPIAR O AUDIO DE ENTRADA NO SERVIDOR
fs.rename(CaminhoArquivo, Variables('src_media') + 'alexa/' + NomeArquivo, function (err) {
if (err) throw err;
const shell = require('shelljs');
// CONVERTER O .mp3 para .wav
//const ComandoConvert = `ffmpeg -i ${Variables('src_media')}alexa/${NomeArquivo} ${Variables('src_media')}alexa/${NomeArquivo}.wav`;
//shell.exec(ComandoConvert, function (sucesso) {
//NomeArquivo += ".wav";
// CONVERTER O .wav PARA TEXTO
var audioTotext = null;
if (Modo == "classroom") {
let Comando = 'export GOOGLE_APPLICATION_CREDENTIALS="/var/www/html/assets/ZoeRobot-1ead32c17478.json";python ' + Variables('src_media') + 'assets/speech_cloud.py ' + NomeArquivo;
//let Comando = 'python ' + Variables('src_media') + 'assets/audio_to_text.py ' + NomeArquivo;
//console.log(Comando);
audioTotext = shell.exec(Comando);
}
else {
let Comando = 'python ' + Variables('src_media') + 'assets/audio_to_text.py ' + NomeArquivo;
//audioTotext = spawn('python', [Variables('src_media') + 'assets/audio_to_text.py', NomeArquivo]);
audioTotext = shell.exec(Comando);
}
var Pergunta = audioTotext.stdout;
console.log("Aluno: " + Pergunta);
if (Modo == "conversation") { // MODO CONVERSACAO LIVRE
console.log("Conversação livre");
// ENVIA A PERGUNTA PARA MITSUKU
EnviaPerguntaMitsuku(Pergunta, SessaoID, function(Resposta) {
if (Pergunta.includes("Google Speech Recognition could not understand audio") || Pergunta.includes("Could not request results from Google Speech Recognition service"))
Resposta = FraseNaoEntendeu;
EnviaResposta(Resposta, NomeArquivo, res, 0, Resposta, Vezes, 0, 0, 1, Velocidade);
});
}
else if (Modo == "classroom") { // MODO SALA DE AULA
console.log("Conversação em ambiente de aula");
// VERIFICA A INTENCAO ATRAVES DA SENTENCA PROFERIDA PELO USUARIO
VerificaIntencao(ArvoreID, Pergunta, UltimoIntentID, Vezes, Matricula, IDUnidade, function(Resposta, idalexaintents, ExemploResposta, newVezes, Final, RetornaPergunta, Coerente) {
EnviaResposta(Resposta, NomeArquivo, res, idalexaintents, ExemploResposta, newVezes, Final, RetornaPergunta, Coerente, Velocidade);
});
}
else if (Modo == "config") { // MODO CONFIGURACAO DE VARIAVEIS
console.log("Configuração de variáveis do usuário");
ModoConfiguracao(Pergunta, NomeArquivo, res, Matricula, IDUnidade);
}
else if (Modo == "exercise") { // MODO EXERCICIO DE PRONUNCIA - verifica a pronúncia do aluno
console.log("Exercício de pronúncia - Aluno");
EnviaResposta(Pergunta, NomeArquivo, res, 0, Pergunta, 0, 0, 0, 1, Velocidade);
}
//});
})
}
});
})
function EnviaResposta(Resposta, NomeArquivo, res, idalexaintents, ExemploResposta, Vezes, Final, RetornaPergunta, Coerente, Velocidade) {
console.log("Robot: " + Resposta);
const fs = require('fs');
const shell = require('shelljs');
const ModoCoversao = 3;
if (ModoCoversao == 1) {
// CONVERTE A RESPOSTA EM TEXTO PARA AUDIO
shell.exec(`pico2wave --wave=${Variables("src_media") + "alexa/" + NomeArquivo.split('.')[0]}.wav "${Resposta}"`, function(Resultado) {
// CONVERTE O AUDIO .WAV PARA .MP3
shell.exec(`ffmpeg -i ${Variables('src_media')}alexa/${NomeArquivo.split('.')[0]}.wav ${Variables('src_media')}alexa/${NomeArquivo.split('.')[0]}_exit.mp3 -loglevel quiet -stats`, function (sucesso) {
// APAGA O AUDIO .WAV DO SERVIDOR
shell.exec(`rm ${Variables('src_media')}alexa/${NomeArquivo.split('.')[0]}.wav`);
// ENVIA O LINK DO AUDIO GERADO COMO RETORNO DA REQUISIÇÃO
res.send(JSON.stringify({
"status": 200,
"url_audio": "http://18.228.91.135/alexa/" + NomeArquivo.split(".")[0] + "_exit.mp3",
"UltimoIntentID": idalexaintents,
"Vezes": Vezes,
"ExemploResposta": ExemploResposta,
"Final": Final,
"RetornaPergunta": RetornaPergunta,
"Coerente": Coerente
}));
// EXCLUI O ARQUIVO DE AUDIO DE ENTRADA
shell.exec('rm ' + Variables('src_media') + 'alexa/' + NomeArquivo);
});
});
}
else if (ModoCoversao == 2) {
// CONVERTE A RESPOSTA EM TEXTO PARA AUDIO
shell.exec(`python ${Variables('src_media')}assets/text_to_audio2.py "${Resposta}" ${NomeArquivo}`, function(Sucesso) {
// ENVIA O LINK DO AUDIO GERADO COMO RETORNO DA REQUISIÇÃO
res.send(JSON.stringify({
"status": 200,
"url_audio": "http://18.228.91.135/alexa/" + NomeArquivo.split(".")[0] + "_exit.mp3",
"UltimoIntentID": idalexaintents,
"Vezes": Vezes,
"ExemploResposta": ExemploResposta,
"Final": Final,
"RetornaPergunta": RetornaPergunta,
"Coerente": Coerente
}));
// EXCLUI O ARQUIVO DE AUDIO DE ENTRADA
shell.exec('rm ' + Variables('src_media') + 'alexa/' + NomeArquivo);
});
}
else if (ModoCoversao == 3) {
const request = require('request');
var options = {
uri: 'https://texttospeechapi.wideo.co/api/wideo-text-to-speech',
method: 'POST',
json: { "data":{"text":Resposta,"speed":Velocidade,"voice":"en-US-Standard-H"} }
};
request(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
shell.exec(`wget "${response['body']['result']['url']}" -O ${Variables("src_media")}alexa/${NomeArquivo.split(".")[0]}_exit.mp3 -q;`, function(Sucesso) {
res.send(JSON.stringify({
"status": 200,
"url_audio": "http://18.228.91.135/alexa/" + NomeArquivo.split(".")[0] + "_exit.mp3",
"UltimoIntentID": idalexaintents,
"Vezes": Vezes,
"ExemploResposta": ExemploResposta,
"Final": Final,
"RetornaPergunta": RetornaPergunta,
"Coerente": Coerente
}));
// EXCLUI O ARQUIVO DE AUDIO DE ENTRADA
shell.exec('rm ' + Variables('src_media') + 'alexa/' + NomeArquivo);
});
}
});
}
else {
// CONVERTE A RESPOSTA EM TEXTO PARA AUDIO
const textToaudio = spawn('python', [Variables('src_media') + 'assets/text_to_audio.py', Resposta, NomeArquivo]);
textToaudio.stdout.on('data', function(data) {
// ENVIA O LINK DO AUDIO GERADO COMO RETORNO DA REQUISIÇÃO
res.send(JSON.stringify({
"status": 200,
"url_audio": "http://18.228.91.135/alexa/" + NomeArquivo.split(".")[0] + "_exit.mp3",
"UltimoIntentID": idalexaintents,
"Vezes": Vezes,
"ExemploResposta": ExemploResposta,
"Final": Final,
"RetornaPergunta": RetornaPergunta,
"Coerente": Coerente
}))
// EXCLUI O ARQUIVO DE AUDIO DE ENTRADA
try {
fs.unlinkSync(Variables('src_media') + 'alexa/' + NomeArquivo);
}
catch (e) {
console.log("Sem audio na entrada para excluir");
}
});
}
}
function EnviaPerguntaMitsuku(Pergunta, SessaoID, callback) {
// TROCA A PALAVRA ZOE POR MITSUKU
Pergunta = ReplaceAll(Pergunta, ["Zoe"], ["Mitsuku"], 10);
// ENVIA A PERGUNTA EM TEXTO PARA MITSUKU
const querystring = require('querystring');
const request = require('request');
var form = {
input: Pergunta,
botid: '9fa364f2fe345a10', // ID do bot (CONSTANTE)
custid: SessaoID // ID do usuário falando com o bot, ex: b3dfe148ae499f98
};
var formData = querystring.stringify(form);
request({
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
uri: 'https://kakko.pandorabots.com/pandora/talk-xml',
body: formData,
method: 'POST'
}, function (err, res2, body) {
var striptags = require('striptags');
var Resposta = body;
try { Resposta = body.split('<that>')[1].split('</that>')[0]; } catch (e) { }
Resposta = decodeURI(Resposta);
Resposta = striptags(Resposta);
RemoverTagsDoTexto(Resposta, ["xgallery.", "xloadswf2.", "xloadswf3.", "xlink.", "xnslink."], function(NewResposta) {
if (NewResposta.includes("Human Virus deletion program started"))
NewResposta = NewResposta.split("Human Virus deletion program started")[0];
if (NewResposta.includes("This is a list of the games I can play with you"))
NewResposta = NewResposta.split(".")[NewResposta.split(".").length - 1];
if (NewResposta.includes("&lt;img") && NewResposta.includes("/img&gt;"))
NewResposta = NewResposta.split("&lt;P")[0] + NewResposta.split("/P&gt;")[1];
if (NewResposta.includes("&lt;P") && NewResposta.includes("/P&gt;"))
NewResposta = NewResposta.split("&lt;P")[0] + NewResposta.split("/P&gt;")[1];
NewResposta = ReplaceAll(NewResposta, ["Mitsuku", "&lt;br&gt;", "&quot;"], ["Zoe", " ", '"'], 15);
callback(NewResposta);
});
});
}
function ReplaceAll(Texto, Palavras, TrocarPor, Vezes) {
for (let i = 0; i < Vezes; i++) {
for (let o = 0; o < Palavras.length; o++) {
Texto = Texto.replace(Palavras[o], TrocarPor[o]);
}
}
return Texto;
}
function VerificaIntencao(ArvoreID, Pergunta, UltimoIntentID, Vezes, Matricula, IDUnidade, callback) {
// PROCURA POR UMA SENTENCA QUE SEJA IGUAL A QUE O USUARIO PROFERIU
let newPergunta = Pergunta.substring(0, Pergunta.length - 1);
let sqlQry1 = `SELECT * FROM alexasentences WHERE sentence = "${newPergunta}";`;
mysqlConnection.query(sqlQry1, function (error, results, fields) {
if (results.length == 0) { // NAO ENCONTROU UMA INTENCAO A PRIMEIRA INSTANCIA
// SEPARA A FRASE DO USUARIO POR PALAVRAS
let Palavras = newPergunta.split(' ');
//Palavras[Palavras.length - 1] = Palavras[Palavras.length - 1].substring(0, Palavras[Palavras.length - 1].length - 1);
// PROCURA EM TODAS AS SENTENCAS A MAIS PROXIMA DA QUAL O USUARIO PROFERIU
AproximacaoSentencial(Palavras, ArvoreID, function(Intencao) {
// VERIFICA SE A INTENCAO ESTA LIGADA AO CONTEXTO
VerificaConexoes(ArvoreID, Intencao, UltimoIntentID, Vezes, Pergunta, Matricula, IDUnidade, function(Resposta, ExemploResposta, newVezes, newUltimoIntentID, Final, RetornaPergunta, Coerente) {
callback(Resposta, newUltimoIntentID, ExemploResposta, newVezes, Final, RetornaPergunta, Coerente);
});
});
}
else { // ENCONTROU UMA INTENCAO A PRIMEIRA INSTANCIA
// VERIFICA SE A INTENCAO ESTA LIGADA AO CONTEXTO
let AlexaSentence = results;
VerificaConexoes(ArvoreID, AlexaSentence[0], UltimoIntentID, Vezes, Pergunta, Matricula, IDUnidade, function(Resposta, ExemploResposta, newVezes, newUltimoIntentID, Final, RetornaPergunta, Coerente) {
callback(Resposta, newUltimoIntentID, ExemploResposta, newVezes, Final, RetornaPergunta, Coerente);
})
}
});
}
function AproximacaoSentencial(Palavras, idconversationtree, callback) {
/*let sqlQry1 = `SELECT R.idalexaintents, (SELECT sentence FROM alexasentences WHERE idalexaintents = R.idalexaintents LIMIT 1) AS sentence FROM (SELECT idalexaintents, (`;
for (let i = 0; i < Palavras.length; i++) {
if (i > 0)
sqlQry1 += ` + `;
sqlQry1 += `CASE WHEN sentence LIKE "%${Palavras[i]}%" THEN 1 ELSE 0 END`;
}
sqlQry1 += `) AS Qtde FROM alexasentences WHERE `;
for (let o = 0; o < Palavras.length; o++) {
if (o > 0)
sqlQry1 += ` OR `;
sqlQry1 += `sentence LIKE "%${Palavras[o]}%"`;
}
sqlQry1 += ` GROUP BY idalexaintents, Qtde ORDER BY Qtde DESC LIMIT 1) R RIGHT JOIN alexanextintents an ON an.idalexaintents = R.idalexaintents WHERE an.idconversationtree = ${idconversationtree} LIMIT 1;`;*/
let sqlQry1 = `SELECT * FROM (SELECT idalexasentences, sentence, (`;
for (let i = 0; i < Palavras.length; i++) {
if (i > 0)
sqlQry1 += ` + `;
sqlQry1 += `CASE WHEN sentence LIKE "%${Palavras[i]}%" THEN 1 ELSE 0 END`;
}
sqlQry1 += `) AS Qtde FROM alexasentences WHERE `;
for (let o = 0; o < Palavras.length; o++) {
if (o > 0)
sqlQry1 += ` OR `;
sqlQry1 += `sentence LIKE "%${Palavras[o]}%"`;
}
sqlQry1 += ` GROUP BY idalexaintents, idalexasentences, Qtde ORDER BY Qtde DESC) R
INNER JOIN (select
als.idalexasentences,
als.idalexaintents,
als.sentence,
ali.reqIntent,
ali.resIntent,
ani.idalexaintents_next,
(select als1.sentence from alexasentences als1 where als1.idalexaintents = ani.idalexaintents_next limit 1) as 'nextSentece'
from alexaintents ali
inner join alexasentences als on als.idalexaintents = ali.idalexaintents
inner join alexanextintents ani on ani.idalexaintents = als.idalexaintents
where ani.idconversationtree = ${idconversationtree}
order by ani.idalexanextintents asc) T
on T.idalexasentences = R.idalexasentences
order by R.Qtde desc;`;
//console.log(sqlQry1);
mysqlConnection.query(sqlQry1, function (error, results, fields) {
callback(results);
});
}
function VerificaConexoes(ArvoreID, Intencao, UltimoIntentID, Vezes, Pergunta, Matricula, IDUnidade, callback) {
//console.log(Intencao);
// CONSULTA A RESPOSTA PARA A INTENCAO REQUISITADA
Vezes++;
let FraseIntencaoNaoEncontrada = FraseNaoEntendeu;
if (!Intencao || Intencao.length == 0) {
IntencaoResposta = FraseIntencaoNaoEncontrada;
callback(IntencaoResposta, "", Vezes, UltimoIntentID, false, 0);
return;
}
else {
if (Intencao.length > 1)
Intencao = Intencao[0];
}
// SQL PARA CONFERIR SE A FRASE DO ALUNO CONDIZ COM O DIALOGO
let sqlQry0 = `SELECT an.*, ai.resIntent FROM alexanextintents an INNER JOIN alexaintents ai ON ai.idalexaintents = an.idalexaintents WHERE an.idalexaintents = ${UltimoIntentID};`;
// CONSULTAR A INTENCAO ANTERIOR
mysqlConnection.query(sqlQry0, function (error0, results0, fields0) {
let Coerente = false;
let UltimaPergunta = "";
if (results0.length > 0) {
// CONSULTAR SE A INTENCAO DITA PELO ALUNO ESTA PRESENTE NA ARVORE DE INTENCOES ATUAL
for (let i = 0; i < results0.length; i++) {
if (results0[i].idalexaintents_next == Intencao['idalexaintents']) {
Coerente = true;
UltimaPergunta = results0[i].resIntent;
}
}
}
// SE FOR A PRIMEIRA CHAMADA DO ALUNO E NAO TIVER UMA INTENT ANTERIOR
if (UltimoIntentID == 0) {
Coerente = true;
UltimaPergunta = Intencao['resIntent'];
}
// SE NAO ESTIVER, ALUNO DISSE ALGO QUE NAO CONDIZ COM O DIALOGO ESPERADO
if (!Coerente) {
IntencaoResposta = FraseIntencaoNaoEncontrada;
callback(IntencaoResposta, "", Vezes, UltimoIntentID, false, 0);
return;
}
else {
// SE A INTENCAO DO ALUNO FOR COERENTE COM O DIALOGO
let sqlQry1 = `SELECT * FROM alexaintents WHERE idalexaintents = ${Intencao['idalexaintents']};`;
mysqlConnection.query(sqlQry1, function (error, results, fields) {
let IntencaoResposta = "";
let IntencaoExemplo = "";
let Final = 0;
let RetornaPergunta = 0;
let newUltimoIntentID = Intencao['idalexaintents'];
// ENCONTROU A INTENCAO DO USUARIO
if (Intencao['idalexaintents'] != 0 && results.length > 0) {
IntencaoResposta = results[0]['resIntent'];
Final = results[0]['endSession'];
RetornaPergunta = results[0]['askRobot'];
if (Intencao['idalexaintents'] == 33)
IntencaoExemplo = UltimaPergunta;
else
IntencaoExemplo = results[0]['exampleResponse'];
}
else // NAO ENCONTROU A INTENCAO
IntencaoResposta = FraseIntencaoNaoEncontrada;
if (IntencaoResposta == "I said, " && UltimoIntentID != 0) { // SE O USUARIOS ESTIVER PEDINDO PRA REPETIR
// CONSULTA QUAL FOI A ULTIMA INTENCAO DITA PELO ROBO PARA ESTE REPETIR
let sqlQry3 = `SELECT * FROM alexaintents WHERE idalexaintents = ${UltimoIntentID};`;
mysqlConnection.query(sqlQry3, function (error, results3, fields) {
// CONCATENA AS DUAS RESPOSTAS
IntencaoResposta += results3[0]['resIntent'];
IntencaoExemplo = results3[0]['exampleResponse'];
newUltimoIntentID = UltimoIntentID;
VerificaVariaveis(IntencaoResposta, Pergunta, Matricula, IDUnidade, Intencao, function(NovaResposta) {
callback(NovaResposta, IntencaoExemplo, Vezes, newUltimoIntentID, Final, RetornaPergunta, 1);
})
});
}
else { // SE FOR QUALQUER OUTRA INTENCAO QUE NAO 'REPEAT PLEASE'
if (UltimoIntentID == 0) { // SE O ULTIMO INTENTID FOR '0', ENTAO É A PRIMEIRA FRASE DO ROBO E NAO VERIFICA AS CONEXOES
VerificaVariaveis(IntencaoResposta, Pergunta, Matricula, IDUnidade, Intencao, function(NovaResposta) {
callback(NovaResposta, IntencaoExemplo, Vezes, newUltimoIntentID, Final, RetornaPergunta, 1);
})
}
else { // SE JA ESTIVER EM CONVERSACAO, VERIFICAR AS CONEXOES DE CONTEXTO DO DIALOGO
let sqlQry2 = `SELECT * FROM alexanextintents WHERE idalexaintents = ${UltimoIntentID} AND idconversationtree = ${ArvoreID};`;
mysqlConnection.query(sqlQry2, function (error, results2, fields) {
// CRIA LISTA COM PROXIMAS INTENCOES POSSIVEIS
if (results2.length > 0) {
let ProximasIntencoes = results2;
let IntencaoValida = false;
for (let i = 0; i < ProximasIntencoes.length; i++) {
// VERIFICA SE A INTENCAO REQUISITADA ESTA CONTIDA NA LISTA DE POSSIVEIS INTENCOES DE RESPOSTA
if (ProximasIntencoes[i]['idalexaintents_next'] == Intencao['idalexaintents']) {
IntencaoValida = true;
break;
}
}
if (!IntencaoValida) // SE A INTENCAO NAO ESTIVER NA LISTA
IntencaoResposta = FraseIntencaoNaoEncontrada;
}
else // SE NAO HOUVER UMA POSSIVEL CONEXAO PARA ESSA INTENCAO
IntencaoResposta = FraseIntencaoNaoEncontrada;
VerificaVariaveis(IntencaoResposta, Pergunta, Matricula, IDUnidade, Intencao, function(NovaResposta) {
callback(NovaResposta, IntencaoExemplo, Vezes, newUltimoIntentID, Final, RetornaPergunta, 1);
})
});
}
}
});
}
});
}
function VerificaVariaveis(IntencaoResposta, Pergunta, Matricula, IDUnidade, Intencao, callback) {
let Variaveis = [];
let VariaveisValor = [];
let ArrayFrase;
let VariavelRobo = false;
let VariavelAluno = false;
try {
if (IntencaoResposta.includes('+')) // VERIFICA SE POSSUI VARIAVEIS NA RESPOSTA DO ROBO
VariavelRobo = true;
if (Intencao['sentence'].includes('+')) // VERIFICA SE POSSUI VARIAVEIS NA RESPOSTA DO ALUNO
VariavelAluno = true;
if (!VariavelRobo && !VariavelAluno) // SE NAO POSSUIR NENHUMA VARIAVEL NA SENTENCA
fs.readdir("/ss") // CAUSA UM ERRO PARA O SISTEMA PULAR PARA O CATCH
if (VariavelAluno) { // EXISTE VARIAVEIS NA RESPOSTA DO ALUNO - ATUALIZAR/INSERIR OS VALORES
// MONTA UM ARRAY COM A FRASE DE RESPOSTA DO ALUNO
ArrayFrase = Intencao['sentence'].split('+');
for (let i = 1; i < ArrayFrase.length; i = i + 2) {
Variaveis.push(ArrayFrase[i]);
VariaveisValor.push("");
}
for (let x = 0; x < Variaveis.length; x++) { // CONSULTAR O VALOR DE CADA VARIAVEL PARA ATUALIZACAO DE VALORES
let sqlSearchVariable = `SELECT
au.valuecli
FROM alexauservariables au
INNER JOIN alexavariables av ON av.idalexavariables = au.idalexavariables
WHERE au.idusers = ${Matricula} AND au.idunits = ${IDUnidade} AND av.description = '${Variaveis[x]}';`;
AtualizaValoresVariaveis(sqlSearchVariable, IntencaoResposta, Pergunta, Variaveis, Matricula, IDUnidade, function(valuecli) {
//console.log("Variavel " + Variaveis[x] + " atualizada com sucesso!");
if (x == Variaveis.length - 1) { // ULTIMA VARIAVEL JA ATUALIZADA
if (!VariavelRobo) // NAO EIXSTE VARIAVEIS NA FRASE DE RESPOSTA DO ROBO
callback(IntencaoResposta);
else { // EXISTE VARIAVEIS NA FRASE DE RESPOSTA DO ROBO - ATUALIZAR A FRASE COM ESSES VALORES
ArrayFrase = [];
Variaveis = [];
VariaveisValor = [];
// MONTA UM ARRAY COM A FRASE DE RESPOSTA DO ROBO
ArrayFrase = IntencaoResposta.split('+');
for (let i = 1; i < ArrayFrase.length; i = i + 2) {
Variaveis.push(ArrayFrase[i]);
VariaveisValor.push("");
}
for (let i = 0; i < Variaveis.length; i++) { // CONSULTAR O VALOR DE CADA VARIAVEL CONTIDA NA FRASE DE RESPOSTA
ConsultarValorVariavel(Variaveis[i], Matricula, IDUnidade, function(valuecli) {
VariaveisValor[i] = valuecli;
if (i == Variaveis.length - 1) {
for (let y = 0; y < Variaveis.length; y++) {
let splitResposta = IntencaoResposta.split('+' + Variaveis[y] + '+');
newResposta = splitResposta[0] + VariaveisValor[y] + splitResposta[1]; // REMONTA A FRASE SUBSTITUINDO OS VALORES DAS VARIAVEIS
IntencaoResposta = newResposta;
if (y == Variaveis.length - 1) // ULTIMA VARIAVEL JA SUBSTITUIDA
callback(IntencaoResposta); // RETORNA NOVA FRASE
}
}
})
}
}
}
});
}
}
}
catch (e) { // NAO EXISTE VARIAVEL NA SENTENCA
callback(IntencaoResposta);
}
}
function AtualizaValoresVariaveis(sqlSearchVariable, IntencaoResposta, Pergunta, Variaveis, Matricula, IDUnidade, callback) {
let ModoInserir;
mysqlConnection.query(sqlSearchVariable, function (error, results0, fields) {
if (results0.length > 0) { // ENCONTROU UM VALOR JA ATRIBUIDO PARA ESSA VARIAVEL
ModoInserir = false
}
else { // NAO ENCONTROU UM VALOR PARA ESSA VARIAVEL
ModoInserir = true;
}
// VERIFICA TODAS AS SENTENCAS DESSA INTENCAO
let sqlQry1 = `SELECT
*
FROM alexasentences
WHERE idalexaintents = (SELECT idalexaintents FROM alexaintents WHERE resIntent = "${IntencaoResposta}");`;
mysqlConnection.query(sqlQry1, function (error, results, fields) {
let ArrayPergunta = Pergunta.split(' ');
let UltimoIndexArray = ArrayPergunta.length - 1;
for (let i = 0; i < ArrayPergunta[UltimoIndexArray].length; i++) { // REMOVE O \r\n DO FINAL DA ULTIMA PALAVRA
let UltimaLeta = ArrayPergunta[UltimoIndexArray][ArrayPergunta[UltimoIndexArray].length - 1];
if (UltimaLeta == "\r" || UltimaLeta == "\n") {
ArrayPergunta[UltimoIndexArray] = ArrayPergunta[UltimoIndexArray].substring(0, ArrayPergunta[UltimoIndexArray].length - 1);
}
else
break;
}
// MONTA ARRAY COM TODAS AS SENTENCAS DESSA INTENCAO
let Sentencas = [];
for (let o = 0; o < results.length; o++) {
Sentencas.push(results[o]['sentence'].split(' '));
}
let NovoValor = "";
let indexVariavelAtual = 0;
// PARA CADA VARIAVEL CONTIDA NA FRASE
for (let i = 0; i < Variaveis.length; i++) {
// PARA CADA SENTENCA VERIFICA QUAIS AS PALAVRAS NAO ESTAO PRESENTES NESTA PARA VERIFICAR SE CONDIZ COM A VARIAVEL
indexVariavelAtual = i;
for (let o = 0; o < Sentencas.length; o++) { // PARA CADA SENTENCA
for (let p = 0; p < ArrayPergunta.length; p++) { // PARA CADA PALAVRA DA FRASE DO USUARIO
for (let q = 0; q < Sentencas[o].length; q++) { // PARA CADA PALAVRA DE CADA SENTENCA
if (Sentencas[o][q] == ArrayPergunta[p]) // VERIFICA SE AS PALAVRAS SAO IGUAIS
ArrayPergunta[p] = ''; // SE IGUAIS ENTAO REMOVE, MANTENDO SOMENTE AS DIFERENTES NO ARRAY
}
}
}
// VERIFICAR OS VALORES QUE SAO DIFERENTES DAS PALAVRAS CONTIDAS NAS FRASES, ATRIBUINDO O VALOR DA VARIAVEL COM ESTE
for (let o = 0; o < ArrayPergunta.length; o++) {
if (ArrayPergunta[o] != '') {
if (!Variaveis[i].includes("Spell")) // SE FOR ALGUMA VARIAVEL DE TEXTO
NovoValor = ArrayPergunta[o];
else { // SE FOR ALGUMA VARIAVEL DE SOLETRAGEM
if (ArrayPergunta[o].length == 1) // SE A PALAVRAS TIVER APENAS UMA LETRA
NovoValor += ArrayPergunta[o] + "-";
}
}
}
if (Variaveis[i].includes("Spell"))
NovoValor = NovoValor.substring(0, NovoValor.length - 1); // REMOVE O ULTIMO - DA VARIAVEL
}
// ALTERA O VALOR DA VARIAVEL PARA O NOVO VALOR DITO PELO ALUNO
InserirValorVariavel(ModoInserir, Variaveis[indexVariavelAtual], NovoValor, Matricula, IDUnidade, function(Sucesso) {
callback(NovoValor);
});
});
});
}
function ModoConfiguracao(Pergunta, NomeArquivo, res, Matricula, IDUnidade) {
let Resposta = "";
try {
if (Pergunta.toLowerCase().includes("change my")) { // ALTERAR VALOR DA VARIAVEL - FRASE EXEMPLO: change my name to Diego
let Variavel = Pergunta.split(' ')[2]; // change my NAME to diego
let NovoValor = Pergunta.split(' ')[4]; // change my name to DIEGO
NovoValor = NovoValor.substring(0, NovoValor.length - 1);
let sqlSearchVariable = `SELECT au.valuecli FROM alexauservariables au INNER JOIN alexavariables av
ON av.idalexavariables = au.idalexavariables WHERE au.idusers = ${Matricula} AND au.idunits = ${IDUnidade} AND av.description = '${Variavel}';`;
mysqlConnection.query(sqlSearchVariable, function (error, results, fields) {
let ModoInserir = false;
if (results.length == 0)
ModoInserir = false;
InserirValorVariavel(ModoInserir, Variavel, NovoValor, Matricula, IDUnidade, function(Sucesso) {
if (Sucesso) // CONSEGUIU DEFINIR A VARIAVEL COM O NOVO VALOR
Resposta = "Your " + Variavel + " was changed to " + NovoValor;
else // ERRO AO DEFINIR NOVO VALOR PARA VARIAVEL
Resposta = "Fail to define your " + Variavel;
EnviaResposta(Resposta, NomeArquivo, res, 0, "", 0, 1, 1, VelocidadePadrao);
})
})
}
else if (Pergunta.toLowerCase().includes("say my")) { // FALAR VALOR DA VARIAVEL - FRASE EXEMPLO: say my name
let Variavel = Pergunta.split(' ')[2]; // say my NAME
Variavel = Variavel.substring(0, Variavel.length - 1);
ConsultarValorVariavel(Variavel, Matricula, IDUnidade, function(valuecli) {
if (valuecli != "") // ENCONTROU VALOR PARA ESSA VARIAVEL
Resposta = "Your " + Variavel + " is " + results[0]['valuecli'];
else // NAO ENCONTROU VALOR PARA ESSA VARIAVEL
Resposta = "I yet not know your " + Variavel + ". Say change my " + Variavel + " to your " + Variavel + " to insert it.";
EnviaResposta(Resposta, NomeArquivo, res, 0, "", 0, 1, 1, VelocidadePadrao);
})
}
else { // COMANDO DESCONHECIDO
Resposta = FraseNaoEntendeu;
EnviaResposta(Resposta, NomeArquivo, res, 0, "", 0, 1, 1, VelocidadePadrao);
}
}
catch(e) { // HOUVE ALGUM ERRO DURANTE O PROCESSO OU FRASE INCORRETA
Resposta = FraseNaoEntendeu;
EnviaResposta(Resposta, NomeArquivo, res, 0, "", 0, 1, 1, VelocidadePadrao);
}
}
function InserirValorVariavel(Inserir, Variavel, NovoValor, Matricula, IDUnidade, callback) {
let sqlChangeVariable = ``;
if (Inserir == true) {
sqlChangeVariable = `INSERT INTO alexauservariables (idalexavariables, valuecli, idusers, idunits)
VALUES ((SELECT idalexavariables FROM alexavariables WHERE description = '${Variavel}'), '${NovoValor}', ${Matricula}, ${IDUnidade});`;
}
else {
sqlChangeVariable = `UPDATE alexauservariables SET valuecli = '${NovoValor}'
WHERE idalexavariables = (SELECT idalexavariables FROM alexavariables WHERE description = '${Variavel}') AND idusers = ${Matricula} AND idunits = ${IDUnidade};`;
}
mysqlConnection.query(sqlChangeVariable, function (error, results, fields) {
let Sucesso = true;
if (error)
Sucesso = false;
callback(Sucesso);
})
}
function ConsultarValorVariavel(Variavel, Matricula, IDUnidade, callback) {
let sqlShowVariable = `SELECT au.valuecli FROM alexauservariables au INNER JOIN alexavariables av
ON av.idalexavariables = au.idalexavariables WHERE au.idusers = ${Matricula} AND au.idunits = ${IDUnidade} AND av.description = '${Variavel}';`;
mysqlConnection.query(sqlShowVariable, function (error, results, fields) {
let ValorVariavel = "";
if (results.length > 0)
ValorVariavel = results[0]['valuecli'];
else
ValorVariavel = "";
callback(ValorVariavel);
});
}
function RemoverTagsDoTexto(Texto, Palavras, callback) {
let NovoTexto = "";
for (let p = 0; p < Palavras.length; p++) {
for (var i = 0; i < Texto.split(Palavras[p]).length; i++) {
if (i % 2 == 0)
NovoTexto += Texto.split(Palavras[p])[i];
}
if (NovoTexto != "")
Texto = NovoTexto;
NovoTexto = "";
}
callback(Texto);
}
router.post('/recognizeFace/:token', (req, res) => {
let token = req.params.token;
if(token != Variables("tk_fixed")) {
res.status(500).send({ status: 'expired' });
return;
}
console.log("/RecognizeFace");
let form = new formidable.IncomingForm();
form.maxFileSize = 1024 * 1024 * 1024;
form.parse(req, function(err,fields,files){
const fs = require('fs');
var Foto = files.foto;
var CaminhoFoto = Variables('src_media') + 'faces/temp/' + Foto.name;
fs.rename(Foto.path, CaminhoFoto, function (err) {
if (err) throw err;
const shell = require('shelljs');
let ResRecognition = shell.exec("python3 " + Variables('src_media') + 'assets/login_face.py ' + CaminhoFoto);
let Matricula = ResRecognition.split('\\')[0];
if (Matricula.length < 1)
Matricula = "N/A";
//console.log(Matricula);
res.send(Matricula);
});
});
})
router.post('/cadastroFace/:token', (req, res) => {
let token = req.params.token;
if(token != Variables("tk_fixed")) {
res.status(500).send({ status: 'expired' });
return;
}
console.log("/RecognizeFace");
let fs = require('fs');
let form = new formidable.IncomingForm();
form.maxFileSize = 1024 * 1024 * 1024;
form.parse(req, function(err,fields,files){
let Matricula = fields.Matricula;
let Amostras = fields.Amostras;
let Fotos = "";
for (let i = 0; i < Amostras; i++) {
let Path = files['foto_' + (i + 1)].path;
let CaminhoFoto = Variables('src_media') + 'faces/temp/foto_' + (i + 1) + '.jpg';
fs.renameSync(Path, CaminhoFoto);
Fotos += " " + CaminhoFoto;
}
const Comando = 'python3 ' + Variables('src_media') + 'assets/cadastro_rosto.py ' + Matricula + Fotos;
const shell = require('shelljs');
let Request = shell.exec(Comando);
if (Request.stderr == '')
res.send(true);
else
res.send(false);
})
})
// #endregion
// #region ALEXA SKILL AMAZOM
router.post('/', function(req, res) {
if (req.body.request.type === 'LaunchRequest') {
console.log("Requisição Alexa");
NextIntents.push({
idalexaintents: [4],
sessionId: req.body.session.sessionId
})
//res.json(SendResponse("Hello! You have opened the MyRobot Dialog assistent! What is your name?", false));
res.json(SendResponse("Hey, whats your name?", false));
}
else if (req.body.request.type === 'IntentRequest') {
var NameIntent = req.body.request.intent.name;
console.log(NameIntent);
CheckIntent(req, res, NameIntent)
}
else {
console.log("ELSE");
res.json(SendResponse("Sorry, I did not understand you! Can you repeat please?", false));
}
});
function SendResponse(speechText, shouldEndSession) {
const speechOutput = "<speak>" + speechText + "</speak>"
var jsonObj = {
"version": "1.0",
"response": {
"shouldEndSession": shouldEndSession,
"outputSpeech": {
"type": "SSML",
"ssml": speechOutput
},
"card": {
"type": "Simple",
"title": "MyRobot Dialog",
"content": speechText,
"text": speechText
},
"reprompt": {
"outputSpeech": {
"type": "PlainText",
"text": speechText,
"ssml": speechText
}
}
}
}
return jsonObj
}
function CheckIntent(req, res, NameIntent, implement = "") {
let isRepeat = false;
let CorrectIntent = false;
try {
let resposta = req.body.request.intent.slots['Query'].value;
console.log("MyRobot Conversation");
console.log("Usuario: " + req.body.request.intent.slots['Query'].value);
GetMitsukoResponse(resposta, false, res);
return;
}
catch(e) {
if (this.JustConversation) {
if (NameIntent == "AMAZON.HelpIntent") {
res.json(SendResponse("This skill is a conversation with Mitsuko. Say hello to begin a chat, for example: Hello, my name is Tommy!", false));
return;
}
res.json(SendResponse("Sorry, I did not understand you! Can you repeat please?", false));
return;
}
console.log("MyRobot Dialog");
}
if (NameIntent == "RepeatPleaseIntent") {
isRepeat = true;
NameIntent = LastIntent;
}
const SQLQry = `
SELECT
ai.idalexaintents,
ai.reqIntent,
ai.resIntent,
ai.endSession,
ai.exampleResponse,
an.idalexaintents_next
FROM
alexaintents ai
LEFT JOIN
alexanextintents an
ON
ai.idalexaintents = an.idalexaintents
WHERE
ai.reqIntent = '${NameIntent}';`;
try {
mysqlConnection.query(SQLQry, function (error, results, fields) {
if (results.length == 0) {
try {
let resposta = req.body.request.intent.slots['Query'].value;
GetMitsukoResponse(resposta, false, res, req.body.session.sessionId);
return;
}
catch(e) {
if (NameIntent == "AMAZON.HelpIntent") {
res.json(SendResponse("This skill is a conversation with Mitsuko. Say hello to begin a chat, for example: Hello, my name is Tommy!", false));
return;
}
res.json(SendResponse("Sorry, I did not understand you! Can you repeat please?", false));
return;
}
}
for (let i = NextIntents.length - 1; i >= 0; i--) {
if (NextIntents[i].sessionId == req.body.session.sessionId) {
for (let o = 0; o < results.length; o++) {
if (results[o]['idalexaintents_next'] == null) {
CorrectIntent = true;
break;
}
for (let f = 0; f < NextIntents[i].idalexaintents.length; f++) {
if (results[o]['idalexaintents'] == NextIntents[i].idalexaintents[f] || NextIntents[i].idalexaintents[0] == null) {
CorrectIntent = true;
NextIntents[i].idalexaintents = [];
for (let g = 0; g < results.length; g++) {
NextIntents[i].idalexaintents.push(results[g]['idalexaintents_next']);
}
}
}
}
}
}
if (isRepeat) {
CorrectIntent = true;
implement = "I said, ";
}
if (NameIntent == "AMAZON.HelpIntent") {
res.json(SendResponse("This skill is a conversation with Mitsuko, you can to begin a chat saying hello, my name is... for example.", false));
return;
}
if (!CorrectIntent &&
NameIntent != "IntentExit" &&
NameIntent != "IntentStop" &&
NameIntent != "AMAZON.StopIntent" &&
NameIntent != "AMAZON.CancelIntent"
) {
res.json(SendResponse("Sorry, I did not understand you! Can you repeat please?", false));
return;
}
if (
NameIntent == "IntentStop" ||
NameIntent == "AMAZON.StopIntent" ||
NameIntent == "AMAZON.CancelIntent" ||
NameIntent == "IntentUsername"
) {
NextIntents[NextIntents.length - 1].idalexaintents = [ null ];
}
var resText = implement + results[0]['resIntent'];
var splitRes = resText.split('+');
var response = "";
let slotVal = "";
for (let i = 0; i < splitRes.length; i++) {
if (i % 2 == 0)
response+= splitRes[i];
else {
let Add = true;
for (let o = 0; o < Slots.length; o++) {
if (Slots[o].name == splitRes[i] && Slots[o].sessionId == req.body.session.sessionId && Slots[o].name != "Subject") {
Add = false;
slotVal = Slots[o].value;
}
}
if (Add) {
try {
Slots.push( {
name: splitRes[i],
value: req.body.request.intent.slots[splitRes[i]].value,
sessionId: req.body.session.sessionId
});
}
catch (e) {
Slots.push( {
name: splitRes[i],
value: "undefined",
sessionId: req.body.session.sessionId
});
}
slotVal = Slots[Slots.length - 1].value;
}
response+= slotVal;
}
}
if (results[0]['endSession'] == true) {
for (let o = 0; o < Slots.length; o++) {
if (Slots[o].sessionId == req.body.session.sessionId) {
Slots.splice(o, 1);
}
}
}
if (slotVal != "" && FirstAction) {
for (let y = Slots.length - 1; y >= 0; y--) {
if (Slots[y].name == "Action" && Slots[y].value == slotVal) {
if (Slots[y].value == "chat") {
FirstAction = false;
CheckIntent(req, res, "IntentChat", resText);
return;
}
}
else if (Slots[y].name == "Subject" && Slots[y].value == slotVal) {
let Complement = resText;
if (Slots[y].value == "movie" || Slots[y].value == "movies") {
Complement += " I like that! ";
FirstAction = false;
CheckIntent(req, res, "IntentMovie", Complement);
return;
}
else if (Slots[y].value == "family") {
Complement += " I like talk about it! ";
FirstAction = false;
CheckIntent(req, res, "IntentFamily", Complement);
return;
}
}
/*else if (Slots[y].name == "Movie" && Slots[y].value == slotVal) {
FirstAction = false;
CheckIntent(req, res, "IntentFamily", resText);
return;
}*/
}
}
if (!FirstAction)
FirstAction = true;
res.json(SendResponse(response, results[0]['endSession']));
//GetMitsukoResponse(response, results[0]['endSession'], res);
})
}
catch (e) {
if (NameIntent == "AMAZON.HelpIntent") {
res.json(SendResponse("This skill is a conversation with Mitsuko, you can to begin a chat saying hello, my name is... for example.", false));
return;
}
}
LastIntent = NameIntent;
}
function GetMitsukoResponse(Question, EndSession, res, Sessao) {
let Resposta = "";
var querystring = require('querystring');
var request = require('request');
var form = {
input: Question,
botid: '9fa364f2fe345a10', // ID do bot (trocar ? melhor não)
//custid: 'b3dfe148ae499f98' // ID do usuário falando com o bot
custid: Sessao // ID do usuário falando com o bot
};
var formData = querystring.stringify(form);
request({
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
uri: 'https://kakko.pandorabots.com/pandora/talk-xml',
body: formData,
method: 'POST'
}, function (err, res2, body) {
var striptags = require('striptags');
Resposta = body.split('<that>')[1].split('</that>')[0];
Resposta = decodeURI(Resposta);
Resposta = striptags(Resposta);
let NewResposta = "";
for (var i = 0; i < Resposta.split('xgallery.').length; i++) {
if (i % 2 == 0)
NewResposta += Resposta.split('xgallery.')[i];
}
if (NewResposta == "")
Resposta = NewResposta;
console.log("Mitsuko: " + NewResposta);
res.json(SendResponse(NewResposta, EndSession));
});
}
// #endregion
return router;
}
module.exports = routes;