Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        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);
            }
        }
Ejemplo n.º 3
0
        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);
            }
        }