new(all): Google Chat (Workspace) connector added.

This commit is contained in:
Rodrigo Rodriguez 2021-06-15 08:36:13 -03:00
parent d8b17af9e8
commit 1b37504077
7 changed files with 212 additions and 170 deletions

1
.gitignore vendored
View file

@ -18,4 +18,3 @@
.env
*.env
.vscode/launch.json
/google-chat.json

View file

@ -104,4 +104,7 @@ ALTER TABLE dbo.GuaribasInstance ADD
googleBotKey nvarchar(255) NULL,
googleChatApiKey nvarchar(255) NULL,
googleChatSubscriptionName nvarchar(255) NULL,
googleClientEmail nvarchar(255) NULL,
googlePrivateKey nvarchar(4000) NULL,
googleProjectId nvarchar(255) NULL
GO

216
package-lock.json generated
View file

@ -1,6 +1,6 @@
{
"name": "botserver",
"version": "2.0.119",
"version": "3.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@ -1294,15 +1294,6 @@
"regenerator-runtime": "^0.13.4"
}
},
"@babel/runtime-corejs3": {
"version": "7.14.5",
"resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.5.tgz",
"integrity": "sha512-cBbwXj3F2xjnQJ0ERaFRLjxhUSBYsQPXJ7CERz/ecx6q6hzQ99eTflAPFC3ks4q/IG4CWupNVdflc4jlFBJVsg==",
"requires": {
"core-js-pure": "^3.14.0",
"regenerator-runtime": "^0.13.4"
}
},
"@babel/template": {
"version": "7.10.4",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
@ -5249,9 +5240,9 @@
}
},
"botlib": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/botlib/-/botlib-1.8.1.tgz",
"integrity": "sha512-u890+yJVOVWKtskY1LvgKz5cM+7XEXAkVUCsLDa7MxTW/GDJQIqHg5i8Zmhp/f6ARiE28WW0gAqXWM9jRKVtbQ==",
"version": "1.8.3",
"resolved": "https://registry.npmjs.org/botlib/-/botlib-1.8.3.tgz",
"integrity": "sha512-NWVeSgavucALMJ6yZT7ld0v01mL3964+3OLCW8oW2nuFxG4eBEpNztsg5HKJWBKb9nbeNWU70ynstC43kMQ+uw==",
"requires": {
"async": "3.2.0",
"botbuilder": "4.13.5",
@ -5311,11 +5302,6 @@
"util-deprecate": "^1.0.1"
}
},
"underscore": {
"version": "1.13.1",
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz",
"integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g=="
},
"winston": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz",
@ -7353,11 +7339,6 @@
}
}
},
"core-js-pure": {
"version": "3.14.0",
"resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.14.0.tgz",
"integrity": "sha512-YVh+LN2FgNU0odThzm61BsdkwrbrchumFq3oztnE9vTKC4KS2fvnPmcx8t6jnqAyOTCTF4ZSiuK8Qhh7SNcL4g=="
},
"core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
@ -7762,7 +7743,8 @@
"deep-extend": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
"integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
"integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
"dev": true
},
"deep-is": {
"version": "0.1.3",
@ -8983,11 +8965,6 @@
}
}
},
"fast-json-patch": {
"version": "3.0.0-1",
"resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.0.0-1.tgz",
"integrity": "sha512-6pdFb07cknxvPzCeLsFHStEy+MysPJPgZQ9LbQ/2O67unQF93SNqfdSqnPPl71YMHX+AD8gbl7iuoGFzHEdDuw=="
},
"fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
@ -11218,14 +11195,6 @@
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
"integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
},
"isomorphic-form-data": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isomorphic-form-data/-/isomorphic-form-data-2.0.0.tgz",
"integrity": "sha512-TYgVnXWeESVmQSg4GLVbalmQ+B4NPi/H4eWxqALKj63KsUrcu301YDjBqaOw3h+cbak7Na4Xyps3BiptHtxTfg==",
"requires": {
"form-data": "^2.3.2"
}
},
"isstream": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
@ -12363,6 +12332,11 @@
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
"lodash-compat": {
"version": "3.10.2",
"resolved": "https://registry.npmjs.org/lodash-compat/-/lodash-compat-3.10.2.tgz",
"integrity": "sha1-xpQBKKnTD46QLNLPmf0Muk7PwYM="
},
"lodash.camelcase": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
@ -17543,24 +17517,13 @@
"q": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
"integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
"dev": true
"integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc="
},
"qs": {
"version": "6.5.2",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
},
"querystring": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
"integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA="
},
"querystring-browser": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/querystring-browser/-/querystring-browser-1.0.4.tgz",
"integrity": "sha1-8uNYgYQKgZvHsb9Zf68JeeZiLcY="
},
"querystringify": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
@ -17754,6 +17717,11 @@
"esprima": "~4.0.0"
}
},
"reduce-component": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/reduce-component/-/reduce-component-1.0.1.tgz",
"integrity": "sha1-4Mk1QsV0UhvqE98PlIjtgqt3xdo="
},
"reflect-metadata": {
"version": "0.1.13",
"resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz",
@ -19566,52 +19534,116 @@
}
},
"swagger-client": {
"version": "3.13.5",
"resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.13.5.tgz",
"integrity": "sha512-n4+yS0+jvx7PNq95TulWhjN+v9Cz6GRkdloF3LL0JV2eQ8E8a3a+0/XEppsYGIzb7i2/h7ZMcM5hIxIr7Gr1RA==",
"version": "2.1.18",
"resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-2.1.18.tgz",
"integrity": "sha1-0zrd7Li438Qjh931t1pAXlQ32M8=",
"requires": {
"@babel/runtime-corejs3": "^7.11.2",
"btoa": "^1.2.1",
"buffer": "^6.0.3",
"cookie": "~0.4.1",
"cross-fetch": "^3.0.6",
"deep-extend": "~0.6.0",
"fast-json-patch": "^3.0.0-1",
"isomorphic-form-data": "~2.0.0",
"js-yaml": "^3.14.0",
"lodash": "^4.17.19",
"qs": "^6.9.4",
"querystring-browser": "^1.0.4",
"traverse": "~0.6.6",
"url": "~0.11.0"
"btoa": "^1.1.2",
"cookiejar": "^2.0.1",
"js-yaml": "^3.3.0",
"lodash-compat": "^3.5.0",
"q": "^1.4.1",
"superagent": "^1.2"
},
"dependencies": {
"buffer": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
"integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
"async": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
"integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
},
"component-emitter": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
"integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
},
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"base64-js": "^1.3.1",
"ieee754": "^1.2.1"
"ms": "2.0.0"
}
},
"cookie": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
"integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA=="
"extend": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz",
"integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ="
},
"form-data": {
"version": "1.0.0-rc3",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz",
"integrity": "sha1-01vGLn+8KTeuePlIqqDTjZBgdXc=",
"requires": {
"async": "^1.4.0",
"combined-stream": "^1.0.5",
"mime-types": "^2.1.3"
}
},
"formidable": {
"version": "1.0.16",
"resolved": "https://registry.npmjs.org/formidable/-/formidable-1.0.16.tgz",
"integrity": "sha1-SRbP38TL7QILJXpqlQWpqzjCzQ4="
},
"isarray": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
"integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
},
"mime": {
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz",
"integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM="
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
"qs": {
"version": "6.10.1",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz",
"integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==",
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz",
"integrity": "sha1-6eha2+ddoLvkyOBHaghikPhjtAQ="
},
"readable-stream": {
"version": "1.0.27-1",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.27-1.tgz",
"integrity": "sha1-a2eYPCA1fO/QfwFlABoW1xDZEHg=",
"requires": {
"side-channel": "^1.0.4"
"core-util-is": "~1.0.0",
"inherits": "~2.0.1",
"isarray": "0.0.1",
"string_decoder": "~0.10.x"
}
},
"traverse": {
"version": "0.6.6",
"resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz",
"integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc="
"string_decoder": {
"version": "0.10.31",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
"integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
},
"superagent": {
"version": "1.8.5",
"resolved": "https://registry.npmjs.org/superagent/-/superagent-1.8.5.tgz",
"integrity": "sha1-HA3cOvMOgOuE68BcshItqP6UC1U=",
"requires": {
"component-emitter": "~1.2.0",
"cookiejar": "2.0.6",
"debug": "2",
"extend": "3.0.0",
"form-data": "1.0.0-rc3",
"formidable": "~1.0.14",
"methods": "~1.1.1",
"mime": "1.3.4",
"qs": "2.3.3",
"readable-stream": "1.0.27-1",
"reduce-component": "1.0.1"
},
"dependencies": {
"cookiejar": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.0.6.tgz",
"integrity": "sha1-Cr81atANHFohnYjURRgEbdAmrP4="
}
}
}
}
},
@ -20893,22 +20925,6 @@
"punycode": "^2.1.0"
}
},
"url": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
"integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
"requires": {
"punycode": "1.3.2",
"querystring": "0.2.0"
},
"dependencies": {
"punycode": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
"integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0="
}
}
},
"url-join": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz",

View file

@ -1,6 +1,6 @@
{
"name": "botserver",
"version": "2.0.119",
"version": "3.0.0",
"description": "General Bot Community Edition open-core server.",
"main": "./boot.js",
"bugs": "https://github.com/pragmatismo-io/BotServer/issues",
@ -72,7 +72,7 @@
"botbuilder-ai": "4.13.5",
"botbuilder-dialogs": "4.13.5",
"botframework-connector": "4.13.5",
"botlib": "1.8.1",
"botlib": "1.8.3",
"cli-spinner": "0.2.10",
"core-js": "3.14.0",
"dotenv-extended": "2.9.0",
@ -107,7 +107,7 @@
"speakingurl": "^14.0.1",
"sppull": "2.7.0",
"strict-password-generator": "1.1.2",
"swagger-client": "^3.13.5",
"swagger-client": "2.1.18",
"tedious": "9.2.1",
"textract": "2.5.0",
"typescript": "3.9.4",

View file

@ -142,6 +142,15 @@ export class GuaribasInstance extends Model<GuaribasInstance>
@Column
public googleChatSubscriptionName: string;
@Column
public googleClientEmail: string;
@Column({ type: DataType.STRING(4000) })
public googlePrivateKey: string;
@Column
public googleProjectId: string;
@Column
public whatsappBotKey: string;

View file

@ -651,16 +651,19 @@ export class GBMinService {
}
});
if (min.instance.googlePrivateKey) {
min['googleDirectLine'] = new GoogleChatDirectLine(
min,
min.botId,
min.instance.googleBotKey,
min.instance.googleChatSubscriptionName,
min.instance.googleChatApiKey
min.instance.googleChatApiKey,
min.instance.googleClientEmail,
min.instance.googlePrivateKey.replace(/\\n/gm, '\n'),
min.instance.googleProjectId
);
await min['googleDirectLine'].setup(true);
}
// If there is WhatsApp configuration specified, initialize
// infrastructure objects.
@ -773,8 +776,7 @@ export class GBMinService {
let adapter = min.bot;
if (req.body.object)
{
if (req.body.object) {
req['rawBody'] = JSON.stringify(req.body);
adapter = min['fbAdapter'];
}

View file

@ -30,27 +30,14 @@
| |
\*****************************************************************************/
import urlJoin = require('url-join');
const Swagger = require('swagger-client');
const rp = require('request-promise');
const fs = require('fs');
import { GBLog, GBMinInstance, GBService, IGBPackage } from 'botlib';
import { CollectionUtil } from 'pragmatismo-io-framework';
import * as request from 'request-promise-native';
import { GBServer } from '../../../src/app';
import { GBConversationalService } from '../../core.gbapp/services/GBConversationalService';
import { SecService } from '../../security.gbapp/services/SecService';
import { Messages } from '../strings';
const { google } = require('googleapis')
const chat = google.chat('v1');
const { promisify } = require('util');
chat.spaces.messages.createAsync = promisify(chat.spaces.messages.create);
const { PubSub } = require('@google-cloud/pubsub');
// Creates a client; cache this for further use
const subscriptionName = 'projects/eastern-amp-316323/topics/generalbots';
const timeout = 60;
import { GBLog, GBMinInstance, GBService } from 'botlib';
import { GBServer } from '../../../src/app';
import { SecService } from '../../security.gbapp/services/SecService';
/**
* Support for Google Chat.
@ -68,6 +55,9 @@ export class GoogleChatDirectLine extends GBService {
private directLineSecret: string;
pubSubClient: any;
GoogleChatApiKey: any;
GoogleClientEmail: any;
GoogleClientPrivateKey: any;
GoogleProjectId: any;
constructor(
min: GBMinInstance,
@ -75,6 +65,9 @@ export class GoogleChatDirectLine extends GBService {
directLineSecret,
GoogleChatSubscriptionName,
GoogleChatApiKey,
GoogleClientEmail,
GoogleClientPrivateKey,
GoogleProjectId
) {
super();
@ -82,8 +75,15 @@ export class GoogleChatDirectLine extends GBService {
this.botId = botId;
this.directLineSecret = directLineSecret;
this.GoogleChatSubscriptionName = GoogleChatSubscriptionName;
this.pubSubClient = new PubSub();
this.GoogleChatApiKey = GoogleChatApiKey;
this.GoogleClientEmail = GoogleClientEmail;
this.GoogleClientPrivateKey = GoogleClientPrivateKey;
this.GoogleProjectId = GoogleProjectId;
this.pubSubClient = new PubSub({
projectId: this.GoogleProjectId,
credentials: { client_email: GoogleClientEmail, private_key: GoogleClientPrivateKey }
});
}
@ -107,8 +107,6 @@ export class GoogleChatDirectLine extends GBService {
new Swagger.ApiKeyAuthorization('Authorization', `Bearer ${this.directLineSecret}`, 'header')
);
if (setUrl) {
try {
@ -140,11 +138,9 @@ export class GoogleChatDirectLine extends GBService {
let text;
const threadName = event.message.thread.name;
if (event['type'] === 'ADDED_TO_SPACE' && event['space']['singleUserBotDm'])
{
if (event['type'] === 'ADDED_TO_SPACE' && event['space']['singleUserBotDm']) {
}else if(event['type'] === 'MESSAGE')
{
} else if (event['type'] === 'MESSAGE') {
text = event.message.text;
fromName = event.message.sender.displayName;
from = event.message.sender.email;
@ -152,27 +148,33 @@ export class GoogleChatDirectLine extends GBService {
}
message.ack();
const sec = new SecService();
const user = await sec.ensureUser(this.min.instance.instanceId, from,
from, '', 'googlechat', fromName, from);
await sec.updateConversationReferenceById(user.userId, threadName);
GBLog.info(`GBGoogleChat: RCV ${from}: ${text})`);
const client = await this.directLineClient;
const conversationId = GoogleChatDirectLine.conversationIds[threadName];
const conversationId = GoogleChatDirectLine.conversationIds[from];
if (GoogleChatDirectLine.conversationIds[threadName] === undefined) {
if (GoogleChatDirectLine.conversationIds[from] === undefined) {
GBLog.info(`GBGoogleChat: Starting new conversation on Bot.`);
const response = await client.Conversations.Conversations_StartConversation();
const generatedConversationId = response.obj.conversationId;
GoogleChatDirectLine.conversationIds[threadName] = generatedConversationId;
GoogleChatDirectLine.conversationIds[from] = generatedConversationId;
this.pollMessages(client, generatedConversationId, from, fromName);
this.inputMessage(client, generatedConversationId, text, from, fromName);
this.pollMessages(client, generatedConversationId, threadName, from, fromName);
this.inputMessage(client, generatedConversationId, threadName, text, from, fromName);
} else {
this.inputMessage(client, conversationId, text, from, fromName);
this.inputMessage(client, conversationId, threadName, text, from, fromName);
}
}
public inputMessage(client, conversationId, text, from, fromName) {
public inputMessage(client, conversationId, threadName, text, from, fromName) {
return client.Conversations.Conversations_PostActivity({
conversationId: conversationId,
activity: {
@ -189,7 +191,7 @@ export class GoogleChatDirectLine extends GBService {
});
}
public pollMessages(client, conversationId, from, fromName) {
public pollMessages(client, conversationId, threadName, from, fromName) {
GBLog.info(`GBGoogleChat: Starting message polling(${from}, ${conversationId}).`);
let watermark: any;
@ -201,7 +203,7 @@ export class GoogleChatDirectLine extends GBService {
watermark: watermark
});
watermark = response.obj.watermark;
await this.printMessages(response.obj.activities, conversationId, from, fromName);
await this.printMessages(response.obj.activities, conversationId, threadName, from, fromName);
} catch (err) {
GBLog.error(`Error calling printMessages on GoogleChat channel ${err.data === undefined ? err : err.data}`);
}
@ -209,7 +211,7 @@ export class GoogleChatDirectLine extends GBService {
setInterval(worker, this.pollInterval);
}
public async printMessages(activities, conversationId, from, fromName) {
public async printMessages(activities, conversationId, threadName, from, fromName) {
if (activities && activities.length) {
// Ignore own messages.
@ -219,13 +221,13 @@ export class GoogleChatDirectLine extends GBService {
// Print other messages.
await GoogleChatDirectLine.asyncForEach(activities, async activity => {
await this.printMessage(activity, conversationId, from, fromName);
await this.printMessage(activity, conversationId, threadName, from, fromName);
});
}
}
}
public async printMessage(activity, conversationId, from, fromName) {
public async printMessage(activity, conversationId, threadName, from, fromName) {
let output = '';
if (activity.text) {
@ -246,34 +248,45 @@ export class GoogleChatDirectLine extends GBService {
});
}
await this.sendToDevice(from, output);
await this.sendToDevice(from, conversationId, threadName, output);
}
public async sendToDevice(threadName: string, msg: string) {
public async sendToDevice(from: string, conversationId: string, threadName, msg: string) {
try {
let threadParts = threadName.split('/');
let spaces = threadParts[1];
let threadKey = threadParts[3];
const scopes = ['https://www.googleapis.com/auth/chat.bot'];
const jwtClient = new google.auth.JWT(
this.GoogleClientEmail,
null,
this.GoogleClientPrivateKey,
scopes,
null
);
await jwtClient.authorize();
const chat = google.chat({version: 'v1', auth: jwtClient});
chat.spaces.messages.createAsync = promisify(chat.spaces.messages.create);
const res = await chat.spaces.messages.createAsync({
auth: this.GoogleChatApiKey,
parent: `spaces/${spaces}`,
threadKey: threadKey,
body: {
requestBody: {
text: msg
}
});
GBLog.info(res);
GBLog.info(`Message [${msg}] sent to ${threadName}: `);
GBLog.info(`Message [${msg}] sent to ${from}: `);
} catch (error) {
GBLog.error(`Error sending message to GoogleChat provider ${error.message}`);
}
}
public async sendToDeviceEx(to, text, locale) {
public async sendToDeviceEx(to, conversationId, threadName, text, locale) {
const minBoot = GBServer.globals.minBoot as any;
text = await minBoot.conversationalService.translate(
@ -281,6 +294,6 @@ export class GoogleChatDirectLine extends GBService {
text,
locale
);
await this.sendToDevice(to, text);
await this.sendToDevice(to, conversationId, threadName, text);
}
}