From d9f09425a196874d2b64f145d10b1190370b3f04 Mon Sep 17 00:00:00 2001 From: Rodrigo Rodriguez Date: Thu, 30 Sep 2021 16:03:31 -0300 Subject: [PATCH] new(teams.gblib): Teams support for creation of new bots. --- package-lock.json | 91 ++++++++++-------- package.json | 3 +- packages/core.gbapp/services/GBCoreService.ts | 5 +- packages/core.gbapp/services/GBDeployer.ts | 25 +++-- .../services/GoogleChatDirectLine.ts | 1 + packages/teams.gblib/index.ts | 71 ++++++++++++++ packages/teams.gblib/services/TeamsService.ts | 65 +++++++++++++ packages/teams.gblib/strings.ts | 8 ++ teams-color.png | Bin 0 -> 25670 bytes teams-manifest.json | 56 +++++++++++ teams-outline.png | Bin 0 -> 8578 bytes 11 files changed, 271 insertions(+), 54 deletions(-) create mode 100644 packages/teams.gblib/index.ts create mode 100644 packages/teams.gblib/services/TeamsService.ts create mode 100644 packages/teams.gblib/strings.ts create mode 100644 teams-color.png create mode 100644 teams-manifest.json create mode 100644 teams-outline.png diff --git a/package-lock.json b/package-lock.json index b89be32a4..5c7a7d222 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "botserver", - "version": "2.0.141", + "version": "2.0.151", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -80,15 +80,15 @@ } }, "@azure/core-rest-pipeline": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.1.1.tgz", - "integrity": "sha512-ObF8iTEDXIG7/NlL28ni9bR3XLJwgm2S3GWO4aNW6CsTCFVoY9HMdbBtN7xOB+pUQwifehifXNnootbzzuwJnw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.3.0.tgz", + "integrity": "sha512-XdGCm4sVfLvFbd3x17Aw6XNA8SK+sWFvVlOnNSSL2OJGJ4g10LspCpGnIqB+V6OZAaVwOx/eQQN2rOfZzf4Q5w==", "requires": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.3.0", - "@azure/core-tracing": "1.0.0-preview.12", + "@azure/core-tracing": "1.0.0-preview.13", "@azure/logger": "^1.0.0", - "form-data": "^3.0.0", + "form-data": "^4.0.0", "http-proxy-agent": "^4.0.1", "https-proxy-agent": "^5.0.0", "tslib": "^2.2.0", @@ -96,9 +96,9 @@ }, "dependencies": { "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -106,9 +106,9 @@ } }, "tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" }, "uuid": { "version": "8.3.2", @@ -118,35 +118,35 @@ } }, "@azure/core-tracing": { - "version": "1.0.0-preview.12", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.12.tgz", - "integrity": "sha512-nvo2Wc4EKZGN6eFu9n3U7OXmASmL8VxoPIH7xaD6OlQqi44bouF0YIi9ID5rEsKLiAU59IYx6M297nqWVMWPDg==", + "version": "1.0.0-preview.13", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.13.tgz", + "integrity": "sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==", "requires": { - "@opentelemetry/api": "^1.0.0", + "@opentelemetry/api": "^1.0.1", "tslib": "^2.2.0" }, "dependencies": { "@opentelemetry/api": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.0.1.tgz", - "integrity": "sha512-H5Djcc2txGAINgf3TNaq4yFofYSIK3722PM89S/3R8FuI/eqi1UscajlXk7EBkG9s2pxss/q6SHlpturaavXaw==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.0.3.tgz", + "integrity": "sha512-puWxACExDe9nxbBB3lOymQFrLYml2dVOrd7USiVRnSbgXE+KwBu+HxFvxrzfqsiSda9IWsXJG1ef7C1O2/GmKQ==" }, "tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" } } }, "@azure/cosmos": { - "version": "3.12.2", - "resolved": "https://registry.npmjs.org/@azure/cosmos/-/cosmos-3.12.2.tgz", - "integrity": "sha512-57KPx3nXOFxhrlFsjP9+ZE87IJ7TFjy/kFa6FS+fmA3MGFDoKULJkZ9YThKMiUXgT+isUeDlQSiURDq10XbIqA==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/@azure/cosmos/-/cosmos-3.14.1.tgz", + "integrity": "sha512-i8HJOlmVfr1P5qMNgKbEpszddtT8Ooskj2pJm0ZD7jeMuwN2tYlQ68eLyCmynv1j5PQimLGjlobBVuFuM8uNAA==", "requires": { "@azure/core-auth": "^1.3.0", - "@azure/core-rest-pipeline": "^1.1.0", + "@azure/core-rest-pipeline": "^1.2.0", "debug": "^4.1.1", - "fast-json-stable-stringify": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", "jsbi": "^3.1.3", "node-abort-controller": "^1.2.0", "priorityqueuejs": "^1.0.0", @@ -165,9 +165,9 @@ } }, "tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" }, "uuid": { "version": "8.3.2", @@ -185,9 +185,9 @@ }, "dependencies": { "tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" } } }, @@ -3455,9 +3455,9 @@ } }, "adm-zip": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", - "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==" + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.6.tgz", + "integrity": "sha512-nUeYhBHLG08VFOkVwai0pLXge6NNlahH+ccwxXodvl+SLa5l9mXHjg40jRVzofRPz29goiTGze7vIKmCltKtSA==" }, "agent-base": { "version": "4.3.0", @@ -5250,9 +5250,9 @@ } }, "botlib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/botlib/-/botlib-1.9.3.tgz", - "integrity": "sha512-t5xLXHghHy0694tE+64nvSRlv5SNX5BAUJEOQ2P7tA685UzKbFekrS1Tik8Z+5Rl9MMxfuZFFbMyZQX/2opSxQ==", + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/botlib/-/botlib-1.9.4.tgz", + "integrity": "sha512-WC9+iss8ch2aDhXDUfiVD5gO1tKcWbPyo8Ul+CNUwM+CdjqVW1mndg83OSX2VZS5vqjU024AwFEJ1jq3EosXvQ==", "requires": { "async": "3.2.0", "botbuilder": "4.11.0", @@ -5807,9 +5807,9 @@ }, "dependencies": { "dayjs": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.6.tgz", - "integrity": "sha512-AztC/IOW4L1Q41A86phW5Thhcrco3xuAA+YX/BLpLWWjRcTj5TOt/QImBLmCKlrF7u7k47arTnOyL6GnbG8Hvw==" + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz", + "integrity": "sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==" } } }, @@ -8347,6 +8347,13 @@ "adm-zip": "^0.4.4", "bluebird": "^3.5.1", "xml2js": "^0.4.4" + }, + "dependencies": { + "adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==" + } } }, "error-ex": { diff --git a/package.json b/package.json index e7b4a49c3..5fd719acb 100644 --- a/package.json +++ b/package.json @@ -58,6 +58,7 @@ "@sendgrid/mail": "^7.4.4", "@types/validator": "13.1.4", "adal-node": "0.2.2", + "adm-zip": "^0.5.6", "any-shell-escape": "0.1.1", "async-promises": "0.2.3", "azure-arm-cognitiveservices": "3.0.0", @@ -73,7 +74,7 @@ "botbuilder-ai": "4.11.0", "botbuilder-dialogs": "4.11.0", "botframework-connector": "4.11.0", - "botlib": "1.9.3", + "botlib": "1.9.4", "cli-spinner": "0.2.10", "core-js": "3.14.0", "date-diff": "^0.2.2", diff --git a/packages/core.gbapp/services/GBCoreService.ts b/packages/core.gbapp/services/GBCoreService.ts index f922d3c6b..45f53d3dd 100644 --- a/packages/core.gbapp/services/GBCoreService.ts +++ b/packages/core.gbapp/services/GBCoreService.ts @@ -36,7 +36,7 @@ 'use strict'; -import { GBLog, GBMinInstance, IGBCoreService, IGBInstallationDeployer, IGBInstance, IGBPackage } from 'botlib'; +import { GBLog, IGBCoreService, IGBInstallationDeployer, IGBInstance, IGBPackage } from 'botlib'; import * as fs from 'fs'; import { Sequelize, SequelizeOptions } from 'sequelize-typescript'; import { Op, Dialect } from 'sequelize'; @@ -50,12 +50,11 @@ import { GBCustomerSatisfactionPackage } from '../../customer-satisfaction.gbapp import { GBKBPackage } from '../../kb.gbapp'; import { GBSecurityPackage } from '../../security.gbapp'; import { GBWhatsappPackage } from '../../whatsapp.gblib/index'; -import { GuaribasInstance, GuaribasSchedule } from '../models/GBModel'; +import { GuaribasInstance } from '../models/GBModel'; import { GBConfigService } from './GBConfigService'; import { GBAzureDeployerPackage } from '../../azuredeployer.gbapp'; import { GBSharePointPackage } from '../../sharepoint.gblib'; import { CollectionUtil } from 'pragmatismo-io-framework'; -import { GBVMService } from '../../basic.gblib/services/GBVMService'; import { GBBasicPackage } from '../../basic.gblib'; import { GBGoogleChatPackage } from '../../google-chat.gblib'; diff --git a/packages/core.gbapp/services/GBDeployer.ts b/packages/core.gbapp/services/GBDeployer.ts index d7b3f8d9a..6ff0badc1 100644 --- a/packages/core.gbapp/services/GBDeployer.ts +++ b/packages/core.gbapp/services/GBDeployer.ts @@ -43,7 +43,7 @@ const express = require('express'); const child_process = require('child_process'); const rimraf = require('rimraf'); const request = require('request-promise-native'); - +const uuidv4 = require('uuid/v4'); import { GBError, GBLog, GBMinInstance, IGBCoreService, IGBDeployer, IGBInstance, IGBPackage } from 'botlib'; import { AzureSearch } from 'pragmatismo-io-framework'; import { CollectionUtil } from 'pragmatismo-io-framework'; @@ -55,6 +55,7 @@ import { AzureDeployerService } from './../../azuredeployer.gbapp/services/Azure import { KBService } from './../../kb.gbapp/services/KBService'; import { GBConfigService } from './GBConfigService'; import { GBImporter } from './GBImporterService'; +import { TeamsService } from '../../teams.gblib/services/TeamsService'; const MicrosoftGraph = require('@microsoft/microsoft-graph-client'); /** @@ -356,6 +357,16 @@ export class GBDeployer implements IGBDeployer { sleep(5000); } + /** + * Return a zip file for importing bot in apps, currently MS Teams. + */ + public async getBotManifest(instance: IGBInstance): Promise { + const s = new TeamsService(); + const manifest = await s.getManifest(instance.marketplaceId, instance.title, instance.description, + uuidv4().toString(), instance.botId, "General Bots"); + return await s.getAppFile(manifest); + } + /** * Refreshes NLP entities on the remote service. */ @@ -446,7 +457,7 @@ export class GBDeployer implements IGBDeployer { baseUrl: string = null, client = null): Promise { - GBLog.info(`downloadFolder: localPath=${localPath}, remotePath=${remotePath}, baseUrl=${baseUrl}`); + GBLog.info(`downloadFolder: localPath=${localPath}, remotePath=${remotePath}, baseUrl=${baseUrl}`); if (!baseUrl) { [baseUrl, client] = await GBDeployer.internalGetDriveClient(min); @@ -473,7 +484,7 @@ export class GBDeployer implements IGBDeployer { const botId = min.instance.botId; const path = urlJoin(`/${botId}.gbai`, remotePath); let url = `${baseUrl}/drive/root:${path}:/children`; - + GBLog.info(`Download URL: ${url}`); const res = await client @@ -500,10 +511,7 @@ export class GBDeployer implements IGBDeployer { } else { GBLog.info(`Downloading ${itemPath}...`); const url = item['@microsoft.graph.downloadUrl']; - const options = { - uri: url, - encoding: null - }; + const response = await request({ uri: url, encoding: null }); Fs.writeFileSync(itemPath, response, { encoding: null }); } @@ -909,7 +917,8 @@ export class GBDeployer implements IGBDeployer { 'azuredeployer.gbapp', 'customer-satisfaction.gbapp', 'kb.gbapp', - 'google-chat.gblib' + 'google-chat.gblib', + 'teams.gblib' ]; return names.indexOf(name) > -1; diff --git a/packages/google-chat.gblib/services/GoogleChatDirectLine.ts b/packages/google-chat.gblib/services/GoogleChatDirectLine.ts index ee3d2605a..7bbe3daea 100644 --- a/packages/google-chat.gblib/services/GoogleChatDirectLine.ts +++ b/packages/google-chat.gblib/services/GoogleChatDirectLine.ts @@ -129,6 +129,7 @@ export class GoogleChatDirectLine extends GBService { GBLog.info(`GBGoogleChat: Checking server...`); } + // TODO: Check service.Users.Messages.List("me"). public async receiver(message) { const event = JSON.parse(Buffer.from(message.data, 'binary').toString()); diff --git a/packages/teams.gblib/index.ts b/packages/teams.gblib/index.ts new file mode 100644 index 000000000..7a015c53b --- /dev/null +++ b/packages/teams.gblib/index.ts @@ -0,0 +1,71 @@ +/*****************************************************************************\ +| ( )_ _ | +| _ _ _ __ _ _ __ ___ ___ _ _ | ,_)(_) ___ ___ _ | +| ( '_`\ ( '__)/'_` ) /'_ `\/' _ ` _ `\ /'_` )| | | |/',__)/' v `\ /'_`\ | +| | (_) )| | ( (_| |( (_) || ( ) ( ) |( (_| || |_ | |\__, \| (˅) |( (_) ) | +| | ,__/'(_) `\__,_)`\__ |(_) (_) (_)`\__,_)`\__)(_)(____/(_) (_)`\___/' | +| | | ( )_) | | +| (_) \___/' | +| | +| General Bots Copyright (c) Pragmatismo.io. All rights reserved. | +| Licensed under the AGPL-3.0. | +| | +| According to our dual licensing model, this program can be used either | +| under the terms of the GNU Affero General Public License, version 3, | +| or under a proprietary license. | +| | +| The texts of the GNU Affero General Public License with an additional | +| permission and of our proprietary license can be found at and | +| in the LICENSE file you have received along with this program. | +| | +| This program is distributed in the hope that it will be useful, | +| but WITHOUT ANY WARRANTY, without even the implied warranty of | +| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | +| GNU Affero General Public License for more details. | +| | +| "General Bots" is a registered trademark of Pragmatismo.io. | +| The licensing of the program under the AGPLv3 does not imply a | +| trademark license. Therefore any rights, title and interest in | +| our trademarks remain entirely with us. | +| | +\*****************************************************************************/ + +/** + * @fileoverview General Bots server core. + */ + +'use strict'; + +import { GBDialogStep, GBLog, GBMinInstance, IGBCoreService, IGBPackage } from 'botlib'; +import { Sequelize } from 'sequelize-typescript'; + +/** + * Package for whatsapp.gblib + */ +export class GBTeamsPackage implements IGBPackage { + public sysPackages: IGBPackage[]; + + public async loadBot(min: GBMinInstance): Promise { + + } + + public async getDialogs(min: GBMinInstance) { + GBLog.verbose(`getDialogs called.`); + } + public async loadPackage(core: IGBCoreService, sequelize: Sequelize): Promise { + GBLog.verbose(`loadPackage called.`); + } + public async unloadPackage(core: IGBCoreService): Promise { + GBLog.verbose(`unloadPackage called.`); + } + public async unloadBot(min: GBMinInstance): Promise { + GBLog.verbose(`unloadBot called.`); + } + public async onNewSession(min: GBMinInstance, step: GBDialogStep): Promise { + GBLog.verbose(`onNewSession called.`); + } + public async onExchangeData(min: GBMinInstance, kind: string, data: any) { + GBLog.verbose(`onExchangeData called.`); + } + +} diff --git a/packages/teams.gblib/services/TeamsService.ts b/packages/teams.gblib/services/TeamsService.ts new file mode 100644 index 000000000..cffae7bfa --- /dev/null +++ b/packages/teams.gblib/services/TeamsService.ts @@ -0,0 +1,65 @@ +/*****************************************************************************\ +| ( )_ _ | +| _ _ _ __ _ _ __ ___ ___ _ _ | ,_)(_) ___ ___ _ | +| ( '_`\ ( '__)/'_` ) /'_ `\/' _ ` _ `\ /'_` )| | | |/',__)/' v `\ /'_`\ | +| | (_) )| | ( (_| |( (_) || ( ) ( ) |( (_| || |_ | |\__, \| (˅) |( (_) ) | +| | ,__/'(_) `\__,_)`\__ |(_) (_) (_)`\__,_)`\__)(_)(____/(_) (_)`\___/' | +| | | ( )_) | | +| (_) \___/' | +| | +| General Bots Copyright (c) Pragmatismo.io. All rights reserved. | +| Licensed under the AGPL-3.0. | +| | +| According to our dual licensing model, this program can be used either | +| under the terms of the GNU Affero General Public License, version 3, | +| or under a proprietary license. | +| | +| The texts of the GNU Affero General Public License with an additional | +| permission and of our proprietary license can be found at and | +| in the LICENSE file you have received along with this program. | +| | +| This program is distributed in the hope that it will be useful, | +| but WITHOUT ANY WARRANTY, without even the implied warranty of | +| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | +| GNU Affero General Public License for more details. | +| | +| "General Bots" is a registered trademark of Pragmatismo.io. | +| The licensing of the program under the AGPLv3 does not imply a | +| trademark license. Therefore any rights, title and interest in | +| our trademarks remain entirely with us. | +| | +\*****************************************************************************/ + +import urlJoin = require('url-join'); +import { GBService } from 'botlib'; +const fs = require('fs'); +var AdmZip = require("adm-zip"); + + +/** + * Support for Whatsapp. + */ +export class TeamsService extends GBService { + + public async getAppFile(manifest) + { + var zip = new AdmZip(); + zip.addFile("manifest.json", Buffer.from(manifest, "utf8"), "Built with General Bots™."); + zip.addLocalFile("teams-color.png", null, "color.png"); + zip.addLocalFile("teams-outline.png", null, "outline.png"); + return zip.toBuffer(); + } + + public async getManifest(marketplaceId, botName, botDescription, id, packageName, yourName) { + let content = fs.readFileSync('teams-manifest.json', 'utf8'); + + content = content.replace(/\@\@marketplaceId/gi, marketplaceId); + content = content.replace(/\@\@botName/gi, botName); + content = content.replace(/\@\@botDescription/gi, botDescription); + content = content.replace(/\@\@id/gi, id); + content = content.replace(/\@\@packageName/gi, packageName); + content = content.replace(/\@\@yourName/gi, yourName); + + return content; + } +} diff --git a/packages/teams.gblib/strings.ts b/packages/teams.gblib/strings.ts new file mode 100644 index 000000000..d30f544b1 --- /dev/null +++ b/packages/teams.gblib/strings.ts @@ -0,0 +1,8 @@ +export const Messages = { + 'en-US': { + + }, + 'pt-BR': { + + } +}; diff --git a/teams-color.png b/teams-color.png new file mode 100644 index 0000000000000000000000000000000000000000..651fe52e916d051cb9ed45d87537f89de162f562 GIT binary patch literal 25670 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%0A_hj&+4MZpafzb+z~Vubxm_hr+@LCjcdWw?K7u zYLg`FkaL^?by}1G*m8#pudt(Qp5F2XCH=|yqMNLooE+Rgs*~TUEE!~R7$)SOf%Is; z!@2L?Ew?Ww!{e4ZDl}Hs4<8?rDbHG!CP79nSW2t8nSHa<+S;Rq9VT=kdZa^aY&|c# z1P|IP?(;G<#{{H;h0{fR4j1YobY{XEFHJuyCnF<+*3ANP7y04VbKHr{<+%?<-r{ec zA(N@)Qb1pD(ufBK4@mkm<#lbC3>LsD#uEt`;Av^H!1=skxg&&H@p~XZ;lllQ3 zrFiWa8YuQQIiyR{%Ae846E0k!k-aX@>G^o+wQD|iwEE{8vJJe<3~!HDZ^Cy5-@k9R zsJnh$4kThyWu?gu)3Lp)1^AE#_Ai*fc0NAZQ{$@k7xB3fp-_l~POV~tlKnQ4LO`s7 z=~Fn!>+j!7cm}*8v0W*(iGittjg|S+zc5t**wtzUnq%ccsAlKjpdM9^bqZ_nHV+TF z-)i7p@xc6x*x%d^+x+$$6`H1;-F!kTPy_hjZvS=}cEQUd?u kyEQ2`5|sbDuN^a7!O~;w<8pFG$mgJ(>|O2tv|%Ou2Xo+vCIA2c literal 0 HcmV?d00001 diff --git a/teams-manifest.json b/teams-manifest.json new file mode 100644 index 000000000..439c66a4f --- /dev/null +++ b/teams-manifest.json @@ -0,0 +1,56 @@ +{ + "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.9/MicrosoftTeams.schema.json", + "manifestVersion": "1.9", + "version": "1.0.0", + "id": "@@id", + "packageName": "@@packageName", + "developer": { + "name": "@@yourName", + "websiteUrl": "https://pragmatismo.io", + "privacyUrl": "https://generalbots.ai/privacy.html", + "termsOfUseUrl": "https://generalbots.ai/terms.html" + }, + "icons": { + "color": "color.png", + "outline": "outline.png" + }, + "name": { + "short": "@@botName", + "full": "@@botName" + }, + "description": { + "short": "@@botName for Microsoft Teams", + "full": "@@botName for Microsoft Teams." + }, + "accentColor": "#7B7B7B", + "staticTabs": [ + { + "entityId": "conversations", + "scopes": [ + "personal" + ] + }, + { + "entityId": "about", + "scopes": [ + "personal" + ] + } + ], + "bots": [ + { + "botId": "@@marketplaceId", + "scopes": [ + "personal", + "team" + ], + "supportsFiles": false, + "isNotificationOnly": false + } + ], + "permissions": [ + "identity", + "messageTeamMembers" + ], + "validDomains": [] +} \ No newline at end of file diff --git a/teams-outline.png b/teams-outline.png new file mode 100644 index 0000000000000000000000000000000000000000..b1aed48a99ed18323c2cbe9a2bc2b8354b25c357 GIT binary patch literal 8578 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 aH4>y7*B@V972zT7Hdbbv$;GBSqW=Y_T|