Как я могу сохранить данные бот-фреймворка, такие как вопросы и ответы
В MessagesController.cs
в своем коде я добавил часть для сохранения данных журнала пользователя, таких как идентификатор пользователя, имя пользователя, канал, дата, сообщения... Я хочу также сохранить ответ бота? но я не знаю как это сделать. База данных на лазурном.
Это код: MessagesController.cs
using System.Net.Http;
using System.Threading.Tasks;
using System.Web.Http;
using Microsoft.Bot.Builder.Dialogs;
using Microsoft.Bot.Connector;
using System;
using System.Net;
namespace QnABot
{
[BotAuthentication]
public class MessagesController : ApiController
{
/// <summary>
/// POST: api/Messages
/// Receive a message from a user and reply to it
/// </summary>
public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
#region Set CurrentBaseURL and ChannelAccount
// Get the base URL that this service is running at
// This is used to show images
string CurrentBaseURL =
this.Url.Request.RequestUri.AbsoluteUri.Replace(@"api/messages", "");
// Create an instance of BotData to store data
BotData objBotData = new BotData();
// Instantiate a StateClient to save BotData
StateClient stateClient = activity.GetStateClient();
// Use stateClient to get current userData
BotData userData = await stateClient.BotState.GetUserDataAsync(
activity.ChannelId, activity.From.Id);
// Update userData by setting CurrentBaseURL and Recipient
userData.SetProperty<string>("CurrentBaseURL", CurrentBaseURL);
// Save changes to userData
await stateClient.BotState.SetUserDataAsync(
activity.ChannelId, activity.From.Id, userData);
#endregion
if (activity.Type == ActivityTypes.Message)
{
//*************************
//Log to Database
// *************************
//// Instantiate the BotData dbContext
Model.qnamakerentitiesEntities DB = new
Model.qnamakerentitiesEntities();
// Create a new UserLog object
Model.UserLog NewUserLog = new Model.UserLog();
// Set the properties on the UserLog object
NewUserLog.Channel = activity.ChannelId;
NewUserLog.UserID = activity.From.Id;
NewUserLog.UserName = activity.From.Name;
NewUserLog.created = DateTime.UtcNow;
NewUserLog.Message = activity.Text.Truncate(500);
// NewUserLog.Response = activity.AsMessageActivity()?.Text;
// Add the UserLog object to UserLogs
DB.UserLogs.Add(NewUserLog);
// Save the changes to the database
DB.SaveChanges();
await Conversation.SendAsync(activity, () => new
Dialogs.QnADialog());
}
else
{
await HandleSystemMessage(activity);
}
var response = Request.CreateResponse(HttpStatusCode.OK);
return response;
}
private async Task<Activity> HandleSystemMessage(Activity message)
{
if (message.Type == ActivityTypes.DeleteUserData)
{
// Implement user deletion here
// If we handle user deletion, return a real message
}
else if (message.Type == ActivityTypes.ConversationUpdate)
{
IConversationUpdateActivity iConversationUpdated = message as
IConversationUpdateActivity;
if (iConversationUpdated != null)
{
}
}
else if (message.Type == ActivityTypes.ContactRelationUpdate)
{
// Handle add/remove from contact lists
// Activity.From + Activity.Action represent what happened
}
else if (message.Type == ActivityTypes.Typing)
{
// Handle knowing tha the user is typing
}
else if (message.Type == ActivityTypes.Ping)
{
}
return null;
}
}
}
RootDialog.cs выглядит так:
using System;
using System.Threading.Tasks;
using Microsoft.Bot.Builder.Dialogs;
using Microsoft.Bot.Connector;
using QnABot.API;
using Microsoft.Bot.Builder.Dialogs.Internals;
namespace QnABot.Dialogs
{
[Serializable]
public class RootDialog : IDialog<object>
{
public Task StartAsync(IDialogContext context)
{
context.Wait(MessageReceivedAsync);
return Task.CompletedTask;
}
private async Task MessageReceivedAsync(IDialogContext context,
IAwaitable<object> result)
{
//var activity = await result as Activity;
//// Prompt text
//await context.PostAsync("Welcome Feel free to ask me ");
//var privateData = context.PrivateConversationData;
//var privateConversationInfo = IncrementInfoCount(privateData,
BotStoreType.BotPrivateConversationData.ToString());
//var conversationData = context.ConversationData;
//var conversationInfo = IncrementInfoCount(conversationData,
BotStoreType.BotConversationData.ToString());
//var userData = context.UserData;
//var userInfo = IncrementInfoCount(userData,
BotStoreType.BotUserData.ToString());
//context.Wait(QnADialog);
//privateData.SetValue(BotStoreType.BotPrivateConversationData.ToString(),
privateConversationInfo);
//conversationData.SetValue(BotStoreType.BotConversationData.ToString(), conversationInfo);
//userData.SetValue(BotStoreType.BotUserData.ToString(), userInfo);
Activity replyToConversation = (Activity)context.MakeMessage();
replyToConversation.Recipient = replyToConversation.Recipient;
replyToConversation.Type = "message";
}
private async Task QnADialog(IDialogContext context, IAwaitable<object>
result)
{
var activityResult = await result as Activity;
var query = activityResult.Text;
var reply = activityResult.CreateReply();
var qnaResult = QnaApi.GetFirstQnaAnswer(query);
string message = "";
if (qnaResult == null)
{
message = $"Sorry, I did not understand . Please reformulate
your question";
}
else
{
message = qnaResult.answers[0].answer;
}
// *************************
// Log to Database
// *************************
Activity replyToConversation = (Activity)context.MakeMessage();
// Instantiate the BotData dbContext
Model.qnamakerentitiesEntities DB = new
Model.qnamakerentitiesEntities();
// Create a new UserLog object
Model.UserLog NewUserLog = new Model.UserLog();
// Set the properties on the UserLog object
NewUserLog.Channel = replyToConversation.ChannelId;
NewUserLog.UserID = replyToConversation.From.Id;
NewUserLog.UserName = replyToConversation.From.Name;
NewUserLog.created = DateTime.UtcNow;
// This logs the message being sent to the user
NewUserLog.Message = qnaResult.answers[0].answer;
// NewUserLog.Response= qnaResult.answers[0].answer;
// Add the UserLog object to UserLogs
DB.UserLogs.Add(NewUserLog);
// Save the changes to the database
DB.SaveChanges();
await context.PostAsync(replyToConversation);
context.Wait(MessageReceivedAsync);
}
public class BotDataInfo
{
public int Count { get; set; }
}
private BotDataInfo IncrementInfoCount(IBotDataBag botdata, string key)
{
BotDataInfo info = null;
if (botdata.ContainsKey(key))
{
info = botdata.GetValue<BotDataInfo>(key);
info.Count++;
}
else
info = new BotDataInfo() { Count = 1 };
return info;
}
}
}
Я пытался следовать вашим инструкциям, но все еще есть проблемы. Я могу сохранить в базе данных Id, UserId, ChannelID, созданный, сообщение, но не ответ (нулевой ответ во всех моих тестах) .
Можете ли вы помочь мне, что я могу сделать?
1 ответ
Одним из способов достижения этой цели является реализация IActivityLogger
проверять входящие и исходящие сообщения. В примере core-Middleware вы увидите пример того, как это сделать.
public class DebugActivityLogger : IActivityLogger
{
public async Task LogAsync(IActivity activity)
{
Debug.WriteLine($"From:{activity.From.Id} - To:{activity.Recipient.Id} - Message:{activity.AsMessageActivity()?.Text}");
}
}
Кроме того, вы можете решить вопрос о том, когда сообщение отправлено ботом. В этом случае я рекомендую вам прочитать, если IActivity принадлежит боту или пользователю в IActivityLogger.