diff --git a/package.json b/package.json index 5b601fb..6b063e9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ebenos/monorepo", - "version": "3.1.0", + "version": "3.1.1", "main": "index.js", "license": "MIT", "private": true, diff --git a/packages/framework/lib/index.ts b/packages/framework/lib/index.ts index 2fcbc3f..b53b50c 100644 --- a/packages/framework/lib/index.ts +++ b/packages/framework/lib/index.ts @@ -12,6 +12,7 @@ import Bot from './bot'; import User from './models/User'; import DatabaseUser, { userLoader as databaseUserLoader } from './models/DatabaseUser'; import InMemoryUser, { userLoader as inMemoryUserLoader } from './models/InMemoryUser'; +import { IUser } from './models/UserSchema'; import GenericAdapter from './adapter'; import TestAdapter from './tests/test-adapter'; export { Module, BotOptions, Scenario } from './interfaces/bot'; @@ -33,5 +34,6 @@ export { databaseUserLoader, InMemoryUser, inMemoryUserLoader, - TestAdapter + TestAdapter, + IUser }; diff --git a/packages/framework/lib/interfaces/nlp.ts b/packages/framework/lib/interfaces/nlp.ts index 34b8747..c9d4d74 100644 --- a/packages/framework/lib/interfaces/nlp.ts +++ b/packages/framework/lib/interfaces/nlp.ts @@ -1,11 +1,16 @@ export interface WitNLP { - entities: { - intent?: WitEntityNLP[]; - sentiment?: WitEntityNLP[]; - }; + text: string; + intents: WitIntentNLP[]; + entities: any; } export interface WitEntityNLP { value: string; confidence: number; } + +export interface WitIntentNLP { + id: string; + name: string; + confidence: number; +} diff --git a/packages/framework/lib/interfaces/trackingData.ts b/packages/framework/lib/interfaces/trackingData.ts index 86910fa..86f58e1 100644 --- a/packages/framework/lib/interfaces/trackingData.ts +++ b/packages/framework/lib/interfaces/trackingData.ts @@ -1,5 +1 @@ -export type TrackingDataPrimitives = null | string | number | boolean; -export type ITrackingData = - | TrackingDataPrimitives - | Array<ITrackingData> - | { [key: string]: ITrackingData }; +export type ITrackingData = Record<string, any> | string; diff --git a/packages/framework/lib/modules/index.ts b/packages/framework/lib/modules/index.ts index 8ce5da4..78957f5 100644 --- a/packages/framework/lib/modules/index.ts +++ b/packages/framework/lib/modules/index.ts @@ -79,7 +79,7 @@ export function addBaseLocationRule<U extends User<any>>( export function addTextRule<U extends User<any>>( module: Module<U>, - action: (user: U, payload?: IPayload, ...args: any[]) => Promise<any>, + action: (user: U, payload: IPayload, ...args: any[]) => Promise<any>, rule: RegExp | RegExp[] ): void { const actionName = module.name + '/' + action.name; diff --git a/packages/framework/package.json b/packages/framework/package.json index ce62e35..d4e98b4 100644 --- a/packages/framework/package.json +++ b/packages/framework/package.json @@ -1,6 +1,6 @@ { - "name": "@ebenos/framework", - "version": "4.0.0-alpha.29", + "name": "@ebonydevcopy/framework", + "version": "4.0.0-alpha.30", "description": "A module-based NodeJS chatbot framework.", "main": "./build/index.js", "types": "./build/index.d.ts", diff --git a/packages/viber-adapter/lib/adapter.ts b/packages/viber-adapter/lib/adapter.ts index bb9a221..8061237 100644 --- a/packages/viber-adapter/lib/adapter.ts +++ b/packages/viber-adapter/lib/adapter.ts @@ -1,26 +1,45 @@ -import { EbonyHandlers, GenericAdapter, GenericAttachment, IRouters } from '@ebenos/framework'; +import { + EbonyHandlers, + GenericAdapter, + GenericAttachment, + IRouters +} from '@ebonydevcopy/framework'; import express, { Request, Response } from 'express'; import { json as bodyParser } from 'body-parser'; import senderFactory from './sender'; -import { IViberMessageEvent, IViberSender, WebhookIncomingViberEvent } from './interfaces/webhook'; +import { + IViberMessageEvent, + IViberSender, + WebhookIncomingViberEvent, + IViberUnsubscribedEvent, + IViberSubscribedEvent, + IViberConversationStartedEvent +} from './interfaces/webhook'; import { setWebhook } from './api/requests'; import { IViberSetWebhookResult } from './interfaces/api'; -import { IUser } from '@ebenos/framework/lib/models/UserSchema'; import { isMediaMessage, IViberLocationMessage, IViberTextMessage } from './interfaces/message_types'; import { isPostbackTrackingData } from './interfaces/tracking_data'; -import { ITrackingData } from '@ebenos/framework'; +import { ITrackingData, IUser } from '@ebonydevcopy/framework'; -export interface IViberOptions { +export interface IViberOptions<U> { route?: string; authToken: string; welcomeMessage?: Record<string, unknown>; + userLoader?: (userData: IUser) => Promise<U>; + webhookHanlers?: IViberWebhookHandlers; +} + +export interface IViberWebhookHandlers { + unsubscribeWebhook?: (e: IViberUnsubscribedEvent) => Promise<void>; + subscribeWebhook?: (e: IViberSubscribedEvent) => Promise<void>; + conversationStartedWebhook?: (e: IViberConversationStartedEvent) => Promise<void>; } -export default class ViberAdapter extends GenericAdapter { +export default class ViberAdapter<U extends IUser> extends GenericAdapter { public operations = { handover: (): Promise<void> => { console.log('Not implemented!'); @@ -31,25 +50,41 @@ export default class ViberAdapter extends GenericAdapter { public sender; private welcomeMessage?: Record<string, unknown>; + private webhookHanlers?: IViberWebhookHandlers; private route: string; private authToken: string; public webhook = express(); + private userLoader?: (userData: IUser) => Promise<U>; - constructor(options: IViberOptions) { + constructor(options: IViberOptions<U>) { super(); - const { route = '/viber/webhook', authToken, welcomeMessage } = options; + const { + route = '/viber/webhook', + authToken, + welcomeMessage, + userLoader, + webhookHanlers + } = options; this.route = route; this.authToken = authToken; this.sender = senderFactory(this.authToken); this.welcomeMessage = welcomeMessage; + this.userLoader = userLoader; + this.webhookHanlers = webhookHanlers; } - public initialization(): void { + public async initialization(): Promise<void> { this.webhook.use(bodyParser()); this.webhook.post( this.route, - viberWebhookFactory(this.routers, this.handlers, this.welcomeMessage) + await viberWebhookFactory( + this.routers, + this.handlers, + this.welcomeMessage, + this.userLoader, + this.webhookHanlers + ) ); } @@ -110,19 +145,27 @@ function handleTextMessage( return; } -function viberWebhookFactory( +async function viberWebhookFactory<U extends IUser>( routers: IRouters, handlers: EbonyHandlers<any>, - welcomeMessage?: Record<string, unknown> + welcomeMessage?: Record<string, unknown>, + userLoader?: (userData: IUser) => Promise<U>, + webhooks?: { + unsubscribeWebhook?: (e: IViberUnsubscribedEvent) => Promise<void>; + subscribeWebhook?: (e: IViberSubscribedEvent) => Promise<void>; + conversationStartedWebhook?: (e: IViberConversationStartedEvent) => Promise<void>; + } ) { - function messageWebhook(e: IViberMessageEvent): void { - const user = convertViberSenderToUser(e.sender); + async function messageWebhook(e: IViberMessageEvent): Promise<void> { + const user = userLoader + ? await userLoader(convertViberSenderToUser(e.sender)) + : convertViberSenderToUser(e.sender); + switch (e.message.type) { case 'text': case 'location': handleTextMessage(e.message, user, handlers.text, routers); return; - default: if (isMediaMessage(e.message)) { if (handlers.attachment !== undefined) { @@ -152,6 +195,7 @@ function viberWebhookFactory( console.log('seen'); return; case 'conversation_started': + if (webhooks?.conversationStartedWebhook) webhooks.conversationStartedWebhook(body); console.log('conversation_started'); if (welcomeMessage !== undefined) { res.json(welcomeMessage); @@ -163,10 +207,12 @@ function viberWebhookFactory( console.log('delivered'); return; case 'subscribed': + if (webhooks?.subscribeWebhook) webhooks.subscribeWebhook(body); console.log('subscribed'); return; case 'unsubscribed': - console.log('unsubscribed'); + if (webhooks?.unsubscribeWebhook) webhooks.unsubscribeWebhook(body); + else console.log('unsubscribed'); return; case 'failed': console.log(`Failed: ${body.desc}`); diff --git a/packages/viber-adapter/lib/sender.ts b/packages/viber-adapter/lib/sender.ts index aaa878c..9895775 100644 --- a/packages/viber-adapter/lib/sender.ts +++ b/packages/viber-adapter/lib/sender.ts @@ -1,4 +1,4 @@ -import { IInteraction } from '@ebenos/framework'; +import { IInteraction } from '@ebonydevcopy/framework'; import { sendMessage } from './api/requests'; export default function senderFactory(viberToken: string) { diff --git a/packages/viber-adapter/package.json b/packages/viber-adapter/package.json index 2bf035d..ca1c388 100644 --- a/packages/viber-adapter/package.json +++ b/packages/viber-adapter/package.json @@ -1,6 +1,6 @@ { - "name": "@ebenos/viber-adapter", - "version": "4.0.0-alpha.29", + "name": "@ebonydevcopy/viber-adapter", + "version": "4.0.0-alpha.31", "description": "Viber adapter for the Ebony framework.", "main": "./build/index.js", "publishConfig": { @@ -33,7 +33,7 @@ "node-fetch": "^2.6.6" }, "devDependencies": { - "@ebenos/framework": "^4.0.0-alpha.29", + "@ebonydevcopy/framework": "^4.0.0-alpha.29", "@types/body-parser": "^1.19.2", "@types/express": "^4.17.13", "@types/node-fetch": "^2.5.12" diff --git a/packages/viber-elements/lib/viberAPI/attachments.ts b/packages/viber-elements/lib/viberAPI/attachments.ts index df1ee2c..2d9ef40 100644 --- a/packages/viber-elements/lib/viberAPI/attachments.ts +++ b/packages/viber-elements/lib/viberAPI/attachments.ts @@ -17,7 +17,7 @@ import { OpenURLMediaType, ISerializedButton } from './interfaces'; -import { ISerializable } from '@ebenos/framework'; +import { ISerializable } from '@ebonydevcopy/framework'; /**Viber RichMedia Button */ export class Button implements ISerializable { diff --git a/packages/viber-elements/lib/viberAPI/carousel.ts b/packages/viber-elements/lib/viberAPI/carousel.ts index b5ef24b..a7da9f7 100644 --- a/packages/viber-elements/lib/viberAPI/carousel.ts +++ b/packages/viber-elements/lib/viberAPI/carousel.ts @@ -1,6 +1,6 @@ import { Button, RichMedia } from './attachments'; import { IFrame, IRichMediaOptions } from './interfaces'; -import { ISerializable } from '@ebenos/framework'; +import { ISerializable } from '@ebonydevcopy/framework'; export interface ICarouselElement { title?: string; diff --git a/packages/viber-elements/lib/viberAPI/interfaces.ts b/packages/viber-elements/lib/viberAPI/interfaces.ts index 127248f..5ca8929 100644 --- a/packages/viber-elements/lib/viberAPI/interfaces.ts +++ b/packages/viber-elements/lib/viberAPI/interfaces.ts @@ -1,7 +1,7 @@ import { RichMedia, Picture, Button } from './attachments'; import { Carousel } from './carousel'; import { Keyboard } from './keyboard'; -import { ITrackingData } from '@ebenos/framework'; +import { ITrackingData } from '@ebonydevcopy/framework'; export type ScaleType = 'crop' | 'fill' | 'fit'; export type ActionType = 'reply' | 'open-url' | 'location-picker' | 'share-phone' | 'none'; diff --git a/packages/viber-elements/lib/viberAPI/keyboard.ts b/packages/viber-elements/lib/viberAPI/keyboard.ts index 3af8f59..e170f61 100644 --- a/packages/viber-elements/lib/viberAPI/keyboard.ts +++ b/packages/viber-elements/lib/viberAPI/keyboard.ts @@ -1,4 +1,4 @@ -import { ISerializable } from '@ebenos/framework'; +import { ISerializable } from '@ebonydevcopy/framework'; import { Button } from './attachments'; import { IKeyboardOptions, InputFieldState, ISerializedKeyboard } from './interfaces'; diff --git a/packages/viber-elements/lib/viberAPI/message.ts b/packages/viber-elements/lib/viberAPI/message.ts index 72b8201..090fe5f 100644 --- a/packages/viber-elements/lib/viberAPI/message.ts +++ b/packages/viber-elements/lib/viberAPI/message.ts @@ -1,4 +1,4 @@ -import { ISerializable } from '@ebenos/framework'; +import { ISerializable } from '@ebonydevcopy/framework'; import { IMessageOptions, ISender, @@ -12,7 +12,7 @@ import { import { Picture, RichMedia } from './attachments'; import { Keyboard } from './keyboard'; import { Carousel } from './carousel'; -import { ITrackingData } from '@ebenos/framework'; +import { ITrackingData } from '@ebonydevcopy/framework'; function isText(options: IMessageOptions): options is ITextOptions { return (options as ITextOptions).text !== undefined; diff --git a/packages/viber-elements/package.json b/packages/viber-elements/package.json index b1d8dc1..8bf6df1 100644 --- a/packages/viber-elements/package.json +++ b/packages/viber-elements/package.json @@ -1,6 +1,6 @@ { - "name": "@ebenos/viber-elements", - "version": "4.0.0-alpha.29", + "name": "@ebonydevcopy/viber-elements", + "version": "4.0.0-alpha.31", "description": "Elements Library for the Ebony framework.", "main": "./build/index.js", "publishConfig": { @@ -29,10 +29,10 @@ ], "license": "MIT", "peerDependencies": { - "@ebenos/framework": "*" + "@ebonydevcopy/framework": "*" }, "devDependencies": { - "@ebenos/framework": "^4.0.0-alpha.29" + "@ebonydevcopy/framework": "^4.0.0-alpha.29" }, "engines": { "node": ">=14.0.0" diff --git a/yarn.lock b/yarn.lock index d75c828..3e1caf4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -23,6 +23,24 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@ebenos/framework@^4.0.0-alpha.29": + version "4.0.0-alpha.29" + resolved "https://registry.yarnpkg.com/@ebenos/framework/-/framework-4.0.0-alpha.29.tgz#966f8535dd7d7abcdb2de5ea4bcad4bac371d6bc" + integrity sha512-P+9RDnP2AZNCGGY0QNY+WMEfTGOWSGuhnjJ0IKNdhGk+Pvp8bDRZ329BHuIYE5KjUajOZbY/pTvnys3smu7Zrw== + dependencies: + lodash "^4.17.21" + mongodb "^4.2.0" + mongoose "^6.0.13" + +"@ebenos/viber-adapter@^4.0.0-alpha.29": + version "4.0.0-alpha.29" + resolved "https://registry.yarnpkg.com/@ebenos/viber-adapter/-/viber-adapter-4.0.0-alpha.29.tgz#b849d77f6604b2156156f12f5de2dc3ab4db9048" + integrity sha512-hhaf3c05kI7txUF5dbWFsN9Om0CobhAs82KFfo1Hsxvwk4QboOX6Bgklv2lzvWj2szV4HGUskeQPp0BINIx8bw== + dependencies: + body-parser "^1.19.0" + express "^4.17.1" + node-fetch "^2.6.6" + "@eslint/eslintrc@^1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.0.4.tgz#dfe0ff7ba270848d10c5add0715e04964c034b31" @@ -1414,7 +1432,7 @@ browser-stdout@1.3.1: resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -bson@^4.2.2, bson@^4.5.4: +bson@^4.2.2, bson@^4.5.4, bson@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/bson/-/bson-4.6.0.tgz#15c3b39ba3940c3d915a0c44d51459f4b4fbf1b2" integrity sha512-8jw1NU1hglS+Da1jDOUYuNcBJ4cNHCFIqzlwoFNnsTOg2R/ox0aTYcTiBN4dzRa9q7Cvy6XErh3L8ReTEb9AQQ== @@ -3328,6 +3346,11 @@ kareem@2.3.2: resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.3.2.tgz#78c4508894985b8d38a0dc15e1a8e11078f2ca93" integrity sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ== +kareem@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.3.3.tgz#a4432d7965a5bb06fc2b4eeae71317344c9a756a" + integrity sha512-uESCXM2KdtOQ8LOvKyTUXEeg0MkYp4wGglTIpGcYHvjJcS5sn2Wkfrfit8m4xSbaNDAw2KdI9elgkOxZbrFYbg== + kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" @@ -3800,6 +3823,14 @@ mongodb-connection-string-url@^2.1.0, mongodb-connection-string-url@^2.2.0: "@types/whatwg-url" "^8.2.1" whatwg-url "^11.0.0" +mongodb-connection-string-url@^2.3.2: + version "2.4.1" + resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-2.4.1.tgz#6b3c6c40133a0ad059fe9a0abda64b2a1cb4e8b4" + integrity sha512-d5Kd2bVsKcSA7YI/yo57fSTtMwRQdFkvc5IZwod1RRxJtECeWPPSo7zqcUGJELifRA//Igs4spVtYAmvFCatug== + dependencies: + "@types/whatwg-url" "^8.2.1" + whatwg-url "^11.0.0" + mongodb@4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-4.1.4.tgz#ba8062c7c67e7a22db5a059dbac1e3044b48453b" @@ -3811,6 +3842,17 @@ mongodb@4.1.4: optionalDependencies: saslprep "^1.0.3" +mongodb@4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-4.2.2.tgz#cd70568bd96003877e35358ad17a0c5de35c6dfd" + integrity sha512-zt8rCTnTKyMQppyt63qMnrLM5dbADgUk18ORPF1XbtHLIYCyc9hattaYHi0pqMvNxDpgGgUofSVzS+UQErgTug== + dependencies: + bson "^4.6.0" + denque "^2.0.1" + mongodb-connection-string-url "^2.3.2" + optionalDependencies: + saslprep "^1.0.3" + mongodb@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-4.2.0.tgz#7ef94ab0613a2fd890763260fdac20cd099d0d7f" @@ -3822,6 +3864,21 @@ mongodb@^4.2.0: optionalDependencies: saslprep "^1.0.3" +mongoose@^6.0.13: + version "6.1.4" + resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-6.1.4.tgz#a414e64c849fae3ced99348e9de73f986c9f0551" + integrity sha512-RsNiMpGWo7OXFmq5xt0ZWYt2rabHLxNYr0oAiR0xDv23lHKCkXDqyDl71+sXF9rcWEe8BTHG+1IRQykiNBvaKQ== + dependencies: + bson "^4.2.2" + kareem "2.3.3" + mongodb "4.2.2" + mpath "0.8.4" + mquery "4.0.0" + ms "2.1.2" + regexp-clone "1.0.0" + sift "13.5.2" + sliced "1.0.1" + mongoose@^6.0.14: version "6.0.14" resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-6.0.14.tgz#8f4d45318bb5de08814a8a9b040dd53521246608"