diff --git a/packages/core.gbapp/services/GBConversationalService.ts b/packages/core.gbapp/services/GBConversationalService.ts index e58accb3..a8bb75fa 100644 --- a/packages/core.gbapp/services/GBConversationalService.ts +++ b/packages/core.gbapp/services/GBConversationalService.ts @@ -51,8 +51,6 @@ const { join } = require('path'); const shell = require('any-shell-escape'); const { exec } = require('child_process'); const prism = require('prism-media'); -const sdk = require('microsoft-cognitiveservices-speech-sdk'); -sdk.Recognizer.enableTelemetry(false); const uuidv4 = require('uuid/v4'); const request = require('request-promise-native'); const fs = require('fs'); @@ -162,7 +160,9 @@ export class GBConversationalService { const name = GBAdminService.getRndReadableIdentifier(); const waveFilename = `work/tmp${name}.pcm`; - + const sdk = require('microsoft-cognitiveservices-speech-sdk'); + sdk.Recognizer.enableTelemetry(false); + var audioConfig = sdk.AudioConfig.fromAudioFileOutput(waveFilename); var speechConfig = sdk.SpeechConfig.fromSubscription(speechKey, cloudRegion); diff --git a/packages/core.gbapp/services/GBCoreService.ts b/packages/core.gbapp/services/GBCoreService.ts index 6fa23b81..dd91286b 100644 --- a/packages/core.gbapp/services/GBCoreService.ts +++ b/packages/core.gbapp/services/GBCoreService.ts @@ -56,7 +56,6 @@ import { GBAzureDeployerPackage } from '../../azuredeployer.gbapp'; import { GBSharePointPackage } from '../../sharepoint.gblib'; import { CollectionUtil } from 'pragmatismo-io-framework'; - const opn = require('opn'); /** @@ -127,8 +126,8 @@ export class GBCoreService implements IGBCoreService { const logging: boolean | Function = GBConfigService.get('STORAGE_LOGGING') === 'true' ? (str: string): void => { - GBLog.info(str); - } + GBLog.info(str); + } : false; const encrypt: boolean = GBConfigService.get('STORAGE_ENCRYPT') === 'true'; @@ -147,7 +146,8 @@ export class GBCoreService implements IGBCoreService { options: { encrypt: encrypt } - }, pool: { + }, + pool: { max: 32, min: 8, idle: 40000, @@ -156,12 +156,7 @@ export class GBCoreService implements IGBCoreService { } }; - this.sequelize = new Sequelize( - database, - username, - password, - sequelizeOptions - ); + this.sequelize = new Sequelize(database, username, password, sequelizeOptions); if (this.dialect === 'mssql') { this.queryGenerator = this.sequelize.getQueryInterface().QueryGenerator; @@ -211,7 +206,6 @@ export class GBCoreService implements IGBCoreService { */ public async loadInstances(): Promise { if (process.env.LOAD_ONLY !== undefined) { - const bots = process.env.LOAD_ONLY.split(`;`); const and = []; await CollectionUtil.asyncForEach(bots, async e => { @@ -224,8 +218,7 @@ export class GBCoreService implements IGBCoreService { } }; return GuaribasInstance.findAll(options); - } - else { + } else { const options = { where: { state: 'active' } }; return GuaribasInstance.findAll(options); } @@ -243,7 +236,6 @@ export class GBCoreService implements IGBCoreService { * Loads just one Bot instance. */ public async loadInstanceByActivationCode(code: string): Promise { - let options = { where: { activationCode: code, state: 'active' } }; return await GuaribasInstance.findOne(options); @@ -283,8 +275,7 @@ STORAGE_SYNC=true public async ensureProxy(port): Promise { try { - if (fs.existsSync('node_modules/ngrok/bin/ngrok.exe') || - fs.existsSync('node_modules/ngrok/bin/ngrok')) { + if (fs.existsSync('node_modules/ngrok/bin/ngrok.exe') || fs.existsSync('node_modules/ngrok/bin/ngrok')) { const ngrok = require('ngrok'); return await ngrok.connect({ port: port }, 10); @@ -302,7 +293,6 @@ STORAGE_SYNC=true } public installWebHook(isGet: boolean, url: string, callback: any) { - if (isGet) { GBServer.globals.server.get(url, (req, res) => { callback(req, res); @@ -311,7 +301,6 @@ STORAGE_SYNC=true GBServer.globals.server.post(url, (req, res) => { callback(req, res); }); - } } @@ -323,7 +312,6 @@ STORAGE_SYNC=true GBServer.globals.wwwroot = localPath; } - public async deleteInstance(botId: string) { const options = { where: {} }; options.where = { botId: botId }; @@ -360,21 +348,19 @@ STORAGE_SYNC=true let instances: IGBInstance[]; try { instances = await core.loadInstances(); - if (process.env.ENDPOINT_UPDATE === "true") { + if (process.env.ENDPOINT_UPDATE === 'true') { await CollectionUtil.asyncForEach(instances, async instance => { GBLog.info(`Updating bot endpoint for ${instance.botId}...`); try { await installationDeployer.updateBotProxy( instance.botId, - GBConfigService.get("CLOUD_GROUP"), + GBConfigService.get('CLOUD_GROUP'), `${proxyAddress}/api/messages/${instance.botId}` ); } catch (error) { - if (error.code === "ResourceNotFound") { - GBLog.warn(`Bot ${instance.botId} not found on resource group ${GBConfigService.get("CLOUD_GROUP")}.`); - } - else { - + if (error.code === 'ResourceNotFound') { + GBLog.warn(`Bot ${instance.botId} not found on resource group ${GBConfigService.get('CLOUD_GROUP')}.`); + } else { throw new Error(`Error updating bot proxy, details: ${error}.`); } } @@ -427,25 +413,27 @@ STORAGE_SYNC=true // Loads all system packages. const sysPackages: IGBPackage[] = []; - await CollectionUtil.asyncForEach([ - GBAdminPackage, - GBCorePackage, - GBSecurityPackage, - GBKBPackage, - GBCustomerSatisfactionPackage, - GBAnalyticsPackage, - GBWhatsappPackage, - GBAzureDeployerPackage, - GBSharePointPackage, - ], async e => { - GBLog.info(`Loading sys package: ${e.name}...`); + await CollectionUtil.asyncForEach( + [ + GBAdminPackage, + GBCorePackage, + GBSecurityPackage, + GBKBPackage, + GBCustomerSatisfactionPackage, + GBAnalyticsPackage, + GBWhatsappPackage, + GBAzureDeployerPackage, + GBSharePointPackage + ], + async e => { + GBLog.info(`Loading sys package: ${e.name}...`); - const p = Object.create(e.prototype) as IGBPackage; - sysPackages.push(p); + const p = Object.create(e.prototype) as IGBPackage; + sysPackages.push(p); - await p.loadPackage(core, core.sequelize); - - }); + await p.loadPackage(core, core.sequelize); + } + ); return sysPackages; } @@ -515,28 +503,22 @@ STORAGE_SYNC=true if (matches !== null) { const table = matches[1]; const re2 = /PRIMARY\s+KEY\s+\(\[[^\]]*\](?:,\s*\[[^\]]*\])*\)/; - sql = sql.replace( - re2, - (match: string, ...args: any[]): string => { - return `CONSTRAINT [${table}_pk] ${match}`; - } - ); + sql = sql.replace(re2, (match: string, ...args: any[]): string => { + return `CONSTRAINT [${table}_pk] ${match}`; + }); const re3 = /FOREIGN\s+KEY\s+\((\[[^\]]*\](?:,\s*\[[^\]]*\])*)\)/g; const re4 = /\[([^\]]*)\]/g; - sql = sql.replace( - re3, - (match: string, ...args: any[]): string => { - const fkcols = args[0]; - let fkname = table; - let matches2 = re4.exec(fkcols); - while (matches2 !== null) { - fkname += `_${matches2[1]}`; - matches2 = re4.exec(fkcols); - } - - return `CONSTRAINT [${fkname}_fk] FOREIGN KEY (${fkcols})`; + sql = sql.replace(re3, (match: string, ...args: any[]): string => { + const fkcols = args[0]; + let fkname = table; + let matches2 = re4.exec(fkcols); + while (matches2 !== null) { + fkname += `_${matches2[1]}`; + matches2 = re4.exec(fkcols); } - ); + + return `CONSTRAINT [${fkname}_fk] FOREIGN KEY (${fkcols})`; + }); } return sql; @@ -558,20 +540,17 @@ STORAGE_SYNC=true const table = matches[1]; const re2 = /(ADD\s+)?CONSTRAINT\s+\[([^\]]*)\]\s+FOREIGN\s+KEY\s+\((\[[^\]]*\](?:,\s*\[[^\]]*\])*)\)/g; const re3 = /\[([^\]]*)\]/g; - sql = sql.replace( - re2, - (match: string, ...args: any[]): string => { - const fkcols = args[2]; - let fkname = table; - let matches2 = re3.exec(fkcols); - while (matches2 !== null) { - fkname += `_${matches2[1]}`; - matches2 = re3.exec(fkcols); - } - - return `${args[0] ? args[0] : ''}CONSTRAINT [${fkname}_fk] FOREIGN KEY (${fkcols})`; + sql = sql.replace(re2, (match: string, ...args: any[]): string => { + const fkcols = args[2]; + let fkname = table; + let matches2 = re3.exec(fkcols); + while (matches2 !== null) { + fkname += `_${matches2[1]}`; + matches2 = re3.exec(fkcols); } - ); + + return `${args[0] ? args[0] : ''}CONSTRAINT [${fkname}_fk] FOREIGN KEY (${fkcols})`; + }); } return sql; @@ -591,7 +570,7 @@ STORAGE_SYNC=true /** * Get a dynamic param from instance. Dynamic params are defined in Config.xlsx * and loaded into the work folder from /publish command. - * + * * @param name Name of param to get from instance. * @param defaultValue Value returned when no param is defined in Config.xlsx. */ @@ -601,19 +580,22 @@ STORAGE_SYNC=true const params = JSON.parse(instance.params); value = params ? params[name] : defaultValue; } - if (typeof (defaultValue) === "boolean") { - return new Boolean(value ? value.toLowerCase() === "true" : defaultValue); + if (typeof defaultValue === 'boolean') { + return new Boolean(value ? value.toLowerCase() === 'true' : defaultValue); } - if (typeof (defaultValue) === "string") { + if (typeof defaultValue === 'string') { return value ? value : defaultValue; } - if (typeof (defaultValue) === "number") { - return new Number(value ? defaultValue : (defaultValue ? defaultValue : 0)); + if (typeof defaultValue === 'number') { + return new Number(value ? defaultValue : defaultValue ? defaultValue : 0); } - value = instance['dataValues'][name]; - if (value === null) { - const minBoot = GBServer.globals.minBoot as any; - value = minBoot.instance.datavalues[name]; + + if (instance['dataValues']) { + value = instance['dataValues'][name]; + if (value === null) { + const minBoot = GBServer.globals.minBoot as any; + value = minBoot.instance.datavalues[name]; + } } return value; diff --git a/packages/core.gbapp/services/GBDeployer.ts b/packages/core.gbapp/services/GBDeployer.ts index ff00f0af..537a21a7 100644 --- a/packages/core.gbapp/services/GBDeployer.ts +++ b/packages/core.gbapp/services/GBDeployer.ts @@ -374,7 +374,9 @@ export class GBDeployer implements IGBDeployer { if (Fs.existsSync(localPath)) { await this.deployBotFromLocalPath(localPath, GBServer.globals.publicAddress); } - min.instance.params = await this.loadParamsFromExcel(min); + if (process.env.ENABLE_PARAMS_ONLINE === "true"){ + min.instance.params = await this.loadParamsFromExcel(min); + } await this.core.saveInstance(min.instance); break; diff --git a/packages/core.gbapp/services/GBMinService.ts b/packages/core.gbapp/services/GBMinService.ts index 94c3c8a8..1d8d569e 100644 --- a/packages/core.gbapp/services/GBMinService.ts +++ b/packages/core.gbapp/services/GBMinService.ts @@ -112,14 +112,12 @@ export class GBMinService { * */ - public async buildMin( - instances: IGBInstance[], - ) { + public async buildMin(instances: IGBInstance[]) { // Serves default UI on root address '/' if web enabled. if (process.env.DISABLE_WEB !== 'true') { - let url = GBServer.globals.wwwroot ? - GBServer.globals.wwwroot : - urlJoin(GBDeployer.deployFolder, GBMinService.uiPackage, 'build'); + let url = GBServer.globals.wwwroot + ? GBServer.globals.wwwroot + : urlJoin(GBDeployer.deployFolder, GBMinService.uiPackage, 'build'); GBServer.globals.server.use('/', express.static(url)); } @@ -135,7 +133,6 @@ export class GBMinService { const url = '/webhooks/whatsapp'; GBServer.globals.server.post(url, async (req, res) => { try { - const id = req.body.messages[0].chatId.split('@')[0]; const senderName = req.body.messages[0].senderName; const text = req.body.messages[0].body; @@ -144,10 +141,14 @@ export class GBMinService { return; // Exit here. } let activeMin; - if (process.env.WHATSAPP_WELCOME_DISABLED !== "true") { - let toSwitchMin = GBServer.globals.minInstances.filter(p => p.instance.botId.toLowerCase() === text.toLowerCase())[0]; + if (process.env.WHATSAPP_WELCOME_DISABLED !== 'true') { + let toSwitchMin = GBServer.globals.minInstances.filter( + p => p.instance.botId.toLowerCase() === text.toLowerCase() + )[0]; if (!toSwitchMin) { - toSwitchMin = GBServer.globals.minInstances.filter(p => p.instance.activationCode ? p.instance.activationCode.toLowerCase() === text.toLowerCase() : false)[0]; + toSwitchMin = GBServer.globals.minInstances.filter(p => + p.instance.activationCode ? p.instance.activationCode.toLowerCase() === text.toLowerCase() : false + )[0]; } activeMin = toSwitchMin ? toSwitchMin : GBServer.globals.minBoot; @@ -157,37 +158,42 @@ export class GBMinService { let user = await sec.getUserFromSystemId(id); if (user === null) { - user = await sec.ensureUser(activeMin.instance.instanceId, id, senderName, "", "whatsapp", senderName); - await (activeMin as any).whatsAppDirectLine.sendToDevice(id, `Olá! Seja bem-vinda(o)!\nMe chamo ${activeMin.instance.title}. Como posso ajudar? Pode me falar que eu te ouço, me manda um aúdio.`); + user = await sec.ensureUser(activeMin.instance.instanceId, id, senderName, '', 'whatsapp', senderName); + await (activeMin as any).whatsAppDirectLine.sendToDevice( + id, + `Olá! Seja bem-vinda(o)!\nMe chamo ${activeMin.instance.title}. Como posso ajudar? Pode me falar que eu te ouço, me manda um aúdio.` + ); res.end(); } else { // User wants to switch bots. if (toSwitchMin !== undefined) { - const instance = await this.core.loadInstanceByBotId(activeMin.botId); await sec.updateUserInstance(id, instance.instanceId); await (activeMin as any).whatsAppDirectLine.resetConversationId(id); - await (activeMin as any).whatsAppDirectLine.sendToDevice(id, `Agora falando com ${activeMin.instance.title}...`); + await (activeMin as any).whatsAppDirectLine.sendToDevice( + id, + `Agora falando com ${activeMin.instance.title}...` + ); res.end(); - } - else { + } else { activeMin = GBServer.globals.minInstances.filter(p => p.instance.instanceId === user.instanceId)[0]; if (activeMin === undefined) { activeMin = GBServer.globals.minBoot; - await (activeMin as any).whatsAppDirectLine.sendToDevice(id, `O outro Bot que você estava falando(${user.instanceId}), não está mais disponível. Agora você está falando comigo, ${activeMin.instance.title}...`); + await (activeMin as any).whatsAppDirectLine.sendToDevice( + id, + `O outro Bot que você estava falando(${user.instanceId}), não está mais disponível. Agora você está falando comigo, ${activeMin.instance.title}...` + ); } await (activeMin as any).whatsAppDirectLine.received(req, res); } } - } - else { + } else { await (GBServer.globals.minBoot as any).whatsAppDirectLine.received(req, res); } } catch (error) { GBLog.error(`Error on Whatsapp callback: ${error.data ? error.data : error}`); } - }); await CollectionUtil.asyncForEach(instances, async instance => { @@ -210,9 +216,12 @@ export class GBMinService { } public async mountBot(instance: IGBInstance) { - // Build bot adapter. - const { min, adapter, conversationState } = await this.buildBotAdapter(instance, GBServer.globals.sysPackages, GBServer.globals.appPackages); + const { min, adapter, conversationState } = await this.buildBotAdapter( + instance, + GBServer.globals.sysPackages, + GBServer.globals.appPackages + ); GBServer.globals.minInstances.push(min); await this.deployer.deployPackage(min, 'packages/default.gbtheme'); @@ -250,8 +259,14 @@ export class GBMinService { if (process.env.DISABLE_WEB !== 'true') { const uiUrl = `/${instance.botId}`; const uiUrlAlt = `/${instance.activationCode}`; - GBServer.globals.server.use(uiUrl, express.static(urlJoin(GBDeployer.deployFolder, GBMinService.uiPackage, 'build'))); - GBServer.globals.server.use(uiUrlAlt, express.static(urlJoin(GBDeployer.deployFolder, GBMinService.uiPackage, 'build'))); + GBServer.globals.server.use( + uiUrl, + express.static(urlJoin(GBDeployer.deployFolder, GBMinService.uiPackage, 'build')) + ); + GBServer.globals.server.use( + uiUrlAlt, + express.static(urlJoin(GBDeployer.deployFolder, GBMinService.uiPackage, 'build')) + ); GBLog.info(`Bot UI ${GBMinService.uiPackage} accessible at: ${uiUrl} and ${uiUrlAlt}.`); } @@ -273,7 +288,7 @@ export class GBMinService { server.get(`/${min.instance.botId}/check`, async (req, res) => { try { if (min.whatsAppDirectLine != undefined && instance.whatsappServiceKey !== null) { - if (!await min.whatsAppDirectLine.check(min)) { + if (!(await min.whatsAppDirectLine.check(min))) { const error = `WhatsApp API lost connection.`; GBLog.error(error); res.status(500).send(error); @@ -289,7 +304,6 @@ export class GBMinService { }); } - private handleOAuthTokenRequests(server: any, min: GBMinInstance, instance: IGBInstance) { server.get(`/${min.instance.botId}/token`, async (req, res) => { const state = await min.adminService.getValue(instance.instanceId, 'AntiCSRFAttackState'); @@ -334,7 +348,7 @@ export class GBMinService { ); authorizationUrl = `${authorizationUrl}?response_type=code&client_id=${ min.instance.marketplaceId - }&redirect_uri=${urlJoin(min.instance.botEndpoint, min.instance.botId, 'token')}`; + }&redirect_uri=${urlJoin(min.instance.botEndpoint, min.instance.botId, 'token')}`; res.redirect(authorizationUrl); }); } @@ -399,9 +413,7 @@ export class GBMinService { return JSON.parse(json); } catch (error) { - const msg = `[botId:${ - instance.botId - }] Error calling Direct Line client, verify Bot endpoint on the cloud. Error is: ${error}.`; + const msg = `[botId:${instance.botId}] Error calling Direct Line client, verify Bot endpoint on the cloud. Error is: ${error}.`; return Promise.reject(new Error(msg)); } @@ -414,7 +426,6 @@ export class GBMinService { * */ private async getSTSToken(instance: any) { - const options = { url: instance.speechEndpoint, method: 'POST', @@ -443,8 +454,10 @@ export class GBMinService { const userState = new UserState(storage); adapter.use(new AutoSaveStateMiddleware(conversationState, userState)); - MicrosoftAppCredentials.trustServiceUrl('https://directline.botframework.com', - new Date(new Date().setFullYear(new Date().getFullYear() + 10))); + MicrosoftAppCredentials.trustServiceUrl( + 'https://directline.botframework.com', + new Date(new Date().setFullYear(new Date().getFullYear() + 10)) + ); // The minimal bot is built here. @@ -474,12 +487,11 @@ export class GBMinService { let handled = false; await CollectionUtil.asyncForEach(min.appPackages, async (e: IGBPackage) => { let services: ConcatArray; - if (services = await e.onExchangeData(min, "getServices", null)) { + if ((services = await e.onExchangeData(min, 'getServices', null))) { min.gbappServices.concat(services); } }); - if (min.instance.whatsappServiceKey !== null) { min.whatsAppDirectLine = new WhatsappDirectLine( min, @@ -490,20 +502,17 @@ export class GBMinService { min.instance.whatsappServiceUrl ); await min.whatsAppDirectLine.setup(true); - } - else { + } else { const minBoot = GBServer.globals.minBoot as any; if (minBoot.instance.whatsappServiceKey) { - - min.whatsAppDirectLine = - new WhatsappDirectLine( - min, - min.botId, - min.instance.whatsappBotKey, - minBoot.instance.whatsappServiceKey, - minBoot.instance.whatsappServiceNumber, - minBoot.instance.whatsappServiceUrl - ); + min.whatsAppDirectLine = new WhatsappDirectLine( + min, + min.botId, + min.instance.whatsappBotKey, + minBoot.instance.whatsappServiceKey, + minBoot.instance.whatsappServiceNumber, + minBoot.instance.whatsappServiceUrl + ); await min.whatsAppDirectLine.setup(false); } } @@ -545,7 +554,6 @@ export class GBMinService { } } }); - } /** @@ -566,7 +574,6 @@ export class GBMinService { step.context.activity.locale = 'pt-BR'; try { - const user = await min.userProfile.get(context, {}); // First time processing. @@ -586,8 +593,14 @@ export class GBMinService { let sec = new SecService(); const member = context.activity.from; - const persistedUser = await sec.ensureUser(instance.instanceId, member.id, - member.name, "", "web", member.name); + const persistedUser = await sec.ensureUser( + instance.instanceId, + member.id, + member.name, + '', + 'web', + member.name + ); const analytics = new AnalyticsService(); @@ -596,7 +609,6 @@ export class GBMinService { } await min.userProfile.set(step.context, user); - } GBLog.info( @@ -630,7 +642,11 @@ export class GBMinService { const msg = `ERROR: ${error.message} ${error.stack ? error.stack : ''}`; GBLog.error(msg); - await min.conversationalService.sendText(min, step, Messages[step.context.activity.locale].very_sorry_about_error); + await min.conversationalService.sendText( + min, + step, + Messages[step.context.activity.locale].very_sorry_about_error + ); await step.beginDialog('/ask', { isReturning: true }); } }); @@ -665,19 +681,20 @@ export class GBMinService { } private async processMessageActivity(context, min: GBMinInstance, step: GBDialogStep) { - let message: GuaribasConversationMessage; - if (process.env.PRIVACY_STORE_MESSAGES === "true") { - + if (process.env.PRIVACY_STORE_MESSAGES === 'true') { // Adds message to the analytics layer. const analytics = new AnalyticsService(); const user = await min.userProfile.get(context, {}); if (user) { - message = await analytics.createMessage(min.instance.instanceId, - user.conversation, user.systemUser.userId, - context.activity.text); + message = await analytics.createMessage( + min.instance.instanceId, + user.conversation, + user.systemUser.userId, + context.activity.text + ); } } @@ -685,14 +702,13 @@ export class GBMinService { const globalQuit = (locale, utterance) => { return utterance.match(Messages.global_quit); - } + }; const isVMCall = Object.keys(min.scriptMap).find(key => min.scriptMap[key] === context.activity.text) !== undefined; const simpleLocale = context.activity.locale.substring(0, 2); const hasBadWord = wash.check(simpleLocale, context.activity.text); - if (hasBadWord) { await step.beginDialog('/pleaseNoBadWords'); } else if (isVMCall) { @@ -704,8 +720,8 @@ export class GBMinService { parts.splice(0, 1); let args = parts.join(' '); await step.beginDialog(dialogName, { args: args }); - - } else if (globalQuit(step.context.activity.locale, context.activity.text)) { // TODO: Hard-code additional languages. + } else if (globalQuit(step.context.activity.locale, context.activity.text)) { + // TODO: Hard-code additional languages. await step.cancelAllDialogs(); await min.conversationalService.sendText(min, step, Messages[step.context.activity.locale].canceled); } else if (context.activity.text === 'admin') { @@ -716,61 +732,71 @@ export class GBMinService { await step.beginDialog('/menu', JSON.parse(context.activity.text)); // Otherwise, continue to the active dialog in the stack. } else { - if (!await this.deployer.getStoragePackageByName(min.instance.instanceId, `${min.instance.botId}.gbkb`)) { - await step.context.sendActivity(`Oi, ainda não possuo pacotes de conhecimento publicados. Por favor, aguarde alguns segundos enquanto eu auto-publico alguns pacotes.`); + if (!(await this.deployer.getStoragePackageByName(min.instance.instanceId, `${min.instance.botId}.gbkb`))) { + await step.context.sendActivity( + `Oi, ainda não possuo pacotes de conhecimento publicados. Por favor, aguarde alguns segundos enquanto eu auto-publico alguns pacotes.` + ); return await step.beginDialog('/publish', { confirm: true }); } if (step.activeDialog !== undefined) { await step.continueDialog(); } else { - let query = context.activity.text; - let locale = 'pt'; - if (process.env.TRANSLATOR_DISABLED !== "true" || - min.core.getParam(min.instance, 'Enable Worldwide Translator')) { + if ( + process.env.TRANSLATOR_DISABLED !== 'true' || + min.core.getParam(min.instance, 'Enable Worldwide Translator') + ) { const minBoot = GBServer.globals.minBoot as any; // TODO: Switch keys automatically to master/per bot. - locale = await AzureText.getLocale(minBoot.instance.textAnalyticsKey ? - minBoot.instance.textAnalyticsKey : minBoot.instance.textAnalyticsKey, - minBoot.instance.textAnalyticsEndpoint ? - minBoot.instance.textAnalyticsEndpoint : minBoot.instance.textAnalyticsEndpoint, query); + locale = await AzureText.getLocale( + minBoot.instance.textAnalyticsKey ? minBoot.instance.textAnalyticsKey : minBoot.instance.textAnalyticsKey, + minBoot.instance.textAnalyticsEndpoint + ? minBoot.instance.textAnalyticsEndpoint + : minBoot.instance.textAnalyticsEndpoint, + query + ); } let sec = new SecService(); const member = step.context.activity.from; - const user = await sec.ensureUser(min.instance.instanceId, member.id, - member.name, "", "web", member.name); + const user = await sec.ensureUser(min.instance.instanceId, member.id, member.name, '', 'web', member.name); user.locale = locale; await user.save(); const minBoot = GBServer.globals.minBoot as any; const notTranslatedQuery = query; - query = await min.conversationalService.translate(min, + query = await min.conversationalService.translate( + min, min.instance.translatorKey ? min.instance.translatorKey : minBoot.instance.translatorKey, min.instance.translatorEndpoint ? min.instance.translatorEndpoint : minBoot.instance.translatorEndpoint, query, - 'pt'); + 'pt' + ); GBLog.info(`Translated text: ${query}.`); // Checks if any .gbapp will handle this answer, if not goes to kb.gbapp. let handled = false; await CollectionUtil.asyncForEach(min.appPackages, async (e: IGBPackage) => { - if (await e.onExchangeData(min, "handleAnswer", { - query: query, step: step, - notTranslatedQuery: notTranslatedQuery, - message: message['dataValues'], - user: user['dataValues'] - })) { + if ( + await e.onExchangeData(min, 'handleAnswer', { + query: query, + step: step, + notTranslatedQuery: notTranslatedQuery, + message: message ? message['dataValues'] : null, + user: user ? user['dataValues'] : null + }) + ) { handled = true; } }); if (!handled) { await step.beginDialog('/answer', { - query: query, message: message + query: query, + message: message }); } } diff --git a/packages/kb.gbapp/dialogs/AskDialog.ts b/packages/kb.gbapp/dialogs/AskDialog.ts index 11af8fcb..a15844f3 100644 --- a/packages/kb.gbapp/dialogs/AskDialog.ts +++ b/packages/kb.gbapp/dialogs/AskDialog.ts @@ -103,45 +103,52 @@ export class AskDialog extends IGBDialog { const translatorEnabled = () => { if (min.instance.params) { const params = JSON.parse(min.instance.params); - return params ? params['Enable Worldwide Translator'] === "TRUE" : false; + return params ? params['Enable Worldwide Translator'] === 'TRUE' : false; } return false; - } // TODO: Encapsulate. + }; // TODO: Encapsulate. let query = step.result; let locale = 'pt'; const minBoot = GBServer.globals.minBoot as any; - if (process.env.TRANSLATOR_DISABLED !== "true" && translatorEnabled()) { - locale = await AzureText.getLocale(minBoot.instance.textAnalyticsKey ? - minBoot.instance.textAnalyticsKey : minBoot.instance.textAnalyticsKey, - minBoot.instance.textAnalyticsEndpoint ? - minBoot.instance.textAnalyticsEndpoint : minBoot.instance.textAnalyticsEndpoint, query); + if (process.env.TRANSLATOR_DISABLED !== 'true' && translatorEnabled()) { + locale = await AzureText.getLocale( + minBoot.instance.textAnalyticsKey ? minBoot.instance.textAnalyticsKey : minBoot.instance.textAnalyticsKey, + minBoot.instance.textAnalyticsEndpoint + ? minBoot.instance.textAnalyticsEndpoint + : minBoot.instance.textAnalyticsEndpoint, + query + ); } let sec = new SecService(); const member = step.context.activity.from; - const user = await sec.ensureUser(min.instance.instanceId, member.id, - member.name, "", "web", member.name); + const user = await sec.ensureUser(min.instance.instanceId, member.id, member.name, '', 'web', member.name); user.locale = locale; await user.save(); const notTranslatedQuery = query; - query = await min.conversationalService.translate(min, + query = await min.conversationalService.translate( + min, min.instance.translatorKey ? min.instance.translatorKey : minBoot.instance.translatorKey, min.instance.translatorEndpoint ? min.instance.translatorEndpoint : minBoot.instance.translatorEndpoint, query, - 'pt'); - GBLog.info(`Translated text: ${query}.`) + 'pt' + ); + GBLog.info(`Translated text: ${query}.`); let handled = false; await CollectionUtil.asyncForEach(min.appPackages, async (e: IGBPackage) => { - if (await e.onExchangeData(min, "handleAnswer", { - query: query, step: step, - notTranslatedQuery: notTranslatedQuery, - message: query, - user: user['dataValues'] - })) { + if ( + await e.onExchangeData(min, 'handleAnswer', { + query: query, + step: step, + notTranslatedQuery: notTranslatedQuery, + message: query, + user: user ? user['dataValues'] : null + }) + ) { handled = true; } }); @@ -153,8 +160,6 @@ export class AskDialog extends IGBDialog { } else { return await step.next(); } - - } else { return await step.next(); } @@ -170,10 +175,10 @@ export class AskDialog extends IGBDialog { let sec = new SecService(); const member = step.context.activity.from; - const userDb = await sec.ensureUser(min.instance.instanceId, member.id, - member.name, "", "web", member.name); + const userDb = await sec.ensureUser(min.instance.instanceId, member.id, member.name, '', 'web', member.name); const minBoot = GBServer.globals.minBoot as any; - text = await min.conversationalService.translate(min, + text = await min.conversationalService.translate( + min, min.instance.translatorKey ? min.instance.translatorKey : minBoot.instance.translatorKey, min.instance.translatorEndpoint ? min.instance.translatorEndpoint : minBoot.instance.translatorEndpoint, text, @@ -218,7 +223,6 @@ export class AskDialog extends IGBDialog { // Sends the answer to all outputs, including projector. return await AskDialog.handleAnswer(service, min, step, resultsA.answer); - } else { // Second time running Search, now with no filter. const resultsB = await service.ask(min.instance, text, searchScore, undefined); @@ -237,7 +241,6 @@ export class AskDialog extends IGBDialog { } if (resultsB.answer) - // Sends the answer to all outputs, including projector. return await AskDialog.handleAnswer(service, min, step, resultsA.answer); @@ -254,16 +257,13 @@ export class AskDialog extends IGBDialog { } private static async handleAnswer(service: KBService, min: GBMinInstance, step: any, answer: GuaribasAnswer) { - if (answer.content.endsWith('.docx')) { const mainName = answer.content.replace(/\s|\-/gi, '').split('.')[0]; return await GBMinService.callVM(mainName, min, step); - } else { await service.sendAnswer(min, AskDialog.getChannel(step), step, answer); return await step.replaceDialog('/ask', { isReturning: true }); } - } private static getChannel(step): string {