Files
dataset-tg-bot/main.py

154 lines
4.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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()