2017-04-25 10 views
4

IActivityLoggerを使用してユーザーの会話をキャプチャしようとしましたが、ユーザーやボットの会話を変数やセッションのような一時的な所有者にコンパイルする方法はありますか?私は、ユーザーがボットの代わりに本物の人と話したがっているときにのみ、すぐに利用できる場所に一時的に格納する必要があります。ユーザーとボットの前の会話を含む電子メールが送信されます。私はそれをDBに保存したくはありません。なぜなら、一部のユーザーはそれを選択しないからです。特定のユーザーの会話を一時的に保存する

「使用されるコード」を参照してください。 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; 

はまた、いくつかの点で、リストから会話を削除する必要があります。すべてのチャンネルがボットにユーザーが会話を離れたことを通知するわけではないので、おそらく何らかの期限切れポリシーが必要です。

0

私は、まったく同じ理由で会話のトランスクリプトを保存模索している - 人間エージェントに会話をハンドオフします。唯一の違いは、私のコードがnode.js SDKを使用していることです。あなたがC#にポートそれをできるかどうかを確認:

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

関連する問題