48 lines
1.4 KiB
Python
48 lines
1.4 KiB
Python
from __future__ import annotations
|
|
|
|
from aiogram import Bot
|
|
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup
|
|
|
|
from app.models import Offer
|
|
|
|
|
|
class TelegramPublisher:
|
|
def __init__(self, bot: Bot, channel_id: str) -> None:
|
|
self._bot = bot
|
|
self._channel_id = channel_id
|
|
|
|
async def publish_offer(self, offer: Offer) -> None:
|
|
await self._bot.send_message(
|
|
chat_id=self._channel_id,
|
|
text=_format_offer_message(offer),
|
|
disable_web_page_preview=True,
|
|
reply_markup=_build_delete_markup(),
|
|
)
|
|
|
|
|
|
def _format_offer_message(offer: Offer) -> str:
|
|
seller_line = f"Исполнитель: @{offer.seller_username}\n" if offer.seller_username else ""
|
|
description = offer.description.strip()
|
|
if len(description) > 1000:
|
|
description = f"{description[:997].rstrip()}..."
|
|
|
|
return (
|
|
f"Новый оффер: {offer.title}\n"
|
|
f"Источник: {offer.source}\n"
|
|
f"Категория: {offer.category_id}\n"
|
|
f"Бюджет: {offer.price}\n"
|
|
f"Опубликовано: {offer.published_at}\n"
|
|
f"{seller_line}"
|
|
f"\n"
|
|
f"{description}\n\n"
|
|
f"Ссылка: {offer.url}"
|
|
)
|
|
|
|
|
|
def _build_delete_markup() -> InlineKeyboardMarkup:
|
|
return InlineKeyboardMarkup(
|
|
inline_keyboard=[
|
|
[InlineKeyboardButton(text="❌", callback_data="delete_post")]
|
|
]
|
|
)
|