middleware.js 2.62 KB
'use strict';

let request = require('request');

module.exports = function(config) {
  if (!config) {
    config = {};
  }

  if (!config.rasa_uri) {
    config.rasa_uri = 'http://localhost:5000';
  }

  let middleware = {
    receive: function (bot, message, next) {
      /*eslint-disable */
      let postData = {
        'q': message.text.toLowerCase(),
      };
      /*eslint-enable */

      let requestOptions = {
        url: config.rasa_uri + '/parse',
        body: postData,
        json: true
      };

      request.post(requestOptions, function (error, response, body) {
        // TODO
        // error handling
        if (body) {
          /* There will be only one intent for sentences of any length.
           * Ex query - "Hi. i am arjun. i have 102 fever"
           *
           * Output - {"text": "hi. this is arjun. i have 102 fever",
           *   "confidence": 0.49330375056610876, "intent":
           *   "symptom_analyze",
           *    "entities": [{"start": 12, "end": 18, "value": "arjun.",
           *    "entity": "patient_name"}, {"start": 21, "end": 25,
           *    "value":
           *    "have", "entity": "symptom"}, {"start": 26, "end": 29,
           *    "value": "102", "entity": "fever_temp"}, {"start": 30,
           *    "end": 35, "value": "fever", "entity": "symptom"}]}
           */
          let intent = body.intent;

          // Group all similar entities in an array.
          let bodyEntities = body.entities;
          let messageEntities = {};

          for (let i = 0; i < bodyEntities.length; i++) {
            if (bodyEntities[i].entity in messageEntities &&
                messageEntities[bodyEntities[i].entity].indexOf(
                  bodyEntities[i].value) === -1) {
              // Entity exists already. Push the new entity value into
              // the same
              // entity.
              messageEntities[bodyEntities[i].entity.toLowerCase()].push(
                bodyEntities[i].value);
            } else {
              // This is a new entity. Add it to message entities.
              messageEntities[bodyEntities[i].entity.toLowerCase()] =
                [bodyEntities[i].value];
            }
          }

          // intent.entities = messageEntities;
          message.intent = intent;
          message.entities = messageEntities;
        }

        next();
      });
    },
    hears: function (patterns, message) {
      if (patterns.indexOf('*') >= 0) {
        return true;
      }

      for (let t = 0; t < patterns.length; t++) {
        if (message.intent.name === patterns[t]) {
          return true;
        }
      }
    }
  };

  return middleware;
};