настройка включения или отключения уведомлений о просрочке заявки

This commit is contained in:
107 2025-03-20 12:06:45 +07:00
parent 4957c697ff
commit de22b30321

View File

@ -93,7 +93,7 @@ class Program
private static async Task MonitorReportStatus(long reportId, CancellationToken token) private static async Task MonitorReportStatus(long reportId, CancellationToken token)
{ {
// Ждем 15 секунд перед первой проверкой // Ждем 15 секунд перед первой проверкой
await Task.Delay(TimeSpan.FromHours(1), token); await Task.Delay(15000, token);
while (!token.IsCancellationRequested) while (!token.IsCancellationRequested)
{ {
@ -132,7 +132,7 @@ class Program
} }
// Ждем 15 секунд перед следующей проверкой // Ждем 15 секунд перед следующей проверкой
await Task.Delay(TimeSpan.FromHours(1), token); await Task.Delay(15000, token);
} }
} }
@ -355,7 +355,18 @@ class Program
await SendMainMenu(botClient, chatId); await SendMainMenu(botClient, chatId);
} }
} }
else if (data != null && data.StartsWith("enable_notifications_"))
{
long adminId = long.Parse(data.Substring("enable_notifications_".Length));
await ToggleAdminNotifications(adminId, true);
await ShowAdminSettings(botClient, chatId);
}
else if (data != null && data.StartsWith("disable_notifications_"))
{
long adminId = long.Parse(data.Substring("disable_notifications_".Length));
await ToggleAdminNotifications(adminId, false);
await ShowAdminSettings(botClient, chatId);
}
// Также добавим обработку команды /removeadmin в секцию обработки текстовых сообщений: // Также добавим обработку команды /removeadmin в секцию обработки текстовых сообщений:
// В блоке для обработки текстовых сообщений (после if (message.Text.StartsWith("/admin"))) // В блоке для обработки текстовых сообщений (после if (message.Text.StartsWith("/admin")))
@ -1266,34 +1277,23 @@ class Program
} }
// Получаем список всех администраторов из базы данных // Получаем список всех администраторов из базы данных
var adminsList = new List<(long chatId, string username)>(); var adminsList = new List<(long chatId, string username, bool notifyOnPendingReports)>();
using (var connection = new SqliteConnection("Data Source=bot.db")) using (var connection = new SqliteConnection("Data Source=bot.db"))
{ {
await connection.OpenAsync(); await connection.OpenAsync();
var command = connection.CreateCommand(); var command = connection.CreateCommand();
command.CommandText = "SELECT ChatId FROM Admins"; command.CommandText = "SELECT ChatId, FullName, NotifyOnPendingReports FROM Admins";
using (var reader = await command.ExecuteReaderAsync()) using (var reader = await command.ExecuteReaderAsync())
{ {
while (await reader.ReadAsync()) while (await reader.ReadAsync())
{ {
long adminId = reader.GetInt64(0); long adminId = reader.GetInt64(0);
string username = "Неизвестно"; string username = reader.GetString(1);
bool notifyOnPendingReports = reader.GetInt32(2) == 1;
// Пытаемся получить имя пользователя adminsList.Add((adminId, username, notifyOnPendingReports));
try
{
var user = await botClient.GetChat(adminId);
username = user.Username ?? user.FirstName ?? "Неизвестно";
}
catch
{
// Если возникает ошибка при получении информации о пользователе,
// просто используем "Неизвестно"
}
adminsList.Add((adminId, username));
} }
} }
} }
@ -1312,13 +1312,16 @@ class Program
var messageText = new System.Text.StringBuilder(); var messageText = new System.Text.StringBuilder();
messageText.AppendLine("📋 <b>Список администраторов:</b>\n"); messageText.AppendLine("📋 <b>Список администраторов:</b>\n");
for (int i = 0; i < adminsList.Count; i++) foreach (var (adminId, username, notifyOnPendingReports) in adminsList)
{ {
var (adminId, username) = adminsList[i]; string notificationStatus = notifyOnPendingReports ? "✅ Включены" : "❌ Отключены";
messageText.AppendLine($"{i + 1}. {username} (ID: {adminId})"); string toggleAction = notifyOnPendingReports ? "disable_notifications" : "enable_notifications";
messageText.AppendLine($"{username} (ID: {adminId}) - Уведомления: {notificationStatus}");
buttons.Add(new[] { buttons.Add(new[] {
InlineKeyboardButton.WithCallbackData($"❌ Удалить {username}", $"removeadmin_{adminId}") InlineKeyboardButton.WithCallbackData($"❌ Удалить {username}", $"removeadmin_{adminId}"),
InlineKeyboardButton.WithCallbackData($"Уведомления: {notificationStatus}", $"{toggleAction}_{adminId}")
}); });
} }
@ -1344,6 +1347,29 @@ class Program
private static async Task ToggleAdminNotifications(long adminId, bool enable)
{
try
{
using (var connection = new SqliteConnection("Data Source=bot.db"))
{
await connection.OpenAsync();
var command = connection.CreateCommand();
command.CommandText = "UPDATE Admins SET NotifyOnPendingReports = @notify WHERE ChatId = @chatId";
command.Parameters.AddWithValue("@notify", enable ? 1 : 0);
command.Parameters.AddWithValue("@chatId", adminId);
await command.ExecuteNonQueryAsync();
Log.Information($"Уведомления для администратора {adminId} {(enable ? "включены" : "отключены")}");
}
}
catch (Exception ex)
{
Log.Error($"Ошибка при переключении уведомлений для администратора {adminId}: {ex.Message}");
}
}
private static async Task NotifyAdminsAboutWorkAssignment(long reportId, long changerId) private static async Task NotifyAdminsAboutWorkAssignment(long reportId, long changerId)
{ {
try try
@ -1636,32 +1662,33 @@ class Program
CREATE TABLE IF NOT EXISTS Admins ( CREATE TABLE IF NOT EXISTS Admins (
Id INTEGER PRIMARY KEY AUTOINCREMENT, Id INTEGER PRIMARY KEY AUTOINCREMENT,
ChatId INTEGER NOT NULL UNIQUE, ChatId INTEGER NOT NULL UNIQUE,
FullName TEXT NOT NULL FullName TEXT NOT NULL,
NotifyOnPendingReports INTEGER NOT NULL DEFAULT 1
);"; );";
await command.ExecuteNonQueryAsync(); await command.ExecuteNonQueryAsync();
Log.Information("Таблица Admins успешно создана (если её не было)."); Log.Information("Таблица Admins успешно создана (если её не было).");
// Проверяем наличие столбца FullName // Проверяем наличие столбца NotifyOnPendingReports
command.CommandText = "PRAGMA table_info(Admins);"; command.CommandText = "PRAGMA table_info(Admins);";
var tableInfo = await command.ExecuteReaderAsync(); var tableInfo = await command.ExecuteReaderAsync();
bool fullNameColumnExists = false; bool notifyColumnExists = false;
while (await tableInfo.ReadAsync()) while (await tableInfo.ReadAsync())
{ {
if (tableInfo["name"].ToString() == "FullName") if (tableInfo["name"].ToString() == "NotifyOnPendingReports")
{ {
fullNameColumnExists = true; notifyColumnExists = true;
break; break;
} }
} }
await tableInfo.CloseAsync(); // Закрываем DataReader перед изменением CommandText await tableInfo.CloseAsync(); // Закрываем DataReader перед изменением CommandText
if (!fullNameColumnExists) if (!notifyColumnExists)
{ {
command.CommandText = "ALTER TABLE Admins ADD COLUMN FullName TEXT NOT NULL DEFAULT '';"; command.CommandText = "ALTER TABLE Admins ADD COLUMN NotifyOnPendingReports INTEGER NOT NULL DEFAULT 1;";
await command.ExecuteNonQueryAsync(); await command.ExecuteNonQueryAsync();
Log.Information("Столбец FullName добавлен в таблицу Admins."); Log.Information("Столбец NotifyOnPendingReports добавлен в таблицу Admins.");
} }
} }
} }
@ -1674,6 +1701,7 @@ class Program
// Метод для сохранения администратора в базу данных // Метод для сохранения администратора в базу данных
private static async Task SaveAdminToDatabase(long chatId, string fullName) private static async Task SaveAdminToDatabase(long chatId, string fullName)
{ {