【问题标题】:Exit Event / Welcome Event Not Firing退出事件/欢迎事件未触发
【发布时间】:2020-02-20 07:06:31
【问题描述】:

我们正在尝试在用户退出聊天机器人窗口(或网站)(或欢迎消息)时发布一些事件/消息,但到目前为止这些事件并未触发。

我可以在 Inspector 工具中看到:

屏幕截图 2020-02-18 下午 3 15 39

创建了各种活动/对话,聊天机器人工作,但没有触发欢迎/退出事件。

我们使用的代码几乎与此处的文档代码相同:https://github.com/microsoft/BotFramework-WebChat/blob/master/docs/WELCOME_MESSAGE.md

这里:How to handle user leaving conversation

我有一个在窗口关闭时触发的函数,如下:

    const store = window.WebChat.createStore( {}, ( { dispatch } ) => next => async action => {
    return next( action );});      

        window.addEventListener( 'sendEventActivity', ( { data } ) => {

          store.dispatch({
            type: 'WEB_CHAT/SEND_EVENT',
            payload: {
              name: 'user_event',
              value: {
                name: 'end_conversation',
                value: 'user ended conversation'
              },
              text: 'The user has left the conversation.'
            }
          })

        });

        function exitEvent(){
          const eventSendActivity = new Event( 'sendEventActivity' );
          eventSendActivity.data = 'User left conversation';
          window.dispatchEvent( eventSendActivity );
          console.log('Exit Event Submitted (hopefully)');
        }
        exitEvent();

我尝试过其他变体,在前面定义商店,在渲染聊天上方,在渲染聊天之后,从不同位置和不同时间发送欢迎消息,但似乎无法发送。

我们正在使用https://cdn.botframework.com/botframework-webchat/latest/webchat.js

知道问题可能是什么吗?不确定我们哪里出错了,或者为什么它没有触发 - 将理论上已知有效的代码直接复制到我们的代码中似乎并不能解决问题。

提前致谢,如果我没有包含任何必要的详细信息,请告诉我 - 聊天机器人的新手,不要在 github 上发布太多内容。非常感谢,

编辑:

我能够将上述代码和这里的代码结合起来:https://github.com/microsoft/BotFramework-WebChat/issues/2120#issuecomment-516056614 以实现我想要的。我会在下面发布,以防它帮助其他人......

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

          window.addEventListener( 'sendEventActivity', ( { data } ) => {

          store.dispatch( {
              type: 'WEB_CHAT/SEND_EVENT',
              payload: {
                 name: 'webchat/exit'
              }
            } );
          } );

          document.getElementById("action_menu_btn").addEventListener( 'click', function() {
            const eventSendActivity = new Event( 'sendEventActivity' );
            eventSendActivity.data = 'User left conversation';
            window.dispatchEvent( eventSendActivity );
            console.log('End Converstaion Event Fired');
          });

干杯!

【问题讨论】:

  • 接受/投票支持更大的 Stack Overflow 社区和任何有类似问题的人。如果您觉得我的回答足够,请“接受”并点赞。如果没有,请告诉我我还能提供哪些帮助!

标签: botframework


【解决方案1】:

我没有在另一个post 中提到这一点(我会更新它),但代码有效的原因是window.onbeforeunload() 函数。没有它,窗口会在任何代码完成执行之前关闭。结果是没有事件被创建,被侦听器捕获,也没有通过网络聊天存储发送到机器人。

在这里,使用上述方法,刷新页面会产生“用户离开对话”活动。


另外,需要注意的是,您创建和传递的任何函数都将在页面加载后立即运行,就像使用 exitEvent() 一样。使用以下代码,它通过浏览器获取用户的位置(放置在关闭 </script> 标记之前)。如您所见,它甚至在网络聊天之前就已加载。如果您希望某个函数根据从机器人传递的某些活动运行,请使用storeactions(即DIRECT_LINE/INCOMING_ACTIVITY 或其他)或通过可用的middleware

let geoLoc = async () => {
  await navigator.geolocation.getCurrentPosition(position => {
    console.log('Latitude: ', position.coords.latitude);
    console.log('Longitude: ', position.coords.longitude);
  });
}

geoLoc();


关于欢迎信息,您有两种选择。作为活动从您的机器人发送(参考此sample)或在收到一些初始活动后在您的页面上启动一个事件(参考此sample)。

最后,我建议在修改代码之前让代码按原样运行。这通常会让我绊倒,所以我想我会把它传递下去。

希望有帮助!

【讨论】:

  • 感谢您的回复! RE: 触发 ExitEvent();我知道会立即触发,这样做是为了测试目的,以便事件绝对触发并且更容易测试。问题是我永远无法让它着火。我不能让你的例子像你写的那样工作。我能够让这个例子工作:github.com/microsoft/BotFramework-WebChat/issues/… 然后我能够将两者结合在一起以实现我想要的~
  • 只要你到最后! :)
猜你喜欢
  • 2018-12-15
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 2017-05-16
  • 2021-07-21
  • 2021-01-16
  • 2011-02-26
相关资源
最近更新 更多