import * as _ from 'lodash'; import * as messages from '../types/message'; import { Button } from '../types/messages/button'; export class ValidationException extends Error { constructor() { super('validation error'); // Set the prototype explicitly. (Object).setPrototypeOf(this, ValidationException.prototype); } } export class Response { check(message: M): void { if (message.type !== this.type) { throw new ValidationException() } } public type: messages.MessageType = null; } export class TextResponse extends Response { protected allowedPhrases: Array; constructor(allowedPhrases: Array | string) { super(); if (_.isArray(allowedPhrases)) { this.allowedPhrases = allowedPhrases; } else { this.allowedPhrases = [ allowedPhrases ]; } this.type = messages.MessageTypes.text } check(message: messages.TextMessage): void { const textCheck: boolean = this.allowedPhrases.length === 0 ? true : _.includes(this.allowedPhrases, message.text); if (textCheck === false) { throw new Error(`Text mismatch expected '${this.allowedPhrases}', but got '${message.text}'`); } super.check(message) } } export class ImageResponse extends Response { protected url: string | RegExp; constructor(url: string | RegExp) { super(); this.url = url; this.type = messages.MessageTypes.image; } check(message: messages.ImageMessage): void { if (message.url.match(this.url as RegExp) === null) { throw new Error(`URL mismatch expected '${this.url}', but got '${message.url}'`); } super.check(message); } } export class AudioResponse extends ImageResponse { constructor(url: string) { super(url); this.type = messages.MessageTypes.audio; } } // export class FileResponse extends ImageResponse { // constructor(url: string) { // super(url); // } // public type: ResponseTypes = ResponseTypes.file_attachment; // } // export class VideoResponse extends ImageResponse { // constructor(url: string) { // super(url); // } // public type: ResponseTypes = ResponseTypes.video_attachment; // } // export class QuickRepliesResponse extends TextResponse { // protected buttons: Array; // constructor(allowedPhraes: Array = [], buttonArray: Array = []) { // super(allowedPhraes); // this.buttons = buttonArray; // } // public type: ResponseTypes = ResponseTypes.quick_replies; // check(message: messages.Message): boolean { // const buttonsMatch = _.intersectionWith(this.buttons, payload.message.quick_replies, _.isEqual).length >= this.buttons.length; // if (buttonsMatch === false) { // throw new Error(`button content doesn't match`); // } // return super.check(payload) && buttonsMatch; // } // } export class ButtonTemplateResponse extends Response { protected allowedText: Array; protected buttons: Array