83 lines
3.5 KiB
Python
83 lines
3.5 KiB
Python
# bot/welcome.py
|
||
import logging
|
||
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
|
||
from telegram.ext import ContextTypes
|
||
from asgiref.sync import sync_to_async
|
||
from bot.models import WelcomeMessage
|
||
|
||
class WelcomeHandler:
|
||
def __init__(self, bot):
|
||
"""
|
||
Инициализация обработчика приветственных сообщений.
|
||
:param bot: экземпляр telegram.Bot для отправки сообщений.
|
||
"""
|
||
self.bot = bot
|
||
self.logger = logging.getLogger(__name__)
|
||
|
||
@sync_to_async
|
||
def get_welcome_config(self):
|
||
"""
|
||
Получает первую запись настроек приветствия.
|
||
"""
|
||
try:
|
||
return WelcomeMessage.objects.select_related("bot").first()
|
||
except WelcomeMessage.DoesNotExist:
|
||
return None
|
||
|
||
async def send_welcome(self, update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||
"""
|
||
Отправляет приветственное сообщение с inline-кнопками, расположенными в 3 строки:
|
||
1 кнопка, затем 2 и затем 2.
|
||
"""
|
||
if not update.message:
|
||
return
|
||
|
||
config = await self.get_welcome_config()
|
||
if not config:
|
||
await update.message.reply_text("Добро пожаловать!")
|
||
return
|
||
|
||
# Формируем список всех кнопок
|
||
buttons = []
|
||
if config.admin_contact:
|
||
buttons.append(InlineKeyboardButton("📞 Связаться с администратором", url=config.admin_contact))
|
||
if config.channel_link:
|
||
buttons.append(InlineKeyboardButton(" 📢 Канал", url=config.channel_link))
|
||
if config.group_link:
|
||
buttons.append(InlineKeyboardButton("👥 Группа", url=config.group_link))
|
||
if config.custom_link1_name and config.custom_link1_url:
|
||
buttons.append(InlineKeyboardButton(config.custom_link1_name, url=config.custom_link1_url))
|
||
if config.custom_link2_name and config.custom_link2_url:
|
||
buttons.append(InlineKeyboardButton(config.custom_link2_name, url=config.custom_link2_url))
|
||
|
||
# Распределяем кнопки по рядам: первая строка 1 кнопка, вторая – 2, третья – 2.
|
||
row1 = buttons[0:1] if len(buttons) >= 1 else []
|
||
row2 = buttons[1:3] if len(buttons) >= 3 else buttons[1:] if len(buttons) > 1 else []
|
||
row3 = buttons[3:5] if len(buttons) >= 5 else []
|
||
|
||
# Собираем список рядов, исключая пустые строки
|
||
keyboard = []
|
||
if row1:
|
||
keyboard.append(row1)
|
||
if row2:
|
||
keyboard.append(row2)
|
||
if row3:
|
||
keyboard.append(row3)
|
||
|
||
reply_markup = InlineKeyboardMarkup(keyboard) if keyboard else None
|
||
|
||
# Отправка сообщения с изображением, если задано
|
||
if config.welcome_image:
|
||
await update.message.reply_photo(
|
||
photo=config.welcome_image,
|
||
caption=config.welcome_message,
|
||
parse_mode="Markdown",
|
||
reply_markup=reply_markup
|
||
)
|
||
else:
|
||
await update.message.reply_text(
|
||
text=config.welcome_message,
|
||
parse_mode="Markdown",
|
||
reply_markup=reply_markup
|
||
)
|