2017-04-25 28 views
4

我试过使用IActivityLogger来捕获用户的对话,有没有办法将用户和机器人的对话编译为像变量或会话这样的临时持有者?我需要暂时将它存储在只有当用户想要与真人对话而不是机器人时才可用的地方。包含用户和机器人之前对话的电子邮件将被发送。我不想将它保存到数据库,因为有些用户不会选择这样做。暂时存储特定用户的对话

请参阅使用的代码。 Logger类:

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

    } 
+0

这是什么问题?您是否考虑过使用带有userId的对话框:conversationId作为关键字并将消息列表作为值? –

+0

为了简单起见,我尝试使用字符串属性来保存该值,但只要机器人回复,该属性不会保留。 – anonymous1110

+0

你可以尝试使用BotState并将其保存在那里......(或者从一个静态属性P开始) –

回答

0

正如意见建议的埃塞基耶尔,您可以在活动存储在字典中。喜欢的东西:

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; 

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