/// <summary> /// Создаем кнопки из БД /// </summary> /// <param name="res">Запрос полученный от БД в виде IEnumerable<string></param> /// <returns>возвращаем replyMarkup </returns> string AddButtonFromBd(IEnumerable <string> res, int column = 4) { Buttons.InlineKeyboardMarkup allBtn = new Buttons.InlineKeyboardMarkup(); int a = 0; foreach (string el in res) { if (el == "") { continue; } //Добавляем кнопку в следующий столбец allBtn.AddButton(new InlineKeyboardButton($"{el}", $"{el}"), ++a / column); } ButtonNavigation(allBtn, res.Count().ToString()); //ButtonHeaderMenu(allBtn); //Добавляем главные кнопки в меню string replyMarkup = JsonConvert.SerializeObject(allBtn); Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(replyMarkup); Console.ResetColor(); return(replyMarkup); }
/// <summary> /// Меню из БД /// </summary> /// <param name="ChatId"></param> /// <returns></returns> public string InlineMenuFromBd(out string replyMarkup, int column = 4) { Buttons.InlineKeyboardMarkup allBtn = new Buttons.InlineKeyboardMarkup(); IEnumerable <string> res = new RequestBd().GetCategory(); //string query = "SELECT catName FROM categorys"; //var res = new Bd().SelectBD(query); //res.Split(new String[] { "\r\n" }, StringSplitOptions.None) int a = 0; foreach (string el in res) { if (el == "") { continue; } //Добавляем кнопку в следующий столбец allBtn.AddButton(new InlineKeyboardButton($"{el}", $"{el}"), ++a / column); } ButtonHeaderMenu(allBtn); replyMarkup = JsonConvert.SerializeObject(allBtn); return("Категории продуктов"); }
/// <summary> /// Добавляем кнопку в InlineMenu /// </summary> /// <param name="ChatId"></param> /// <param name="nameButton"> имя кнопки</param> /// <param name="lineBtn">линия кнопки</param> /// <returns></returns> public string InlineMenuAddButton(string nameButton, string callback_data) { Buttons.InlineKeyboardMarkup allBtn = new Buttons.InlineKeyboardMarkup(); allBtn.AddButton (new InlineKeyboardButton(nameButton, callback_data)); //необходимо сериализовать класс в JSON string replyMarkup = JsonConvert.SerializeObject(allBtn); return(replyMarkup); }
public string MenuCart(string UserName, out string replyMarkup) { Cart cart = new Cart(UserName); Buttons.InlineKeyboardMarkup allBtn = new Buttons.InlineKeyboardMarkup(); List <InlineKeyboardButton> line = new List <InlineKeyboardButton>() { new InlineKeyboardButton("Назад", "about"), }; allBtn.AddLineButton(line); ButtonHeaderMenu(allBtn); replyMarkup = JsonConvert.SerializeObject(allBtn); return($"В корзине {cart.CountProductsToCart.ToString()} шт."); }
/// <summary> /// Получаем рабочие места из БД /// </summary> /// <param name="replyMarkup"></param> /// <param name="idUser"></param> /// <param name="idGroupOfUser"></param> /// <param name="idChecklist"></param> /// <param name="command"></param> /// <param name="column"></param> public void MenuWorcplese(out string replyMarkup, string idUser, string idGroupOfUser = "", string idWorkplese = "", string command = "", int column = 1) { replyMarkup = ""; if (idUser == "") { return; } //получае ID группы пользователей по idUser int?idGroup = new RequestBd().GetIdGroupOfUsers(int.Parse(idUser)); if (idGroup == null) { return; } //получаем все рабочие места из БД по группе пользователей // в формате id var res = new RequestBd().GetWorcplaseOfGroupOfUsers(idGroup); //Создаем кнопки Buttons.InlineKeyboardMarkup allBtn = new Buttons.InlineKeyboardMarkup(); int a = 0; foreach (var el in res) { idWorkplese = el.Split('|')[0]; string workplese = el.Split('|')[1]; string calback = $"{idUser}|{idGroup}|{idWorkplese}|checklist"; //Добавляем кнопку Удалить в следующий столбец allBtn.AddButton(new InlineKeyboardButton($"{workplese}", $"{calback}"), ++a / column); } replyMarkup = JsonConvert.SerializeObject(allBtn); }
/// <summary> /// Кнопки, полученные из списка /// Важно! Необходимо потом их будет серилизовать: /// string replyMarkup = JsonConvert.SerializeObject(список) /// </summary> /// <param name="res">Список кнопок, которой необходимо добавить IEnumerable<string></param> /// <param column="res">Максимальное кол-во столбцов в меню (по умолчанию =4)</param> /// <returns></returns> InlineKeyboardMarkup AddButtonReturnInlineKeyboardMarkup(IEnumerable <string> res, int column = 4) { Buttons.InlineKeyboardMarkup allBtn = new Buttons.InlineKeyboardMarkup(); int a = 0; foreach (string el in res) { if (el == "") { continue; } //Добавляем кнопку в следующий столбец allBtn.AddButton(new InlineKeyboardButton($"{el}", $"{el}"), ++a / column); } ButtonNavigation(allBtn, res.Count().ToString()); //Добавляем главные кнопки в меню return(allBtn); }
/// <summary> /// Обработка входящих сообщений /// </summary> /// <param name="ChatId">введите ChatId</param> /// <param name="Message">введите сообщение, которое нужно обработать</param> internal void ProcessMessage(string ChatId, string Message, JsonMessages.Message resultMessage = null) { string answer = String.Empty; //ответ входящее на сообщение string chatId = resultMessage.chat.id.ToString(); string messageId = resultMessage.message_id.ToString(); string idUser = resultMessage.from.id.ToString(); string?userName = resultMessage.from.username; string phoneNumber = String.Empty; if (resultMessage.contact != null) { phoneNumber = resultMessage.contact.phone_number; if (phoneNumber != null || phoneNumber == "") { Console.WriteLine($"Отправляем номер админу {phoneNumber}"); Message = "данные успешно отправлены"; } } #region Проверка на ник if (userName == "" || userName == null) { userName = resultMessage.from.first_name; } #endregion if (Message == null) { return; } switch (Message.ToLower()) { case @"/start": answer = "<b>Добро пожаловать!</b>" + "\r\n <i>Для регистрации отправьте свой номер телефона</i> нажмите на кнопку 📞"; string replyMarkup = CreateDeleteBtnPhone(); sendMessage(ChatId, answer, replyMarkup); return; case @"данные успешно отправлены": //добавляем пользователя в базу данных, если его нет new RequestBd().AddWorkerToWorkers(idUser, userName, phoneNumber); replyMarkup = CreateDeleteBtnPhone(true); sendMessage(ChatId, "✅ Данные успешно отправлены!", replyMarkup); System.Threading.Thread.Sleep(2000); MenuChekList(ChatId); return; case @"/menu": case @"получить чек-лист": //получаем чек лист, если пользователь есть в БД MenuChekList(ChatId); return; default: //вопрос | ответ | idUser | idGroupOfUser | idWorkplese | command | prefix(если есть) string dataAll = Settings.dicAllData.GetOrAdd(int.Parse(chatId), ""); int ColuntLenght = dataAll.Split('|').Length; //Разбиваем полученные данные из словаря на массив string[] arrDataAll = dataAll.Split(new String[] { "|" }, StringSplitOptions.None); if (ColuntLenght >= 7) { string idMess = arrDataAll[0]; string vopros = arrDataAll[1]; string otvet = arrDataAll[2]; //string idUser = arrDataAll[3]; string idGroupOfUser = arrDataAll[4]; string idWorkplese = arrDataAll[5]; string command = arrDataAll[6]; string prefix = arrDataAll[7]; string callback = $"{idUser}|{idGroupOfUser}|{idWorkplese}|{command}|{prefix}"; answer = $"<b>Вопрос {prefix}:</b>\r\n{vopros}" + $"\r\n<b>Ответ:</b>\r\n{otvet}" + $"\r\n<b>Комментарий:</b>\r\n{Message}" + "\r\n*****\r\n"; Buttons.InlineKeyboardMarkup allBtn = new Buttons.InlineKeyboardMarkup(); //Добавляем кнопку в следующий столбец allBtn.AddButton(new Buttons.InlineKeyboardButton($"➡ Далее", $"{callback}"), 0); callback = $"{idUser}|{idGroupOfUser}|{idWorkplese}|{command}|{int.Parse(prefix) - 1}"; allBtn.AddButton(new Buttons.InlineKeyboardButton($"🔙 Назад 📝", callback), 0); string Rm = JsonConvert.SerializeObject(allBtn); deleteMessage(chatId, messageId); AddNewElement(Settings.dicResult, int.Parse(idUser), answer, (int.Parse(prefix) - 1)); editMessageText(chatId, idMess, answer, Rm); return; } answer = $"Вы мне написали:\r\n{Message}\r\nЯ не знаю что ответить, воспользуйтесь командой: /start"; break; } //отправка сообщения пользователю sendMessage(ChatId, answer); }
/// <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); }