Добавлены настройки пользователя и управление уведомлениями
В код добавлены новые методы для работы с настройками пользователя, включая создание таблицы `UserSettings`, отображение настроек и изменение состояния уведомлений. Метод `CreateUserSettingsTableIfNotExists` создает таблицу, если она не существует, и обрабатывает возможные ошибки при создании. Метод `ShowUserSettings` загружает текущие настройки пользователя из базы данных и отправляет сообщение с возможностью изменения состояния уведомлений. В обработке обновлений добавлена логика для обработки нажатий на кнопки, связанных с настройками пользователя и переключением уведомлений. Метод `NotifyUserAboutStatusChange` теперь проверяет, включены ли уведомления для пользователя, перед отправкой сообщения о смене статуса заявки. Метод `ToggleNotifications` изменяет состояние уведомлений для пользователя и обновляет соответствующую запись в базе данных, а также отображает обновленные настройки. В меню добавлена кнопка для перехода к настройкам пользователя.
This commit is contained in:
parent
24da3f01df
commit
9d1e9c141e
151
Program.cs
151
Program.cs
@ -64,6 +64,7 @@ class Program
|
|||||||
|
|
||||||
// Создание базы данных и таблицы, если они не существуют
|
// Создание базы данных и таблицы, если они не существуют
|
||||||
await CreateDatabaseIfNotExists();
|
await CreateDatabaseIfNotExists();
|
||||||
|
await CreateUserSettingsTableIfNotExists();
|
||||||
|
|
||||||
// Загрузка списка администраторов из базы данных
|
// Загрузка списка администраторов из базы данных
|
||||||
await LoadAdminsFromDatabase();
|
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: "⚙️ <b>Настройки пользователя</b>\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)
|
private static async Task HandleUpdateAsync(ITelegramBotClient botClient, Update update, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@ -380,6 +462,15 @@ class Program
|
|||||||
{
|
{
|
||||||
await SendMainMenu(botClient, chatId);
|
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_"))
|
else if (data != null && data.StartsWith("priority_"))
|
||||||
{
|
{
|
||||||
string priority = data.Substring(9);
|
string priority = data.Substring(9);
|
||||||
@ -591,6 +682,30 @@ class Program
|
|||||||
{
|
{
|
||||||
try
|
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);
|
string statusEmoji = GetStatusEmoji(newStatus);
|
||||||
await _botClient.SendMessage(
|
await _botClient.SendMessage(
|
||||||
chatId: chatId,
|
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)
|
private static async Task SendMainMenu(ITelegramBotClient botClient, long chatId)
|
||||||
@ -615,6 +762,10 @@ class Program
|
|||||||
new[]
|
new[]
|
||||||
{
|
{
|
||||||
InlineKeyboardButton.WithCallbackData("📝 Подать заявку", "report"),
|
InlineKeyboardButton.WithCallbackData("📝 Подать заявку", "report"),
|
||||||
|
},
|
||||||
|
new[]
|
||||||
|
{
|
||||||
|
InlineKeyboardButton.WithCallbackData("⚙️ Настройки", "user_settings"),
|
||||||
InlineKeyboardButton.WithCallbackData("🔐 Панель администратора", "admin_panel")
|
InlineKeyboardButton.WithCallbackData("🔐 Панель администратора", "admin_panel")
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user