【问题标题】:Proactive Dialog with the Bot Framework from Group chat to Personal chat in MS Teams从群聊到 MS Teams 中的个人聊天与 Bot 框架的主动对话
【发布时间】:2021-12-16 12:49:22
【问题描述】:

可以使用下一部分代码向团队群聊中的消息发送者发送主动消息(=私人):

if (stepContext.Context.Activity.ChannelId == Channels.Msteams &&
    stepContext.Context.Activity.Conversation.IsGroup.HasValue &&
    stepContext.Context.Activity.Conversation.IsGroup.Value) {
        var teamConversationData = stepContext.Context.Activity.GetChannelData<TeamsChannelData>();
        var connectorClient = new ConnectorClient(new Uri(stepContext.Context.Activity.ServiceUrl), _credentialOptions.MicrosoftAppId, _credentialOptions.MicrosoftAppPassword);
        var userId = stepContext.Context.Activity.From.Id;
        var tenantId = teamConversationData.Tenant.Id;
        var parameters = new ConversationParameters
            {
                  Members = new[] { new ChannelAccount(userId) },
                  ChannelData = new TeamsChannelData
                  {
                       Tenant = new TenantInfo(tenantId),
                  },
            };
        var conversationResource = await connectorClient.Conversations.CreateConversationAsync(parameters, cancellationToken: cancellationToken);
        var message = Activity.CreateMessageActivity();
        message.Text = "This is a proactive message. I've sent it from a group conversation.";
        await connectorClient.Conversations.SendToConversationAsync(conversationResource.Id, (Activity)message, cancellationToken: cancellationToken);
}

但问题是,我还希望能够为该调用用户触发一个对话框,而不是发送一个 Activity。在网上搜索后似乎不可能? 我玩了一下代码,发现可以替换

await connectorClient.Conversations.SendToConversationAsync(conversationResource.Id, (Activity)message, cancellationToken: cancellationToken);

stepContext.Context.Activity.Conversation.Id = conversationResource.Id;
stepContext.Context.Activity.Conversation.IsGroup = false;

这样可以将对话发送到发送用户的私人聊天

当我查看数据库时,我可以看到已保存的用户对话框堆栈填充了对话框(等待用户交互)。 我还可以看到仍然为空的群聊对话框堆栈,因此机器人在群聊和其他用户中仍然响应。

当对话结束时,我将 Conversation.Id 和 .IsGroup 放回我在上下文中保存的之前的群聊值,并且它能够像我想要的那样在群聊中传递最终答案它是。

基本上,我的代码可以切换到在私人中间对话中发送内容,并且在对话中的任何其他点它可以切换回群组对话。

问题是关于我在对话中更改对话 ID。这是正常的事情吗?这会破坏我还没有想到的东西吗?

【问题讨论】:

  • 你检查过这个文档吗? - Proactive Messages
  • 是的,我就是从那里开始的。但这仅适用于发送活动,而不是对话框。但我不知道如何或为什么,但现在一切似乎都像想要的那样工作。我可能正在查看错误的数据库文档。我会更新问题。
  • 试试这个方法 - MS Team Proactive message
  • 这也和我一开始的做法一样,但是不能发送Dialogs,只能发送Activity。
  • 我们不使用这种方式,这样使用很正常,

标签: c# botframework microsoft-teams chatbot proactive


【解决方案1】:

我认为这种方法没有任何问题,但我认为通常你会开始一个新的对话,而不是继续使用同一个对话。

我认为,在保存状态时,任何在 hack 之前访问状态的代码都会保留在新 id 下。在回合之前运行的中间件与在回合完成之后运行的中间件将有两个单独的对话 ID。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 2020-10-27
    • 2021-10-26
    • 2020-03-31
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多