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 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) { 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); } }