227 lines
6.5 KiB
Python
227 lines
6.5 KiB
Python
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 = """
|
||
Сообщение включено: <b>{include}</b>
|
||
|
||
Выберите действие:
|
||
"""
|
||
|
||
send_message_text = """
|
||
Отправьте сообщение с прикреплением до одного фото:
|
||
"""
|
||
|
||
send_buttons_text = """
|
||
Отправьте кнопки в таком формате:
|
||
|
||
<b>Кнопка в первом ряду - http://example.com</b>
|
||
<b>Кнопка во втором ряду - http://example.com</b>
|
||
|
||
Используйте разделитель " | ", чтобы добавить до 8 кнопок в один ряд (допустимо 6 рядов):
|
||
<b>Кнопка в ряду - http://example.com | Другая кнопка в ряду - http://example.com</b>
|
||
"""
|
||
|
||
incorrect_data_text = """
|
||
<b>Не верный формат данных</b>
|
||
"""
|
||
|
||
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
|