Улучшение обработки сообщений в классе Program
Внесены значительные изменения в код класса `Program` в файле `Program.cs`. Удалены класс `ReportData` и перечисление `ReportStep`. Добавлены новые методы для обработки обновлений от Telegram: `DeletePreviousMessage`, `HandleUpdateAsync` и `SendMainMenu`. Улучшена логика обработки сообщений с новыми проверками для администраторов и возможностью просмотра отчетов. Добавлены новые сообщения для пользователей для улучшения взаимодействия и информирования о статусе заявок.
This commit is contained in:
parent
87b9df5fd1
commit
52dd321f1d
367
Program.cs
367
Program.cs
@ -86,22 +86,7 @@ class Program
|
|||||||
// Ожидаем отмены через token
|
// Ожидаем отмены через token
|
||||||
cts.Token.WaitHandle.WaitOne();
|
cts.Token.WaitHandle.WaitOne();
|
||||||
}
|
}
|
||||||
private class ReportData
|
|
||||||
{
|
|
||||||
public ReportStep Step { get; set; }
|
|
||||||
public string Priority { get; set; } = string.Empty;
|
|
||||||
public string Room { get; set; } = string.Empty;
|
|
||||||
public string Description { get; set; } = string.Empty;
|
|
||||||
public string FullName { get; set; } = string.Empty;
|
|
||||||
}
|
|
||||||
private enum ReportStep
|
|
||||||
{
|
|
||||||
Priority,
|
|
||||||
Room,
|
|
||||||
Description,
|
|
||||||
FullName,
|
|
||||||
Completed
|
|
||||||
}
|
|
||||||
private static async Task DeletePreviousMessage(ITelegramBotClient botClient, long chatId, int messageId)
|
private static async Task DeletePreviousMessage(ITelegramBotClient botClient, long chatId, int messageId)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@ -114,7 +99,7 @@ class Program
|
|||||||
Log.Error($"Ошибка при удалении сообщения {messageId} в чате {chatId}: {ex.Message}");
|
Log.Error($"Ошибка при удалении сообщения {messageId} в чате {chatId}: {ex.Message}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private static Dictionary<long, ReportData> reportCreation = new Dictionary<long, ReportData>();
|
|
||||||
|
|
||||||
private static async Task HandleUpdateAsync(ITelegramBotClient botClient, Update update, CancellationToken cancellationToken)
|
private static async Task HandleUpdateAsync(ITelegramBotClient botClient, Update update, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
@ -141,192 +126,150 @@ class Program
|
|||||||
|
|
||||||
if (data == "report")
|
if (data == "report")
|
||||||
{
|
{
|
||||||
// Начинаем процесс создания заявки с запроса приоритета
|
usersWaitingForReport[chatId] = true;
|
||||||
reportCreation[chatId] = new ReportData { Step = ReportStep.Priority };
|
await botClient.SendMessage(chatId, "Пожалуйста, отправьте описание проблемы.");
|
||||||
|
Log.Information($"Пользователь {chatId} начал создание заявки");
|
||||||
var priorityKeyboard = new InlineKeyboardMarkup(new[]
|
|
||||||
{
|
|
||||||
new[] {
|
|
||||||
InlineKeyboardButton.WithCallbackData("Низкий", "priority_low")
|
|
||||||
},
|
|
||||||
new[] {
|
|
||||||
InlineKeyboardButton.WithCallbackData("Средний", "priority_medium")
|
|
||||||
},
|
|
||||||
new[] {
|
|
||||||
InlineKeyboardButton.WithCallbackData("Высокий", "priority_high")
|
|
||||||
},
|
|
||||||
new[] {
|
|
||||||
InlineKeyboardButton.WithCallbackData("Отмена", "cancel_report")
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
await botClient.SendMessage(chatId, "Выберите приоритет заявки:", replyMarkup: priorityKeyboard);
|
|
||||||
Log.Information($"Пользователь {chatId} начал создание заявки - выбор приоритета");
|
|
||||||
}
|
}
|
||||||
else if (data != null && data.StartsWith("priority_"))
|
else if (data == "admin_panel")
|
||||||
{
|
{
|
||||||
// Обрабатываем выбор приоритета
|
if (admins.Contains(chatId))
|
||||||
if (reportCreation.TryGetValue(chatId, out var reportData))
|
|
||||||
{
|
{
|
||||||
string priority = data.Substring(9) switch
|
await SendAdminPanel(botClient, chatId);
|
||||||
{
|
|
||||||
"low" => "Низкий",
|
|
||||||
"medium" => "Средний",
|
|
||||||
"high" => "Высокий",
|
|
||||||
_ => "Не указан"
|
|
||||||
};
|
|
||||||
|
|
||||||
reportData.Priority = priority;
|
|
||||||
reportData.Step = ReportStep.Room;
|
|
||||||
|
|
||||||
var cancelKeyboard = new InlineKeyboardMarkup(new[]
|
|
||||||
{
|
|
||||||
new[] { InlineKeyboardButton.WithCallbackData("Отмена", "cancel_report") }
|
|
||||||
});
|
|
||||||
|
|
||||||
await botClient.SendMessage(chatId, "Введите номер кабинета:", replyMarkup: cancelKeyboard);
|
|
||||||
Log.Information($"Пользователь {chatId} выбрал приоритет {priority}");
|
|
||||||
}
|
|
||||||
else if (data == "admin_panel")
|
|
||||||
{
|
|
||||||
if (admins.Contains(chatId))
|
|
||||||
{
|
|
||||||
await SendAdminPanel(botClient, chatId);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var keyboard = new InlineKeyboardMarkup(new[]
|
|
||||||
{
|
|
||||||
new[]
|
|
||||||
{
|
|
||||||
InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu")
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
await botClient.SendMessage(chatId, "⛔ Вы не являетесь администратором!", replyMarkup: keyboard);
|
|
||||||
Log.Information($"Неавторизованный доступ к админ-панели от {chatId}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (data == "view_reports")
|
|
||||||
{
|
|
||||||
if (admins.Contains(chatId))
|
|
||||||
{
|
|
||||||
await ViewReports(botClient, chatId);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var keyboard = new InlineKeyboardMarkup(new[]
|
|
||||||
{
|
|
||||||
new[]
|
|
||||||
{
|
|
||||||
InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu")
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
await botClient.SendMessage(chatId, "⛔ Вы не являетесь администратором!", replyMarkup: keyboard);
|
|
||||||
Log.Information($"Неавторизованный доступ к заявкам от {chatId}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (data == "view_archived_reports")
|
|
||||||
{
|
|
||||||
if (admins.Contains(chatId))
|
|
||||||
{
|
|
||||||
await ViewArchivedReports(botClient, chatId);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var keyboard = new InlineKeyboardMarkup(new[]
|
|
||||||
{
|
|
||||||
new[]
|
|
||||||
{
|
|
||||||
InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu")
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
await botClient.SendMessage(chatId, "⛔ Вы не являетесь администратором!", replyMarkup: keyboard);
|
|
||||||
Log.Information($"Неавторизованный доступ к архиву заявок от {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);
|
|
||||||
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 if (data == "main_menu")
|
|
||||||
{
|
|
||||||
await SendMainMenu(botClient, chatId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Обработка текстовых сообщений
|
|
||||||
if (update.Type == UpdateType.Message && update.Message?.Text != null)
|
|
||||||
{
|
|
||||||
var message = update.Message;
|
|
||||||
Log.Information($"Получено сообщение от {message.Chat.Id}: {message.Text}");
|
|
||||||
|
|
||||||
// Обработка команды /admin для авторизации
|
|
||||||
if (message.Text.StartsWith("/admin"))
|
|
||||||
{
|
|
||||||
string[] parts = message.Text.Split(' ');
|
|
||||||
if (parts.Length == 2 && parts[1] == adminPassword)
|
|
||||||
{
|
|
||||||
admins.Add(message.Chat.Id);
|
|
||||||
var keyboard = new InlineKeyboardMarkup(new[]
|
|
||||||
{
|
|
||||||
new[]
|
|
||||||
{
|
|
||||||
InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu")
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
await botClient.SendMessage(message.Chat.Id, "✅ Вы авторизованы как администратор!", replyMarkup: keyboard);
|
|
||||||
Log.Information($"Новый администратор: {message.Chat.Id}");
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var keyboard = new InlineKeyboardMarkup(new[]
|
var keyboard = new InlineKeyboardMarkup(new[]
|
||||||
{
|
{
|
||||||
|
new[]
|
||||||
|
{
|
||||||
|
InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu")
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
await botClient.SendMessage(chatId, "⛔ Вы не являетесь администратором!", replyMarkup: keyboard);
|
||||||
|
Log.Information($"Неавторизованный доступ к админ-панели от {chatId}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (data == "view_reports")
|
||||||
|
{
|
||||||
|
if (admins.Contains(chatId))
|
||||||
|
{
|
||||||
|
await ViewReports(botClient, chatId);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var keyboard = new InlineKeyboardMarkup(new[]
|
||||||
|
{
|
||||||
|
new[]
|
||||||
|
{
|
||||||
|
InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu")
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
await botClient.SendMessage(chatId, "⛔ Вы не являетесь администратором!", replyMarkup: keyboard);
|
||||||
|
Log.Information($"Неавторизованный доступ к заявкам от {chatId}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (data == "view_archived_reports")
|
||||||
|
{
|
||||||
|
if (admins.Contains(chatId))
|
||||||
|
{
|
||||||
|
await ViewArchivedReports(botClient, chatId);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var keyboard = new InlineKeyboardMarkup(new[]
|
||||||
|
{
|
||||||
|
new[]
|
||||||
|
{
|
||||||
|
InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu")
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
await botClient.SendMessage(chatId, "⛔ Вы не являетесь администратором!", replyMarkup: keyboard);
|
||||||
|
Log.Information($"Неавторизованный доступ к архиву заявок от {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);
|
||||||
|
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 if (data == "main_menu")
|
||||||
|
{
|
||||||
|
await SendMainMenu(botClient, chatId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Обработка текстовых сообщений
|
||||||
|
if (update.Type == UpdateType.Message && update.Message?.Text != null)
|
||||||
|
{
|
||||||
|
var message = update.Message;
|
||||||
|
Log.Information($"Получено сообщение от {message.Chat.Id}: {message.Text}");
|
||||||
|
|
||||||
|
// Обработка команды /admin для авторизации
|
||||||
|
if (message.Text.StartsWith("/admin"))
|
||||||
|
{
|
||||||
|
string[] parts = message.Text.Split(' ');
|
||||||
|
if (parts.Length == 2 && parts[1] == adminPassword)
|
||||||
|
{
|
||||||
|
admins.Add(message.Chat.Id);
|
||||||
|
var keyboard = new InlineKeyboardMarkup(new[]
|
||||||
|
{
|
||||||
new[]
|
new[]
|
||||||
{
|
{
|
||||||
InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu")
|
InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu")
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
await botClient.SendMessage(message.Chat.Id, "❌ Неверный пароль!", replyMarkup: keyboard);
|
await botClient.SendMessage(message.Chat.Id, "✅ Вы авторизованы как администратор!", replyMarkup: keyboard);
|
||||||
}
|
Log.Information($"Новый администратор: {message.Chat.Id}");
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
if (message.Text == "/start")
|
|
||||||
{
|
{
|
||||||
var keyboard = new InlineKeyboardMarkup(new[]
|
var keyboard = new InlineKeyboardMarkup(new[]
|
||||||
{
|
{
|
||||||
|
new[]
|
||||||
|
{
|
||||||
|
InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu")
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
await botClient.SendMessage(message.Chat.Id, "❌ Неверный пароль!", replyMarkup: keyboard);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (message.Text == "/start")
|
||||||
|
{
|
||||||
|
var keyboard = new InlineKeyboardMarkup(new[]
|
||||||
|
{
|
||||||
new[]
|
new[]
|
||||||
{
|
{
|
||||||
InlineKeyboardButton.WithCallbackData("Подать заявку", "report"),
|
InlineKeyboardButton.WithCallbackData("Подать заявку", "report"),
|
||||||
@ -334,39 +277,38 @@ class Program
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
await botClient.SendMessage(
|
await botClient.SendMessage(
|
||||||
chatId: message.Chat.Id,
|
chatId: message.Chat.Id,
|
||||||
text: "Привет! Я бот для сбора заявок на ремонт оборудования.",
|
text: "Привет! Я бот для сбора заявок на ремонт оборудования.",
|
||||||
replyMarkup: keyboard
|
replyMarkup: keyboard
|
||||||
);
|
);
|
||||||
Log.Information($"Ответ на команду /start с кнопками отправлен.");
|
Log.Information($"Ответ на команду /start с кнопками отправлен.");
|
||||||
}
|
}
|
||||||
else if (usersWaitingForReport.TryGetValue(message.Chat.Id, out bool isWaiting) && isWaiting)
|
else if (usersWaitingForReport.TryGetValue(message.Chat.Id, out bool isWaiting) && isWaiting)
|
||||||
{
|
{
|
||||||
string problemDescription = message.Text;
|
string problemDescription = message.Text;
|
||||||
await SaveReportToDatabase(message.Chat.Id, problemDescription);
|
await SaveReportToDatabase(message.Chat.Id, problemDescription);
|
||||||
|
|
||||||
// Создаем клавиатуру с кнопкой возврата
|
// Создаем клавиатуру с кнопкой возврата
|
||||||
var keyboard = new InlineKeyboardMarkup(new[]
|
var keyboard = new InlineKeyboardMarkup(new[]
|
||||||
{
|
{
|
||||||
new[]
|
new[]
|
||||||
{
|
{
|
||||||
InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu")
|
InlineKeyboardButton.WithCallbackData("Главное меню", "main_menu")
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
await botClient.SendMessage(
|
await botClient.SendMessage(
|
||||||
chatId: message.Chat.Id,
|
chatId: message.Chat.Id,
|
||||||
text: "✅ Спасибо за заявку! Мы обработаем её в ближайшее время.",
|
text: "✅ Спасибо за заявку! Мы обработаем её в ближайшее время.",
|
||||||
replyMarkup: keyboard);
|
replyMarkup: keyboard);
|
||||||
|
|
||||||
usersWaitingForReport[message.Chat.Id] = false;
|
usersWaitingForReport[message.Chat.Id] = false;
|
||||||
Log.Information($"Заявка пользователя {message.Chat.Id} сохранена в базе данных.");
|
Log.Information($"Заявка пользователя {message.Chat.Id} сохранена в базе данных.");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
await botClient.SendMessage(chatId: message.Chat.Id, text: "ℹ️ Используйте команду /start для начала работы с ботом.");
|
await botClient.SendMessage(chatId: message.Chat.Id, text: "ℹ️ Используйте команду /start для начала работы с ботом.");
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -410,6 +352,11 @@ class Program
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private static async Task SendMainMenu(ITelegramBotClient botClient, long chatId)
|
private static async Task SendMainMenu(ITelegramBotClient botClient, long chatId)
|
||||||
{
|
{
|
||||||
var keyboard = new InlineKeyboardMarkup(new[]
|
var keyboard = new InlineKeyboardMarkup(new[]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user