/// <summary> /// Метод, для отправки всплывающей подсказаки для Inline кнопок /// </summary> /// <param name="result"></param> async void answerCallbackQuery(JsonMessages.Result result, string text) { //адрес для запроса string url = $@"{Settings.Url}answerCallbackQuery"; //текст всплывающей подсказки //string text = result.callback_query.data; //передаваемые параметры callback_query_id и text string data = $"callback_query_id={result.callback_query.id}&text={text}"; StringContent content = new StringContent(data, Encoding.UTF8, "application/x-www-form-urlencoded"); var res = await Settings.Client.PostAsync(url, content); }
/// <summary> /// Правка сообщений (реализовал пока только для Сallback) /// </summary> /// <param name="result"></param> /// <param name="replyMarkup"> введите replyMarkup</param> async void editMessageText(JsonMessages.Result result, string replyMarkup = "") { //https://core.telegram.org/bots/api#editmessagetext string text = result.callback_query.data; string url = $@"{Settings.Url}editMessageText"; //текст text.UrlEncode() нужно кодировать string data = $"chat_id={result.callback_query.message.chat.id.ToString()}&text={text}&message_id={result.callback_query.message.message_id.ToString()}"; if (replyMarkup != "") { data = data + $"&reply_markup={replyMarkup}"; } StringContent content = new StringContent(data, Encoding.UTF8, "application/x-www-form-urlencoded"); var res = await Settings.Client.PostAsync(url, content); }
/// <summary> /// Обработка запросов от Inline кнопки /// </summary> /// <param name="result">Результат от запроса JsonMessages.Result</param> /// <param name="replyMarkup"></param> internal void ProcessMessageToInline(JsonMessages.Result result, string replyMarkup = "") { //получаем chatId - идентификатор чата string chatId = result.callback_query.message.chat.id.ToString(); //получаем message_id - идентификатор сообщения string messageId = result.callback_query.message.message_id.ToString(); //получаем текст от callback_query string messageCallback = result.callback_query.data; //получаем название кнопки string titleButton = result.callback_query.message.text; string userName = result.callback_query.message.from.username; string answer = String.Empty; //ответ входящее на сообщение //обработка сообщения полученого от Inline кнопки от callback_query switch (messageCallback.ToLower()) { case @"help": titleButton = "Спаравка по продуктам"; new Menu().InlineMenuFromBd(out replyMarkup); break; case @"about": titleButton = "Тут будет описание компании"; new Menu().InlineMenuFromBd(out replyMarkup); break; case @"next": titleButton = messageCallback; Settings.Number = Settings.Number + 5; new Menu().InlineMenuProductsFromCategory(messageCallback, out replyMarkup); break; case @"корзина": titleButton = new Menu().MenuCart(userName, out replyMarkup); break; default: titleButton = messageCallback; var res = new Menu().InlineMenuProductsFromCategory(messageCallback, out replyMarkup); //проверка на NULL if (String.IsNullOrEmpty(res)) { break; } //если ответ выдал больше 30 символов, значит это не категория и не товар, а описание товара if (res.Length > 30 || !res.Any()) { titleButton = res; } break; } //titleButton = answer + Environment.NewLine + messageCallback; //отправка сообщения пользователю //sendMessage(chatId, answer, replyMarkup); ; editMessageText(chatId, messageId, titleButton, replyMarkup); }
/// <summary> /// Обработка запросов от Inline кнопки /// </summary> /// <param name="result">Результат от запроса JsonMessages.Result</param> /// <param name="replyMarkup"></param> internal void ProcessMessageToInline(JsonMessages.Result result, string replyMarkup = "", string text = "") { #region //получаем chatId - идентификатор чата string chatId = result.callback_query.message.chat.id.ToString(); //получаем message_id - идентификатор сообщения string messageId = result.callback_query.message.message_id.ToString(); //получаем callback_query от кнопки string messageCallback = result.callback_query.data; string idUser = string.Empty; string idGroupOfUser = string.Empty; string idWorkplese = string.Empty; string command = string.Empty; idUser = messageCallback.Split('|')[0]; idGroupOfUser = messageCallback.Split('|')[1]; idWorkplese = messageCallback.Split('|')[2]; command = messageCallback.Split('|')[3]; if (idUser == "") { //Получаем idUser idUser = result.callback_query.from.id.ToString(); } //получаем название/текст на кнопке string titleButton = result.callback_query.message.text; //получаем userName string userName = result.callback_query.from.username; if (userName == "" || userName == null) { userName = result.callback_query.from.first_name; } string answer = String.Empty; //ответ входящее на сообщение string nameProduct = String.Empty; // наименование продукта #endregion //обработка сообщения полученого от Inline кнопки от callback_query switch (command.ToLower()) { case "checklist": //373101829 | 1 | 1 | checklist //idUser - 373101829 //idGroupOfUser - 1 //idWorkplese - 1 //command - checklist|номер вопроса string prefix = String.Empty; if (messageCallback.Split('|').Length >= 5) { prefix = messageCallback.Split('|')[4]; } titleButton = new Menu().InlineMenuFromChecList(out replyMarkup, idUser, idGroupOfUser, idWorkplese, command, prefix); if (titleButton == null) { Console.WriteLine("Произошла внутренняя ошибка - возможно сбой интернет соеденения\r\n" + "или пользователь нажал на кнопку, которая уже не актуальна"); titleButton = "<i>Произошла внутренняя ошибка - возможно из-за сбоя интернет соеденения, </i>" + "<i>⚠ или вы нажали на неактивную кнопку из прошлых сообщений ⚠\r\n</i>" + "<b>❗ Очистите историю сообщений, чтоб перезапустить бота</b>"; sendMessage(idUser, titleButton); return; } #region Закончились все вопросы из чек листа if (titleButton.Contains("Закончились все вопросы из чек листа")) { foreach (var el in Settings.dicResult[int.Parse(idUser)]) { titleButton += "\r\n" + el; } Buttons.InlineKeyboardMarkup allBtn = new Buttons.InlineKeyboardMarkup(); //Добавляем кнопку в следующий столбец allBtn.AddButton(new Buttons.InlineKeyboardButton($"✅ Отправить", $"{idUser}|{idGroupOfUser}|{idWorkplese}|send"), 0); //allBtn.AddButton(new Buttons.InlineKeyboardButton($"Редактировать", $"{idUser}|{idGroupOfUser}|{idWorkplese}|edit"), 0); replyMarkup = JsonConvert.SerializeObject(allBtn); } #endregion string otvet = ""; //Если после prefix (номра вопроса из чеклитса) пришло еще что-то //значит это пришел ответ на вопрос if (messageCallback.Split('|').Length == 6) { //получаем ответ на вопрос (Да/Нет) otvet = messageCallback.Split('|')[5]; if (otvet.Contains("✔️")) { otvet += " - Да"; } else { otvet += " - Нет"; } //добавляем Ответы на вопросы из чек-листа в словарь AddNewElement(Settings.dicOtvetToCheckList, int.Parse(idUser), $"{prefix} = {otvet}"); //получаем заданный вопрос string vopros = Settings.dicVoprosToCheckList[int.Parse(idUser)][int.Parse(prefix) - 1]; string AllData = $"{messageId}|{vopros}|{otvet}|{idUser}|{idGroupOfUser}|{idWorkplese}|{command}|{prefix}"; //Добавляем полученные данные в словарь Settings.dicAllData.AddOrUpdate(int.Parse(idUser), AllData, (key, oldValue) => AllData); AddNewElement(Settings.dicResult, int.Parse(idUser), $"<b>Вопрос {prefix}:</b>\r\n{vopros}\r\n" + $"<b>Ответ:</b>\r\n{otvet}" + "\r\n*****\r\n", (int.Parse(prefix) - 1)); Buttons.InlineKeyboardMarkup allBtn = new Buttons.InlineKeyboardMarkup(); //Добавляем кнопку в следующий столбец allBtn.AddButton(new Buttons.InlineKeyboardButton($"❗ Пропустить", $"{idUser}|{idGroupOfUser}|{idWorkplese}|checklist|{int.Parse(prefix)}"), 0); allBtn.AddButton(new Buttons.InlineKeyboardButton($"🔙 Назад 📝", $"{idUser}|{idGroupOfUser}|{idWorkplese}|checklist|{int.Parse(prefix) - 1}"), 0); string Rm = JsonConvert.SerializeObject(allBtn); //Оставляем или пропускаем комментарий text = $"{vopros} - {otvet}" + "\r\n\n<pre>Напишите 💡 комментарий по вопросу, если комментарий не требуетcя нажмите </pre>" + "<b>кнопку Пропустить ⬇</b>"; editMessageText(chatId, messageId, text, Rm); //deleteMessage(chatId, messageId); return; } break; case @"send": titleButton = "🟢 Ваш Чек-Лист отправлен!"; int userId = int.Parse(idUser); //очищаем словари DelIdUserFromDic(Settings.dicOtvetToCheckList, userId); DelIdUserFromDic(Settings.dicVoprosToCheckList, userId); string value; Settings.dicAllData.TryRemove(userId, out value); //получаем список Админов для отправки им результа var listAdmin = new RequestBd().GetAdmin(); string report = String.Empty; //проверяем на наличие юзера в словаре if (!Settings.dicResult.ContainsKey(userId)) { Console.WriteLine("Ошибка"); return; } //делаем перебор результатов из чек листа foreach (var el in Settings.dicResult[userId]) { report += "\r\n" + el; } //Метод, отправки отчета админам SpamAdmin(listAdmin, report, userId, idGroupOfUser, idWorkplese, userName); //чистим от тегов report = report.Replace("</b>", "").Replace("<b>", "").Replace("</i>", "").Replace("<i>", ""). Replace("</pre>", "").Replace("<pre>", ""); new RequestBd().AddReportFromToUserId(userId, idGroupOfUser, idWorkplese, report); //очищаем словарь с результами List <string> Lvalue; Settings.dicResult.Remove(userId, out Lvalue); break; case @"edit": titleButton = "Тут можно будет редактировать ответы\r\n (Пока не реализовано!)"; int UserId = int.Parse(idUser); //очищаем словарь DelIdUserFromDic(Settings.dicOtvetToCheckList, UserId); //DelIdUserFromDic(Settings.dicVoprosToCheckList, UserId); List <string> lList; Settings.dicVoprosToCheckList.Remove(UserId, out lList); break; default: #region titleButton = "Получили не известную команду, нажмите /start"; break; #endregion } editMessageText(chatId, messageId, titleButton, replyMarkup); }