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;