1384 lines
65 KiB
JavaScript
1384 lines
65 KiB
JavaScript
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("<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 = "<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;
|