Files

92 lines
2.9 KiB
Python

# - *- 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,
)