【问题标题】:Storing conversation of a specific user temporarily临时存储特定用户的对话
【发布时间】:2017-09-21 23:37:26
【问题描述】:

我尝试使用 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");
    }
}

全球阿萨克斯:

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

        GlobalConfiguration.Configure(WebApiConfig.Register);

    }

【问题讨论】:

  • 有什么问题?您是否考虑过使用以 userId:conversationId 作为键并以消息列表作为值的字典?
  • 为了简单起见,我尝试使用字符串属性来保存该值,但是一旦机器人回复,该属性就不会保留。
  • 您可以尝试使用 BotState 并将其保存在那里...(或从静态属性开始:P)
  • 你能告诉我如何使用botstate吗?我尝试阅读有关 botstate 的信息,我是否必须先设置对话数据?然后检索它?

标签: c# logging session-variables bots botframework


【解决方案1】:

出于完全相同的原因,我已经探索过保留对话记录 - 将对话交给人工代理。唯一的区别是我的代码使用了 node.js SDK。看看你能不能把它移植到 C#:

http://www.pveller.com/smarter-conversations-part-4-transcript/

【讨论】:

    【解决方案2】:

    按照 Ezequiel 在 cmets 中的建议,您可以将活动存储在字典中。比如:

    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;
    

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

    【讨论】:

      猜你喜欢
      • 2013-09-08
      • 1970-01-01
      • 1970-01-01
      • 2017-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-18
      相关资源
      最近更新 更多