From 621f8c25c8d8350d3dd80c364ac59f1079a65204 Mon Sep 17 00:00:00 2001 From: 107 <107@DESKTOP-UP8U7M2> Date: Fri, 21 Mar 2025 09:33:08 +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=D1=8B=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20?= =?UTF-8?q?=D1=81=20=D0=BE=D1=82=D1=87=D0=B5=D1=82=D0=B0=D0=BC=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавлен метод `ViewUserReports` для извлечения и отображения отчетов пользователя. Обновлена логика удаления отчетов с проверкой принадлежности. Изменено отображение списка заявок после удаления. Добавлен метод `NotifyUserAboutStatusChange` для уведомления пользователей об изменениях статуса. Обновлен интерфейс главного меню с новыми кнопками и добавлен метод `SendAdminPanel` для панели администратора. --- Program.cs | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 95 insertions(+), 3 deletions(-) diff --git a/Program.cs b/Program.cs index bac4256..390292a 100644 --- a/Program.cs +++ b/Program.cs @@ -193,6 +193,62 @@ class Program } } + private static async Task ViewUserReports(ITelegramBotClient botClient, long chatId) + { + string connectionString = "Data Source=bot.db"; + + try + { + using (var connection = new SqliteConnection(connectionString)) + { + await connection.OpenAsync(); + var command = connection.CreateCommand(); + command.CommandText = "SELECT Id, Description, Status, Priority FROM Reports WHERE ChatId = @chatId"; + command.Parameters.AddWithValue("@chatId", chatId); + + var buttons = new List(); + + using (var reader = await command.ExecuteReaderAsync()) + { + while (await reader.ReadAsync()) + { + long id = reader.GetInt64(0); + string description = reader.GetString(1).Substring(0, Math.Min(20, reader.GetString(1).Length)); + string status = reader.GetString(2); + string priority = reader.GetString(3); + string statusEmoji = GetStatusEmoji(status); + string priorityMarker = priority.ToLower() == "высокий" ? "⚠️ " : ""; + + buttons.Add(new[] + { + InlineKeyboardButton.WithCallbackData( + $"{priorityMarker}#{id} - {statusEmoji} {status} - {description}...", + $"user_report_{id}") + }); + } + } + + // Добавляем кнопки навигации + buttons.Add(new[] + { + InlineKeyboardButton.WithCallbackData("🏠 Главное меню", "main_menu") + }); + + await botClient.SendMessage( + chatId: chatId, + text: "Ваши заявки:", + replyMarkup: new InlineKeyboardMarkup(buttons) + ); + } + } + catch (Exception ex) + { + Log.Error($"Ошибка: {ex.Message}"); + await botClient.SendMessage(chatId, "Ошибка при получении ваших заявок"); + } + } + + private static async Task ShowUserSettings(ITelegramBotClient botClient, long chatId) { try @@ -387,6 +443,20 @@ class Program await ToggleAdminNotifications(adminId, false); await ShowAdminSettings(botClient, chatId); } + else if (data == "user_reports") + { + await ViewUserReports(botClient, chatId); + } + else if (data != null && data.StartsWith("user_report_")) + { + long reportId = long.Parse(data.Substring("user_report_".Length)); + await ShowReportDetails(botClient, chatId, reportId, callbackQuery.Message.MessageId); + } + else if (data != null && data.StartsWith("delete_")) + { + long reportId = long.Parse(data.Substring(7)); + await DeleteReport(botClient, chatId, reportId); + } // Также добавим обработку команды /removeadmin в секцию обработки текстовых сообщений: // В блоке для обработки текстовых сообщений (после if (message.Text.StartsWith("/admin"))) @@ -726,8 +796,24 @@ class Program { await connection.OpenAsync(); var command = connection.CreateCommand(); - command.CommandText = "DELETE FROM Reports WHERE Id = @id"; + command.CommandText = "SELECT ChatId FROM Reports WHERE Id = @id"; command.Parameters.AddWithValue("@id", reportId); + + var ownerChatId = (long?)await command.ExecuteScalarAsync(); + + if (ownerChatId == null) + { + await botClient.SendMessage(chatId, $"Заявка #{reportId} не найдена."); + return; + } + + if (ownerChatId != chatId && !admins.Contains(chatId)) + { + await botClient.SendMessage(chatId, "⛔ Вы не можете удалить эту заявку, так как она не принадлежит вам."); + return; + } + + command.CommandText = "DELETE FROM Reports WHERE Id = @id"; await command.ExecuteNonQueryAsync(); var deletionMessage = await botClient.SendMessage(chatId, $"Заявка #{reportId} успешно удалена."); @@ -739,8 +825,8 @@ class Program // Удаляем сообщение об удалении await botClient.DeleteMessage(chatId, deletionMessage.MessageId); - // Отображаем список заявок - await ViewReports(botClient, chatId); + // Отображаем список заявок пользователя + await ViewUserReports(botClient, chatId); } } catch (Exception ex) @@ -751,6 +837,7 @@ class Program } + private static async Task NotifyUserAboutStatusChange(long chatId, long reportId, string newStatus) { try @@ -879,6 +966,10 @@ class Program InlineKeyboardButton.WithCallbackData("⚙️ Настройки", "user_settings") }, new[] + { + InlineKeyboardButton.WithCallbackData("📋 Мои заявки", "user_reports") + }, + new[] { InlineKeyboardButton.WithCallbackData("🔐 Панель администратора", "admin_panel") } @@ -891,6 +982,7 @@ class Program ); } + private static async Task SendAdminPanel(ITelegramBotClient botClient, long chatId) { var keyboard = new InlineKeyboardMarkup(new[]