/// <summary> /// Добавление запроса пользователя /// </summary> /// <param name="botUser"></param> /// <param name="type"></param> /// <param name="answer"></param> /// <param name="query"></param> /// <param name="TimeToStartAnswer"></param> /// <param name="buRequest"></param> public void AddBotQuery(BotUser botUser, FindedInformation answer, DateTime TimeToStartAnswer, BotUserRequest buRequest) { try { buRequest.BotUserID = botUser.BotUserID; buRequest.NowIs = (MallBotWhatIsHappeningNow)botUser.NowIs; if (answer != null && answer.Result != null) { buRequest.Answer = JsonConvert.SerializeObject(answer.Result); } var TimeToAnswer = DateTime.Now.Subtract(TimeToStartAnswer); buRequest.TimeToAnswer = TimeToAnswer.Days.ToString() + ":" + TimeToAnswer.Hours.ToString() + ":" + TimeToAnswer.Minutes.ToString() + ":" + TimeToAnswer.Seconds.ToString() + ":" + TimeToAnswer.Milliseconds.ToString(); buRequest.DateTime = DateTime.Now; buRequest.BotUserID = botUser.BotUserID; buRequest.CustomerCompositeID = botUser.CustomerCompositeID; buRequest.Name = botUser.Name; botUser.LastActivityDate = DateTime.Now; BotUserRequest.Add(buRequest); SaveChanges(); } catch (Exception exc) { Logging.Logger.Error(exc); } }
public MainAnswerHelper(BotUserRequest _thisRequest, object _Bot, SocialNetworkType _type, BotUser _botUser, List <MallBotContext> _dbContextes, List <VKApiRequestModel> _Requests = null) { botUser = _botUser; dbContextes = _dbContextes; Requests = _Requests; Bot = _Bot; type = _type; thisRequest = _thisRequest; #region Кэшируем string CachedItemKey = "MallBotData"; var datafromCache = cacher.Get(CachedItemKey); if (datafromCache == null) { datasOfBot = cacher.Update(CachedItemKey, dbContextes); } else { datasOfBot = (List <CachedDataModel>)datafromCache; } #endregion texter = new BotTextHelper(botUser.Locale, type, datasOfBot[0].Texts); sender = new ApiRouter(type, Bot, botUser, Requests); dataGetter = new GetDataHelper(datasOfBot); if (botUser.NowIs != MallBotWhatIsHappeningNow.SettingCustomer) { char usersdbID = botUser.CustomerCompositeID[0]; var customerID = int.Parse(botUser.CustomerCompositeID.Remove(0, 1)); currentCustomer = dataGetter.GetStructuredCustomers(true).FirstOrDefault(x => x.DBaseID == usersdbID).Customers.FirstOrDefault(x => x.CustomerID == customerID); //дает возможность работы в тц не из тестового режима } }
public Result Convert(BotUserResult input) { BotUserRequest userRequest = _userRequestService.GetRequestById(input.requestId); Result output = new Result(Convert(userRequest), input.rawOutput, new TimeSpan(0, 0, 0, 0, input.Duration), input.hasTimedOut); return(output); }
/// <summary> /// Добавление запроса /// </summary> /// <param name="btrequest"></param> /// <param name="TimeToStartAnswer"></param> public void AddBotRequest(BotUserRequest btrequest, DateTime TimeToStartAnswer) { var TimeToAnswer = DateTime.Now.Subtract(TimeToStartAnswer); btrequest.TimeToAnswer = TimeToAnswer.Seconds.ToString() + ":" + TimeToAnswer.Milliseconds.ToString(); BotUserRequest.Add(btrequest); SaveChanges(); }
/// <summary> /// Добавление запроса /// </summary> /// <param name="btrequest"></param> /// <param name="TimeToStartAnswer"></param> public void AddBotRequest(Models.BotUserRequest btrequest, BotUser botUser, DateTime TimeToStartAnswer) { var TimeToAnswer = DateTime.Now.Subtract(TimeToStartAnswer); btrequest.TimeToAnswer = TimeToAnswer.Seconds.ToString() + ":" + TimeToAnswer.Milliseconds.ToString(); btrequest.DateTime = DateTime.Now; btrequest.BotUserID = botUser.BotUserID; btrequest.NowIs = (MallBotWhatIsHappeningNow)botUser.NowIs; botUser.LastActivityDate = DateTime.Now; BotUserRequest.Add(btrequest); SaveChanges(); }
public Request Convert(BotUserRequest input) { Request output = new Request() { UserId = input.userId, HasTimedOut = false, RawInput = input.rawInput, StartedOn = input.startedOn, Id = input.id }; return(output); }
public int Add(string rawInput, int userId) { BotUserRequest request = new BotUserRequest() { rawInput = rawInput, userId = userId, startedOn = DateTimeOffset.UtcNow }; UnitOfWork uow = new UnitOfWork(); uow.BotUserRequestRepository.Insert(request); uow.Save(); return(request.id); }
public MainAnswerHelper(DBHelpers.Models.MFCModels.BotUser _botUser, MFCBotContext _context, BotUserRequest _thisRequest, List <VKApiRequestModel> _requests) { context = _context; botUser = _botUser; thisRequest = _thisRequest; requests = _requests; string key = "MFCDATAOFBOT"; var datafromCache = cacheHelper.Get(key); if (datafromCache == null) { mfcDataOfBot = cacheHelper.Update(key, context); } else { mfcDataOfBot = (MFCBotModel)datafromCache; } if (botUser.NowIs != MFCBotWhatIsHappeningNow.SettingOffice) { var usersOffice = mfcDataOfBot.Offices.FirstOrDefault(x => x.AisMFCID == botUser.OfficeID); if (usersOffice.Name == "Ярмарка") { usersOffice.OfficeID = 326; } //получаем все секции, которые относятся к выбранному филиалу mfcDataOfBot.Sections = mfcDataOfBot.AllSections. Where(x => mfcDataOfBot.SectionOffices. Where(z => z.OfficeID == usersOffice.OfficeID). Select(y => y.SectionID).Contains(x.SectionID)).DistinctBy(x => x.Name).ToList(); //сохраняем из них только листья mfcDataOfBot.RetainLeafs(); } sendHelper = new ApiRouter(SocialNetworkType.VK, null, botUser, requests); textHelper = new BotTextHelper(botUser.Locale, SocialNetworkType.VK, mfcDataOfBot.Texts); }
public async Task <HttpResponseMessage> PostMessage(JObject Responce) { try { DateTime TimeToStartAnswer = DateTime.Now; FacebookResponce facebookeResponce = Responce.ToObject <FacebookResponce>(); Logging.Logger.Debug($"Facebook PostMessage message={Responce}"); if (facebookeResponce == null) { Logging.Logger.Error("Facebook. Empty request!"); return(result); } if (facebookeResponce.Object != ObjectTypes.page) { Logging.Logger.Error($"Facebook. It's not a message!"); return(result); } //long unixTimestamp = (long)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds; //if (unixTimestamp - facebookTimestamp > long.Parse(ConfigurationManager.AppSettings["TimeToNotice"])) //{ // Logging.Logger.Debug($"Faceboooook !!!! An old message occurred {unixTimestamp} sub = {unixTimestamp - facebookTimestamp}"); // return result; //} // создание объекта - Бота var FacebookBot = new FacebookApiHelper(_token); // создание объекта для логирования запроса var thisRequest = new BotUserRequest(); // подключаем главную базу var dbContextes = new List <MallBotContext>(); dbContextes.Add(new MallBotContext($"A{ConfigurationManager.AppSettings["dbTest"]}")); // Находим пользователя var botUsers = dbContextes[0].BotUser.ToList(); var stringID = facebookeResponce.entry[0].messaging[0].sender.Id.ToString(); var botUser = botUsers.FirstOrDefault(x => x.BotUserFacebookID == stringID); if (botUser == null) { dbContextes[0] = dbContextes[0].AddBotUser(SocialNetworkType.Facebook, FacebookBot, stringID); botUser = dbContextes[0].BotUser.FirstOrDefault(x => x.BotUserFacebookID == stringID); botUser.IsNewUser = true; } else { if (botUser.NowIs == MallBotWhatIsHappeningNow.SettingCustomer && TimeHelper.GetMinutes((DateTime)botUser.LastActivityDate) > 240) { botUser.IsNewUser = true; } else { botUser.IsNewUser = false; } // если пользователь не завершил диалог с ботом и вернулся больше, чем через пол часа, то данные сбросятся к поиску организации. // кэш почистится в MainAnswerHelper if ((botUser.NowIs == MallBotWhatIsHappeningNow.SearchingWay || botUser.NowIs == MallBotWhatIsHappeningNow.GettingAllOrganizations) && TimeHelper.GetMinutes((DateTime)botUser.LastActivityDate) > 30) { botUser.NowIs = MallBotWhatIsHappeningNow.SearchingOrganization; } } //проверка на актуальность сообщения long facebookTimestamp = (long)facebookeResponce.entry[0].messaging[0].timestamp / 1000; if (ConfigurationManager.AppSettings["IgnoreOldEvents"] == "Enabled" && !TimeHelper.IsNewEvent((int)facebookTimestamp, botUser.BotUserID)) { return(result); } // помечаем сообщение как прочитанное. thisRequest.IsSendingError = await FacebookBot.SendAction(facebookeResponce.entry[0].messaging[0].sender.Id, SenderActionType.typing_on); //проверяем, что сообщение не пусто var trimmedLoweredQuery = ""; if (!string.IsNullOrWhiteSpace(facebookeResponce.entry[0].messaging[0].message?.text)) { trimmedLoweredQuery = facebookeResponce.entry[0].messaging[0].message.text.ToLower().Trim(AnalyseHelper.splitters); } else { if (facebookeResponce.entry[0].messaging[0].postback != null) { trimmedLoweredQuery = facebookeResponce.entry[0].messaging[0].postback.payload; facebookeResponce.entry[0].messaging[0].message = new FacebookMessage { text = trimmedLoweredQuery }; } } if (string.IsNullOrWhiteSpace(trimmedLoweredQuery) || (facebookeResponce.entry[0].messaging[0].message?.attachments != null && facebookeResponce.entry[0].messaging[0].message?.attachments[0].type != AttachmentType.location)) //что-то непонятное пришло { var simpleAnaliser = new AnalyseHelper(); thisRequest.IsSendingError = await simpleAnaliser.AnalyseBadRequest(botUser, SocialNetworkType.Facebook, FacebookBot, dbContextes[0].BotText.ToList()); dbContextes[0].AddBotQuery(botUser, null, TimeToStartAnswer, thisRequest); return(result); } var analyser = new MainAnswerHelper(thisRequest, FacebookBot, SocialNetworkType.Facebook, botUser, dbContextes); FindedInformation answer; // если была прислана геолокация, то ищем по ней. Иначе по тексту if (facebookeResponce.entry[0].messaging[0].message?.attachments != null && facebookeResponce.entry[0].messaging[0].message?.attachments[0].type == AttachmentType.location) { botUser.InputDataType = InputDataType.GeoLocation; botUser.NowIs = MallBotWhatIsHappeningNow.SettingCustomer; var temp = $"POINT({facebookeResponce.entry[0].messaging[0].message.attachments[0].payload.coordinates.Long} {facebookeResponce.entry[0].messaging[0].message.attachments[0].payload.coordinates.lat})"; temp = temp.Replace(',', '.'); thisRequest.Text = temp; answer = await analyser.Main(DbGeography.FromText(temp)); } else { botUser.InputDataType = InputDataType.Text; thisRequest.Text = facebookeResponce.entry[0].messaging[0].message.text; answer = await analyser.Main(trimmedLoweredQuery); } //сохраняем полезные данные по юзеру botUser.LastActivityDate = DateTime.Now; dbContextes[0].SaveChanges(); //пишем в базу запрос dbContextes[0].AddBotQuery(botUser, answer, TimeToStartAnswer, thisRequest); return(result); } catch (Exception ex) { Logging.Logger.Error(ex, "Facebook"); return(result); } }
public async Task <HttpResponseMessage> PostMessage(JObject jsonResponce) { try { DateTime TimeToStartAnswer = DateTime.Now; var telegramResponce = jsonResponce.ToObject <Update>(); Logging.Logger.Debug($"Telegram PostMessage message={jsonResponce}"); if (telegramResponce == null) { Logging.Logger.Error("Telegram Empty request"); return(result); } if (telegramResponce.Type == UpdateType.MessageUpdate) { // создание объекта - Бота var TelegramBot = new Telegram.Bot.TelegramBotClient(_token); // создание объекта для логирования запроса var thisRequest = new BotUserRequest(); // подключаем главную базу var dbContextes = new List <MallBotContext>(); dbContextes.Add(new MallBotContext($"A{ConfigurationManager.AppSettings["dbTest"]}")); // Находим пользователя var botUsers = dbContextes[0].BotUser.ToList(); var stringID = telegramResponce.Message.Chat.Id.ToString(); var botUser = botUsers.FirstOrDefault(x => x.BotUserTelegramID == stringID); if (botUser == null) { dbContextes[0] = dbContextes[0].AddBotUser(SocialNetworkType.Telegram, TelegramBot, stringID, telegramResponce.Message.From.FirstName, telegramResponce.Message.From.LastName); botUser = dbContextes[0].BotUser.FirstOrDefault(x => x.BotUserTelegramID == stringID); botUser.IsNewUser = true; } else { if (botUser.NowIs == MallBotWhatIsHappeningNow.SettingCustomer && TimeHelper.GetMinutes((DateTime)botUser.LastActivityDate) > 240) { botUser.IsNewUser = true; } else { botUser.IsNewUser = false; } // если пользователь не завершил диалог с ботом и вернулся больше, чем через пол часа, то данные сбросятся к поиску организации. // кэш почистится в MainAnswerHelper if ((botUser.NowIs == MallBotWhatIsHappeningNow.SearchingWay || botUser.NowIs == MallBotWhatIsHappeningNow.GettingAllOrganizations) && TimeHelper.GetMinutes((DateTime)botUser.LastActivityDate) > 30) { botUser.NowIs = MallBotWhatIsHappeningNow.SearchingOrganization; } } //проверка на актуальность сообщения long thisTimestamp = (int)(telegramResponce.Message.Date.Subtract(new DateTime(1970, 1, 1))).TotalSeconds; if (ConfigurationManager.AppSettings["IgnoreOldEvents"] == "Enabled" && !TimeHelper.IsNewEvent((int)thisTimestamp, botUser.BotUserID)) { return(result); } thisRequest.IsSendingError = 0; await TelegramBot.SendChatActionAsync(telegramResponce.Message.Chat.Id, ChatAction.Typing); // бот сделает вид что набирает сообщение //проверяем, что сообщение не пусто var trimmedLoweredQuery = ""; if (!string.IsNullOrWhiteSpace(telegramResponce.Message.Text)) { trimmedLoweredQuery = telegramResponce.Message.Text.ToLower().Trim(AnalyseHelper.splitters); } if (telegramResponce.Message.Text == null && telegramResponce.Message.Location == null) { var simpleAnaliser = new AnalyseHelper(); thisRequest.IsSendingError = await simpleAnaliser.AnalyseBadRequest(botUser, SocialNetworkType.Telegram, TelegramBot, dbContextes[0].BotText.ToList()); dbContextes[0].AddBotQuery(botUser, null, TimeToStartAnswer, thisRequest); return(result); } var analyser = new MainAnswerHelper(thisRequest, TelegramBot, SocialNetworkType.Telegram, botUser, dbContextes); FindedInformation answer; // если была прислана геолокация, то ищем по ней. Иначе по тексту if (telegramResponce.Message.Location != null) { botUser.InputDataType = InputDataType.GeoLocation; botUser.NowIs = MallBotWhatIsHappeningNow.SettingCustomer; var temp = $"POINT({telegramResponce.Message.Location.Longitude} {telegramResponce.Message.Location.Latitude})"; temp = temp.Replace(',', '.'); thisRequest.Text = temp; answer = await analyser.Main(DbGeography.FromText(temp)); } else { botUser.InputDataType = InputDataType.Text; thisRequest.Text = telegramResponce.Message.Text; answer = await analyser.Main(trimmedLoweredQuery); } //сохраняем полезные данные по юзеру botUser.LastActivityDate = DateTime.Now; dbContextes[0].SaveChanges(); //пишем в базу запрос dbContextes[0].AddBotQuery(botUser, answer, TimeToStartAnswer, thisRequest); return(result); } return(result); } catch (Exception ex) { Logging.Logger.Error(ex, "Telegram"); return(result); } }
public async Task <HttpResponseMessage> PostMessage(JObject jsonResponce) { var result = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent("ok"), }; try { DateTime TimeToStartAnswer = DateTime.Now; var vkResponce = jsonResponce.ToObject <VKResponce>(); Logging.Logger.Debug($"VK PostMessage message={jsonResponce}"); if (vkResponce == null) { Logging.Logger.Error("VK Empry request"); return(result); } if (vkResponce.GroupId != 120366480 && vkResponce.GroupId != 127789119) { Logging.Logger.Error($"VK group with ID {vkResponce.GroupId} is not supporting by MOLOKO"); result.Content = new StringContent($"VK group with ID {vkResponce.GroupId} is not supporting by MOLOKO"); return(result); } if (vkResponce.Type == "confirmation") { if (vkResponce.GroupId == 120366480) { return(new HttpResponseMessage { Content = new StringContent("da3aa7a7"), }); } if (vkResponce.GroupId == 127789119) { return(new HttpResponseMessage { Content = new StringContent("38ffe9fe"), }); } } if (vkResponce.Type == "message_new") { var vkMessage = jsonResponce["object"].ToObject <VKMessage>(); // создание объекта - Бота VK vk = null; if (vkResponce.GroupId == 120366480) { var token = "af48a9fdfdb50e827c09799047c71bcb1ac8ef0f874000d1e2ba30e416735e535badacec4f0f48af3fed4"; vk = new VK(token); } else { var token = "157c278b4e80a8bcade8eab4f4c0a99e2d6bc3f6fb9f0736763e8600e3682e3a0471f126a34a52e37534e"; vk = new VK(token); } // создание объекта для логирования запроса var thisRequest = new BotUserRequest(); thisRequest.IsSendingError = 0; // помечаем сообщение как прочитанное. thisRequest.IsSendingError = AsyncHelper.RunSync(() => vk.markAsRead(vkMessage.Id));// сообщение помечено как прочитанное // подключаем главную базу var dbContextes = new List <MallBotContext>(); dbContextes.Add(new MallBotContext($"A{ConfigurationManager.AppSettings["dbTest"]}")); // Находим пользователя var botUsers = dbContextes[0].BotUser.ToList(); var botUser = botUsers.FirstOrDefault(x => x.BotUserVKID == vkMessage.UserId.ToString()); if (botUser == null) { var temp = vkMessage.UserId.ToString(); dbContextes[0] = dbContextes[0].AddBotUser(SocialNetworkType.VK, vk, temp); botUser = dbContextes[0].BotUser.FirstOrDefault(x => x.BotUserVKID == temp); botUser.IsNewUser = true; } else { if (botUser.NowIs == MallBotWhatIsHappeningNow.SettingCustomer && TimeHelper.GetMinutes((DateTime)botUser.LastActivityDate) > 240) { botUser.IsNewUser = true; } else { botUser.IsNewUser = false; } // если пользователь не завершил диалог с ботом и вернулся больше, чем через пол часа, то данные сбросятся к поиску организации. // кэш почистится в MainAnswerHelper if ((botUser.NowIs == MallBotWhatIsHappeningNow.SearchingWay || botUser.NowIs == MallBotWhatIsHappeningNow.GettingAllOrganizations) && TimeHelper.GetMinutes((DateTime)botUser.LastActivityDate) > 30) { botUser.NowIs = MallBotWhatIsHappeningNow.SearchingOrganization; } } //проверка на актуальность сообщения if (ConfigurationManager.AppSettings["IgnoreOldEvents"] == "Enabled" && !TimeHelper.IsNewEvent(vkMessage.Date, botUser.BotUserID)) { return(result); } // сборщик запросов к апи var Requests = new List <VKApiRequestModel>(); //проверяем, что сообщение не пусто var trimmedLoweredQuery = vkMessage.Body.ToLower().Trim(AnalyseHelper.splitters); if (string.IsNullOrWhiteSpace(trimmedLoweredQuery) && vkMessage.geo == null) { var simpleAnaliser = new AnalyseHelper(); thisRequest.IsSendingError = await simpleAnaliser.AnalyseBadRequest(botUser, SocialNetworkType.VK, vk, dbContextes[0].BotText.ToList(), Requests); // отправка данных во вконтаке thisRequest.IsSendingError = AsyncHelper.RunSync(() => vk.SendAllRequests(Requests)); dbContextes[0].AddBotQuery(botUser, null, TimeToStartAnswer, thisRequest); return(result); } var analyser = new MainAnswerHelper(thisRequest, vk, SocialNetworkType.VK, botUser, dbContextes, Requests); FindedInformation answer; // если была прислана геолокация, то ищем по ней. Иначе по тексту if (vkMessage.geo != null) { botUser.InputDataType = InputDataType.GeoLocation; botUser.NowIs = MallBotWhatIsHappeningNow.SettingCustomer; thisRequest.Text = vkMessage.geo.coordinates; var geo = vkMessage.geo.coordinates.Split(' '); var temp = $"POINT({geo[1]} {geo[0]})"; temp = temp.Replace(',', '.'); answer = await analyser.Main(DbGeography.FromText(temp)); } else { botUser.InputDataType = InputDataType.Text; thisRequest.Text = vkMessage.Body; answer = await analyser.Main(trimmedLoweredQuery); } // отправка данных во вконтаке thisRequest.IsSendingError = AsyncHelper.RunSync(() => vk.SendAllRequests(Requests)); //сохраняем полезные данные по юзеру botUser.LastActivityDate = DateTime.Now; dbContextes[0].SaveChanges(); //пишем в базу запрос dbContextes[0].AddBotQuery(botUser, answer, TimeToStartAnswer, thisRequest); return(result); } if (vkResponce.Type == "group_join") { return(result); } return(result); } catch (Exception ex) { Logging.Logger.Error(ex, "VK"); return(result); } }