微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 暂时存储特定用户的会话

我尝试使用Iactivitylogger捕获用户的对话,有没有办法将用户和机器人的对话编译为临时持有者,如变量或会话?我需要暂时将它存储在只有当用户想要与真人而不是机器人交谈时才能使用的地方.将发送包含用户和机器人的先前对话的电子邮件.我不想将其保存到数据库,因为有些用户不会选择这样做.

参见使用的代码.
记录器类:

public class Logger:Iactivitylogger
{
    public async Task LogAsync(IActivity activity)
    {
        var a = ($"From:{activity.From.Id} - To:{activity.Recipient.Id} - Message:{activity.AsMessageActivity()?.Text}" + "\b\r");
    }
}

全球Asax:

protected void Application_Start()
    {
        var builder = new ContainerBuilder();
        builder.RegisterType<Logger>().AsImplementedInterfaces().InstancePerDependency();
        builder.Update(Conversation.Container);

        GlobalConfiguration.Configure(WebApiConfig.Register);

    }

解决方法

正如Ezequiel在评论中所建议的那样,您可以将活动存储在字典中.就像是:

public class Logger : Iactivitylogger
{
    public static ConcurrentDictionary<string,List<IActivity>> Messages = new ConcurrentDictionary<string,List<IActivity>>();

    public Task LogAsync(IActivity activity)
    {
        var list = new List<IActivity>() { activity };            
        Messages.AddOrUpdate(activity.Conversation.Id,list,(k,v) => { v.Add(activity); return v; });
        return Task.Fromresult(false);
    }
}

然后将它们发送给用户

case ActivityTypes.Message:

    if (!string.IsNullOrEmpty(activity.Text) && activity.Text.ToLower() == "history")
    {
        using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container,activity))
        {
            var reply = activity.CreateReply();
            var storedActivities = new List<IActivity>();
            var found = Logger.Messages.TryGetValue(activity.Conversation.Id,out storedActivities);
            if (storedActivities != null)
            {
                foreach (var storedActivity in storedActivities)
                {
                    reply.Text += $"\n\n {storedActivity.From.Name}: {storedActivity.AsMessageActivity().Text}";
                }
            }
            else
            {
                reply.Text = "no history yet";
            }

            //or,send an email here...
            var client = scope.Resolve<IConnectorClient>();
            await client.Conversations.ReplyToActivityAsync(reply);
        }                               
    }
    else
        await Conversation.SendAsync(activity,MakeRootDialog);
    break;

您还需要在某个时候从列表中删除对话.您可能需要某种过期策略,因为并非每个频道都会通知机器人用户已离开对话.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐