我尝试使用Iactivitylogger捕获用户的对话,有没有办法将用户和机器人的对话编译为临时持有者,如变量或会话?我需要暂时将它存储在只有当用户想要与真人而不是机器人交谈时才能使用的地方.将发送包含用户和机器人的先前对话的电子邮件.我不想将其保存到数据库,因为有些用户不会选择这样做.
参见使用的代码.
记录器类:
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); }
解决方法
正如Ezequiel在评论中所建议的那样,您可以将活动存储在字典中.就像是:
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;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。