v1.2.1
This commit is contained in:
4
bot/utils/__init__.py
Normal file
4
bot/utils/__init__.py
Normal file
@@ -0,0 +1,4 @@
|
||||
from .interesting_facts import *
|
||||
from .md2_escape import *
|
||||
from .usernames import *
|
||||
from .pagination import *
|
||||
29
bot/utils/interesting_facts.py
Normal file
29
bot/utils/interesting_facts.py
Normal file
@@ -0,0 +1,29 @@
|
||||
from random import choice
|
||||
|
||||
from configs.config import Lists
|
||||
|
||||
# Настройки экспорта
|
||||
__all__ = ("interesting_fact",)
|
||||
|
||||
|
||||
def interesting_fact(mode: str = "факт", lists: list[str] = None) -> str:
|
||||
"""
|
||||
Возвращает случайный факт, анекдот или цитату, в зависимости от режима.
|
||||
|
||||
:param mode: Строка, определяющая тип контента ("факт", "анекдот", "цитата").
|
||||
:param lists: Необязательный список строк, из которого можно выбирать вручную.
|
||||
:return: Случайный элемент из соответствующего списка.
|
||||
"""
|
||||
if lists is not None:
|
||||
return choice(lists)
|
||||
|
||||
mode: str = mode.lower()
|
||||
|
||||
if mode == "анекдот":
|
||||
source: list[str] = Lists.jokes
|
||||
elif mode == "цитата":
|
||||
source: list[str] = Lists.quotes
|
||||
else:
|
||||
source: list[str] = Lists.facts
|
||||
|
||||
return choice(source)
|
||||
35
bot/utils/md2_escape.py
Normal file
35
bot/utils/md2_escape.py
Normal file
@@ -0,0 +1,35 @@
|
||||
from re import sub, escape
|
||||
from configs.config import BotSettings
|
||||
|
||||
# Настройка экспорта в модули
|
||||
__all__ = ("textmd2",)
|
||||
|
||||
def textmd2(msg: str,
|
||||
parse_mode: str = BotSettings.PARSE_MODE,
|
||||
special_chars: str = r"_*[]()~`>#+-=|{}.!") -> str:
|
||||
"""
|
||||
Экранирует специальные символы MarkdownV2 в переданном тексте.
|
||||
|
||||
:param msg: Входной текст в виде строки.
|
||||
:param parse_mode: Формат форматирования ('MarkdownV2' или 'HTML').
|
||||
:param special_chars: Символы, которые необходимо экранировать.
|
||||
|
||||
:return: Экранированный текст или исходный текст, если формат HTML.
|
||||
:raises TypeError: Если передан не строковый тип данных.
|
||||
:raises ValueError: Если parse_mode задан некорректно.
|
||||
"""
|
||||
|
||||
if not isinstance(msg, str):
|
||||
raise TypeError(f"Ожидается строка, но получено {type(msg).__name__}")
|
||||
|
||||
if not isinstance(parse_mode, str):
|
||||
raise TypeError(f"parse_mode должен быть строкой, но получено {type(parse_mode).__name__}")
|
||||
|
||||
if parse_mode.strip().lower() == "html":
|
||||
return msg
|
||||
|
||||
elif parse_mode in {"markdownv2", "markdown"}:
|
||||
return sub(rf"([{escape(special_chars)}])", r"\\\1", msg)
|
||||
|
||||
else:
|
||||
raise ValueError(f"Недопустимое значение parse_mode: '{parse_mode}'. Ожидалось 'HTML' или 'MarkdownV2'")
|
||||
28
bot/utils/pagination.py
Normal file
28
bot/utils/pagination.py
Normal file
@@ -0,0 +1,28 @@
|
||||
from aiogram.types import InlineKeyboardButton
|
||||
|
||||
# Настройка экспорта в модули
|
||||
__all__ = ('pagination_btn',)
|
||||
|
||||
def pagination_btn(action: str,
|
||||
page: int = 0,
|
||||
total_posts: int = 0,
|
||||
bt_page: int = 5) -> list[InlineKeyboardButton]:
|
||||
"""
|
||||
Создает кнопки для пагинации.
|
||||
|
||||
:param action: Действие в котором нужна пангинация.
|
||||
:param page: Номер начальной страницы, по умолчанию 0.
|
||||
:param total_posts: Количество постов.
|
||||
:param bt_page: Количество кнопок на одной странице.
|
||||
:return: Готовый лист списка инлайн-кнопок.
|
||||
"""
|
||||
navigation_buttons: list[InlineKeyboardButton] = []
|
||||
if page > 0:
|
||||
navigation_buttons.append(InlineKeyboardButton(
|
||||
text="←", callback_data=f"{action}_page_{page - 1}"
|
||||
))
|
||||
if (page + 1) * bt_page < total_posts:
|
||||
navigation_buttons.append(InlineKeyboardButton(
|
||||
text="→", callback_data=f"{action}_page_{page + 1}"
|
||||
))
|
||||
return navigation_buttons
|
||||
21
bot/utils/usernames.py
Normal file
21
bot/utils/usernames.py
Normal file
@@ -0,0 +1,21 @@
|
||||
from aiogram.types import Message
|
||||
|
||||
# Настройка экспорта в модули
|
||||
__all__ = ('username', )
|
||||
|
||||
# Функция получения юзера или ID пользователя
|
||||
def username(message: Message) -> str:
|
||||
"""
|
||||
Возвращает юзернейм пользователя из сообщения, или ID, если юзернейм не указан.
|
||||
|
||||
:param message: Объект сообщения из aiogram.
|
||||
:return: Строка с юзернеймом пользователя или его ID.
|
||||
:raises ValueError: Если в сообщении отсутствует информация о пользователе.
|
||||
"""
|
||||
try:
|
||||
if message.from_user:
|
||||
return f"@{message.from_user.username}" if message.from_user.username else f"@{message.from_user.id}"
|
||||
raise ValueError("Информация о пользователе отсутствует в сообщении.")
|
||||
|
||||
except ValueError as e:
|
||||
raise e # Перебрасываем ошибку выше для дальнейшей обработки
|
||||
Reference in New Issue
Block a user