import fs = require("fs-extra"); import path = require('path'); import request = require("request"); const chalk = require("chalk"); export class Platform { protected env:any; constructor(env){ this.env = env; } preprocessParams(params){ Object.keys(params).forEach(function(name) { var param = params[name] if (param && typeof param === 'object') { params[name] = JSON.stringify(param) } }); return params; } } export class Facebook extends Platform { setWebhook(callback){ return new Promise((resolve, reject) => { if (this.env.RECIME_FACEBOOK_APP_ID && this.env.RECIME_FACEBOOK_APP_SECRET) { const uid = this.env.UID; const appId = this.env.RECIME_FACEBOOK_APP_ID; const secret = this.env.RECIME_FACEBOOK_APP_SECRET; request({ "url": `https://graph.facebook.com/${appId}/subscriptions`, "method": "POST", qs: { access_token: `${appId}|${secret}` }, json: true, form: this.preprocessParams({ object: "page", "callback_url": callback, fields: "messages,messaging_postbacks,messaging_optins,message_deliveries,message_reads", verify_token: uid }) }, (err, response, body) => { if (err) { reject(err); return; } if (body.error) { reject(body.error); return; } resolve(); }); } else { resolve(); } }); } subscribeToPage(){ return new Promise((resolve, reject)=>{ if (this.env.RECIME_FACEBOOK_ACCESS_TOKEN){ const accessToken = this.env.RECIME_FACEBOOK_ACCESS_TOKEN; request({ method : "POST", json : true, url : "https://graph.facebook.com/v2.6/me/subscribed_apps", qs : { access_token : accessToken } }, (err, response, body)=>{ if (err){ reject(err); return; } if (body.error) { reject(body.error); return; } console.log(`\r\n${chalk.inverse("FACEBOOK")} Webhook is set.\r\n`); resolve(); }); } else { resolve(); } }); } configureNLP(){ return new Promise((resolve, reject) => { if (this.env.RECIME_FACEBOOK_ACCESS_TOKEN && this.env.WIT_TOKEN) { const accessToken = this.env.RECIME_FACEBOOK_ACCESS_TOKEN; const witToken = this.env.WIT_TOKEN; request({ method: "POST", json: true, url: `https://graph.facebook.com/v2.8/me/nlp_configs?nlp_enabled=true&&custom_token=${witToken}`, qs: { access_token: accessToken } }, (err, response, body) => { if (err) { reject(err); return; } console.log(`${chalk.inverse("FACEBOOK")} NLP --> Configured.\r\n`); resolve(); }); } else { resolve(); } }); } setWecomeScreen(){ return new Promise((resolve, reject) => { if (this.env.RECIME_FACEBOOK_ACCESS_TOKEN){ this.updateProfile({ "get_started": { "payload": "start" } }, "Welcome screen --> Success.") .then(resolve) .catch(reject); } else { resolve(); } }); } setPersistentMenu(){ return new Promise((resolve, reject) => { if (this.env.RECIME_FACEBOOK_ACCESS_TOKEN) { this.updateProfile({ "persistent_menu": [{ "locale": "default", "composer_input_disabled": false, "call_to_actions": [ { "type": "postback", "title": "Made with Recime", "payload": "about" } ] }] }, "Persistent menu --> Success.") .then(resolve) .catch(reject) } else { resolve(); } }); } updateProfile(body, message){ return new Promise((resolve, reject) => { if (!this.env.RECIME_FACEBOOK_ACCESS_TOKEN) resolve(); else { request({ method: "POST", url: `https://graph.facebook.com/v2.6/me/messenger_profile?access_token=${this.env.RECIME_FACEBOOK_ACCESS_TOKEN}`, json: true, body: body }, (err, response, body) => { if (err) { reject(err); return; } console.log(`${chalk.inverse("FACEBOOK")} ${message}\r\n`) resolve(); }); } }); } } export class Telegram extends Platform { //curl -F url=PASTE_YOUR_BOT_URL https://api.telegram.org/botPASTE_YOUR_ACCESS_TOKEN_HERE/setWebhook setWebhook(callback) { return new Promise((resolve, reject) => { if (!this.env.RECIME_TELEGRAM_ACCESS_TOKEN) return resolve(); else { request({ json: true, url: `https://api.telegram.org/bot${this.env.RECIME_TELEGRAM_ACCESS_TOKEN}/setWebhook`, form: this.preprocessParams({ url: callback }) }, (err, response, body) => { if (err) { reject(err); return; } console.log(`${chalk.inverse("TELEGRAM")} ${body.description}\r\n`); resolve(); }); } }); } } export class Viber extends Platform { setWebhook(callback) { return new Promise((resolve, reject) => { if (this.env.RECIME_VIBER_ACCESS_TOKEN) { request({ json: true, method: "POST", url: " https://chatapi.viber.com/pa/set_webhook", headers: { "X-Viber-Auth-Token": this.env.RECIME_VIBER_ACCESS_TOKEN }, body: { url: callback, event_types: ["delivered", "seen", "failed", "subscribed", "unsubscribed", "conversation_started"] } }, (err, response, body) => { if (err) { return reject(err); } console.log(`${chalk.inverse("VIBER")} ${JSON.stringify(body)}\r\n`); resolve(); }); } else { resolve(); } }); } } // FAQ Bot // const facebook = new Facebook({ // "RECIME_FACEBOOK_ACCESS_TOKEN": "EAATZCyFGylS4BAEwou9pA17M12DQDmY7t8v4YhdyM6zXhe5V9kAniTcfne9xWvBZAQmo6GI3HtOu8l7UYT0QtMsylsCyValtr7lXb1b1o2G3lCldnj651BTPWg3sWcoZATO0S1I3Buz2rFr0q6fIrrOYYrnwsG3jwDZBkZB1qmgZDZD", // }); // facebook.setWecomeScreen().then(() => facebook.setPersistentMenu()).then(console.log); const facebook = new Facebook({ "RECIME_FACEBOOK_ACCESS_TOKEN": "EAATZCyFGylS4BAJP8KCqXu4DeZC1ZAj39C4BgD5ZBErFo48qpHFIZCVOJUCflqaNEDkBcZBLavOckY7sFaDB5P4fnKxDW6toAGwcqaopB4Mv5u8JAGvvR4Lh0fBJjmlcZAdAPbgFi7MVzpsETkiKHSsuh0OVZBqvwXZCRKwBVEhK5bwZDZD", }); facebook.setWecomeScreen().then(() => facebook.setPersistentMenu()).then(console.log);