From 9d1e9c141e9726c7c852ca1706e4f883156fbbcc Mon Sep 17 00:00:00 2001 From: 107 <107@DESKTOP-UP8U7M2> Date: Thu, 20 Mar 2025 11:02:41 +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=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82?= =?UTF-8?q?=D0=B5=D0=BB=D1=8F=20=D0=B8=20=D1=83=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=83=D0=B2=D0=B5=D0=B4=D0=BE?= =?UTF-8?q?=D0=BC=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit В код добавлены новые методы для работы с настройками пользователя, включая создание таблицы `UserSettings`, отображение настроек и изменение состояния уведомлений. Метод `CreateUserSettingsTableIfNotExists` создает таблицу, если она не существует, и обрабатывает возможные ошибки при создании. Метод `ShowUserSettings` загружает текущие настройки пользователя из базы данных и отправляет сообщение с возможностью изменения состояния уведомлений. В обработке обновлений добавлена логика для обработки нажатий на кнопки, связанных с настройками пользователя и переключением уведомлений. Метод `NotifyUserAboutStatusChange` теперь проверяет, включены ли уведомления для пользователя, перед отправкой сообщения о смене статуса заявки. Метод `ToggleNotifications` изменяет состояние уведомлений для пользователя и обновляет соответствующую запись в базе данных, а также отображает обновленные настройки. В меню добавлена кнопка для перехода к настройкам пользователя. --- Program.cs | 151 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) diff --git a/Program.cs b/Program.cs index 8acf70b..b3e8cfb 100644 --- a/Program.cs +++ b/Program.cs @@ -64,6 +64,7 @@ class Program // Создание базы данных и таблицы, если они не существуют await CreateDatabaseIfNotExists(); + await CreateUserSettingsTableIfNotExists(); // Загрузка списка администраторов из базы данных await LoadAdminsFromDatabase(); @@ -105,7 +106,88 @@ class Program } } + private static async Task CreateUserSettingsTableIfNotExists() + { + try + { + using (var connection = new SqliteConnection("Data Source=bot.db")) + { + await connection.OpenAsync(); + var command = connection.CreateCommand(); + command.CommandText = @" + CREATE TABLE IF NOT EXISTS UserSettings ( + UserId INTEGER PRIMARY KEY, + NotificationsEnabled INTEGER NOT NULL DEFAULT 1 + );"; + await command.ExecuteNonQueryAsync(); + Log.Information("Таблица UserSettings успешно создана (если её не было)."); + } + } + catch (Exception ex) + { + Log.Error($"Ошибка при создании таблицы UserSettings: {ex.Message}"); + } + } + private static async Task ShowUserSettings(ITelegramBotClient botClient, long chatId) + { + try + { + // Получаем текущие настройки пользователя + bool notificationsEnabled = true; // По умолчанию уведомления включены + + using (var connection = new SqliteConnection("Data Source=bot.db")) + { + await connection.OpenAsync(); + var command = connection.CreateCommand(); + command.CommandText = "SELECT NotificationsEnabled FROM UserSettings WHERE UserId = @userId"; + command.Parameters.AddWithValue("@userId", chatId); + + var result = await command.ExecuteScalarAsync(); + if (result != null && result != DBNull.Value) + { + notificationsEnabled = Convert.ToInt32(result) == 1; + } + else + { + // Если запись для пользователя отсутствует, создаем ее + var insertCommand = connection.CreateCommand(); + insertCommand.CommandText = "INSERT INTO UserSettings (UserId, NotificationsEnabled) VALUES (@userId, 1)"; + insertCommand.Parameters.AddWithValue("@userId", chatId); + await insertCommand.ExecuteNonQueryAsync(); + } + } + + // Создаем клавиатуру с настройками + string notificationStatus = notificationsEnabled ? "✅ Включены" : "❌ Отключены"; + string toggleAction = notificationsEnabled ? "toggle_off" : "toggle_on"; + + var keyboard = new InlineKeyboardMarkup(new[] + { + new[] + { + InlineKeyboardButton.WithCallbackData($"Уведомления: {notificationStatus}", $"notifications_{toggleAction}") + }, + new[] + { + InlineKeyboardButton.WithCallbackData("🔙 Назад в меню", "main_menu") + } + }); + + await botClient.SendMessage( + chatId: chatId, + text: "⚙️ Настройки пользователя\n\n" + + "Здесь вы можете настроить параметры бота:", + parseMode: ParseMode.Html, + replyMarkup: keyboard + ); + } + catch (Exception ex) + { + Log.Error($"Ошибка при отображении настроек пользователя: {ex.Message}"); + await botClient.SendMessage(chatId, "Произошла ошибка при загрузке настроек."); + } + } private static async Task HandleUpdateAsync(ITelegramBotClient botClient, Update update, CancellationToken cancellationToken) { try @@ -380,6 +462,15 @@ class Program { await SendMainMenu(botClient, chatId); } + else if (data == "user_settings") + { + await ShowUserSettings(botClient, chatId); + } + else if (data != null && data.StartsWith("notifications_toggle_")) + { + string action = data.Substring(18); // "on" или "off" + await ToggleNotifications(botClient, chatId, action); + } else if (data != null && data.StartsWith("priority_")) { string priority = data.Substring(9); @@ -591,6 +682,30 @@ class Program { try { + // Проверяем настройки пользователя + bool notificationsEnabled = true; // По умолчанию уведомления включены + + using (var connection = new SqliteConnection("Data Source=bot.db")) + { + await connection.OpenAsync(); + var command = connection.CreateCommand(); + command.CommandText = "SELECT NotificationsEnabled FROM UserSettings WHERE UserId = @userId"; + command.Parameters.AddWithValue("@userId", chatId); + + var result = await command.ExecuteScalarAsync(); + if (result != null && result != DBNull.Value) + { + notificationsEnabled = Convert.ToInt32(result) == 1; + } + } + + // Если уведомления отключены, не отправляем сообщение + if (!notificationsEnabled) + { + Log.Information($"Уведомление о смене статуса заявки #{reportId} не отправлено пользователю {chatId} (уведомления отключены)"); + return; + } + string statusEmoji = GetStatusEmoji(newStatus); await _botClient.SendMessage( chatId: chatId, @@ -605,7 +720,39 @@ class Program } } + private static async Task ToggleNotifications(ITelegramBotClient botClient, long chatId, string action) + { + try + { + bool newValue = action == "toggle_on"; + int dbValue = newValue ? 1 : 0; + using (var connection = new SqliteConnection("Data Source=bot.db")) + { + await connection.OpenAsync(); + var command = connection.CreateCommand(); + command.CommandText = @" + INSERT INTO UserSettings (UserId, NotificationsEnabled) + VALUES (@userId, @value) + ON CONFLICT(UserId) + DO UPDATE SET NotificationsEnabled = @value"; + command.Parameters.AddWithValue("@userId", chatId); + command.Parameters.AddWithValue("@value", dbValue); + await command.ExecuteNonQueryAsync(); + } + + // Показываем обновленные настройки + await ShowUserSettings(botClient, chatId); + + string statusText = newValue ? "включены" : "отключены"; + Log.Information($"Пользователь {chatId} {statusText} уведомления о статусе заявок"); + } + catch (Exception ex) + { + Log.Error($"Ошибка при изменении настроек уведомлений: {ex.Message}"); + await botClient.SendMessage(chatId, "Произошла ошибка при обновлении настроек."); + } + } private static async Task SendMainMenu(ITelegramBotClient botClient, long chatId) @@ -615,6 +762,10 @@ class Program new[] { InlineKeyboardButton.WithCallbackData("📝 Подать заявку", "report"), + }, + new[] + { + InlineKeyboardButton.WithCallbackData("⚙️ Настройки", "user_settings"), InlineKeyboardButton.WithCallbackData("🔐 Панель администратора", "admin_panel") } });