public async Task <OkResult> Update([FromBody] Update update) { try { var remoteIpAddress = Request?.HttpContext?.Connection?.RemoteIpAddress; _logger.LogInformation("Remote Ip Address {0}, {1}", remoteIpAddress, remoteIpAddress?.MapToIPv4()); var inputData = System.Text.Json.JsonSerializer.Serialize(update); var msg = update.Message; if (msg == null) { _logger.LogInformation("Incoming empty message"); Ok(); } _logger.LogInformation("Incomming message from {0}, contact {1}, message {2}", string.Concat(update?.Message?.From?.Id, ":", update?.Message?.From?.FirstName, " ", update?.Message?.From?.LastName), update?.Message?.Contact?.PhoneNumber, update?.Message?.Text); ChatInfo chatInfo = null; if (true) { using (ApplicationContext db = new ApplicationContext()) { Chat chat = msg?.Chat; if (chat != null) { chatInfo = _mapper.Map <ChatInfo>(chat); Save(db, chatInfo); } User from = GetFrom(update); if (update?.Message?.Contact != null) { } if (from == null) { return(Ok()); } var fromUser = _mapper.Map <TelegramUser>(from); var user = db.TelegramUsers.FirstOrDefault(p => p.Id == fromUser.Id); if (user == null) { db.TelegramUsers.Add(fromUser); db.SaveChanges(); } if (update.Type == UpdateType.CallbackQuery) { await _updateService.AddLike(db, update, from); return(Ok()); } db.SaveChanges(); if (!ProcessCommand(update, msg?.Text, db, fromUser, update)) { var questText = msg?.Text; if (questText == null) { //if (msg?.Photo.Length > 0) //{ // var stream = new MemoryStream(); // var types = await _updateService.GetPhoto(msg.Photo, stream); // FIBITMAP bitmap = FreeImage.LoadFromStream(stream); // BITMAPINFO imageInfo = FreeImage.GetInfoEx(bitmap); // FREE_IMAGE_FORMAT imageType = FreeImage.GetFileTypeFromStream(stream); //} //return Ok(); } bool isToThisBot = questText != null && questText.StartsWith(_config.BotName); if (from.IsBot && questText != null) { questText = Regex.Replace(questText, @"^@\S+\s", String.Empty); } if (update.Type == UpdateType.Message) { //questText = update.InlineQuery.Query; var quest = db.Questions.FirstOrDefault(p => p.Text == questText); if (quest == null && isToThisBot) { quest = new Question { Text = questText.Substring(0, Math.Min(questText.Length, 128)), CreatedDate = DateTime.UtcNow, CreatorId = from.Id, Quantity = 1 }; db.Questions.Add(quest); } else if (quest != null) { quest.UpdatedDate = DateTime.UtcNow; quest.UpdatedId = from.Id; quest.Quantity++; } else if (!isToThisBot && !string.IsNullOrEmpty(questText) && !string.IsNullOrEmpty(msg?.ReplyToMessage?.Text)) { //Add replies human to human as quest and answer string replyText = msg.ReplyToMessage.Text; replyText = Regex.Replace(replyText, "[\n\r]", " ").Trim(); replyText = replyText.Substring(0, Math.Min(replyText.Length, 128)); var replyQuest = db.Questions.FirstOrDefault(p => p.Text.Equals(replyText)); if (replyQuest == null) { replyQuest = new Question { Text = replyText, CreatedDate = DateTime.UtcNow, CreatorId = msg.ReplyToMessage.From.Id, Quantity = 1, Answers = new List <Answer>() }; db.Questions.Add(replyQuest); } else { replyQuest.UpdatedDate = DateTime.UtcNow; replyQuest.UpdatedId = msg.ReplyToMessage.From.Id; replyQuest.Quantity++; } var answeText = questText.Substring(0, Math.Min(questText.Length, 512)); answeText = Regex.Replace(answeText, "[\n\r]", " ").Trim(); var q = db.Answers.Where(p => p.QuestionId == 88).ToList(); var answer = db.Answers .Where(p => p.Text == answeText && p.QuestionId == replyQuest.Id) .FirstOrDefault(); if (answer == null) { answer = new Answer { Text = answeText, }; replyQuest.Answers.Add(answer); } db.SaveChanges(); return(Ok()); } } if (!string.IsNullOrEmpty(questText)) { questText = Regex.Replace(questText, "[\n\r]", " ").Trim(); string toSend = null; int answerId = 0; if (isToThisBot) { var answers = GetBotAnswers(db, questText, ".4"); answerId = SelectMessage(answers, answerId, ref toSend); } else { var n = (new Random()).Next(10); var rating = n > 6 ? ".4" : ".7"; var answers = GetBotAnswers(db, questText, rating); if (answers.Any()) { answerId = SelectMessage(answers, answerId, ref toSend); } else { _logger.LogInformation($"No any items with rating >{rating}"); } } if (!string.IsNullOrWhiteSpace(toSend) && (chatInfo == null || !chatInfo.IsSelentMode)) { var responce = await _updateService.EchoAsync(update, toSend); if (responce != null) { var sended = new SendedAnswer { AnswerId = answerId, CreatedDate = DateTime.UtcNow, MessageId = responce.MessageId, }; db.SendedAnswers.Add(sended); var inputMessage = new InputMessage { MessageId = responce.MessageId, Text = questText }; db.InputMessages.Add(inputMessage); db.SaveChanges(); } } } } } } } catch (Exception e) { _logger.LogError(e, "Error"); } return(Ok()); }