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
|