Добавлено управление администраторами и улучшена обработка

В классе `Program` в файле `Program.cs` реализованы новые функции для управления администраторами, включая просмотр и удаление администраторов из базы данных. Улучшена обработка команд и сообщений для администраторов, добавлены сообщения об ошибках для пользователей без прав доступа. Обновлены визуальные элементы интерфейса для лучшего восприятия. Также добавлена обработка статуса при изменении данных в базе.
This commit is contained in:
Mef 2025-03-19 20:37:51 +07:00
parent f0cc0a74cc
commit 152c1a3649

View File

@ -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: "🔐 <b>Панель администраторов:</b>",
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<InlineKeyboardButton[]>();
var messageText = new System.Text.StringBuilder();
messageText.AppendLine("📋 <b>Список администраторов:</b>\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: "⚙️ <b>Управление администраторами</b>",
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;
}
// Если статус не изменился, прерываем выполнение