Улучшение управления администраторами и отчетами

Внесены изменения в класс `Program` для улучшения управления администраторами:
- Добавлено поле `adminFullNames` для хранения полных имен администраторов.
- Изменена логика авторизации: теперь требуется указание полного имени.
- Обновлена база данных для хранения полных имен в таблице `Admins`.
- Изменены SQL-запросы для работы с новым полем `FullName`.
- Обновлены сообщения пользователям с информацией о полном имени администратора.
- Добавлен метод `SaveReportToDatabase` для сохранения отчетов.
- Обновлена логика изменения статуса отчетов с сохранением ID администратора.
This commit is contained in:
107 2025-03-20 09:50:04 +07:00
parent f0ad5fd74f
commit 62ba8b5877

View File

@ -18,6 +18,7 @@ class Program
private static Dictionary<long, bool> usersWaitingForReport = new Dictionary<long, bool>(); // Отслеживаем состояние пользователей private static Dictionary<long, bool> usersWaitingForReport = new Dictionary<long, bool>(); // Отслеживаем состояние пользователей
private static HashSet<long> admins = new HashSet<long>(); // Хранение списка администраторов private static HashSet<long> admins = new HashSet<long>(); // Хранение списка администраторов
private static string adminPassword = "admin123"; // Простой пароль для администратора private static string adminPassword = "admin123"; // Простой пароль для администратора
private static Dictionary<long, string> adminFullNames = new Dictionary<long, string>();
static async Task Main() static async Task Main()
{ {
@ -233,7 +234,7 @@ class Program
{ {
admins.Add(message.Chat.Id); admins.Add(message.Chat.Id);
// Сохраняем администратора в базу данных // Сохраняем администратора в базу данных
await SaveAdminToDatabase(message.Chat.Id); await SaveAdminToDatabase(message.Chat.Id, ""); // Добавляем пустую строку для fullName
var authMessage = await botClient.SendMessage(message.Chat.Id, "✅ Вы авторизованы как администратор!"); var authMessage = await botClient.SendMessage(message.Chat.Id, "✅ Вы авторизованы как администратор!");
Log.Information($"Новый администратор: {message.Chat.Id}"); Log.Information($"Новый администратор: {message.Chat.Id}");
@ -241,6 +242,7 @@ class Program
await botClient.DeleteMessage(message.Chat.Id, authMessage.MessageId); await botClient.DeleteMessage(message.Chat.Id, authMessage.MessageId);
await SendMainMenu(botClient, message.Chat.Id); await SendMainMenu(botClient, message.Chat.Id);
} }
else else
{ {
var authMessage = await botClient.SendMessage(message.Chat.Id, "❌ Неверный пароль!"); var authMessage = await botClient.SendMessage(message.Chat.Id, "❌ Неверный пароль!");
@ -397,21 +399,23 @@ class Program
if (message.Text.StartsWith("/admin")) if (message.Text.StartsWith("/admin"))
{ {
string[] parts = message.Text.Split(' '); string[] parts = message.Text.Split(' ');
if (parts.Length == 2 && parts[1] == adminPassword) if (parts.Length == 3 && parts[1] == adminPassword)
{ {
string fullName = parts[2];
admins.Add(message.Chat.Id); admins.Add(message.Chat.Id);
adminFullNames[message.Chat.Id] = fullName;
// Сохраняем администратора в базу данных // Сохраняем администратора в базу данных
await SaveAdminToDatabase(message.Chat.Id); await SaveAdminToDatabase(message.Chat.Id, fullName);
var authMessage = await botClient.SendMessage(message.Chat.Id, "✅ Вы авторизованы как администратор!"); var authMessage = await botClient.SendMessage(message.Chat.Id, "✅ Вы авторизованы как администратор!");
Log.Information($"Новый администратор: {message.Chat.Id}"); Log.Information($"Новый администратор: {message.Chat.Id}, ФИО: {fullName}");
await Task.Delay(2000); await Task.Delay(2000);
await botClient.DeleteMessage(message.Chat.Id, authMessage.MessageId); await botClient.DeleteMessage(message.Chat.Id, authMessage.MessageId);
await SendMainMenu(botClient, message.Chat.Id); await SendMainMenu(botClient, message.Chat.Id);
} }
else else
{ {
var authMessage = await botClient.SendMessage(message.Chat.Id, "❌ Неверный пароль!"); var authMessage = await botClient.SendMessage(message.Chat.Id, "❌ Неверный пароль или ФИО!");
await Task.Delay(2000); await Task.Delay(2000);
await botClient.DeleteMessage(message.Chat.Id, authMessage.MessageId); await botClient.DeleteMessage(message.Chat.Id, authMessage.MessageId);
await SendMainMenu(botClient, message.Chat.Id); await SendMainMenu(botClient, message.Chat.Id);
@ -419,6 +423,7 @@ class Program
return; return;
} }
// В блоке для обработки текстовых сообщений // В блоке для обработки текстовых сообщений
else if (message.Text == "/admins") else if (message.Text == "/admins")
{ {
@ -777,7 +782,7 @@ class Program
{ {
await connection.OpenAsync(); await connection.OpenAsync();
var command = connection.CreateCommand(); var command = connection.CreateCommand();
command.CommandText = "SELECT Priority, Room, Description, ReporterName, Status, DateCreated FROM Reports WHERE Id = @id"; command.CommandText = "SELECT Priority, Room, Description, ReporterName, Status, DateCreated, AdminId FROM Reports WHERE Id = @id";
command.Parameters.AddWithValue("@id", reportId); command.Parameters.AddWithValue("@id", reportId);
using (var reader = await command.ExecuteReaderAsync()) using (var reader = await command.ExecuteReaderAsync())
@ -790,6 +795,8 @@ class Program
string reporterName = reader.GetString(3); string reporterName = reader.GetString(3);
string status = reader.GetString(4); string status = reader.GetString(4);
string dateCreated = reader.GetDateTime(5).ToString("yyyy-MM-dd HH:mm:ss"); string dateCreated = reader.GetDateTime(5).ToString("yyyy-MM-dd HH:mm:ss");
long adminId = reader.GetInt64(6);
string adminFullName = adminFullNames.ContainsKey(adminId) ? adminFullNames[adminId] : "Неизвестно";
string priorityEmoji = GetPriorityEmoji(priority); string priorityEmoji = GetPriorityEmoji(priority);
string statusEmoji = GetStatusEmoji(status); string statusEmoji = GetStatusEmoji(status);
@ -822,7 +829,8 @@ class Program
$"Описание: {description}\n" + $"Описание: {description}\n" +
$"ФИО: {reporterName}\n" + $"ФИО: {reporterName}\n" +
$"Статус: {statusEmoji} {status}\n" + $"Статус: {statusEmoji} {status}\n" +
$"Дата создания: {dateCreated}"; $"Дата создания: {dateCreated}\n" +
$"Администратор: {adminFullName}";
await botClient.SendMessage( await botClient.SendMessage(
chatId: chatId, chatId: chatId,
@ -1072,6 +1080,7 @@ class Program
string description = ""; string description = "";
string priority = ""; string priority = "";
string room = ""; string room = "";
string changerFullName = adminFullNames[changerId];
using (var connection = new SqliteConnection("Data Source=bot.db")) using (var connection = new SqliteConnection("Data Source=bot.db"))
{ {
@ -1107,7 +1116,7 @@ class Program
await _botClient.SendMessage( await _botClient.SendMessage(
chatId: adminId, chatId: adminId,
text: $"{priorityEmoji} <b>Заявка #{reportId} взята в работу</b>\n\n" + text: $"{priorityEmoji} <b>Заявка #{reportId} взята в работу администратором {changerFullName}</b>\n\n" +
$"<b>Приоритет:</b> {priority}\n" + $"<b>Приоритет:</b> {priority}\n" +
$"<b>Кабинет:</b> {room}\n" + $"<b>Кабинет:</b> {room}\n" +
$"<b>Фрагмент описания:</b> {description.Substring(0, Math.Min(50, description.Length))}...", $"<b>Фрагмент описания:</b> {description.Substring(0, Math.Min(50, description.Length))}...",
@ -1152,13 +1161,14 @@ class Program
// Если статус не изменился, прерываем выполнение // Если статус не изменился, прерываем выполнение
if (oldStatus == newStatus) return; if (oldStatus == newStatus) return;
// Обновляем статус // Обновляем статус и сохраняем ID администратора
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 = "UPDATE Reports SET Status = @status WHERE Id = @id"; command.CommandText = "UPDATE Reports SET Status = @status, AdminId = @adminId WHERE Id = @id";
command.Parameters.AddWithValue("@status", newStatus); command.Parameters.AddWithValue("@status", newStatus);
command.Parameters.AddWithValue("@adminId", changerId);
command.Parameters.AddWithValue("@id", reportId); command.Parameters.AddWithValue("@id", reportId);
await command.ExecuteNonQueryAsync(); await command.ExecuteNonQueryAsync();
@ -1183,6 +1193,7 @@ class Program
private static async Task SaveReportToDatabase(long chatId, Report report) private static async Task SaveReportToDatabase(long chatId, Report report)
{ {
string connectionString = "Data Source=bot.db"; // Используем SQLite string connectionString = "Data Source=bot.db"; // Используем SQLite
@ -1340,10 +1351,11 @@ 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
);";
await command.ExecuteNonQueryAsync(); await command.ExecuteNonQueryAsync();
Log.Information("Таблица Admins успешно создана (если её не было)."); Log.Information("Таблица Admins успешно создана (если её не было).");
} }
@ -1354,8 +1366,9 @@ class Program
} }
} }
// Метод для сохранения администратора в базу данных // Метод для сохранения администратора в базу данных
private static async Task SaveAdminToDatabase(long chatId) private static async Task SaveAdminToDatabase(long chatId, string fullName)
{ {
try try
{ {
@ -1373,8 +1386,9 @@ class Program
{ {
// Добавляем нового админа // Добавляем нового админа
var insertCommand = connection.CreateCommand(); var insertCommand = connection.CreateCommand();
insertCommand.CommandText = "INSERT INTO Admins (ChatId) VALUES (@chatId)"; insertCommand.CommandText = "INSERT INTO Admins (ChatId, FullName) VALUES (@chatId, @fullName)";
insertCommand.Parameters.AddWithValue("@chatId", chatId); insertCommand.Parameters.AddWithValue("@chatId", chatId);
insertCommand.Parameters.AddWithValue("@fullName", fullName);
await insertCommand.ExecuteNonQueryAsync(); await insertCommand.ExecuteNonQueryAsync();
Log.Information($"Администратор {chatId} добавлен в базу данных"); Log.Information($"Администратор {chatId} добавлен в базу данных");
} }
@ -1395,15 +1409,17 @@ class Program
{ {
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 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 fullName = reader.GetString(1);
admins.Add(adminId); admins.Add(adminId);
Log.Information($"Загружен администратор с ID: {adminId}"); adminFullNames[adminId] = fullName;
Log.Information($"Загружен администратор с ID: {adminId}, ФИО: {fullName}");
} }
} }
} }