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