diff --git a/Program.cs b/Program.cs index fbb4bdf..d1308da 100644 --- a/Program.cs +++ b/Program.cs @@ -158,19 +158,6 @@ class Program 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).Replace("_", "")); @@ -251,153 +238,153 @@ class Program return; } - else if (data == "admin_panel") - { - if (admins.Contains(chatId)) + else if (data == "admin_panel") { - await SendAdminPanel(botClient, chatId); + if (admins.Contains(chatId)) + { + await SendAdminPanel(botClient, chatId); + } + else + { + var authMessage = await botClient.SendMessage(chatId, "⛔ Вы не являетесь администратором!"); + Log.Information($"Неавторизованный доступ к админ-панели от {chatId}"); + await Task.Delay(2000); + await botClient.DeleteMessage(chatId, authMessage.MessageId); + await SendMainMenu(botClient, chatId); + } } - else + else if (data == "view_reports") { - var authMessage = await botClient.SendMessage(chatId, "⛔ Вы не являетесь администратором!"); - Log.Information($"Неавторизованный доступ к админ-панели от {chatId}"); - await Task.Delay(2000); - await botClient.DeleteMessage(chatId, authMessage.MessageId); - await SendMainMenu(botClient, chatId); + if (admins.Contains(chatId)) + { + await ViewReports(botClient, chatId); + } + else + { + var authMessage = await botClient.SendMessage(chatId, "⛔ Вы не являетесь администратором!"); + Log.Information($"Неавторизованный доступ к заявкам от {chatId}"); + await Task.Delay(2000); + await botClient.DeleteMessage(chatId, authMessage.MessageId); + await SendMainMenu(botClient, chatId); + } } - } - else if (data == "view_reports") - { - if (admins.Contains(chatId)) + else if (data == "view_archived_reports") + { + if (admins.Contains(chatId)) + { + await ViewArchivedReports(botClient, chatId); + } + else + { + var authMessage = await botClient.SendMessage(chatId, "⛔ Вы не являетесь администратором!"); + Log.Information($"Неавторизованный доступ к архиву заявок от {chatId}"); + await Task.Delay(2000); + await botClient.DeleteMessage(chatId, authMessage.MessageId); + await SendMainMenu(botClient, chatId); + } + } + else if (data != null && data.StartsWith("report_")) + { + long reportId = long.Parse(data.Substring(7)); + if (callbackQuery?.Message?.MessageId != null) + { + int messageId = callbackQuery.Message.MessageId; + await ShowReportDetails(botClient, chatId, reportId, messageId); + } + } + else if (data != null && data.StartsWith("status_")) + { + string[] parts = data.Split('_'); + long reportId = long.Parse(parts[1]); + string newStatus = parts[2]; + if (callbackQuery?.Message?.MessageId != null) + { + int messageId = callbackQuery.Message.MessageId; + await UpdateReportStatus(reportId, newStatus, chatId); + await ShowReportDetails(botClient, chatId, reportId, messageId); + } + } + else if (data != null && data.StartsWith("delete_")) + { + long reportId = long.Parse(data.Substring(7)); + await DeleteReport(botClient, chatId, reportId); + } + else if (data == "back_to_list") { await ViewReports(botClient, chatId); } - else + else if (data == "back_to_admin_panel") + { + await SendAdminPanel(botClient, chatId); + } + else if (data == "main_menu") { - var authMessage = await botClient.SendMessage(chatId, "⛔ Вы не являетесь администратором!"); - Log.Information($"Неавторизованный доступ к заявкам от {chatId}"); - await Task.Delay(2000); - await botClient.DeleteMessage(chatId, authMessage.MessageId); await SendMainMenu(botClient, chatId); } - } - else if (data == "view_archived_reports") - { - if (admins.Contains(chatId)) + else if (data != null && data.StartsWith("priority_")) { - await ViewArchivedReports(botClient, chatId); + string priority = data.Substring(9); + userReports[chatId].Priority = priority; + userReportSteps[chatId] = 2; + await botClient.SendMessage(chatId, "Пожалуйста, укажите кабинет."); + } + } + } + + // Обработка текстовых сообщений + 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(chatId, "⛔ Вы не являетесь администратором!"); - Log.Information($"Неавторизованный доступ к архиву заявок от {chatId}"); + var authMessage = await botClient.SendMessage(message.Chat.Id, "❌ Неверный пароль!"); await Task.Delay(2000); - await botClient.DeleteMessage(chatId, authMessage.MessageId); - await SendMainMenu(botClient, chatId); + await botClient.DeleteMessage(message.Chat.Id, authMessage.MessageId); + await SendMainMenu(botClient, message.Chat.Id); } + return; } - else if (data != null && data.StartsWith("report_")) + + // В блоке для обработки текстовых сообщений + else if (message.Text == "/admins") { - long reportId = long.Parse(data.Substring(7)); - if (callbackQuery?.Message?.MessageId != null) + if (admins.Contains(message.Chat.Id)) { - int messageId = callbackQuery.Message.MessageId; - await ShowReportDetails(botClient, chatId, reportId, messageId); + await ShowAdminsList(botClient, message.Chat.Id); } - } - else if (data != null && data.StartsWith("status_")) - { - string[] parts = data.Split('_'); - long reportId = long.Parse(parts[1]); - string newStatus = parts[2]; - if (callbackQuery?.Message?.MessageId != null) + else { - int messageId = callbackQuery.Message.MessageId; - await UpdateReportStatus(reportId, newStatus, chatId); - await ShowReportDetails(botClient, chatId, reportId, messageId); + var authMessage = await botClient.SendMessage( + chatId: message.Chat.Id, + text: "⛔ У вас нет прав для просмотра списка администраторов!" + ); + await Task.Delay(2000); + await botClient.DeleteMessage(message.Chat.Id, authMessage.MessageId); + await SendMainMenu(botClient, message.Chat.Id); } } - else if (data != null && data.StartsWith("delete_")) - { - long reportId = long.Parse(data.Substring(7)); - await DeleteReport(botClient, chatId, reportId); - } - else if (data == "back_to_list") - { - await ViewReports(botClient, chatId); - } - else if (data == "back_to_admin_panel") - { - await SendAdminPanel(botClient, chatId); - } - else if (data == "main_menu") - { - await SendMainMenu(botClient, chatId); - } - else if (data != null && data.StartsWith("priority_")) - { - string priority = data.Substring(9); - userReports[chatId].Priority = priority; - userReportSteps[chatId] = 2; - await botClient.SendMessage(chatId, "Пожалуйста, укажите кабинет."); - } - } - } - // Обработка текстовых сообщений - 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 - { - var authMessage = await botClient.SendMessage( - chatId: message.Chat.Id, - text: "⛔ У вас нет прав для просмотра списка администраторов!" - ); - await Task.Delay(2000); - await botClient.DeleteMessage(message.Chat.Id, authMessage.MessageId); - await SendMainMenu(botClient, message.Chat.Id); - } - } - - if (message.Text == "/start") - { - var keyboard = new InlineKeyboardMarkup(new[] + if (message.Text == "/start") { + var keyboard = new InlineKeyboardMarkup(new[] + { new[] { InlineKeyboardButton.WithCallbackData("Подать заявку", "report"), @@ -405,55 +392,56 @@ class Program } }); - await botClient.SendMessage( - chatId: message.Chat.Id, - text: "Привет! Я бот для сбора заявок на ремонт оборудования.", - replyMarkup: keyboard - ); - Log.Information($"Ответ на команду /start с кнопками отправлен."); - } - else if (usersWaitingForReport.TryGetValue(message.Chat.Id, out bool isWaiting) && isWaiting) - { - if (userReportSteps.TryGetValue(message.Chat.Id, out int step)) + await botClient.SendMessage( + chatId: message.Chat.Id, + text: "Привет! Я бот для сбора заявок на ремонт оборудования.", + replyMarkup: keyboard + ); + Log.Information($"Ответ на команду /start с кнопками отправлен."); + } + else if (usersWaitingForReport.TryGetValue(message.Chat.Id, out bool isWaiting) && isWaiting) { - switch (step) + if (userReportSteps.TryGetValue(message.Chat.Id, out int step)) { - case 2: - userReports[message.Chat.Id].Room = message.Text; - userReportSteps[message.Chat.Id] = 3; - await botClient.SendMessage(message.Chat.Id, "Пожалуйста, опишите проблему."); - break; - case 3: - userReports[message.Chat.Id].Description = message.Text; - userReportSteps[message.Chat.Id] = 4; - await botClient.SendMessage(message.Chat.Id, "Пожалуйста, укажите ваше ФИО."); - break; - case 4: - userReports[message.Chat.Id].ReporterName = message.Text; - await SaveReportToDatabase(message.Chat.Id, userReports[message.Chat.Id]); - var mainMenuKeyboard = new InlineKeyboardMarkup(new[] - { + switch (step) + { + case 2: + userReports[message.Chat.Id].Room = message.Text; + userReportSteps[message.Chat.Id] = 3; + await botClient.SendMessage(message.Chat.Id, "Пожалуйста, опишите проблему."); + break; + case 3: + userReports[message.Chat.Id].Description = message.Text; + userReportSteps[message.Chat.Id] = 4; + await botClient.SendMessage(message.Chat.Id, "Пожалуйста, укажите ваше ФИО."); + break; + case 4: + userReports[message.Chat.Id].ReporterName = message.Text; + await SaveReportToDatabase(message.Chat.Id, userReports[message.Chat.Id]); + var mainMenuKeyboard = new InlineKeyboardMarkup(new[] + { new[] { InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu") } }); - await botClient.SendMessage( - message.Chat.Id, - "✅ Спасибо за заявку! Мы обработаем её в ближайшее время.", - replyMarkup: mainMenuKeyboard - ); - usersWaitingForReport[message.Chat.Id] = false; - userReportSteps.Remove(message.Chat.Id); - userReports.Remove(message.Chat.Id); - Log.Information($"Заявка пользователя {message.Chat.Id} сохранена в базе данных."); - break; + await botClient.SendMessage( + message.Chat.Id, + "✅ Спасибо за заявку! Мы обработаем её в ближайшее время.", + replyMarkup: mainMenuKeyboard + ); + usersWaitingForReport[message.Chat.Id] = false; + userReportSteps.Remove(message.Chat.Id); + userReports.Remove(message.Chat.Id); + Log.Information($"Заявка пользователя {message.Chat.Id} сохранена в базе данных."); + break; + } } } - } - else - { - await botClient.SendMessage(message.Chat.Id, "ℹ️ Используйте команду /start для начала работы с ботом."); + else + { + await botClient.SendMessage(message.Chat.Id, "ℹ️ Используйте команду /start для начала работы с ботом."); + } } } } @@ -866,20 +854,73 @@ class Program return; } - var keyboard = new InlineKeyboardMarkup(new[] + // Получаем список всех администраторов из базы данных + var adminsList = new List<(long chatId, string username)>(); + + using (var connection = new SqliteConnection("Data Source=bot.db")) { - new[] { - InlineKeyboardButton.WithCallbackData("👥 Список администраторов", "view_admins") - }, - new[] { - InlineKeyboardButton.WithCallbackData("🔙 Назад к панели администратора", "admin_panel"), - InlineKeyboardButton.WithCallbackData("🏠 Главное меню", "main_menu") + 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_panel"), + InlineKeyboardButton.WithCallbackData("🏠 Главное меню", "main_menu") }); + var keyboard = new InlineKeyboardMarkup(buttons); + await botClient.SendMessage( chatId: chatId, - text: "⚙️ Управление администраторами", + text: messageText.ToString(), parseMode: ParseMode.Html, replyMarkup: keyboard ); @@ -887,6 +928,10 @@ class Program catch (Exception ex) { Log.Error($"Ошибка при отображении настроек администраторов: {ex.Message}"); + await botClient.SendMessage( + chatId: chatId, + text: "❌ Произошла ошибка при отображении настроек администраторов." + ); } }