2017-11-24 8 views
1

私はボットを作成し、直接チャネルを使ってWebアプリケーションに組み込むためにMicrosoftボットフレームワークを使用しています。会話をブックマークするか、ボットのメッセージや応答が必要です。botframeworkを使用してメッセージをブックマークする方法

+0

「ブックマーク」または「好き」を明示できますか?後で使用するために結果を保存することについて話している場合。同じダイアログ内にあるシリアライズ可能なプロパティは、ダイアログセッション全体にとどまります。シリアライズ可能でない場合は、ランタイムエラーが発生する可能性があります。 –

答えて

1

ボットフレームワークは、この機能をSDKに実装していません。ミドルウェア機能を活用して自分自身を実装することができます。

一般的な考え方は、すべてのアクティビティメッセージをユーザーとペアで保存できることです。 markまたはlikeの場合はglobal message handlersを作成するか、ミドルウェアのすべてのメッセージを検出してユーザーがmarkまたはlikeの場合は確認してください。以前に保存した最後のメッセージにmardタグを付けることができます。

ミドルウェアの使用例については、C#の場合はhttps://github.com/Microsoft/BotBuilder-Samples/tree/master/CSharp/core-Middleware、Node.jの場合はhttps://github.com/Microsoft/BotBuilder-Samples/tree/master/Node/capability-middlewareLoggingを参照してください。

さらに詳しいことがありましたら、お気軽にお知らせください。

0

を格納するMicrosoft.Bot.Builder.Historyネームスペース/ブックマークDBまたはキャッシュにIMessageActivityメッセージであるIActivityLoggerを実装します。

IActivityLoggerintercept IDialogインターフェイスを実装するダイアログからのすべてのメッセージです。

これは、ユーザとボットから送られてきたすべてのメッセージを傍受するためのものです。 LuisDialogクラスを継承するダイアログの

using Microsoft.Bot.Builder.History; 
using Microsoft.Bot.Connector; 
using MongoDB.Bson; 
using MongoDB.Driver; 
using System; 
using System.Threading.Tasks; 

namespace DemoBot.Dialogs 
{ 
    public class Logger : IActivityLogger 
    { 

     private readonly IMongoClient client; 
     private readonly IMongoCollection<BsonDocument> collection; 
     public Logger() 
     { 
      client = new MongoClient(); 
      collection = client.GetDatabase("test").GetCollection<BsonDocument>("botLog"); 
     } 
     public Task LogAsync(IActivity activity) 
     { 
      IMessageActivity msgToBeLogged = activity.AsMessageActivity(); 

      BsonDocument objectToBeLogged = new BsonDocument 
      { 
       { "messageText", new BsonString(msgToBeLogged.Text) }, 
       { "timeStamp", new BsonDateTime(Convert.ToDateTime(msgToBeLogged.Timestamp)) }, 
       { "recipientId", new BsonString(msgToBeLogged.Recipient.Id) }, 
       { "fromId", new BsonString(msgToBeLogged.From.Id) }, 
       { "conversationId", new BsonString(msgToBeLogged.Conversation.Id) }, 
       { "fromName", new BsonString(msgToBeLogged.From.Name) }, 
       { "toName", new BsonString(msgToBeLogged.Recipient.Name) }, 
       { "channnel", new BsonString(msgToBeLogged.ChannelId) }, 
       { "serviceUrl",new BsonString(msgToBeLogged.ServiceUrl) }, 
       { "locale", new BsonString(msgToBeLogged.Locale)} 
      }; 

      return Task.Run(() => 
      { 
       LogIntoDB(objectToBeLogged); 
      }); 
     } 

     public void LogIntoDB(BsonDocument activityDetails) 
     { 
      collection.InsertOne(activityDetails); 
     } 
    } 
} 

2)を、それが入ってくるメッセージは、意志れるように、DispatchToIntentHandler方法でロギングコードを書く:ダイアログがIDialogインタフェースを実現するため

1)そのメソッドを通って適切なハンドラに解決されます:

using Microsoft.Bot.Builder.Dialogs; 
using Microsoft.Bot.Builder.Luis; 
using Microsoft.Bot.Builder.Luis.Models; 
using Microsoft.Bot.Connector; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks; 

namespace DemoBot.Dialogs 
{ 
    [Serializable] 
    public class RootDialog : LuisDialog<object> 
    { 
     public Task StartAsync(IDialogContext context) 
     { 
      return Task.Run(() => { context.Wait(MessageReceived); }); 
     } 

     protected override Task DispatchToIntentHandler(IDialogContext context, IAwaitable<IMessageActivity> item, IntentRecommendation bestIntent, LuisResult result) 
     { 
      IMessageActivity msgToBeLogged = context.MakeMessage(); 

      BsonDocument objectToBeLogged = new BsonDocument 
      { 
       { "messageText", new BsonString(msgToBeLogged.Text) }, 
       { "timeStamp", new BsonDateTime(Convert.ToDateTime(msgToBeLogged.Timestamp)) }, 
       { "recipientId", new BsonString(msgToBeLogged.Recipient.Id) }, 
       { "fromId", new BsonString(msgToBeLogged.From.Id) }, 
       { "conversationId", new BsonString(msgToBeLogged.Conversation.Id) }, 
       { "fromName", new BsonString(msgToBeLogged.From.Name) }, 
       { "toName", new BsonString(msgToBeLogged.Recipient.Name) }, 
       { "channnel", new BsonString(msgToBeLogged.ChannelId) }, 
       { "serviceUrl",new BsonString(msgToBeLogged.ServiceUrl) }, 
       { "locale", new BsonString(msgToBeLogged.Locale)} 
      }; 

      Task.Run(() => 
      { 
       LogIntoDB(objectToBeLogged); 
      }); 

      return base.DispatchToIntentHandler(context, item, bestIntent, result); 
     } 

     public void LogIntoDB(BsonDocument activityDetails) 
     { 
      collection.InsertOne(activityDetails); 
     } 


     public Task MessageReceived(IDialogContext context, IAwaitable<IMessageActivity> item) 
     { 
      return Task.Run(() => 
      { 
       context.Wait(MessageReceived); 
      }); 
     } 

    } 
} 

私はMongoDBを使用していますが、SQL Serverも使用できますご希望の場合。

最後に、Autofac IoCを使用してglobal.asax.csファイルに依存関係を挿入します。

using Autofac; 
using DemoBot.Dialogs; 
using Microsoft.Bot.Builder.Dialogs; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Http; 
using System.Web.Routing; 

namespace DemoBot 
{ 
    public class WebApiApplication : System.Web.HttpApplication 
    { 
     protected void Application_Start() 
     { 
      Conversation.UpdateContainer(builder => 
      { 
       builder.RegisterType<Logger>().AsImplementedInterfaces().InstancePerDependency(); 
      }); 

      GlobalConfiguration.Configure(WebApiConfig.Register); 
     } 
    } 
} 
関連する問題