Advertisement
Guest User

Untitled

a guest
Aug 23rd, 2019
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.59 KB | None | 0 0
  1. // __ __ ___ ___
  2. // |__) / \ | |__/ | |
  3. // |__) \__/ | | \ | |
  4.  
  5. // This is the main file for the botium bot.
  6.  
  7. // Import Botkit's core features
  8. const { Botkit, BotkitConversation } = require('botkit');
  9. const { BotkitCMSHelper } = require('botkit-plugin-cms');
  10.  
  11. // Import a platform-specific adapter for slack.
  12.  
  13. const { SlackAdapter, SlackMessageTypeMiddleware, SlackEventMiddleware } = require('botbuilder-adapter-slack');
  14.  
  15. const { MongoDbStorage } = require('botbuilder-storage-mongodb');
  16.  
  17. // Load process.env values from .env file
  18. require('dotenv').config();
  19.  
  20. let storage = null;
  21. if (process.env.MONGO_URI) {
  22. storage = mongoStorage = new MongoDbStorage({
  23. url : process.env.MONGO_URI,
  24. });
  25. }
  26.  
  27.  
  28.  
  29. const adapter = new SlackAdapter({
  30. // REMOVE THIS OPTION AFTER YOU HAVE CONFIGURED YOUR APP!
  31. enable_incomplete: true,
  32.  
  33. // parameters used to secure webhook endpoint
  34. verificationToken: process.env.verificationToken,
  35. clientSigningSecret: process.env.clientSigningSecret,
  36.  
  37. // auth token for a single-team app
  38. botToken: process.env.botToken,
  39.  
  40. // credentials used to set up oauth for multi-team apps
  41. clientId: process.env.clientId,
  42. clientSecret: process.env.clientSecret,
  43. scopes: ['bot'],
  44. redirectUri: process.env.redirectUri,
  45.  
  46. // functions required for retrieving team-specific info
  47. // for use in multi-team apps
  48. getTokenForTeam: getTokenForTeam,
  49. getBotUserByTeam: getBotUserByTeam,
  50. });
  51.  
  52. // Use SlackEventMiddleware to emit events that match their original Slack event types.
  53. adapter.use(new SlackEventMiddleware());
  54.  
  55. // Use SlackMessageType middleware to further classify messages as direct_message, direct_mention, or mention
  56. adapter.use(new SlackMessageTypeMiddleware());
  57.  
  58.  
  59. const controller = new Botkit({
  60. webhook_uri: '/api/messages',
  61.  
  62. adapter: adapter,
  63.  
  64. storage
  65. });
  66.  
  67. if (process.env.cms_uri) {
  68. controller.usePlugin(new BotkitCMSHelper({
  69. uri: process.env.cms_uri,
  70. token: process.env.cms_token,
  71. }));
  72. }
  73.  
  74. // Once the bot has booted up its internal services, you can use them to do stuff.
  75. controller.ready(() => {
  76.  
  77. // load traditional developer-created local custom feature modules
  78. controller.loadModules(__dirname + '/features');
  79.  
  80. /* catch-all that uses the CMS to trigger dialogs */
  81. if (controller.plugins.cms) {
  82. controller.on('message,direct_message', async (bot, message) => {
  83. let results = false;
  84. results = await controller.plugins.cms.testTrigger(bot, message);
  85.  
  86. if (results !== false) {
  87. // do not continue middleware!
  88. return false;
  89. }
  90. });
  91. }
  92.  
  93. });
  94.  
  95.  
  96.  
  97. controller.webserver.get('/', (req, res) => {
  98.  
  99. res.send(`This app is running Botkit ${ controller.version }.`);
  100.  
  101. });
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108. controller.webserver.get('/install', (req, res) => {
  109. // getInstallLink points to slack's oauth endpoint and includes clientId and scopes
  110. res.redirect(controller.adapter.getInstallLink());
  111. });
  112.  
  113. controller.webserver.get('/install/auth', async (req, res) => {
  114. try {
  115. const results = await controller.adapter.validateOauthCode(req.query.code);
  116.  
  117. console.log('FULL OAUTH DETAILS', results);
  118.  
  119. // Store token by team in bot state.
  120. tokenCache[results.team_id] = results.bot.bot_access_token;
  121.  
  122. // Capture team to bot id
  123. userCache[results.team_id] = results.bot.bot_user_id;
  124.  
  125. res.json('Success! Bot installed.');
  126.  
  127. } catch (err) {
  128. console.error('OAUTH ERROR:', err);
  129. res.status(401);
  130. res.send(err.message);
  131. }
  132. });
  133.  
  134. let tokenCache = {};
  135. let userCache = {};
  136.  
  137. if (process.env.TOKENS) {
  138. tokenCache = JSON.parse(process.env.TOKENS);
  139. }
  140.  
  141. if (process.env.USERS) {
  142. userCache = JSON.parse(process.env.USERS);
  143. }
  144.  
  145. async function getTokenForTeam(teamId) {
  146. if (tokenCache[teamId]) {
  147. return new Promise((resolve) => {
  148. setTimeout(function() {
  149. resolve(tokenCache[teamId]);
  150. }, 150);
  151. });
  152. } else {
  153. console.error('Team not found in tokenCache: ', teamId);
  154. }
  155. }
  156.  
  157. async function getBotUserByTeam(teamId) {
  158. if (userCache[teamId]) {
  159. return new Promise((resolve) => {
  160. setTimeout(function() {
  161. resolve(userCache[teamId]);
  162. }, 150);
  163. });
  164. } else {
  165. console.error('Team not found in userCache: ', teamId);
  166. }
  167. }
  168.  
  169. controller.addDialog(createServiceDialog());
  170.  
  171. function createServiceDialog() {
  172. const MY_DIALOG_ID = 'my-dialog-name-constant';
  173. let convo = new BotkitConversation(MY_DIALOG_ID, controller);
  174.  
  175. convo.say('Howdy!');
  176. return (convo);
  177. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement