From 0ecaa8a877e9a9e0b024544fd826c7fe188f7bf4 Mon Sep 17 00:00:00 2001 From: Rodrigo Rodriguez Date: Thu, 19 Nov 2020 11:43:15 -0300 Subject: [PATCH] fix(core.gbapp): Fixing after language new fetures being added. --- packages/core.gbapp/dialogs/LanguageDialog.ts | 39 ++++++++++++++----- packages/core.gbapp/index.ts | 2 + .../services/GBConversationalService.ts | 32 +++++++++++++++ packages/core.gbapp/services/GBMinService.ts | 8 ++-- packages/core.gbapp/strings.ts | 6 ++- 5 files changed, 72 insertions(+), 15 deletions(-) diff --git a/packages/core.gbapp/dialogs/LanguageDialog.ts b/packages/core.gbapp/dialogs/LanguageDialog.ts index 936b7b8c..fdbd841f 100644 --- a/packages/core.gbapp/dialogs/LanguageDialog.ts +++ b/packages/core.gbapp/dialogs/LanguageDialog.ts @@ -43,6 +43,7 @@ import { Messages } from '../strings'; import { SecService } from '../../security.gbapp/services/SecService'; import { GBServer } from '../../../src/app'; import { GBConversationalService } from '../services/GBConversationalService'; +import { CollectionUtil } from 'pragmatismo-io-framework'; /** * Dialog for the bot explains about itself. */ @@ -58,18 +59,36 @@ export class LanguageDialog extends IGBDialog { async step => { const locale = step.context.activity.locale; - - return await min.conversationalService.prompt (min, step, + + return await min.conversationalService.prompt(min, step, Messages[locale].which_language); - }, - async step => { + }, + async step => { + + const locale = step.context.activity.locale; + const user = await min.userProfile.get(step.context, {}); + + const list = [ + { name: 'english', code: 'en' }, + { name: 'portuguese', code: 'pt' }, + { name: 'spanish', code: 'es' }, + { name: 'german', code: 'de' }, + { name: 'deutsch', code: 'de' } + ]; + let translatorLocale = null; + await CollectionUtil.asyncForEach(list, async item => { + if (GBConversationalService.kmpSearch(step.result, item.name) != -1) { + translatorLocale = item.code; + } + }); + let sec = new SecService(); - let from = step.context.activity.from.id; - const botId = step.result; - const instance = await min.core.loadInstanceByBotId(botId); - await sec.updateUserInstance(from, instance.instanceId); - await min.conversationalService.sendText(min, step, `Opa, vamos lá!`); - + user.systemUser = await sec.updateUserLocale(user.systemUser.userId, translatorLocale); + + await min.userProfile.set(step.context, user); + await min.conversationalService.sendText(min, step, + Messages[locale].language_chosen ); + return await step.next(); } ])); diff --git a/packages/core.gbapp/index.ts b/packages/core.gbapp/index.ts index d34dcb6d..93221f95 100644 --- a/packages/core.gbapp/index.ts +++ b/packages/core.gbapp/index.ts @@ -39,6 +39,7 @@ import { GBDialogStep, GBLog, GBMinInstance, IGBCoreService, IGBPackage } from 'botlib'; import { Sequelize } from 'sequelize-typescript'; import { BroadcastDialog } from './dialogs/BroadcastDialog'; +import { LanguageDialog } from './dialogs/LanguageDialog'; import { SwitchBotDialog } from './dialogs/SwitchBot'; import { WelcomeDialog } from './dialogs/WelcomeDialog'; import { WhoAmIDialog } from './dialogs/WhoAmIDialog'; @@ -78,5 +79,6 @@ export class GBCorePackage implements IGBPackage { SwitchBotDialog.setup(min.bot, min); DialogClass.setup(min.bot, min); BroadcastDialog.setup(min.bot, min); + LanguageDialog.setup(min.bot, min); } } diff --git a/packages/core.gbapp/services/GBConversationalService.ts b/packages/core.gbapp/services/GBConversationalService.ts index b90ecda7..e65aeb8d 100644 --- a/packages/core.gbapp/services/GBConversationalService.ts +++ b/packages/core.gbapp/services/GBConversationalService.ts @@ -679,4 +679,36 @@ export class GBConversationalService { } }); } + + public static kmpSearch(pattern, text) { + pattern = pattern.toLowerCase(); + text = text.toLowerCase(); + if (pattern.length == 0) + return 0; // Immediate match + + // Compute longest suffix-prefix table + var lsp = [0]; // Base case + for (var i = 1; i < pattern.length; i++) { + var j = lsp[i - 1]; // Start by assuming we're extending the previous LSP + while (j > 0 && pattern.charAt(i) != pattern.charAt(j)) + j = lsp[j - 1]; + if (pattern.charAt(i) == pattern.charAt(j)) + j++; + lsp.push(j); + } + + // Walk through text string + var j = 0; // Number of chars matched in pattern + for (var i = 0; i < text.length; i++) { + while (j > 0 && text.charAt(i) != pattern.charAt(j)) + j = lsp[j - 1]; // Fall back in the pattern + if (text.charAt(i) == pattern.charAt(j)) { + j++; // Next char matched, increment position + if (j == pattern.length) + return i - (j - 1); + } + } + return -1; // Not found + } + } diff --git a/packages/core.gbapp/services/GBMinService.ts b/packages/core.gbapp/services/GBMinService.ts index 53f4325e..62f299da 100644 --- a/packages/core.gbapp/services/GBMinService.ts +++ b/packages/core.gbapp/services/GBMinService.ts @@ -764,8 +764,9 @@ export class GBMinService { await step.beginDialog('/publish', { confirm: true, firstTime: true }); } else { let text = context.activity.text; + const originalText = text; text = text.replace(/<([^>]+?)([^>]*?)>(.*?)<\/\1>/gi, ''); - + // Spells check the input text before translating. text = await min.conversationalService.spellCheck(min, text); @@ -787,13 +788,14 @@ export class GBMinService { const systemUser = user.systemUser; if (systemUser.locale != locale) { let sec = new SecService(); - await sec.updateUserLocale(systemUser.userId, locale); + user.systemUser = await sec.updateUserLocale(systemUser.userId, locale); + await min.userProfile.set(step.context, user); } } // Translates the input text if is turned on instance params. - const originalText = context.text; + let contentLocale = min.core.getParam( min.instance, 'Default Content Language', diff --git a/packages/core.gbapp/strings.ts b/packages/core.gbapp/strings.ts index 8d4ca1b1..fe2d54cd 100644 --- a/packages/core.gbapp/strings.ts +++ b/packages/core.gbapp/strings.ts @@ -10,8 +10,9 @@ export const Messages = { very_sorry_about_error: `I'm sorry to inform that there was an error which was recorded to be solved.`, canceled: 'Canceled. If I can be useful, let me know how', whats_email: "What's your E-mail address?", - which_language: "Which language would you like to choose from?", + which_language: "Please, type the language name you would like to talk through.", validation_enter_valid_email: "Please enter a valid e-mail." , + language_chosen: "Very good, so let's go..." , affirmative_sentences: /^(sim|s|positivo|afirmativo|claro|evidente|sem dúvida|confirmo|confirmar|confirmado|uhum)/i, }, @@ -24,8 +25,9 @@ export const Messages = { very_sorry_about_error: `Lamento, ocorreu um erro que já foi registrado para ser tratado.`, canceled: 'Cancelado, avise como posso ser útil novamente.', whats_email: "Qual seu e-mail?", - which_language: "Qual idioma você gostaria de usar?", + which_language: "Por favor, digite o idioma que você gostaria de usar para conversarmos.", validation_enter_valid_email: "Por favor digite um email válido.", + language_chosen: "Muito bem, então vamos lá..." , affirmative_sentences: /^(sim|s|positivo|afirmativo|claro|evidente|sem dúvida|confirmo|confirmar|confirmado|uhum)/i, }