80 lines
2.9 KiB
Python
80 lines
2.9 KiB
Python
import os
|
|
|
|
import aiofiles
|
|
|
|
from aiogram import Bot
|
|
from aiogram.exceptions import TelegramForbiddenError
|
|
from aiogram.types import BufferedInputFile, InlineKeyboardMarkup
|
|
|
|
from logger import logger
|
|
|
|
|
|
async def send_notification(
|
|
bot: Bot,
|
|
tg_id: int,
|
|
image_filename: str,
|
|
caption: str,
|
|
keyboard: InlineKeyboardMarkup | None = None,
|
|
) -> bool:
|
|
"""
|
|
Отправляет уведомление пользователю.
|
|
|
|
Args:
|
|
bot: Экземпляр бота для отправки сообщений
|
|
tg_id: Telegram ID пользователя
|
|
image_filename: Имя файла изображения в директории img
|
|
caption: Текст сообщения
|
|
keyboard: Клавиатура для сообщения (опционально)
|
|
|
|
Returns:
|
|
bool: True если сообщение успешно отправлено, False в случае ошибки
|
|
"""
|
|
photo_path = os.path.join("img", image_filename)
|
|
|
|
if os.path.isfile(photo_path):
|
|
return await _send_photo_notification(bot, tg_id, photo_path, image_filename, caption, keyboard)
|
|
else:
|
|
logger.warning(f"Файл с изображением не найден: {photo_path}")
|
|
return await _send_text_notification(bot, tg_id, caption, keyboard)
|
|
|
|
|
|
async def _send_photo_notification(
|
|
bot: Bot,
|
|
tg_id: int,
|
|
photo_path: str,
|
|
image_filename: str,
|
|
caption: str,
|
|
keyboard: InlineKeyboardMarkup | None = None,
|
|
) -> bool:
|
|
"""Отправляет уведомление с изображением."""
|
|
try:
|
|
async with aiofiles.open(photo_path, "rb") as image_file:
|
|
image_data = await image_file.read()
|
|
buffered_photo = BufferedInputFile(image_data, filename=image_filename)
|
|
await bot.send_photo(tg_id, buffered_photo, caption=caption, reply_markup=keyboard)
|
|
return True
|
|
except TelegramForbiddenError:
|
|
logger.error(f"Пользователь {tg_id} заблокировал бота")
|
|
return False
|
|
except Exception as e:
|
|
logger.error(f"Ошибка отправки фото для пользователя {tg_id}: {e}")
|
|
return await _send_text_notification(bot, tg_id, caption, keyboard)
|
|
|
|
|
|
async def _send_text_notification(
|
|
bot: Bot,
|
|
tg_id: int,
|
|
caption: str,
|
|
keyboard: InlineKeyboardMarkup | None = None,
|
|
) -> bool:
|
|
"""Отправляет текстовое уведомление."""
|
|
try:
|
|
await bot.send_message(tg_id, caption, reply_markup=keyboard)
|
|
return True
|
|
except TelegramForbiddenError:
|
|
logger.error(f"Пользователь {tg_id} заблокировал бота")
|
|
return False
|
|
except Exception as e:
|
|
logger.error(f"Неизвестная ошибка при отправке сообщения для пользователя {tg_id}: {e}")
|
|
return False
|