Я использую веб-чат 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;
}
Когда соединение инициируется, появляется загрузчик.
После этого есть задержка около 3-5 секунд, прежде чем появится приветственное сообщение, и тем временем веб-чат кажется готовым для пользователя.
Небольшая задержка в 3 секунды допустима, но довольно часто задержка составляет до 10 секунд и более. Я понимаю, что это можно немного улучшить, используя функцию Always On
службы приложений и увеличив масштаб плана. Есть ли способ дождаться появления приветственного сообщения обратного канала и показать загрузчик до тех пор?
Ссылка: https://github.com/microsoft/BotFramework-WebChat/pull/1866
@tdurnford Добавлена реализация handleGetStore
Итак, ваша проблема в том, что приветственное событие отправляется, и бот отвечает приветственным сообщением, в то время как подключающийся счетчик все еще отображается, даже если вы отправляете приветственное событие после того, как соединение выполнено из промежуточного программного обеспечения магазина?
@tdurnford Нет. Спиннер срабатывает, но получение приветственного сообщения происходит с задержкой. Второй снимок, который я прикрепил выше, показывает, что счетчик исчез, а приветственное сообщение еще не появилось.
К сожалению, отображение состояния подключения зависит от событий, полученных от 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);
}
Надеюсь это поможет!
Можете ли вы добавить код, который вы используете для отправки приветственного события?