Значок загрузчика в веб-чате Bot Framework

Я использую веб-чат Bot Framework. Есть несколько данных, связанных с пользователем, которые я публикую, используя активность публикации обратного канала с помощью опции store, чтобы приветствовать пользователя.

<ReactWebChat
  activityMiddleware = { activityMiddleware }
  directLine = { window.WebChat.createDirectLine( this.state.token ) }
  store = {this.handleGetStore()}
  styleOptions = {styleOptions}
/>

handleGetStore возвращает данные магазина:

handleGetStore(){
    const store = window.WebChat.createStore({}, ({ dispatch }) => next => action => {
        if (action.type === 'DIRECT_LINE/CONNECT_FULFILLED') {
            dispatch({
                type: 'WEB_CHAT/SEND_EVENT',
                payload: {
                    name: 'userDetail',
                    value: this.state.userDetail
                }
            });
        }
        return next(action);
    });
    return store;
}

Когда соединение инициируется, появляется загрузчик.

Значок загрузчика в веб-чате Bot Framework

После этого есть задержка около 3-5 секунд, прежде чем появится приветственное сообщение, и тем временем веб-чат кажется готовым для пользователя.

Значок загрузчика в веб-чате Bot Framework

Небольшая задержка в 3 секунды допустима, но довольно часто задержка составляет до 10 секунд и более. Я понимаю, что это можно немного улучшить, используя функцию Always On службы приложений и увеличив масштаб плана. Есть ли способ дождаться появления приветственного сообщения обратного канала и показать загрузчик до тех пор?

Ссылка: https://github.com/microsoft/BotFramework-WebChat/pull/1866

Можете ли вы добавить код, который вы используете для отправки приветственного события?

tdurnford 28.05.2019 19:38

@tdurnford Добавлена ​​реализация handleGetStore

Display name 29.05.2019 03:39

Итак, ваша проблема в том, что приветственное событие отправляется, и бот отвечает приветственным сообщением, в то время как подключающийся счетчик все еще отображается, даже если вы отправляете приветственное событие после того, как соединение выполнено из промежуточного программного обеспечения магазина?

tdurnford 29.05.2019 04:30

@tdurnford Нет. Спиннер срабатывает, но получение приветственного сообщения происходит с задержкой. Второй снимок, который я прикрепил выше, показывает, что счетчик исчез, а приветственное сообщение еще не появилось.

Display name 29.05.2019 18:33
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
619
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

К сожалению, отображение состояния подключения зависит от событий, полученных от DirectLineJs, и веб-чат в настоящее время не поддерживает настройку своего поведения. При этом существует хакерский способ выполнить то, что вы пытаетесь сделать, отправляя псевдособытия DirectLine.

Вот шаги ниже:

  • Создайте флаг, который будет указывать, отправил ли бот приветственное сообщение — received_welcome_message.

  • Когда веб-чат отправляет событие выполнения соединения, установите флажок чтобы убедиться, что приветственное сообщение было получено. Если у бота нет отправил приветственное сообщение, отправить приветственное событие боту и сбросить состояние подключения к выполнению.

  • Когда веб-чат получает активность от бота, проверьте, является ли это приветственным сообщением. я бы порекомендовал добавление атрибута имени в сообщение на стороне бота для проверки - await context.sendActivity({ text: 'Welcome', name: 'welcome'}). Если активность является приветственным сообщением, отправляет событие выполнения соединения и устанавливает флаг в значение true.

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

let received_welcome_message = false;
const store = createStore(
  {},
  ({ dispatch}) => next => action => {

    if (action.type === 'DIRECT_LINE/CONNECT_FULFILLED') {

      if (!received_welcome_message) {
        dispatch({
          type: 'DIRECT_LINE/CONNECT_FULFILLING'
        });
        dispatch({
          type: 'WEB_CHAT/SEND_EVENT',
          payload: { name: 'webchat/join' }
        });

        return
      }

    } else if (action.type === 'DIRECT_LINE/INCOMING_ACTIVITY' && action.payload.activity.name === 'welcome') {
      received_welcome_message = true;
      dispatch({
        type: 'DIRECT_LINE/CONNECT_FULFILLED',
      });
    }
    return next(action);
  }
);

Редактировать

Менее хакерский подход заключается в отправке события ожидания публикации, когда соединение с ботом выполнено, чтобы имитировать отправку ботом приветственного сообщения. Обратите внимание, что бот не знает об имитируемой активности. См. фрагмент кода ниже.

const store = createStore(
  {},
  ({ dispatch}) => next => action => {
    console.info(action)
    if (action.type === 'DIRECT_LINE/CONNECT_FULFILLED') {
      dispatch({
        type: 'DIRECT_LINE/POST_ACTIVITY_PENDING',
        meta: { method: 'keyboard' },
        payload: {
          activity: {
            from: { role: "bot" },
            text: "Welcome Message",
            textFormat: "plain",
            timestamp: new Date().toString(),
            type: "message"
          }
        }
      })
    }
    return next(action);
  }

Надеюсь это поможет!

Другие вопросы по теме

Похожие вопросы

Каков правильный способ аутентификации от JavaScript в HTML-файле до элемента управления Microsoft Web Chat для Bot Framework v4?
Платформа ботов — Skype для бизнеса
Приветственное сообщение с интерфейсом Ibot
Есть ли способ включить параметр календаря в качестве входа в чат-бот V4 C#, кроме использования адаптивных карточек?
Японский символ в AdaptiveCard Bot Framework V4
Adaptive Card возвращает неопределенное значение в Microsoft Teams, но хорошо работает в эмуляторе бота
[BotFramework]: есть ли способ отобразить приглашение Oauth в карточке героя или адаптивной карточке в BOT, разработанном с использованием SDK V4 на C#?
Запрос упреждающего сообщения канала Skype через некоторое время получает 500 (внутренняя ошибка сервера)
Как исправить проблемы, связанные с параметрами выбора приглашения DirectLineChannel, которые не отображаются в окне чат-бота, разработанного с использованием V4 SDK на C#?
Преобразование шаблона кнопки facebook из json в c#