154 lines
4.5 KiB
Python
154 lines
4.5 KiB
Python
from telegram.error import NetworkError
|
||
from telegram.ext import (
|
||
ApplicationBuilder,
|
||
CallbackQueryHandler,
|
||
CommandHandler,
|
||
ContextTypes,
|
||
MessageHandler,
|
||
filters,
|
||
)
|
||
from telegram.request import HTTPXRequest
|
||
|
||
from src.config import (
|
||
BOT_TOKEN,
|
||
TELEGRAM_CONNECT_TIMEOUT,
|
||
TELEGRAM_READ_TIMEOUT,
|
||
TELEGRAM_WRITE_TIMEOUT,
|
||
)
|
||
from src.database import init_db
|
||
from src.handlers import (
|
||
admin_command,
|
||
handle_admin_document,
|
||
handle_ask_replica_number,
|
||
handle_cancel_ask_number,
|
||
handle_cancel_delete,
|
||
handle_cancel_delete_list,
|
||
handle_cancel_restart,
|
||
handle_cancel_upload,
|
||
handle_confirm_delete,
|
||
handle_confirm_restart,
|
||
handle_confirm_upload,
|
||
handle_delete_scenario_list,
|
||
handle_exit_admin,
|
||
handle_rerecord_last,
|
||
handle_rerecord_previous,
|
||
handle_restart_track,
|
||
handle_save_track,
|
||
handle_select_gender,
|
||
handle_select_scenario_delete,
|
||
handle_text_message,
|
||
handle_voice_message,
|
||
start_command,
|
||
)
|
||
from src.logger import logger
|
||
|
||
|
||
async def error_handler(update: object, context: ContextTypes.DEFAULT_TYPE) -> None:
|
||
"""Обработчик ошибок бота."""
|
||
error = context.error
|
||
|
||
# Сетевые ошибки при polling - это норма, логируем компактно
|
||
if isinstance(error, NetworkError):
|
||
logger.warning(f"Network error during polling: {error}")
|
||
return
|
||
|
||
# Для остальных ошибок логируем с контекстом
|
||
logger.error(
|
||
f"Exception while handling update {update}: {error}", exc_info=context.error
|
||
)
|
||
|
||
|
||
def main() -> None:
|
||
"""Точка входа приложения."""
|
||
logger.info("Запуск бота...")
|
||
|
||
init_db()
|
||
|
||
app = (
|
||
ApplicationBuilder()
|
||
.token(BOT_TOKEN)
|
||
.request(
|
||
HTTPXRequest(
|
||
connection_pool_size=8,
|
||
connect_timeout=TELEGRAM_CONNECT_TIMEOUT,
|
||
read_timeout=TELEGRAM_READ_TIMEOUT,
|
||
write_timeout=TELEGRAM_WRITE_TIMEOUT,
|
||
)
|
||
)
|
||
.build()
|
||
)
|
||
|
||
# Команды
|
||
app.add_handler(CommandHandler("start", start_command))
|
||
app.add_handler(CommandHandler("admin", admin_command))
|
||
|
||
# Callback query handlers
|
||
app.add_handler(
|
||
CallbackQueryHandler(handle_select_gender, pattern="^select_gender:")
|
||
)
|
||
app.add_handler(
|
||
CallbackQueryHandler(handle_rerecord_previous, pattern="^rerecord_previous$")
|
||
)
|
||
app.add_handler(
|
||
CallbackQueryHandler(handle_restart_track, pattern="^restart_track$")
|
||
)
|
||
app.add_handler(
|
||
CallbackQueryHandler(handle_confirm_restart, pattern="^confirm_restart$")
|
||
)
|
||
app.add_handler(
|
||
CallbackQueryHandler(handle_cancel_restart, pattern="^cancel_restart$")
|
||
)
|
||
app.add_handler(CallbackQueryHandler(handle_save_track, pattern="^save_track$"))
|
||
app.add_handler(
|
||
CallbackQueryHandler(handle_rerecord_last, pattern="^rerecord_last$")
|
||
)
|
||
app.add_handler(
|
||
CallbackQueryHandler(handle_ask_replica_number, pattern="^ask_replica_number$")
|
||
)
|
||
app.add_handler(
|
||
CallbackQueryHandler(handle_cancel_ask_number, pattern="^cancel_ask_number$")
|
||
)
|
||
app.add_handler(CallbackQueryHandler(handle_exit_admin, pattern="^exit_admin$"))
|
||
app.add_handler(
|
||
CallbackQueryHandler(handle_confirm_upload, pattern="^confirm_upload$")
|
||
)
|
||
app.add_handler(
|
||
CallbackQueryHandler(handle_cancel_upload, pattern="^cancel_upload$")
|
||
)
|
||
|
||
# Delete scenario handlers
|
||
app.add_handler(
|
||
CallbackQueryHandler(
|
||
handle_delete_scenario_list, pattern="^delete_scenario_list$"
|
||
)
|
||
)
|
||
app.add_handler(
|
||
CallbackQueryHandler(handle_select_scenario_delete, pattern="^delete_scenario:")
|
||
)
|
||
app.add_handler(
|
||
CallbackQueryHandler(handle_confirm_delete, pattern="^confirm_delete$")
|
||
)
|
||
app.add_handler(
|
||
CallbackQueryHandler(handle_cancel_delete, pattern="^cancel_delete$")
|
||
)
|
||
app.add_handler(
|
||
CallbackQueryHandler(handle_cancel_delete_list, pattern="^cancel_delete_list$")
|
||
)
|
||
|
||
# Message handlers
|
||
app.add_handler(MessageHandler(filters.VOICE, handle_voice_message))
|
||
app.add_handler(MessageHandler(filters.Document.ALL, handle_admin_document))
|
||
app.add_handler(
|
||
MessageHandler(filters.TEXT & ~filters.COMMAND, handle_text_message)
|
||
)
|
||
|
||
# Error handler
|
||
app.add_error_handler(error_handler)
|
||
|
||
logger.info("Бот запущен")
|
||
app.run_polling()
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|