2025-03-12 17:52:00 +07:00
using System ;
2025-03-17 14:53:01 +07:00
using System.Collections.Generic ;
2025-03-12 17:52:00 +07:00
using System.IO ;
using System.Threading ;
using System.Threading.Tasks ;
using Microsoft.Extensions.Configuration ;
using Microsoft.Data.Sqlite ;
using Serilog ;
using Telegram.Bot ;
using Telegram.Bot.Types ;
using Telegram.Bot.Types.Enums ;
class Program
{
private static string _botToken = string . Empty ;
private static TelegramBotClient _botClient = null ! ;
2025-03-17 14:53:01 +07:00
private static Dictionary < long , bool > usersWaitingForReport = new Dictionary < long , bool > ( ) ; // Отслеживаем состояние пользователей
2025-03-12 17:52:00 +07:00
static async Task Main ( )
{
// Загружаем конфигурацию из appsettings.json
2025-03-12 22:41:14 +07:00
try
{
Log . Information ( "Загрузка конфигурации из appsettings.json..." ) ;
var config = new ConfigurationBuilder ( )
. SetBasePath ( AppContext . BaseDirectory ) // <-- Используем правильный путь
. AddJsonFile ( "appsettings.json" , optional : false , reloadOnChange : true )
. Build ( ) ;
2025-03-12 17:52:00 +07:00
2025-03-12 22:41:14 +07:00
_botToken = config [ "BotToken" ] ? ? throw new Exception ( "BotToken не найден в конфигурации!" ) ;
Log . Information ( "Конфигурация успешно загружена." ) ;
}
catch ( Exception ex )
{
Log . Error ( $"Ошибка при загрузке конфигурации: {ex.Message}" ) ;
throw ;
}
2025-03-12 17:52:00 +07:00
2025-03-17 14:53:01 +07:00
// Настроим логирование
2025-03-12 17:52:00 +07:00
Log . Logger = new LoggerConfiguration ( )
. WriteTo . Console ( )
. WriteTo . File ( "logs/log.txt" , rollingInterval : RollingInterval . Day )
. CreateLogger ( ) ;
Log . Information ( "Запуск Telegram-бота..." ) ;
2025-03-12 22:41:14 +07:00
try
{
// Инициализация клиента бота
_botClient = new TelegramBotClient ( _botToken ) ;
2025-03-17 14:53:01 +07:00
var me = await _botClient . GetMeAsync ( ) ;
2025-03-12 22:41:14 +07:00
Log . Information ( $"Бот {me.FirstName} запущен! ID: {me.Id}" ) ;
}
catch ( Exception ex )
{
Log . Error ( $"Ошибка при подключении к Telegram API: {ex.Message}" ) ;
throw ;
}
2025-03-12 17:52:00 +07:00
2025-03-12 19:11:38 +07:00
var cts = new CancellationTokenSource ( ) ;
2025-03-12 22:41:14 +07:00
Log . Information ( "Начало получения обновлений..." ) ;
2025-03-12 22:17:34 +07:00
2025-03-12 22:41:14 +07:00
try
{
// Применение StartReceiving для работы с задачами
_botClient . StartReceiving ( HandleUpdateAsync , HandleErrorAsync , cancellationToken : cts . Token ) ;
Log . Information ( "Получение обновлений успешно началось." ) ;
}
catch ( Exception ex )
{
Log . Error ( $"Ошибка при запуске получения обновлений: {ex.Message}" ) ;
throw ;
}
2025-03-12 17:52:00 +07:00
2025-03-12 22:17:34 +07:00
// Создание TaskCompletionSource для удержания процесса бота
var tcs = new TaskCompletionSource ( ) ;
await tcs . Task ; // Это заставит бота работать до тех пор, пока не будет отменен
// Ожидаем отмены через token
cts . Token . WaitHandle . WaitOne ( ) ;
2025-03-12 17:52:00 +07:00
}
private static async Task HandleUpdateAsync ( ITelegramBotClient botClient , Update update , CancellationToken cancellationToken )
{
2025-03-12 22:41:14 +07:00
try
{
if ( update . Type ! = UpdateType . Message | | update . Message ? . Text = = null )
return ;
2025-03-12 17:52:00 +07:00
2025-03-12 22:41:14 +07:00
var message = update . Message ;
Log . Information ( $"Получено сообщение от {message.Chat.Id}: {message.Text}" ) ;
2025-03-12 17:52:00 +07:00
2025-03-12 22:41:14 +07:00
if ( message . Text = = "/start" )
{
2025-03-17 14:53:01 +07:00
await botClient . SendTextMessageAsync (
2025-03-12 22:41:14 +07:00
chatId : message . Chat . Id ,
2025-03-17 14:53:01 +07:00
text : "Привет! Я бот для с б о р а заявок на ремонт оборудования. Отправь /report для подачи заявки."
2025-03-12 22:41:14 +07:00
) ;
2025-03-17 14:53:01 +07:00
Log . Information ( $"Ответ на команду /start отправлен. Т Е К С Т О Т В Е Т А : Привет! Я бот для с б о р а заявок на ремонт оборудования. Отправь /report для подачи заявки." ) ;
2025-03-12 22:41:14 +07:00
}
else if ( message . Text = = "/report" )
{
2025-03-17 14:53:01 +07:00
usersWaitingForReport [ message . Chat . Id ] = true ; // Отметить, что пользователь должен отправить описание
await botClient . SendTextMessageAsync (
2025-03-12 22:41:14 +07:00
chatId : message . Chat . Id ,
text : "Пожалуйста, отправьте описание проблемы."
) ;
Log . Information ( "Ответ на команду /report отправлен." ) ;
}
2025-03-17 14:53:01 +07:00
else if ( usersWaitingForReport . ContainsKey ( message . Chat . Id ) & & usersWaitingForReport [ message . Chat . Id ] )
{
// Пользователь отправил описание проблемы
string problemDescription = message . Text ;
// Сохраняем описание проблемы в базу данных (SQLite)
await SaveReportToDatabase ( message . Chat . Id , problemDescription ) ;
// Ответ пользователю, что заявка принята
await botClient . SendTextMessageAsync (
chatId : message . Chat . Id ,
text : "Спасибо за заявку! Мы обработаем её в ближайшее время."
) ;
// С б р о с состояния
usersWaitingForReport [ message . Chat . Id ] = false ;
Log . Information ( $"Заявка пользователя {message.Chat.Id} сохранена в базе данных. Описание: {problemDescription}" ) ;
}
2025-03-12 22:41:14 +07:00
else
{
2025-03-17 14:53:01 +07:00
await botClient . SendTextMessageAsync (
2025-03-12 22:41:14 +07:00
chatId : message . Chat . Id ,
text : "Неизвестная команда. Используйте /start."
) ;
Log . Information ( "Ответ на неизвестную команду отправлен." ) ;
}
2025-03-12 17:52:00 +07:00
}
2025-03-12 22:41:14 +07:00
catch ( Exception ex )
2025-03-12 17:52:00 +07:00
{
2025-03-12 22:41:14 +07:00
Log . Error ( $"Ошибка при обработке обновлений: {ex.Message}" ) ;
Log . Error ( $"StackTrace: {ex.StackTrace}" ) ;
2025-03-12 17:52:00 +07:00
}
}
2025-03-17 14:53:01 +07:00
private static async Task SaveReportToDatabase ( long chatId , string description )
{
string connectionString = "Data Source=bot.db" ; // Используем SQLite
try
{
using ( var connection = new SqliteConnection ( connectionString ) )
{
await connection . OpenAsync ( ) ;
var insertCommand = connection . CreateCommand ( ) ;
insertCommand . CommandText =
@ "
INSERT INTO Reports ( ChatId , Description )
VALUES ( @ChatId , @Description ) ;
";
insertCommand . Parameters . AddWithValue ( "@ChatId" , chatId ) ;
insertCommand . Parameters . AddWithValue ( "@Description" , description ) ;
await insertCommand . ExecuteNonQueryAsync ( ) ;
Log . Information ( $"Заявка от пользователя {chatId} успешно сохранена." ) ;
}
}
catch ( Exception ex )
{
Log . Error ( $"Ошибка при сохранении заявки в базу данных: {ex.Message}" ) ;
}
}
2025-03-12 17:52:00 +07:00
private static Task HandleErrorAsync ( ITelegramBotClient botClient , Exception exception , CancellationToken cancellationToken )
{
2025-03-12 22:41:14 +07:00
Log . Error ( $"Ошибка в процессе работы с ботом: {exception.Message}" ) ;
2025-03-12 22:35:28 +07:00
Log . Error ( $"StackTrace: {exception.StackTrace}" ) ;
2025-03-12 17:52:00 +07:00
return Task . CompletedTask ;
}
}