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;
}
// Если статус не изменился, прерываем выполнение