Как мне реализовать какие-то сессии в моем боте? - PullRequest
0 голосов
/ 03 июля 2019

Я использую Microsoft Bot Framework SDK 4 Node JS для развертывания в Skype.Я хочу реализовать своего рода сеанс в моем боте.Например, если пользователь не взаимодействовал с ботом в течение «x» времени, тогда разговор заканчивался бы.

В настоящее время я использую функцию «onMessage» для обновления переменной каждый раз, когда пользователь отправляет сообщениебот и сравнить это время с последним, когда пользователь взаимодействовал.Если он превышает ограничение по времени, тогда разговор заканчивается.

Но проблема в том, что этот метод не работает для более чем 1 пользователя.Поэтому, если с ботом взаимодействуют 2 человека, переменная таймера обновляется каждый раз, когда любой из этих пользователей взаимодействует с ботом.

Однако я хочу создать новый экземпляр этой переменной таймера для каждого пользователя и обновитьэто когда конкретный пользователь взаимодействует с ботом.

Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

Чтобы немного расширить ответ Али ...

Использование тайм-аута для завершения разговора не является хорошей практикой, поскольку при масштабировании сообщения могут перенаправляться на разные экземпляры бота, и тайм-аут выигрывается.не может быть отменено правильно.Лучший подход - сохранить последний раз, когда пользователь отправил сообщение боту в userState, и проверить разницу во времени, когда пользователь в следующий раз отправит сообщение боту, прежде чем ответить.Посмотрите на фрагменты кода ниже.

const TIMEOUT = 5000;



  // Prompts
  async promptForName(step) {
    this.profileAccessor.set(step.context, { lastMessage: new Date() });    
    return await step.prompt(NAME_PROMPT, "What is your name?");
  }

  async captureName(step) {
    const profile = await this.profileAccessor.get(step.context);
    if (new Date().getTime() - new Date(profile.lastMessage).getTime() < TIMEOUT) {
      profile.name = step.result;
      profile.lastMessage = new Date();
      this.profileAccessor.set(step.context, profile);

      await this.userState.saveChanges(step.context);

      return await step.next();
    } else {
      await step.context.sendActivity("Sorry, you took too long to respond");
      return await step.endDialog();
    }
  }
0 голосов
/ 04 июля 2019

Вам необходимо использовать управление состоянием для этой цели согласно цитируемой части документации ниже:

Бот по своей сути не имеет состояния. Как только ваш бот развернут, он может не запустить в том же процессе или на той же машине от одного поворота к следующий. Однако вашему боту может потребоваться отследить контекст разговор, чтобы он мог управлять своим поведением и помнить ответы на предыдущие вопросы. Состояние и особенности хранения бота Framework SDK позволит вам добавить состояние вашего бота. Боты используют государство управление и хранение объектов для управления и сохранения состояния. Штат менеджер обеспечивает уровень абстракции, который позволяет вам получить доступ к состоянию свойства, использующие методы доступа к свойствам, независимо от типа базовое хранилище.

Это в основном основано на использовании 2 объектов: UserState и ConversationState и MemoryStorage для имитации хранилища.

Вот пример , иллюстрирующий их использование после определения классов и создания объектов:

// The accessor names for the conversation data and user profile state property accessors.
const CONVERSATION_DATA_PROPERTY = 'conversationData';
const USER_PROFILE_PROPERTY = 'userProfile';

class StateManagementBot extends ActivityHandler {
    constructor(conversationState, userState) {
        super();
        // Create the state property accessors for the conversation data and user profile.
        this.conversationData = conversationState.createProperty(CONVERSATION_DATA_PROPERTY);
        this.userProfile = userState.createProperty(USER_PROFILE_PROPERTY);

        // The state management objects for the conversation and user state.
        this.conversationState = conversationState;
        this.userState = userState;

Тогда вы можете легко использовать средства доступа во время выполнения для чтения и записи информации о состоянии.

Вы также можете проверить образец , упомянутый в документации, для лучшего понимания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...