import asyncio import logging import time from aiogram import Dispatcher, F, types from aiogram.filters import Command from antispam import anti_DuDo, call_verification from config import bot, setup_bot_connection from functions import download_yd, get_weather, info_ban_status, send_photo_with_caption from switching_en_ru import convert_layout from yandex_cloud_sk import get_text_from_speech logging.basicConfig(level=logging.INFO) logger = logging.getLogger("main") router = Dispatcher() @router.message(Command("start")) async def welcome_start(message: types.Message): caption = ( f"Приветствую тебя {message.from_user.username or message.from_user.full_name}\n" "Для получения дополнительной информации отправь мне /help" ) await send_photo_with_caption(message.chat.id, "welcome_robot", "img/welcome_robot.jpeg", caption) await call_verification(message.from_user.id, message, "start") @router.message(Command("help")) async def welcome_help(message: types.Message): with open("info.txt", "r", encoding="utf-8") as file: info = file.read() await message.reply(f"Привет {message.from_user.username or message.from_user.full_name}.\n{info}") await call_verification(message.from_user.id, message, "help") @router.message(Command("get_id")) async def get_me_id(message: types.Message): await message.answer(f"ID пользователя: {message.from_user.id}") await call_verification(message.from_user.id, message, "get_id") @router.message(Command("weather")) async def weather(message: types.Message): await get_weather(message) await call_verification(message.from_user.id, message, "weather") @router.message(Command("ydf")) async def yandex_down_files(message: types.Message): await download_yd(message) await call_verification(message.from_user.id, message, "ydf") @router.message(Command("res")) async def restoring_layout(message: types.Message): if message.reply_to_message and message.reply_to_message.text: restored_text = convert_layout(message.reply_to_message.text) await message.answer(restored_text) else: await message.answer("Пожалуйста, ответьте командой /res на сообщение с текстом.") await call_verification(message.from_user.id, message, "res") @router.message(Command("info_ban")) async def info_ban(message: types.Message): await info_ban_status(message) await call_verification(message.from_user.id, message, "info_ban") @router.message(F.sticker | F.animation) async def handle_sticker(message: types.Message): user_id = message.from_user.id now = time.time() await anti_DuDo(user_id, message, now) @router.message(F.voice) async def handle_voice(message: types.Message): voice: types.Voice = message.voice voice_file = await bot.get_file(voice.file_id) file_base_url = f"https://api.telegram.org/file/bot{bot.token}/{voice_file.file_path}" try: text = await get_text_from_speech(file_base_url) if not text: text = "Не удалось распознать текст." except Exception as exc: logger.error("Ошибка при распознавании текста: %s", exc) text = "Произошла ошибка при обработке голосового сообщения." await message.answer(f"{message.from_user.username or message.from_user.full_name} изрек:\n{text}") async def main(): connected = await setup_bot_connection() if not connected: # Завершаем работу штатно: без traceback и без падения процесса. return await router.start_polling(bot) if __name__ == "__main__": asyncio.run(main())