diff --git a/Program.cs b/Program.cs index 60e6ada..a17c9d3 100644 --- a/Program.cs +++ b/Program.cs @@ -145,7 +145,127 @@ class Program await botClient.SendMessage(chatId, "Пожалуйста, выберите приоритет:", replyMarkup: priorityKeyboard); Log.Information($"Пользователь {chatId} начал создание заявки"); } - else if (data == "admin_panel") + else if (data == "admin_settings") + { + if (admins.Contains(chatId)) + { + await ShowAdminSettings(botClient, chatId); + } + else + { + await botClient.SendMessage(chatId, "⛔ У вас нет прав для доступа к настройкам администраторов!"); + await Task.Delay(2000); + await SendMainMenu(botClient, chatId); + } + } + else if (data == "view_admins") + { + if (admins.Contains(chatId)) + { + await ShowAdminsList(botClient, chatId); + } + else + { + await botClient.SendMessage(chatId, "⛔ У вас нет прав для просмотра администраторов!"); + await Task.Delay(2000); + await SendMainMenu(botClient, chatId); + } + } + else if (data != null && data.StartsWith("removeadmin_")) + { + long adminIdToRemove = long.Parse(data.Substring(11)); + + // Проверяем, что пользователь является администратором + if (admins.Contains(chatId)) + { + // Проверяем, не пытается ли пользователь удалить себя + if (adminIdToRemove == chatId) + { + await botClient.SendMessage( + chatId: chatId, + text: "⚠️ Вы не можете удалить себя из администраторов!" + ); + } + else + { + await RemoveAdminFromDatabase(adminIdToRemove); + + string username = "администратор"; + try + { + var user = await botClient.GetChat(adminIdToRemove); + username = user.Username ?? user.FirstName ?? "администратор"; + } + catch { } + + await botClient.SendMessage( + chatId: chatId, + text: $"✅ Пользователь {username} (ID: {adminIdToRemove}) удален из администраторов." + ); + + await Task.Delay(2000); + await ShowAdminsList(botClient, chatId); + } + } + else + { + await botClient.SendMessage(chatId, "⛔ У вас нет прав для удаления администраторов!"); + await Task.Delay(2000); + await SendMainMenu(botClient, chatId); + } + } + + // Также добавим обработку команды /removeadmin в секцию обработки текстовых сообщений: + + // В блоке для обработки текстовых сообщений (после if (message.Text.StartsWith("/admin"))) + else if (update.Type == UpdateType.Message && update.Message?.Text != null) + { + var message = update.Message; + Log.Information($"Получено сообщение от {message.Chat.Id}: {message.Text}"); + + if (message.Text.StartsWith("/admin")) + { + string[] parts = message.Text.Split(' '); + if (parts.Length == 2 && parts[1] == adminPassword) + { + admins.Add(message.Chat.Id); + // Сохраняем администратора в базу данных + await SaveAdminToDatabase(message.Chat.Id); + + var authMessage = await botClient.SendMessage(message.Chat.Id, "✅ Вы авторизованы как администратор!"); + Log.Information($"Новый администратор: {message.Chat.Id}"); + await Task.Delay(2000); + await botClient.DeleteMessage(message.Chat.Id, authMessage.MessageId); + await SendMainMenu(botClient, message.Chat.Id); + } + else + { + var authMessage = await botClient.SendMessage(message.Chat.Id, "❌ Неверный пароль!"); + await Task.Delay(2000); + await botClient.DeleteMessage(message.Chat.Id, authMessage.MessageId); + await SendMainMenu(botClient, message.Chat.Id); + } + return; + } + + // В блоке для обработки текстовых сообщений + else if (message.Text == "/admins") + { + if (admins.Contains(message.Chat.Id)) + { + await ShowAdminsList(botClient, message.Chat.Id); + } + else + { + await botClient.SendMessage( + chatId: message.Chat.Id, + text: "⛔ У вас нет прав для просмотра списка администраторов!" + ); + } + } + } + + else if (data == "admin_panel") { if (admins.Contains(chatId)) { @@ -269,6 +389,22 @@ class Program return; } + // В блоке для обработки текстовых сообщений + else if (message.Text == "/admins") + { + if (admins.Contains(message.Chat.Id)) + { + await ShowAdminsList(botClient, message.Chat.Id); + } + else + { + await botClient.SendMessage( + chatId: message.Chat.Id, + text: "⛔ У вас нет прав для просмотра списка администраторов!" + ); + } + } + if (message.Text == "/start") { var keyboard = new InlineKeyboardMarkup(new[] @@ -400,20 +536,25 @@ class Program { var keyboard = new InlineKeyboardMarkup(new[] { - new[] - { - InlineKeyboardButton.WithCallbackData("Менеджер заявок", "view_reports"), - InlineKeyboardButton.WithCallbackData("Архив заявок", "view_archived_reports") - }, - new[] - { - InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu") - } - }); + new[] + { + InlineKeyboardButton.WithCallbackData("📋 Менеджер заявок", "view_reports"), + InlineKeyboardButton.WithCallbackData("🗃️ Архив заявок", "view_archived_reports") + }, + new[] + { + InlineKeyboardButton.WithCallbackData("⚙️ Управление администраторами", "admin_settings") + }, + new[] + { + InlineKeyboardButton.WithCallbackData("🏠 Главное меню", "main_menu") + } + }); await botClient.SendMessage( chatId: chatId, - text: "Панель администраторов:", + text: "🔐 Панель администраторов:", + parseMode: ParseMode.Html, replyMarkup: keyboard ); } @@ -592,6 +733,173 @@ class Program } + // Метод для удаления администратора из базы данных + private static async Task RemoveAdminFromDatabase(long chatId) + { + try + { + using (var connection = new SqliteConnection("Data Source=bot.db")) + { + await connection.OpenAsync(); + + var command = connection.CreateCommand(); + command.CommandText = "DELETE FROM Admins WHERE ChatId = @chatId"; + command.Parameters.AddWithValue("@chatId", chatId); + + int rowsAffected = await command.ExecuteNonQueryAsync(); + + if (rowsAffected > 0) + { + admins.Remove(chatId); + Log.Information($"Администратор {chatId} удален из базы данных"); + } + else + { + Log.Information($"Администратор {chatId} не найден в базе данных"); + } + } + } + catch (Exception ex) + { + Log.Error($"Ошибка при удалении администратора из базы данных: {ex.Message}"); + } + } + + // Метод для отображения списка администраторов + private static async Task ShowAdminsList(ITelegramBotClient botClient, long chatId) + { + try + { + // Проверяем, что запрашивающий пользователь - администратор + if (!admins.Contains(chatId)) + { + await botClient.SendMessage( + chatId: chatId, + text: "⛔ У вас нет прав для просмотра списка администраторов." + ); + return; + } + + // Получаем список всех администраторов из базы данных + var adminsList = new List<(long chatId, string username)>(); + + using (var connection = new SqliteConnection("Data Source=bot.db")) + { + await connection.OpenAsync(); + var command = connection.CreateCommand(); + command.CommandText = "SELECT ChatId FROM Admins"; + + using (var reader = await command.ExecuteReaderAsync()) + { + while (await reader.ReadAsync()) + { + long adminId = reader.GetInt64(0); + string username = "Неизвестно"; + + // Пытаемся получить имя пользователя + try + { + var user = await botClient.GetChat(adminId); + username = user.Username ?? user.FirstName ?? "Неизвестно"; + } + catch + { + // Если возникает ошибка при получении информации о пользователе, + // просто используем "Неизвестно" + } + + adminsList.Add((adminId, username)); + } + } + } + + // Формируем сообщение + if (adminsList.Count == 0) + { + await botClient.SendMessage( + chatId: chatId, + text: "⚠️ В системе нет зарегистрированных администраторов." + ); + return; + } + + var buttons = new List(); + var messageText = new System.Text.StringBuilder(); + messageText.AppendLine("📋 Список администраторов:\n"); + + for (int i = 0; i < adminsList.Count; i++) + { + var (adminId, username) = adminsList[i]; + messageText.AppendLine($"{i + 1}. {username} (ID: {adminId})"); + + buttons.Add(new[] { + InlineKeyboardButton.WithCallbackData($"❌ Удалить {username}", $"removeadmin_{adminId}") + }); + } + + buttons.Add(new[] { + InlineKeyboardButton.WithCallbackData("🔙 Назад", "admin_settings") + }); + + var keyboard = new InlineKeyboardMarkup(buttons); + + await botClient.SendMessage( + chatId: chatId, + text: messageText.ToString(), + parseMode: ParseMode.Html, + replyMarkup: keyboard + ); + } + catch (Exception ex) + { + Log.Error($"Ошибка при отображении списка администраторов: {ex.Message}"); + await botClient.SendMessage( + chatId: chatId, + text: "❌ Произошла ошибка при отображении списка администраторов." + ); + } + } + + // Добавим метод для отображения раздела настроек администраторов + private static async Task ShowAdminSettings(ITelegramBotClient botClient, long chatId) + { + try + { + // Проверяем, что запрашивающий пользователь - администратор + if (!admins.Contains(chatId)) + { + await botClient.SendMessage( + chatId: chatId, + text: "⛔ У вас нет прав для доступа к настройкам администраторов." + ); + await Task.Delay(2000); + await SendMainMenu(botClient, chatId); + return; + } + + var keyboard = new InlineKeyboardMarkup(new[] + { + new[] { + InlineKeyboardButton.WithCallbackData("👥 Список администраторов", "view_admins") + }, + new[] { + InlineKeyboardButton.WithCallbackData("🔙 Назад к панели администратора", "admin_panel"), + InlineKeyboardButton.WithCallbackData("🏠 Главное меню", "main_menu") + } + }); + + await botClient.SendMessage( + chatId: chatId, + text: "⚙️ Управление администраторами", + parseMode: ParseMode.Html, + replyMarkup: keyboard + ); + } + catch (Exception ex) + { + Log.Error($"Ошибка при отображении настроек администраторов: {ex.Message}"); + } + } @@ -610,7 +918,7 @@ class Program var getStatusCommand = connection.CreateCommand(); getStatusCommand.CommandText = "SELECT Status FROM Reports WHERE Id = @id"; getStatusCommand.Parameters.AddWithValue("@id", reportId); - oldStatus = (string)await getStatusCommand.ExecuteScalarAsync(); + oldStatus = (await getStatusCommand.ExecuteScalarAsync())?.ToString() ?? string.Empty; } // Если статус не изменился, прерываем выполнение