From 820d4f612e330a11a9aa8bac7459e4db89959e18 Mon Sep 17 00:00:00 2001 From: "Rodrigo Rodriguez (pragmatismo.io)" Date: Thu, 1 Nov 2018 18:00:09 -0300 Subject: [PATCH] Updating to latest architectural changes from BotBuilder-js v4. --- packages/core.gbapp/dialogs/WelcomeDialog.ts | 6 ++- packages/core.gbapp/services/GBMinService.ts | 47 ++++++++++--------- .../dialogs/FeedbackDialog.ts | 2 +- .../dialogs/QualityDialog.ts | 3 +- packages/kb.gbapp/dialogs/AskDialog.ts | 34 ++++++++------ packages/kb.gbapp/dialogs/MenuDialog.ts | 8 ++-- 6 files changed, 56 insertions(+), 44 deletions(-) diff --git a/packages/core.gbapp/dialogs/WelcomeDialog.ts b/packages/core.gbapp/dialogs/WelcomeDialog.ts index 14fbfae7..cf60ae58 100644 --- a/packages/core.gbapp/dialogs/WelcomeDialog.ts +++ b/packages/core.gbapp/dialogs/WelcomeDialog.ts @@ -46,12 +46,14 @@ export class WelcomeDialog extends IGBDialog { */ static setup(bot: BotAdapter, min: GBMinInstance) { min.dialogs.add("/", [ - async (dc, args) => { - const user = min.userState.get(dc.context); + async (dc) => { + const user = await min.userProfile.get(context, {}); + const locale = dc.context.activity.locale; if (!user.once) { user.once = true; + await min.userProfile.set(context, user); var a = new Date(); const date = a.getHours(); var msg = diff --git a/packages/core.gbapp/services/GBMinService.ts b/packages/core.gbapp/services/GBMinService.ts index 159504b7..aab0caad 100644 --- a/packages/core.gbapp/services/GBMinService.ts +++ b/packages/core.gbapp/services/GBMinService.ts @@ -32,7 +32,7 @@ "use strict"; -const { TextPrompt } = require("botbuilder-dialogs"); +const {DialogSet, TextPrompt } = require("botbuilder-dialogs"); const UrlJoin = require("url-join"); const express = require("express"); const logger = require("../../../src/logger"); @@ -45,7 +45,8 @@ import { ConversationState, MemoryStorage, UserState, - BotState + AutoSaveStateMiddleware + } from "botbuilder"; import { GBMinInstance, IGBPackage } from "botlib"; @@ -303,11 +304,12 @@ export class GBMinService { appId: instance.marketplaceId, appPassword: instance.marketplacePassword }); - + const storage = new MemoryStorage(); const conversationState = new ConversationState(storage); const userState = new UserState(storage); - + adapter.use(new AutoSaveStateMiddleware(conversationState, userState)); + // The minimal bot is built here. let min = new GBMinInstance(); @@ -318,7 +320,10 @@ export class GBMinService { min.conversationalService = this.conversationalService; min.adminService = this.adminService; min.instance = await this.core.loadInstance(min.botId); - min.dialogs.add("textPrompt", new TextPrompt()); + min.userProfile = conversationState.createProperty('userProfile'); + const dialogState = conversationState.createProperty('dialogState'); + min.dialogs = new DialogSet(dialogState); + //min.dialogs.add("textPrompt", new TextPrompt()); return { min, adapter, conversationState }; } @@ -366,12 +371,12 @@ export class GBMinService { ) { return adapter.processActivity(req, res, async context => { const state = conversationState.get(context); - const dc = min.dialogs.createContext(context, state); + const dc = await min.dialogs.createContext(context, state); dc.context.activity.locale = "en-US"; // TODO: Make dynamic. try { - const user = min.userState.get(dc.context); - + const user = await min.userProfile.get(context, {}); + if (!user.loaded) { await min.conversationalService.sendEvent(dc, "loadInstance", { instanceId: instance.instanceId, @@ -381,6 +386,7 @@ export class GBMinService { }); user.loaded = true; user.subjects = []; + await min.userProfile.set(context, user); } logger.info( @@ -398,10 +404,9 @@ export class GBMinService { appPackages.forEach(e => { e.onNewSession(min, dc); }); - // Processes the root dialog. - await dc.begin("/"); + await dc.beginDialog("/"); } else { logger.info(`Member added to conversation: ${member.name}`); } @@ -411,11 +416,11 @@ export class GBMinService { // Checks for /admin request. if (context.activity.text === "admin") { - await dc.begin("/admin"); + await dc.beginDialog("/admin"); // Checks for /menu JSON signature. } else if (context.activity.text.startsWith('{"title"')) { - await dc.begin("/menu", { + await dc.beginDialog("/menu", { data: JSON.parse(context.activity.text) }); @@ -424,7 +429,7 @@ export class GBMinService { if (dc.activeDialog) { await dc.continue(); } else { - await dc.begin("/answer", { query: context.activity.text }); + await dc.beginDialog("/answer", { query: context.activity.text }); } } @@ -435,27 +440,27 @@ export class GBMinService { await dc.endAll(); if (context.activity.name === "whoAmI") { - await dc.begin("/whoAmI"); + await dc.beginDialog("/whoAmI"); } else if (context.activity.name === "showSubjects") { - await dc.begin("/menu"); + await dc.beginDialog("/menu"); } else if (context.activity.name === "giveFeedback") { - await dc.begin("/feedback", { + await dc.beginDialog("/feedback", { fromMenu: true }); } else if (context.activity.name === "showFAQ") { - await dc.begin("/faq"); + await dc.beginDialog("/faq"); } else if (context.activity.name === "answerEvent") { - await dc.begin("/answerEvent", { + await dc.beginDialog("/answerEvent", { questionId: (context.activity as any).data, fromFaq: true }); } else if (context.activity.name === "quality") { - await dc.begin("/quality", { + await dc.beginDialog("/quality", { score: (context.activity as any).data }); } else if (context.activity.name === "updateToken") { let token = (context.activity as any).data; - await dc.begin("/adminUpdateToken", { token: token }); + await dc.beginDialog("/adminUpdateToken", { token: token }); } else { await dc.continue(); } @@ -467,7 +472,7 @@ export class GBMinService { await dc.context.sendActivity( Messages[dc.context.activity.locale].very_sorry_about_error ); - await dc.begin("/ask", { isReturning: true }); + await dc.beginDialog("/ask", { isReturning: true }); } }); } diff --git a/packages/customer-satisfaction.gbapp/dialogs/FeedbackDialog.ts b/packages/customer-satisfaction.gbapp/dialogs/FeedbackDialog.ts index 920f1ac2..b6c0fefd 100644 --- a/packages/customer-satisfaction.gbapp/dialogs/FeedbackDialog.ts +++ b/packages/customer-satisfaction.gbapp/dialogs/FeedbackDialog.ts @@ -63,7 +63,7 @@ export class FeedbackDialog extends IGBDialog { async (dc, value) => { let locale = dc.context.activity.locale; let rate = value.entity; - const user = min.userState.get(dc.context); + const user = await min.userProfile.get(context, {}); await service.updateConversationRate(user.conversation, rate); await dc.context.sendActivity(Messages[locale].thanks); } diff --git a/packages/customer-satisfaction.gbapp/dialogs/QualityDialog.ts b/packages/customer-satisfaction.gbapp/dialogs/QualityDialog.ts index 1318d2ec..d6fd5625 100644 --- a/packages/customer-satisfaction.gbapp/dialogs/QualityDialog.ts +++ b/packages/customer-satisfaction.gbapp/dialogs/QualityDialog.ts @@ -53,7 +53,8 @@ export class QualityDialog extends IGBDialog { min.dialogs.add("/quality", [ async (dc, args) => { const locale = dc.context.activity.locale; - const user = min.userState.get(dc.context); + const user = await min.userProfile.get(context, {}); + var score = args.score; setTimeout( diff --git a/packages/kb.gbapp/dialogs/AskDialog.ts b/packages/kb.gbapp/dialogs/AskDialog.ts index c563f207..3671f365 100644 --- a/packages/kb.gbapp/dialogs/AskDialog.ts +++ b/packages/kb.gbapp/dialogs/AskDialog.ts @@ -55,29 +55,29 @@ export class AskDialog extends IGBDialog { min.dialogs.add("/answerEvent", [ async (dc, args) => { - if (args && args.questionId) { + let question = await service.getQuestionById( + min.instance.instanceId, + args.questionId + ); + let answer = await service.getAnswerById( + min.instance.instanceId, + question.answerId + ); - let question = await service.getQuestionById(min.instance.instanceId, args.questionId); - let answer = await service.getAnswerById(min.instance.instanceId, question.answerId) - // Sends the answer to all outputs, including projector. - await service.sendAnswer( - min.conversationalService, - dc, - answer - ); + await service.sendAnswer(min.conversationalService, dc, answer); await dc.replace("/ask", { isReturning: true }); } - }]) + } + ]); min.dialogs.add("/answer", [ async (dc, args) => { - // Initialize values. + const user = await min.userProfile.get(context, {}); - const user = min.userState.get(dc.context); let text = args.query; if (!text) { throw new Error(`/answer being called with no args.query text.`); @@ -114,6 +114,7 @@ export class AskDialog extends IGBDialog { // Searches KB for the first time. user.lastQuestion = text; + await min.userProfile.set(context, user); let resultsA = await service.ask( min.instance, text, @@ -128,6 +129,7 @@ export class AskDialog extends IGBDialog { user.isAsking = false; user.lastQuestionId = resultsA.questionId; + await min.userProfile.set(context, user); // Sends the answer to all outputs, including projector. @@ -155,9 +157,11 @@ export class AskDialog extends IGBDialog { if (resultsB && resultsB.answer) { // Saves some context info. - const user = min.userState.get(dc.context); + const user = await min.userProfile.get(context, {}); + user.isAsking = false; user.lastQuestionId = resultsB.questionId; + await min.userProfile.set(context, user); // Informs user that a broader search will be used. @@ -189,7 +193,7 @@ export class AskDialog extends IGBDialog { min.dialogs.add("/ask", [ async (dc, args) => { const locale = dc.context.activity.locale; - const user = min.userState.get(dc.context); + const user = await min.userProfile.get(context, {}); user.isAsking = true; if (!user.subjects) { user.subjects = []; @@ -214,7 +218,7 @@ export class AskDialog extends IGBDialog { }, async (dc, value) => { await dc.endAll(); - await dc.begin("/answer", { query: value }); + await dc.beginDialog("/answer", { query: value }); } ]); } diff --git a/packages/kb.gbapp/dialogs/MenuDialog.ts b/packages/kb.gbapp/dialogs/MenuDialog.ts index 13b81b5a..0bb75ee4 100644 --- a/packages/kb.gbapp/dialogs/MenuDialog.ts +++ b/packages/kb.gbapp/dialogs/MenuDialog.ts @@ -71,7 +71,7 @@ export class MenuDialog extends IGBDialog { // Adds to bot a perception of a new subject. - const user = min.userState.get(dc.context) + const user = await min.userProfile.get(context, {}); user.subjects.push(subject) rootSubjectId = subject.subjectId @@ -88,7 +88,7 @@ export class MenuDialog extends IGBDialog { }) } } else { - const user = min.userState.get(dc.context) + const user = await min.userProfile.get(context, {}); user.subjects = [] await dc.context.sendActivity(Messages[locale].here_is_subjects) // TODO: Handle rnd. @@ -137,7 +137,7 @@ export class MenuDialog extends IGBDialog { }) if (attachments.length == 0) { - const user = min.userState.get(dc.context) + const user = await min.userProfile.get(context, {}); if (user.subjects && user.subjects.length > 0) { await dc.context.sendActivity( @@ -153,7 +153,7 @@ export class MenuDialog extends IGBDialog { await dc.context.sendActivity(msg) } - const user = min.userState.get(dc.context) + const user = await min.userProfile.get(context, {}); user.isAsking = true }, async (dc, value) => {