簡體   English   中英

從群聊到 MS Teams 中的個人聊天與 Bot 框架的主動對話

[英]Proactive Dialog with the Bot Framework from Group chat to Personal chat in MS Teams

可以使用下一部分代碼向團隊群組聊天中的消息發送者發送主動消息(=私人):

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);
}

但問題是我還希望能夠為該調用用戶觸發一個對話框,而不是發送一個活動。 搜索 web 后看起來不可能? 我玩了一下代碼,發現我可以替換

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。 這是正常的事情嗎? 這會破壞我還沒有想到的東西嗎?

我認為這種方法沒有任何問題,但我認為通常你會開始一個新的對話,而不是繼續使用同一個對話。

我認為當 state 被保存時,在黑客攻擊之前訪問 state 的任何代碼都將保留在新 ID 下。 在回合之前運行的中間件與在回合完成之后運行的中間件將有兩個單獨的對話 ID。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM