# - *- coding: utf- 8 - *- from aiogram import Bot, Router from aiogram.exceptions import TelegramForbiddenError from aiogram.types import ChatJoinRequest from tgbot.database.db_pending import PendingRepository from tgbot.database.db_settings import SettingsRepository from tgbot.utils.const_functions import get_unix, smart_message from tgbot.utils.misc.bot_logging import bot_logger from tgbot.keyboards.inline_main import _build_msg_keyboard router = Router(name=__name__) @router.chat_join_request() async def on_join_request(update: ChatJoinRequest, bot: Bot) -> None: user_id = update.from_user.id settings = await SettingsRepository().get() if not settings.status_work: return if not settings.misc_message: return keyboard = _build_msg_keyboard(settings.misc_finl_text, settings.misc_finl_link) try: await smart_message( bot=bot, user_id=user_id, text=settings.misc_message, keyboard=keyboard, photo=settings.misc_message_media, ) except TelegramForbiddenError: bot_logger.info("Пользователь %s заблокировал бота, пропускаем", user_id) return except Exception: bot_logger.warning( "Не удалось отправить сообщение пользователю %s", user_id, exc_info=True ) return if settings.remind_interval > 0: await PendingRepository().add(user_id=user_id) async def send_reminders(bot: Bot) -> None: settings = await SettingsRepository().get() if settings.remind_interval == 0 or not settings.misc_message: return interval_seconds = settings.remind_interval * 3600 now = get_unix() pending_repo = PendingRepository() pending_users = await pending_repo.get_all() keyboard = _build_msg_keyboard(settings.misc_finl_text, settings.misc_finl_link) for row in pending_users: reference = row.last_remind_at if row.last_remind_at > 0 else row.joined_at if now - reference < interval_seconds: continue try: await smart_message( bot=bot, user_id=row.user_id, text=settings.misc_message, keyboard=keyboard, photo=settings.misc_message_media, ) await pending_repo.update_remind_at(user_id=row.user_id) except TelegramForbiddenError: await pending_repo.delete(user_id=row.user_id) bot_logger.info( "Пользователь %s заблокировал бота, удалён из очереди", row.user_id ) except Exception: bot_logger.warning( "Не удалось отправить напоминание пользователю %s", row.user_id, exc_info=True, )