C# 我想从bot发送一条消息;X分钟后你在吗;当他们没有更多的用户输入到bot时

C# 我想从bot发送一条消息;X分钟后你在吗;当他们没有更多的用户输入到bot时,c#,botframework,azure-functions,azure-language-understanding,qnamaker,C#,Botframework,Azure Functions,Azure Language Understanding,Qnamaker,我正在使用带有c#的Bot框架v4,并部署到Slack通道。我想使用Azure函数在bot或外部创建计时器。在x分钟内没有用户输入的情况下,bot应该发送一条类似“你在吗?” 在网上读了很多文章后,我找不到想要的解决办法 我厌倦了跟随这个 但是我不完全理解这个人在那里说的话。有人能帮我吗?我的方法适用于Directline Webchat,但您可以接受这个概念,并将其用于解决Slack问题 使用时,您可以设置自定义存储以跟踪不活动。在下面的示例中,我将使用页面标题“通知”和发送消息的组合。但是您

我正在使用带有c#的Bot框架v4,并部署到Slack通道。我想使用Azure函数在bot或外部创建计时器。在x分钟内没有用户输入的情况下,bot应该发送一条类似“你在吗?”

在网上读了很多文章后,我找不到想要的解决办法

我厌倦了跟随这个


但是我不完全理解这个人在那里说的话。有人能帮我吗?

我的方法适用于Directline Webchat,但您可以接受这个概念,并将其用于解决Slack问题

使用时,您可以设置自定义存储以跟踪不活动。在下面的示例中,我将使用页面标题“通知”和发送消息的组合。但是您可以简单地设置间隔并发送消息,而无需更改任何页面标题

let间隔;
变量页标题通知={
变量:{
原文:document.title,
间隔:空
},    
On:功能(通知、间隔速度){
var_this=这个;
_this.Vars.Interval=setInterval(函数(){
document.title=(\u this.Vars.originaltile==document.title)
?通知
:_this.Vars.originaltle;
},(间隔速度)?间隔速度:1000);
},
关闭:函数(){
clearInterval(此.Vars.Interval);
document.title=this.Vars.originaltle;
}
}
//我们正在使用一个定制的存储来添加连接事件的钩子
const store=window.WebChat.createStore({},({dispatch})=>next=>action=>{
如果(action.type===“网络聊天/发送消息”){
//用户发送的消息
PageTitleNotification.Off();
清除超时(间隔);
}else if(action.type==='DIRECT\u LINE/INCOMING\u ACTIVITY'&&action.payload.ACTIVITY.name!=='inactive'){
//由bot发送的消息
间隔时间;
间隔=设置超时(()=>{
//更改标题以刷新页面
PageTitleNotification.On('你还在吗?');
//通知bot用户已处于非活动状态
派遣({
键入:“网络聊天/发送事件”,
有效载荷:{
名称:'非活动',
值:“”
}
});
}, 300000)
}
返回下一步(操作);
});
当您使用Slack channel时,面临的挑战是您不能在Slack客户端上注入类似的内容,所以您需要在外部执行。我能给你的最好的指导就是从头开始。您需要通过类似于
turnContext.getConversationReference()
的方式从turnContext获取对话引用并存储它。然后可以将其发送到函数并启动计时器。如果函数在指定的时间段内未收到该引用的其他消息,则可以发送主动消息


我认为您应该将此作为bot中的本地函数,而不是Azure函数,因为您希望在用户每次发送新消息时重置计时器。我不确定你会如何使用外部Azure函数来跟踪它。希望这将足以为您提供在Slack channel中实现此功能的一些想法。

您使用的是哪个频道?我有一个使用botframework webchat(通过directline,而不是可以嵌入iframe中的现成webchat)的实现,在该实现中,您在页面本身上设置了一个计时器,它向bot发送一条反向通道消息,从而触发一条消息。但除非您可以使用botframework webchat的directline频道,否则它将无法工作。@billoverton我使用的是slack频道。但您可以分享您的解决方案,这将非常有用。我的解决方案在slack频道上无法工作,但我将向它提供一些想法,说明如何通过Azure功能执行类似操作(尽管我没有这方面的直接经验)