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