【问题标题】:Bot conversation reference issue机器人对话参考问题
【发布时间】:2021-01-05 09:29:02
【问题描述】:

我的主动式机器人有问题。

我的问题是,当我第一次将机器人添加到团队时,它会触发并创建团队和常规频道的事件。

我的问题是,在添加机器人之前,它不会为其他现有频道创建聊天参考。 如果我向团队添加一个新频道,它会触发一个 channelCreated 事件并创建一个新的对话引用。 我已经覆盖了 OnConversationUpdateActivityAsync 并且如前所述,它在首次添加机器人时有效,然后在添加新频道时有效。

有人知道第一次添加机器人时的最佳做法是什么吗?第一次添加机器人时,我应该只为所有现有频道创建对话引用吗?

https://docs.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/send-proactive-messages?tabs=dotnet

https://github.com/microsoft/BotBuilder-Samples/tree/main/samples/csharp_dotnetcore/16.proactive-messages

【问题讨论】:

    标签: botframework microsoft-teams


    【解决方案1】:

    我假设您只是希望能够在所有频道中发送机器人消息。如果不是这种情况,请告诉我,我会编辑答案。

    我建议看看Teams - Start New Thread in Channel Sample

    基本上你需要have the bot get a list of Channels:

    public class MyBot : TeamsActivityHandler
    {
        protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
        {
            IEnumerable<ChannelInfo> channels = await TeamsInfo.GetTeamChannelsAsync(turnContext, turnContext.Activity.TeamsGetTeamInfo().Id, cancellationToken);
    
            await turnContext.SendActivityAsync($"The channel count is: {channels.Count()}");
        }
    }
    

    然后你可以send a Proactive Message to the channel by creating the conversation and then continuing it:

    var conversationParameters = new ConversationParameters
    {
        IsGroup = true,
        ChannelData = new { channel = new { id = teamsChannelId } },
        Activity = (Activity)message,
    };
    
    ConversationReference conversationReference = null;
    
    await ((BotFrameworkAdapter)turnContext.Adapter).CreateConversationAsync(
        teamsChannelId,
        serviceUrl,
        credentials,
        conversationParameters,
        (t, ct) =>
        {
            conversationReference = t.Activity.GetConversationReference();
            return Task.CompletedTask;
        },
        cancellationToken);
    
    
    await ((BotFrameworkAdapter)turnContext.Adapter).ContinueConversationAsync(
        _appId,
        conversationReference,
        async (t, ct) =>
        {
            await t.SendActivityAsync(MessageFactory.Text("This will be the first response to the new thread"), ct);
        },
        cancellationToken);
    }
    

    【讨论】:

    • 感谢您的回答。问题是我有一个机器人,我有一个应用程序。将我的应用程序添加到团队/频道时,机器人会收到一个事件并调用 OnConversationUpdateActivityAsync 我在其中创建对话引用。如果我的应用程序被添加到另一个现有频道,则不会向机器人发送任何事件。所以我在考虑是否需要自己创建对话参考,或者我是否缺少某些东西。
    • 但是正如您在回答中提到的那样,当应用程序/机器人第一次添加到团队中时,我可以获取团队中的所有频道并为每个频道创建对话参考。这样我就可以稍后向团队成员发送主动消息。
    • @OskarJenssonFjeld 没错。您只会收到一次事件,因为您是在将机器人添加到 TEAM(而不是频道)时收到的。一个团队可以由许多频道组成,因此一旦将机器人添加到团队中,它就可以访问该团队的所有频道,这就是您想要查询所有频道的时候。
    • @OskarJenssonFjeld 你能用我的回答来解决这个问题吗?如果是这样,请“接受”并投票,以便其他人可以快速找到答案,我可以从我的支持跟踪器中清除它。如果没有,请告诉我我还能提供哪些帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 2019-09-13
    • 2011-09-29
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    相关资源
    最近更新 更多