Botframework v4。如何清除turnContext.Activity.Member☎联系人,因此再次发送欢迎消息

时间:2019-03-25 11:39:31

标签: c# botframework

当Facebook用户首次向该机器人发送消息时,该机器人会发送欢迎消息。该漫游器检查turnContext.Activity.Member Leicester是否不为null,然后发送欢迎消息。尽管此列表从未删除。

您知道我如何清除此列表,以便下次用户向漫游器发送消息时,它将再次发送欢迎消息

我尝试仅使用LINQ清除它,但是没有用

if (turnContext.Activity.MembersAdded != null)
{
    await SendWelcomeMessageAsync(turnContext, cancellationToken);
}

预先感谢大家!

2 个答案:

答案 0 :(得分:1)

僵尸程序存储用户信息(userState)的方式与Facebook的方式非常不同。 UserState由机器人开发人员(您)创建和维护。 Facebook还可以通过游戏等Facebook应用程序或Messenger维护已连接到应用程序的人员列表。 Facebook将这些信息存储在PSID或ASID中,可通过Facebook Graph API v2.0进行访问

在bot框架方面,当facebook用户首次连接到bot时,将点击turnContext.Activity.Member Leicester(从而创建要存储在Facebook Graph API中的PSID或ASID)。从理论上讲,您可以从Facebook side上的Facebook应用(机器人)中清除PSID / ASID,但请记住,一旦为Facebook用户创建了ASID / PSID,那就是THEIR ASID / PSID。如果将它们从bot中删除,以便可以“重新连接”,Facebook Graph将把它们返回给相同的PSID / ASID,因此.Member Leicesteres标志不会跳闸,并且您将在原来的位置右转。 。

如果您试图在用户离开机器人一定时间后每次创建新的“欢迎消息”,或者开始有关其他主题的对话,则必须跟踪转换和用户状态就在您身边(一旦用户连接,就给他们唯一的用户ID),并将其存储并跟踪到您自己的数据库中。然后,您可以使用漫游器访问器收到一个可重置的欢迎消息(一个基于时间或sessionID的消息)。

答案 1 :(得分:0)

请确保您正在OnTurnAsync处理程序中检查正确的活动类型,并且在重新连接时确实可以再次发送该活动类型。需要特别注意的是,不同渠道的行为可能有所不同。

switch (turnContext.Activity.Type)
{
    case ActivityTypes.ConversationUpdate:
        // Send a welcome & help message to the user.
        if (turnContext.Activity.MembersAdded != null)
        {
            await SendWelcomeMessageAsync(turnContext, cancellationToken);
        }

        break;
}

您可能无法再次收到欢迎消息的事实是由于会话状态存储在您的漫游器状态中。有关很好的介绍,请参见documentation

知道这一点,我唯一能想到的解决方案是在完成对话后删除漫游器状态。可以使用DeleteAsync API进行存档。

await _stateAccessors.ConversationDialogState.DeleteAsync(turnContext, cancellationToken);

还要确保通过调用await await dc.EndDialogAsync();await dc.CancelAllDialogsAsync();来明确结束对话框。这样,您可以确保完全没有任何状态的全新对话。

假设下次您与机器人聊天时,Facebook Messenger再次发送ConversationUpdate活动,应该再次发送欢迎消息。

如果由于某种原因,Facebook Messenger在您首次连接后没有发送ConversationUpdate类型的活动,那么您可以在收到Message类型的活动时发送欢迎消息。在这种情况下,用户必须先发送一些内容。您可以决定是否要忽略它,而是发送欢迎消息,或处理所讲内容并显示欢迎消息。