Skip to content
Draft
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion packages/framework/lib/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -33,5 +34,6 @@ export {
databaseUserLoader,
InMemoryUser,
inMemoryUserLoader,
TestAdapter
TestAdapter,
IUser
};
13 changes: 9 additions & 4 deletions packages/framework/lib/interfaces/nlp.ts
Original file line number Diff line number Diff line change
@@ -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;
}
6 changes: 1 addition & 5 deletions packages/framework/lib/interfaces/trackingData.ts
Original file line number Diff line number Diff line change
@@ -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;
2 changes: 1 addition & 1 deletion packages/framework/lib/modules/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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>,

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what will the payload be like there?

rule: RegExp | RegExp[]
): void {
const actionName = module.name + '/' + action.name;
Expand Down
71 changes: 56 additions & 15 deletions packages/viber-adapter/lib/adapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,39 @@ import { EbonyHandlers, GenericAdapter, GenericAttachment, IRouters } from '@ebe
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 '@ebenos/framework';

export interface IViberOptions {
export interface IViberOptions<U> {
route?: string;
authToken: string;
welcomeMessage?: Record<string, unknown>;
userLoader?: (userData: IUser) => Promise<U>;
webhookHanlers?: IViberWebhookHandlers;

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

typo: webhookHanlers -> webhookHandlers

}

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!');
Expand All @@ -31,25 +45,41 @@ export default class ViberAdapter extends GenericAdapter {
public sender;

private welcomeMessage?: Record<string, unknown>;
private webhookHanlers?: IViberWebhookHandlers;

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

typo webhookHanlers -> webhookHandlers

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
)
);
}

Expand Down Expand Up @@ -110,19 +140,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) {
Expand Down Expand Up @@ -152,6 +190,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);
Expand All @@ -163,10 +202,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);

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add brackets ({}) on all ifs

else console.log('unsubscribed');
return;
case 'failed':
console.log(`Failed: ${body.desc}`);
Expand Down