2017-04-25 26 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; 

您還需要在某些時候從列表中刪除交談。您可能需要某種到期策略,因爲並非每個頻道都會通知該用戶已離開該對話。