передать параметры в botframework при запуске сеанса чата - PullRequest
0 голосов
/ 03 февраля 2020

Я не могу найти способ передать параметры в среду бота, когда начинается сессия. Я хочу передать projectId, когда пользователь запускает чат, и он должен быть пропущен автоматически (ie пользователю не нужно запрашивать эту информацию).

Я напрасно пробую десятки подходов, так как несколько дни и ничего не работает. У меня есть 2 подхода, которые закрыты для результата:

var projectId ="191";
var d1 = window.WebChat.createDirectLine({ token });
    		
const store = window.WebChat.createStore(
  {},
  function() {
  return function(next) {
  return function(action) {
  if (action.type === 'DIRECT_LINE/POST_ACTIVITY') {
  action = window.simpleUpdateIn(
  action,
  ['payload', 'activity', 'channelData'],
  () => ({
    	'email': "testemail1@test.com",
    	'projectId': projectId
    	})
    	)
     	}
   return next(action);
  }
 }
);

window.WebChat.renderWebChat({
    directLine: d1,
    store: store,
    styleOptions:styleOptions
}, document.getElementById('webchat'));		
    		

var user = {
    id: 'default-user',
    name: 'user name'
};
    		
var activity = {
    from: user,
    name: 'startConversation',
    type: 'event',
    value: '',		
    channelData: {  "email": "test2@b.com","usertoken": userToken,"projectId":projectId}		
    };

    d1.postActivity(activity).subscribe(function(id) {
    if (console) {
    	console.log('"trigger requestWelcomeDialog" sent');
    }
});
  1. Если я пытаюсь передать параметры через хранилище и DIRECT_LINE / POST_ACTIVITY, параметр передается после создания сеанса (слишком поздно для моей необходимости) 2.If Я перехожу через postActivity к событию типа, мне удается переопределить OnEventAsynx c и получить доступ к параметрам. Но тогда я не понимаю, как передать их в диалоги. В диалоговых окнах, когда я сбрасываю данные канала dataData и состояния разговора или пользователя, он пуст.

Пожалуйста, помогите, мне просто нужно автоматически передать идентификатор проекта при запуске чата. Выглядит тривиально, но это не так.

    protected override async Task OnEventAsync(ITurnContext<IEventActivity> turnContext, CancellationToken cancellationToken)
    {
        IStatePropertyAccessor<OnboardingState> accessor = UserState.CreateProperty<OnboardingState>(nameof(OnboardingState));
        OnboardingState state = await accessor.GetAsync(turnContext, () => new OnboardingState());
        state.Ticket = new CIWTicket();
        state.Ticket.SourceEmailAddress = email;
        await UserState.SaveChangesAsync(turnContext, false, cancellationToken);
    }

1 Ответ

0 голосов
/ 05 февраля 2020

Этого можно добиться, используя dispatch(), чтобы отправить событие с данными, сохраненными в полезной нагрузке. dispatch() вызывается, и событие отправляется, когда прямая линия завершает свое соединение с ботом ("CONNECTION_FULFILLED"), как показано ниже.

<script>
  (async function () {
    const store = window.WebChat.createStore( {}, ( { dispatch } ) => next => async action => {
      if (action.type === 'DIRECT_LINE/CONNECT_FULFILLED') {
        console.log('Event dispatched');
        dispatch( {
          type: 'WEB_CHAT/SEND_EVENT',
          payload: {
            name: 'SEND_PROJECT_ID',
            value: 191
          }
        } )
      }

      return next(action);
    });

    [...]

    window.ReactDOM.render(
      <ReactWebChat
      directLine={ window.WebChat.createDirectLine({ token }) }
      store={store}
      />,
    document.getElementById( 'webchat' );
    )
  })
</script>

Консоль разработчика

enter image description here

Зарегистрирован ботом

enter image description here

Надеюсь на помощь!

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