import json from aiogram.fsm.state import StatesGroup, State from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup from aiogram.types import Message from aiogram.utils.keyboard import InlineKeyboardBuilder from core import bot class SendState(StatesGroup): message = State() buttons = State() actions_text = """ Сообщение включено: {include} Выберите действие: """ send_message_text = """ Отправьте сообщение с прикреплением до одного фото: """ send_buttons_text = """ Отправьте кнопки в таком формате: Кнопка в первом ряду - http://example.com Кнопка во втором ряду - http://example.com Используйте разделитель " | ", чтобы добавить до 8 кнопок в один ряд (допустимо 6 рядов): Кнопка в ряду - http://example.com | Другая кнопка в ряду - http://example.com """ incorrect_data_text = """ Не верный формат данных """ check_data_text = """ Проверьте введённые данные """ publish_message_text = """ Обуликовано успешно """ def check_data_ikb() -> InlineKeyboardMarkup: """ -✅ Опубликовать -⬅️ Назад :return: объект клавиатуры для параметра reply_markup """ builder = InlineKeyboardBuilder() builder.add( InlineKeyboardButton( text='✅ Опубликовать', callback_data='publish_message' ), InlineKeyboardButton( text='⬅️ Назад', callback_data='come_back_buttons' ) ) builder.adjust(1) return builder.as_markup() async def send_preview(message_data: dict, chat_id: int, username='') -> Message | None: """ Присылает превью сообщения :param message_data: Данные сообщения из бд :param chat_id: ID телеграм чата куда надо прислать превью :param username: Username пользователя :return: """ msg_text = message_data['text'] if username: msg_text = f'{username}\n\n' + message_data['text'] if message_data['media']: preview_msg = await bot.send_photo( chat_id=chat_id, caption=msg_text, photo=message_data['media'], reply_markup=url_ikb( row_buttons=message_data['buttons'] ) ) else: preview_msg = await bot.send_message( chat_id=chat_id, text=msg_text, reply_markup=url_ikb( row_buttons=message_data['buttons'] ) ) return preview_msg def send_buttons_ikb() -> InlineKeyboardMarkup: """ -➡️ Пропустить -⬅️ Назад :return: объект клавиатуры для параметра reply_markup """ builder = InlineKeyboardBuilder() builder.add( InlineKeyboardButton( text='➡️ Пропустить', callback_data='pass_buttons' ), InlineKeyboardButton( text='⬅️ Назад', callback_data='come_back_message' ) ) builder.adjust(1) return builder.as_markup() def send_message_ikb() -> InlineKeyboardMarkup: """ -⬅️ Назад :return: объект клавиатуры для параметра reply_markup """ builder = InlineKeyboardBuilder() builder.add( InlineKeyboardButton( text='⬅️ Назад', callback_data='come_back_preview' ) ) builder.adjust(1) return builder.as_markup() def actions_ikb(included: bool) -> InlineKeyboardMarkup: """ -Вкл✅ \ Выкл ❌ -📝 Редактировать -⬅️ Назад :param included: bool включено ли сообщение или нет :return: объект клавиатуры для параметра reply_markup """ builder = InlineKeyboardBuilder() if included: included_btn = InlineKeyboardButton( text='Выкл ❌', callback_data='included_message_false' ) else: included_btn = InlineKeyboardButton( text='Вкл ✅', callback_data='included_message_true' ) builder.add( included_btn, InlineKeyboardButton( text='📝 Редактировать', callback_data='edit_message' ), InlineKeyboardButton( text='⬅️ Назад', callback_data='come_back_menu' ) ) builder.adjust(1) return builder.as_markup() def build_url_ikb(msg_text: str) -> list: """ Создаёт клавиатуру с url кнопками пользователя :param msg_text: Текст сообщения с заданными параметры клавиатуру :return: list с кнопками клавиатуры """ try: paragraphs = msg_text.split('\n') row_buttons = [] for paragraph in paragraphs: row = [] for button_text_data in paragraph.split(' | '): row.append(button_text_data.strip().split(' - ')) row_buttons.append(row) return row_buttons except: return [] def url_ikb(row_buttons: list | str) -> InlineKeyboardMarkup | None: """ Создаёт клавиатуру с url кнопками пользователя :param row_buttons: List с кнопками клавиатуры :return: В случае ошибки False, если норм то объект клавиатуры для параметра reply_markup """ try: if isinstance(row_buttons, str): row_buttons = json.loads(row_buttons) builder = InlineKeyboardBuilder() rows_len = [0, 0, 0, 0, 0, 0] i = 0 for row in row_buttons: rows_len[i] = len(row) for button in row: builder.add( InlineKeyboardButton( text=button[0], url=button[1] ) ) i += 1 builder.adjust(*rows_len) if row_buttons: return builder.as_markup() return None except: return None