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

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
@ -1633,35 +1659,36 @@ class Program
await connection.OpenAsync(); await connection.OpenAsync();
var command = connection.CreateCommand(); var command = connection.CreateCommand();
command.CommandText = @" command.CommandText = @"
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)
{ {