From 76c2a1492ab57dbd05de3f8f24321b0a16a7ce0c Mon Sep 17 00:00:00 2001 From: Mef Date: Wed, 19 Mar 2025 19:00:55 +0700 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=20ReportData=20=D0=B8?= =?UTF-8?q?=20=D1=83=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D1=86=D0=B5=D1=81=D1=81=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=B7=D0=B0=D1=8F=D0=B2=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit В код добавлен новый класс `ReportData` для хранения информации о заявках, а также перечисляемый тип `ReportStep` для определения этапов создания заявки. Введена структура данных `Dictionary reportCreation` для отслеживания процесса создания заявок по идентификатору чата. Изменен процесс обработки обновлений: теперь при выборе "report" пользователю предлагается выбрать приоритет через клавиатуру. Упрощена логика обработки выбора приоритета и удалены лишние проверки для админ-панели и просмотра заявок. Обновлены сообщения для пользователей, улучшено взаимодействие и управление состоянием ожидания заявки. Также обновлены кнопки навигации для более интуитивного пользовательского интерфейса. --- Program.cs | 378 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 215 insertions(+), 163 deletions(-) diff --git a/Program.cs b/Program.cs index 669bf1d..9b098b4 100644 --- a/Program.cs +++ b/Program.cs @@ -86,7 +86,22 @@ class Program // Ожидаем отмены через token cts.Token.WaitHandle.WaitOne(); } - + private class ReportData + { + public ReportStep Step { get; set; } + public string Priority { get; set; } = string.Empty; + public string Room { get; set; } = string.Empty; + public string Description { get; set; } = string.Empty; + public string FullName { get; set; } = string.Empty; + } + private enum ReportStep + { + Priority, + Room, + Description, + FullName, + Completed + } private static async Task DeletePreviousMessage(ITelegramBotClient botClient, long chatId, int messageId) { try @@ -99,7 +114,7 @@ class Program Log.Error($"Ошибка при удалении сообщения {messageId} в чате {chatId}: {ex.Message}"); } } - + private static Dictionary reportCreation = new Dictionary(); private static async Task HandleUpdateAsync(ITelegramBotClient botClient, Update update, CancellationToken cancellationToken) { @@ -126,150 +141,192 @@ class Program if (data == "report") { - usersWaitingForReport[chatId] = true; - await botClient.SendMessage(chatId, "Пожалуйста, отправьте описание проблемы."); - Log.Information($"Пользователь {chatId} начал создание заявки"); + // Начинаем процесс создания заявки с запроса приоритета + reportCreation[chatId] = new ReportData { Step = ReportStep.Priority }; + + var priorityKeyboard = new InlineKeyboardMarkup(new[] + { + new[] { + InlineKeyboardButton.WithCallbackData("Низкий", "priority_low") + }, + new[] { + InlineKeyboardButton.WithCallbackData("Средний", "priority_medium") + }, + new[] { + InlineKeyboardButton.WithCallbackData("Высокий", "priority_high") + }, + new[] { + InlineKeyboardButton.WithCallbackData("Отмена", "cancel_report") + } + }); + + await botClient.SendMessage(chatId, "Выберите приоритет заявки:", replyMarkup: priorityKeyboard); + Log.Information($"Пользователь {chatId} начал создание заявки - выбор приоритета"); } - else if (data == "admin_panel") + else if (data != null && data.StartsWith("priority_")) { - if (admins.Contains(chatId)) + // Обрабатываем выбор приоритета + if (reportCreation.TryGetValue(chatId, out var reportData)) { - await SendAdminPanel(botClient, chatId); - } - else - { - var keyboard = new InlineKeyboardMarkup(new[] + string priority = data.Substring(9) switch { + "low" => "Низкий", + "medium" => "Средний", + "high" => "Высокий", + _ => "Не указан" + }; + + reportData.Priority = priority; + reportData.Step = ReportStep.Room; + + var cancelKeyboard = new InlineKeyboardMarkup(new[] + { + new[] { InlineKeyboardButton.WithCallbackData("Отмена", "cancel_report") } + }); + + await botClient.SendMessage(chatId, "Введите номер кабинета:", replyMarkup: cancelKeyboard); + Log.Information($"Пользователь {chatId} выбрал приоритет {priority}"); + } + else if (data == "admin_panel") + { + if (admins.Contains(chatId)) + { + await SendAdminPanel(botClient, chatId); + } + else + { + var keyboard = new InlineKeyboardMarkup(new[] + { new[] { InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu") } }); - await botClient.SendMessage(chatId, "⛔ Вы не являетесь администратором!", replyMarkup: keyboard); - Log.Information($"Неавторизованный доступ к админ-панели от {chatId}"); + await botClient.SendMessage(chatId, "⛔ Вы не являетесь администратором!", replyMarkup: keyboard); + Log.Information($"Неавторизованный доступ к админ-панели от {chatId}"); + } } - } - else if (data == "view_reports") - { - if (admins.Contains(chatId)) + else if (data == "view_reports") + { + if (admins.Contains(chatId)) + { + await ViewReports(botClient, chatId); + } + else + { + var keyboard = new InlineKeyboardMarkup(new[] + { + new[] + { + InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu") + } + }); + + await botClient.SendMessage(chatId, "⛔ Вы не являетесь администратором!", replyMarkup: keyboard); + Log.Information($"Неавторизованный доступ к заявкам от {chatId}"); + } + } + else if (data == "view_archived_reports") + { + if (admins.Contains(chatId)) + { + await ViewArchivedReports(botClient, chatId); + } + else + { + var keyboard = new InlineKeyboardMarkup(new[] + { + new[] + { + InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu") + } + }); + + await botClient.SendMessage(chatId, "⛔ Вы не являетесь администратором!", replyMarkup: keyboard); + Log.Information($"Неавторизованный доступ к архиву заявок от {chatId}"); + } + } + else if (data != null && data.StartsWith("report_")) + { + long reportId = long.Parse(data.Substring(7)); + if (callbackQuery?.Message?.MessageId != null) + { + int messageId = callbackQuery.Message.MessageId; + await ShowReportDetails(botClient, chatId, reportId, messageId); + } + } + else if (data != null && data.StartsWith("status_")) + { + string[] parts = data.Split('_'); + long reportId = long.Parse(parts[1]); + string newStatus = parts[2]; + if (callbackQuery?.Message?.MessageId != null) + { + int messageId = callbackQuery.Message.MessageId; + await UpdateReportStatus(reportId, newStatus); + await ShowReportDetails(botClient, chatId, reportId, messageId); + } + } + else if (data != null && data.StartsWith("delete_")) + { + long reportId = long.Parse(data.Substring(7)); + await DeleteReport(botClient, chatId, reportId); + } + else if (data == "back_to_list") { await ViewReports(botClient, chatId); } - else + else if (data == "main_menu") { - var keyboard = new InlineKeyboardMarkup(new[] - { - new[] - { - InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu") - } - }); - - await botClient.SendMessage(chatId, "⛔ Вы не являетесь администратором!", replyMarkup: keyboard); - Log.Information($"Неавторизованный доступ к заявкам от {chatId}"); + await SendMainMenu(botClient, chatId); } } - else if (data == "view_archived_reports") - { - if (admins.Contains(chatId)) - { - await ViewArchivedReports(botClient, chatId); - } - else - { - var keyboard = new InlineKeyboardMarkup(new[] - { - new[] - { - InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu") - } - }); - - await botClient.SendMessage(chatId, "⛔ Вы не являетесь администратором!", replyMarkup: keyboard); - Log.Information($"Неавторизованный доступ к архиву заявок от {chatId}"); - } - } - else if (data != null && data.StartsWith("report_")) - { - long reportId = long.Parse(data.Substring(7)); - if (callbackQuery?.Message?.MessageId != null) - { - int messageId = callbackQuery.Message.MessageId; - await ShowReportDetails(botClient, chatId, reportId, messageId); - } - } - else if (data != null && data.StartsWith("status_")) - { - string[] parts = data.Split('_'); - long reportId = long.Parse(parts[1]); - string newStatus = parts[2]; - if (callbackQuery?.Message?.MessageId != null) - { - int messageId = callbackQuery.Message.MessageId; - await UpdateReportStatus(reportId, newStatus); - await ShowReportDetails(botClient, chatId, reportId, messageId); - } - } - else if (data != null && data.StartsWith("delete_")) - { - long reportId = long.Parse(data.Substring(7)); - await DeleteReport(botClient, chatId, reportId); - } - else if (data == "back_to_list") - { - await ViewReports(botClient, chatId); - } - else if (data == "main_menu") - { - await SendMainMenu(botClient, chatId); - } } - } - // Обработка текстовых сообщений - if (update.Type == UpdateType.Message && update.Message?.Text != null) - { - var message = update.Message; - Log.Information($"Получено сообщение от {message.Chat.Id}: {message.Text}"); - - // Обработка команды /admin для авторизации - if (message.Text.StartsWith("/admin")) + // Обработка текстовых сообщений + if (update.Type == UpdateType.Message && update.Message?.Text != null) { - string[] parts = message.Text.Split(' '); - if (parts.Length == 2 && parts[1] == adminPassword) + var message = update.Message; + Log.Information($"Получено сообщение от {message.Chat.Id}: {message.Text}"); + + // Обработка команды /admin для авторизации + if (message.Text.StartsWith("/admin")) { - admins.Add(message.Chat.Id); - var keyboard = new InlineKeyboardMarkup(new[] + string[] parts = message.Text.Split(' '); + if (parts.Length == 2 && parts[1] == adminPassword) { + admins.Add(message.Chat.Id); + var keyboard = new InlineKeyboardMarkup(new[] + { new[] { InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu") } }); - await botClient.SendMessage(message.Chat.Id, "✅ Вы авторизованы как администратор!", replyMarkup: keyboard); - Log.Information($"Новый администратор: {message.Chat.Id}"); - } - else - { - var keyboard = new InlineKeyboardMarkup(new[] + await botClient.SendMessage(message.Chat.Id, "✅ Вы авторизованы как администратор!", replyMarkup: keyboard); + Log.Information($"Новый администратор: {message.Chat.Id}"); + } + else { + var keyboard = new InlineKeyboardMarkup(new[] + { new[] { InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu") } }); - await botClient.SendMessage(message.Chat.Id, "❌ Неверный пароль!", replyMarkup: keyboard); + await botClient.SendMessage(message.Chat.Id, "❌ Неверный пароль!", replyMarkup: keyboard); + } + return; } - return; - } - if (message.Text == "/start") - { - var keyboard = new InlineKeyboardMarkup(new[] + if (message.Text == "/start") { + var keyboard = new InlineKeyboardMarkup(new[] + { new[] { InlineKeyboardButton.WithCallbackData("Подать заявку", "report"), @@ -277,38 +334,39 @@ class Program } }); - await botClient.SendMessage( - chatId: message.Chat.Id, - text: "Привет! Я бот для сбора заявок на ремонт оборудования.", - replyMarkup: keyboard - ); - Log.Information($"Ответ на команду /start с кнопками отправлен."); - } - else if (usersWaitingForReport.TryGetValue(message.Chat.Id, out bool isWaiting) && isWaiting) - { - string problemDescription = message.Text; - await SaveReportToDatabase(message.Chat.Id, problemDescription); - - // Создаем клавиатуру с кнопкой возврата - var keyboard = new InlineKeyboardMarkup(new[] + await botClient.SendMessage( + chatId: message.Chat.Id, + text: "Привет! Я бот для сбора заявок на ремонт оборудования.", + replyMarkup: keyboard + ); + Log.Information($"Ответ на команду /start с кнопками отправлен."); + } + else if (usersWaitingForReport.TryGetValue(message.Chat.Id, out bool isWaiting) && isWaiting) { + string problemDescription = message.Text; + await SaveReportToDatabase(message.Chat.Id, problemDescription); + + // Создаем клавиатуру с кнопкой возврата + var keyboard = new InlineKeyboardMarkup(new[] + { new[] { InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu") } }); - await botClient.SendMessage( - chatId: message.Chat.Id, - text: "✅ Спасибо за заявку! Мы обработаем её в ближайшее время.", - replyMarkup: keyboard); + await botClient.SendMessage( + chatId: message.Chat.Id, + text: "✅ Спасибо за заявку! Мы обработаем её в ближайшее время.", + replyMarkup: keyboard); - usersWaitingForReport[message.Chat.Id] = false; - Log.Information($"Заявка пользователя {message.Chat.Id} сохранена в базе данных."); - } - else - { - await botClient.SendMessage(chatId: message.Chat.Id, text: "ℹ️ Используйте команду /start для начала работы с ботом."); + usersWaitingForReport[message.Chat.Id] = false; + Log.Information($"Заявка пользователя {message.Chat.Id} сохранена в базе данных."); + } + else + { + await botClient.SendMessage(chatId: message.Chat.Id, text: "ℹ️ Используйте команду /start для начала работы с ботом."); + } } } } @@ -352,11 +410,6 @@ class Program } } - - - - - private static async Task SendMainMenu(ITelegramBotClient botClient, long chatId) { var keyboard = new InlineKeyboardMarkup(new[] @@ -421,19 +474,18 @@ class Program buttons.Add(new[] { - InlineKeyboardButton.WithCallbackData( - $"#{id} - {status} - {description}...", - $"report_{id}") - }); + InlineKeyboardButton.WithCallbackData( + $"#{id} - {status} - {description}...", + $"report_{id}") + }); } } // Добавляем кнопки навигации buttons.Add(new[] { - InlineKeyboardButton.WithCallbackData("Назад", "admin_panel"), - InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu") - }); + InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu") + }); await botClient.SendMessage( chatId: chatId, @@ -520,25 +572,25 @@ class Program var statusButtons = new InlineKeyboardMarkup(new[] { - new[] - { - InlineKeyboardButton.WithCallbackData("🟡 Ожидает", $"status_{reportId}_ожидает"), - InlineKeyboardButton.WithCallbackData("🔵 В работе", $"status_{reportId}_в работе") - }, - new[] - { - InlineKeyboardButton.WithCallbackData("🟢 Закрыта", $"status_{reportId}_закрыта") - }, - new[] - { - InlineKeyboardButton.WithCallbackData("❌ Удалить заявку", $"delete_{reportId}") - }, - new[] - { - InlineKeyboardButton.WithCallbackData("Назад", "back_to_list"), - InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu") - } - }); + new[] + { + InlineKeyboardButton.WithCallbackData("🟡 Ожидает", $"status_{reportId}_ожидает"), + InlineKeyboardButton.WithCallbackData("🔵 В работе", $"status_{reportId}_в работе") + }, + new[] + { + InlineKeyboardButton.WithCallbackData("🟢 Закрыта", $"status_{reportId}_закрыта") + }, + new[] + { + InlineKeyboardButton.WithCallbackData("❌ Удалить заявку", $"delete_{reportId}") + }, + new[] + { + InlineKeyboardButton.WithCallbackData("Назад", "back_to_list"), + InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu") + } + }); string newText = $"Заявка #{reportId}\n\nОписание: {description}\nСтатус: {status}";