Можно ли поддерживать пользовательские сеансы для бота facebook messenger?

Я работаю над ботом-мессенджером facebook, веб-хук написан на node.js, который прослушивает сообщения от пользователя и отвечает, поток беседы направляется и структурируется в модулях. Каждый модуль имеет имя модуля и оператор бота, а также ссылку на дочерние модули. Для Forex достаточно модуля приветствия с утверждением «Здравствуйте, я отличный бот, я могу предложить следующую информацию 1: — Фильмы 2: — Музыка». Теперь модуль приветствия содержит ссылки на два дочерних модуля «Фильмы» и «Музыка», разговор должен прогресс в одном из этих двух направлений в зависимости от ответа пользователя, например, если пользователь отвечает «Фильмы», бот возьмет оператор модуля из модуля фильмов и отправит обратно в facebook, поэтому ответ пользователю для фильмов будет выглядеть как «захватывающий , о каких фильмах вы хотите узнать? боевик, приключения, научная фантастика», и снова пользователь отвечает тем, о чем он хочет знать, и бот берет оператор модуля и отправляет обратно пользователю. теперь все это работает хорошо, но проблема в том, что если есть два пользователя, скажите «Пользователь А» и «Пользователь Б». Пользователь А говорит «Привет», бот говорит «Добро пожаловать», что вы хотите узнать о фильмах или музыке? пользователь отвечает «Фильмы», и бот бросает какие-то фильмы, боевик, приключения или научную фантастику, но затем приходит пользователь Б, который говорит «привет», поэтому бот отвечает тем же текущим модулем, что и для пользователя А. вот код

var sender;
var ModID=0;
exports.Facebook_bot = function(req, res) {
// console.log(req.body);
var messaging_events = req.body.entry[0].messaging;
// console.log(messaging_events);
for (var i = 0; i < messaging_events.length; i++) {
  var event = messaging_events[i];
  sender = event.sender.id;
  //  console.log('this is event',event);
  if (event.message && event.message.text) {
    var msg = event.message.text;
    console.log( "this is recived text",msg);
    // sendText(sender, "text echo" + msg.substring(0, 100));
  }
}
res.send(200);

if (ModID == 0) {
  ModID = "71072";
  botSchema.findOne({ Bot_name: "My Bot" }, function(err, data) {
    for (var i = 0; i < data.Modules.length; i++) {
      var back = data.Modules[i].ModuleResponse;

      if (data.Modules[i].ModuleID === ModID) {
        for (var j = 0; j < back.length; j++) {
          console.log("back", back[j].Response);

          if (back[j].Response === msg || back[j].Response === "-input-") {
            //got to module ModID
            ModID = back[j].TransBotID;
            // console.log("else",ModID);
            // console.log(back[j]);
          }
        }
      }
    }
  }).then(function(data) {
    for (var i = 0; i < data.Modules.length; i++) {
      if (data.Modules[i].ModuleID === ModID) {
        sendText(
          sender,
          data.Modules[i].ModuleStatement.substring(0, 500)
        );
        sendUI(sender,data.Modules[i].FBUI) 
        console.log(data.Modules[i].FBUI);

      } else if (ModID === null) {
        console.log(false);
      }
    }
  });;
} else {
  botSchema
    .findOne({ Bot_name: "HIA Airport" }, function(err, data) {
      // console.log(data)
      for (var i = 0; i < data.Modules.length; i++) {
        var back = data.Modules[i].ModuleResponse;
        // console.log(back);
        if (data.Modules[i].ModuleID === ModID && back != null) {
          for (var j = 0; j < back.length; j++) {
            console.log("back 2", back[j].Response);

            if (back[j].Response === msg || back[j].Response === "-input-") {
              ModID = back[j].TransBotID;
              console.log("Go to :", ModID);
            }
          }
        }
      }
    })
    .then(function(data) {
      for (var i = 0; i < data.Modules.length; i++) {
        if (data.Modules[i].ModuleID === ModID) {
          sendText(
            sender,
            data.Modules[i].ModuleStatement.substring(0, 500)
          );
          console.log(data.Modules[i].ModuleStatement);
        } else if (ModID === null) {
          console.log(false);
        }
      }
    });
}
//end if

}; отправитель переменных и ModID определены глобально, я хочу, чтобы они определялись отдельно для каждого нового пользователя, чтобы состояние разговора для пользователя B не зависело от состояния разговора для пользователя B, как я могу это сделать? Я надеюсь, что это имеет смысл, пожалуйста, спросите, если вам нужно узнать что-нибудь еще.


person Jawad    schedule 17.11.2017    source источник


Ответы (1)


Вы должны заблокировать область sender, а затем передать ее из модуля в модуль. Это гарантирует, что каждый входящий PSID будет следовать своему собственному пути.

person amuramoto    schedule 17.11.2017