Heroku/docs/mods.md

6.6 KiB
Executable File
Raw Blame History

Разработчикам модулей

Finally, кто-то сделал документацию по тому, как писать модули...

Общая структура

Любой модуль начинается с:

  • Лицензии
  • Импорта зависимостей
  • Подключения логирования
  • Класса модуля, обернутого в декоратор @loader.tds
  • Объявления базовых обработчиков

Все остальные действия выполняются внутри этого класса*.

*Важное примечание. Если функция не использует атрибуты и методы класса (self.что-то), ее стоит объявление стоит вынести за пределы класса.

Справочник по структуре

@loader.tds Декоратор, используемый на классе модуля. Нужен для добавления возможности локализации докстрингов команд.

def __init__(self) -> None:

Вызывается при начале загрузки модуля. Обычно используется только для инициализации конфига.

async def client_ready(self, client, db) -> None:

Вызывается в момент, когда готовы все инстансы (client, db). Основное место инициализации. Чаще всего здесь объявляют внутренние переменные, готовят базу данных, запускают нужные корутины и другие вещи, которые нужны при загрузке.

async def on_unload(self) -> None:

Вызывается в момент выгрузки модуля. Максимальное время выполнения - 5 секунд, при превышении код прерывается. Используется для сброса бесконечных циклов и других действий, нужных при выгрузке \ перезагрузке модуля.

async def testcmd(self, message: Message) -> None:

Таким образом выглядят обработчики команд. Все функции класса, которые заканчиваются на -cmd расцениваются как команды. Обратите внимание, что нельзя создать команду, которая начинается с цифры, содержит спецсимволы и др. Действуют те же ограничения, что и на обычные функции Python.

async def watcher(self, message: Message) -> None:

Обработчик всех сообщений. В него приходят все события, которые вызваны другими сессиями (не сессией юзербота), включая сервисные сообщения.

utils.py

Для повышения совместимости модуля рекомендуется использовать библиотеку utils. Она содержит множество полезных методов:

Возвращает список аргументов из сообщения

get_args(message: Message) -> list

Возвращает необработанные аргументы в виде одной строки

get_args_raw(message: Message) -> str

Возвращает список аргументов, разделенных символом sep

get_args_split_by(message: Message, sep: str) -> list

Возвращает ID объекта (для чатов\каналов без -100)

get_chat_id(message: Message) -> int

Экранирует HTML, данный в аргументе

escape_html(text: str) -> str

Получает рабочую директорию

get_base_dir() -> str

Получает директорию выбранного модуля

get_dir(mod: str) -> str

Получает отправителя (не работает с сервисными сообщениями)

get_user(message: Message) -> str

Оборачивает синхронный код в коротину. Рекомендуется использовать тогда, когда нужно внутри модуля использовать синхронный код, чтобы не останавливать основной поток

run_sync(func: FunctionType, *args, **kwargs) -> coroutine

Репозиционирование объектов и их смещений

relocate_entities(entities: ListLike, offset: int, text: str = None) -> list

Answer to a message (edit if possible, else send new message)

answer(message: Message, response: str, *args, **kwargs) -> Many

Get possible target id

get_target(message: Message, arg_no: int = 0) -> int or None

Merge two dictionaries

merge(a: dict, b: dict) -> dict

Create new channel (if needed) and return its entity

asset_channel(a: dict, b: dict) -> dict

Get telegram permalink to entity

get_link(a: dict, b: dict) -> dict

Split provided _list into chunks of n

chunks(a: dict, b: dict) -> dict

strings

Хоть они и объявляются как словарь, на самом деле это не словарь. Их можно вызывать. Сделано это для упрощения локализации. Все строки, которые можно вынести в strings - выноси в strings. В этом же словаре объявляется отображаемое имя модуля. Старайся выбирать имя без пробелов, спецсимволов и другого шлака.

db

База данных FTG. Практически всегда сохраняется в атрибут self.db или self._db.

Получение ключа из базы данных, заменяя его default в случае отсутствия:

db.get(owner: str, key: str, default: Any = None) -> Many

Установка значения ключа базы данных

db.set(owner: str, key: str, value: str) -> None

Документация будет пополняться