Skip to content

Commit

Permalink
fix(core.gbapp): New async interfaces for .gbapps.
Browse files Browse the repository at this point in the history
  • Loading branch information
rodrigorodriguez committed Apr 13, 2020
1 parent 4addca4 commit 5ff38a4
Show file tree
Hide file tree
Showing 19 changed files with 450 additions and 366 deletions.
514 changes: 250 additions & 264 deletions package-lock.json

Large diffs are not rendered by default.

4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -65,16 +65,18 @@
"botbuilder-ai": "4.7.0",
"botbuilder-dialogs": "4.7.0",
"botframework-connector": "4.7.0",
"botlib": "1.4.5",
"botlib": "1.5.0",
"chai": "4.2.0",
"cli-spinner": "0.2.10",
"csv-parse": "4.8.3",
"dotenv-extended": "2.7.1",
"exceljs": "3.5.0",
"express": "4.17.1",
"express-remove-route": "1.0.0",
"ffmpeg-static": "^4.1.0",
"js-beautify": "1.10.2",
"marked": "0.8.0",
"microsoft-cognitiveservices-speech-sdk": "^1.11.0",
"mocha": "6.2.2",
"ms-rest-azure": "3.0.0",
"nexmo": "2.5.2",
Expand Down
12 changes: 6 additions & 6 deletions packages/admin.gbapp/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,24 +47,24 @@ import { GuaribasAdmin } from './models/AdminModel';
export class GBAdminPackage implements IGBPackage {
public sysPackages: IGBPackage[];

public getDialogs(min: GBMinInstance) {
public async getDialogs(min: GBMinInstance) {
GBLog.verbose(`getDialogs called.`);
}
public unloadPackage(core: IGBCoreService): void {
public async unloadPackage(core: IGBCoreService): Promise<void> {
GBLog.verbose(`unloadPackage called.`);
}
public unloadBot(min: GBMinInstance): void {
public async unloadBot(min: GBMinInstance): Promise<void> {
GBLog.verbose(`unloadBot called.`);
}
public onNewSession(min: GBMinInstance, step: GBDialogStep): void {
public async onNewSession(min: GBMinInstance, step: GBDialogStep): Promise<void> {
GBLog.verbose(`onNewSession called.`);
}

public loadPackage(core: IGBCoreService, sequelize: Sequelize): void {
public async loadPackage(core: IGBCoreService, sequelize: Sequelize): Promise<void> {
core.sequelize.addModels([GuaribasAdmin]);
}

public loadBot(min: GBMinInstance): void {
public async loadBot(min: GBMinInstance): Promise<void> {
AdminDialog.setup(min);
}
}
12 changes: 6 additions & 6 deletions packages/analytics.gblib/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,24 +45,24 @@ import { GuaribasConversation, GuaribasConversationMessage } from './models';
*/
export class GBAnalyticsPackage implements IGBPackage {
public sysPackages: IGBPackage[];
public getDialogs(min: GBMinInstance) {
public async getDialogs(min: GBMinInstance) {
GBLog.verbose(`getDialogs called.`);
}
public loadPackage(core: IGBCoreService, sequelize: Sequelize): void {
public async loadPackage(core: IGBCoreService, sequelize: Sequelize): Promise<void> {
GBLog.verbose(`loadPackage called.`);
core.sequelize.addModels([GuaribasConversation, GuaribasConversationMessage]);

}
public unloadPackage(core: IGBCoreService): void {
public async unloadPackage(core: IGBCoreService): Promise<void> {
GBLog.verbose(`unloadPackage called.`);
}
public loadBot(min: GBMinInstance): void {
public async loadBot(min: GBMinInstance): Promise<void> {
GBLog.verbose(`loadBot called.`);
}
public unloadBot(min: GBMinInstance): void {
public async unloadBot(min: GBMinInstance): Promise<void> {
GBLog.verbose(`unloadBot called.`);
}
public onNewSession(min: GBMinInstance, step: GBDialogStep): void {
public async onNewSession(min: GBMinInstance, step: GBDialogStep): Promise<void> {
GBLog.verbose(`onNewSession called.`);
}
}
14 changes: 7 additions & 7 deletions packages/azuredeployer.gbapp/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,23 +43,23 @@ import { Sequelize } from 'sequelize-typescript';
* Package for Azure Deployer.
*/
export class GBAzureDeployerPackage implements IGBPackage {
public sysPackages: IGBPackage[];
public getDialogs(min: GBMinInstance) {
public sysPackages: IGBPackage[];
public async getDialogs(min: GBMinInstance) {
GBLog.verbose(`getDialogs called.`);
}
public loadPackage(core: IGBCoreService, sequelize: Sequelize): void {
public async loadPackage(core: IGBCoreService, sequelize: Sequelize): Promise<void> {
GBLog.verbose(`loadPackage called.`);
}
public unloadPackage(core: IGBCoreService): void {
public async unloadPackage(core: IGBCoreService): Promise<void> {
GBLog.verbose(`unloadPackage called.`);
}
public loadBot(min: GBMinInstance): void {
public async loadBot(min: GBMinInstance): Promise<void> {
GBLog.verbose(`loadBot called.`);
}
public unloadBot(min: GBMinInstance): void {
public async unloadBot(min: GBMinInstance): Promise<void> {
GBLog.verbose(`unloadBot called.`);
}
public onNewSession(min: GBMinInstance, step: GBDialogStep): void {
public async onNewSession(min: GBMinInstance, step: GBDialogStep): Promise<void> {
GBLog.verbose(`onNewSession called.`);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -502,7 +502,7 @@ export class AzureDeployerService implements IGBInstallationDeployer {

instance.marketplaceId = appId;
instance.marketplacePassword = appPassword;
instance.engineName = GBCorePackage.CurrentEngineName;
instance.engineName = GBCorePackage['CurrentEngineName'];

const parameters = {
location: location,
Expand Down
12 changes: 6 additions & 6 deletions packages/console.gblib/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,23 +46,23 @@ import { ConsoleDirectLine } from './services/ConsoleDirectLine';
export class GBConsolePackage implements IGBPackage {
public sysPackages: IGBPackage[];
public channel: ConsoleDirectLine;
public getDialogs(min: GBMinInstance) {
public async getDialogs(min: GBMinInstance) {
GBLog.verbose(`getDialogs called.`);
}
public loadPackage(core: IGBCoreService, sequelize: Sequelize): void {
public async loadPackage(core: IGBCoreService, sequelize: Sequelize): Promise<void> {
GBLog.verbose(`loadPackage called.`);
}
public unloadPackage(core: IGBCoreService): void {
public async unloadPackage(core: IGBCoreService): Promise<void> {
GBLog.verbose(`unloadPackage called.`);
}
public unloadBot(min: GBMinInstance): void {
public async unloadBot(min: GBMinInstance): Promise<void> {
GBLog.verbose(`unloadBot called.`);
}
public onNewSession(min: GBMinInstance, step: GBDialogStep): void {
public async onNewSession(min: GBMinInstance, step: GBDialogStep): Promise<void> {
GBLog.verbose(`onNewSession called.`);
}

public loadBot(min: GBMinInstance): void {
public async loadBot(min: GBMinInstance): Promise<void> {
this.channel = new ConsoleDirectLine(min.instance.webchatKey);
}
}
14 changes: 7 additions & 7 deletions packages/core.gbapp/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,26 +47,26 @@ import { GuaribasChannel, GuaribasException, GuaribasInstance, GuaribasPackage }
* Package for core.gbapp.
*/
export class GBCorePackage implements IGBPackage {
public static CurrentEngineName = 'guaribas-1.0.0';
public sysPackages: IGBPackage[];
public loadPackage(core: IGBCoreService, sequelize: Sequelize): void {
public CurrentEngineName = "guaribas-1.0.0";
public async loadPackage(core: IGBCoreService, sequelize: Sequelize): Promise<void> {
core.sequelize.addModels([GuaribasInstance, GuaribasPackage, GuaribasChannel, GuaribasException]);
}

public getDialogs(min: GBMinInstance) {
public async getDialogs(min: GBMinInstance) {
GBLog.verbose(`getDialogs called.`);
}
public unloadPackage(core: IGBCoreService): void {
public async unloadPackage(core: IGBCoreService): Promise<void> {
GBLog.verbose(`unloadPackage called.`);
}
public unloadBot(min: GBMinInstance): void {
public async unloadBot(min: GBMinInstance): Promise<void> {
GBLog.verbose(`unloadBot called.`);
}
public onNewSession(min: GBMinInstance, step: GBDialogStep): void {
public async onNewSession(min: GBMinInstance, step: GBDialogStep): Promise<void> {
GBLog.verbose(`onNewSession called.`);
}

public loadBot(min: GBMinInstance): void {
public async loadBot(min: GBMinInstance): Promise<void> {
WelcomeDialog.setup(min.bot, min);
WhoAmIDialog.setup(min.bot, min);
SwitchBotDialog.setup(min.bot, min);
Expand Down
71 changes: 69 additions & 2 deletions packages/core.gbapp/services/GBConversationalService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,13 @@ import { GBDialogStep, GBLog, GBMinInstance, IGBConversationalService, IGBCoreSe
import { AzureText } from 'pragmatismo-io-framework';
import { Messages } from '../strings';
import { GBServer } from '../../../src/app';
import { GBWhatsappPackage } from '../../whatsapp.gblib';
const urlJoin = require('url-join');
const PasswordGenerator = require("strict-password-generator").default;
const Nexmo = require('nexmo');
let sdk = require("microsoft-cognitiveservices-speech-sdk");
var fs = require('fs')
import { Readable } from 'stream'
const prism = require('prism-media');

export interface LanguagePickerSettings {
defaultLocale?: string;
Expand Down Expand Up @@ -130,6 +133,70 @@ export class GBConversationalService implements IGBConversationalService {
min.whatsAppDirectLine.sendToDevice(mobile, message);
}

public static async getTextFromAudioBuffer(speechKey, cloudRegion, buffer, locale): Promise<string> {
return new Promise<string>(async (resolve, reject) => {
try {
let subscriptionKey = speechKey;
let serviceRegion = cloudRegion;

var samplingRate = 16000;
var frameDuration = 20;
var channels = 1;
var frameSize = samplingRate * frameDuration / 1000;

const oggFile = new Readable();
oggFile._read = () => { } // _read is required but you can noop it
oggFile.push(buffer);
oggFile.push(null);

// TODO: Use stream directly without physical files.

fs.writeFileSync('audio.ogg', buffer);

let wr = fs.createWriteStream('audio.pcm');
wr.on('finish', () => {
let data = fs.readFileSync('audio.pcm');

let pushStream = sdk.AudioInputStream.createPushStream();
pushStream.write(data);
pushStream.close();

let audioConfig = sdk.AudioConfig.fromStreamInput(pushStream);
let speechConfig = sdk.SpeechConfig.fromSubscription(subscriptionKey, serviceRegion);
speechConfig.speechRecognitionLanguage = locale;
let recognizer = new sdk.SpeechRecognizer(speechConfig, audioConfig);

recognizer.recognizeOnceAsync(
(result) => {

resolve(result.text ? result.text : 'audio not converted');

recognizer.close();
recognizer = undefined;
},
(err) => {
reject(err);

recognizer.close();
recognizer = undefined;
});
});

fs.createReadStream('audio.ogg')
.pipe(new prism.opus.OggDemuxer())
.pipe(new prism.opus.Decoder({
rate: samplingRate,
channels: channels, frameSize: frameSize
}))
.pipe(wr);
} catch (error) {
GBLog.error(error);
return Promise.reject(error);
}
});
}


// tslint:enable:no-unsafe-any

public async sendMarkdownToMobile(min: GBMinInstance, step: GBDialogStep, mobile: string, text: string) {
Expand Down Expand Up @@ -161,7 +228,7 @@ export class GBConversationalService implements IGBConversationalService {
let currentEmbedUrl = '';

//![General Bots](/instance/images/gb.png)
for (var i = 0; i < text.length; i++) {
for (let i = 0; i < text.length; i++) {
const c = text.charAt(i);

switch (state) {
Expand Down
30 changes: 17 additions & 13 deletions packages/core.gbapp/services/GBCoreService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ 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';


const opn = require('opn');
Expand Down Expand Up @@ -385,27 +386,30 @@ STORAGE_SYNC=true
return instances;
}

public loadSysPackages(core: GBCoreService) {
public async loadSysPackages(core: GBCoreService) : Promise<IGBPackage[]>{
// NOTE: if there is any code before this line a semicolon
// will be necessary before this line.
// Loads all system packages.
const sysPackages: IGBPackage[] = [];
[
GBAdminPackage,
GBCorePackage,
GBSecurityPackage,
GBKBPackage,
GBCustomerSatisfactionPackage,
GBAnalyticsPackage,
GBWhatsappPackage,
GBAzureDeployerPackage,
GBSharePointPackage,
].forEach(e => {

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);
p.loadPackage(core, core.sequelize);

await p.loadPackage(core, core.sequelize);

});

return sysPackages;
Expand Down
2 changes: 1 addition & 1 deletion packages/core.gbapp/services/GBDeployer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -537,7 +537,7 @@ export class GBDeployer implements IGBDeployer {
}
const m = await import(e);
const p = new m.Package();
p.loadPackage(core, core.sequelize);
await p.loadPackage(core, core.sequelize);
appPackages.push(p);
GBLog.info(`App (.gbapp) deployed: ${e}.`);
appPackagesProcessed++;
Expand Down

0 comments on commit 5ff38a4

Please sign in to comment.