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('')[1].split('')[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("<img") && NewResposta.includes("/img>"))
NewResposta = NewResposta.split("<P")[0] + NewResposta.split("/P>")[1];
if (NewResposta.includes("<P") && NewResposta.includes("/P>"))
NewResposta = NewResposta.split("<P")[0] + NewResposta.split("/P>")[1];
NewResposta = ReplaceAll(NewResposta, ["Mitsuku", "<br>", """], ["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, what’s 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 = "" + speechText + ""
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('')[1].split('')[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;