Skip to content

▶️ Использование Загрузчика и Менеджера

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

WARNING

Запрос use_loader предоставляет значительный контроль над модулями бота. Включайте его только для модулей, которым вы полностью доверяете.

Запрос Разрешения

Добавьте use_loader в список разрешений в файле config.yaml вашего модуля:

yaml
# config.yaml
info:
  name: ModuleManagerUI
  # ... другая информация ...
permissions:
  - use_loader # Запрос доступа к API загрузчика/менеджера
# ... конфигурация ...

Доступ к Загрузчику

Если разрешение получено, ModuleLoader (base.loader.ModuleLoader) будет доступен в вашем модуле как self.loader.

Доступ к Менеджеру Модулей

Сам ModuleLoader содержит ModuleManager (base.mod_manager.ModuleManager) в своем атрибуте mod_manager. Таким образом, вы получаете доступ к функциям менеджера через self.loader.mod_manager.

python
# Внутри метода вашего класса BaseModule
if self.loader: # Проверьте, был ли предоставлен доступ к загрузчику.
    manager = self.loader.mod_manager
    # Теперь вы можете вызывать методы менеджера.
    # например, await manager.install_from_git(...)
else:
    await message.reply("Ошибка: Доступ загрузчика к этому модулю не предоставлен.")
    return

Доступные Функции

Вот краткое описание основных функций, доступных через self.loader и self.loader.mod_manager. Точные параметры, типы возврата и поведение всегда смотрите в документации к исходному коду (docstrings) в base/loader.py и base/mod_manager.py.

Через self.loader (ModuleLoader):

  • load_module(name: str, skip_deps: bool = False) -> Optional[str]: Загружает модуль по имени его каталога. В случае успеха возвращает удобное для пользователя имя, в случае неудачи - None.
  • unload_module(name: str): Выгружает модуль по имени его каталога.
  • get_module(name: str) -> Optional[BaseModule]: Получает экземпляр загруженного модуля.
  • get_modules_info() -> dict[str, ModuleInfo]: Получает информацию обо всех текущих загруженных модулях.
  • get_all_modules_info() -> dict[str, ModuleInfo]: Получает информацию обо всех модулях (загруженных или нет), найденных в каталоге modules.
  • get_module_info(name: str) -> Optional[ModuleInfo]: Получает информацию для конкретного модуля, независимо от состояния загрузки.
  • get_module_help(name: str) -> Optional[Union[HelpPage, str]]: Получает страницу помощи для загруженного модуля.
  • get_module_perms(name: str) -> list[Permissions]: Получает разрешения, объявленные загруженным модулем.
  • get_modules_deps() -> dict[str, list[str]]: Получает список зависимостей для загруженных модулей, для которых есть файл requirements.txt.
  • get_int_name(name: str) -> Optional[str]: Получает имя внутреннего каталога из удобного имени модуля.
  • prepare_for_module_update(name: str) -> Optional[BaseModule]: Выгружает модуль для подготовки к обновлению, возвращая экземпляр, если он был загружен.

Через self.loader.mod_manager (ModuleManager):

  • install_from_git(url: str) -> Tuple[int, str]: Клонирует модуль из Git URL в каталог modules/. Возвращает код выхода из Git и выходные данные.
  • check_for_updates(name: str, directory: str) -> Optional[bool]: Проверяет наличие удаленных обновлений для модуля/расширения на базе Git. Возвращает True (обновления доступны), False (неактуальны) или None (ошибка). директория обычно "modules" или "extensions".
  • update_from_git(name: str, directory: str, module: Optional[BaseModule] = None) -> Tuple[int, str, Optional[str]]: Обновление модуля/расширения из Git. Создает резервную копию, извлекает изменения, обрабатывает потенциальные миграции БД (если предоставлен экземпляр модуля). Возвращает код выхода из Git, выходные данные и путь к резервной копии.
  • revert_update(name: str, directory: str) -> bool: Отменяет последнее обновление Git для модуля/расширения, используя сохраненный хэш фиксации перед обновлением.
  • restore_from_backup(name: str, directory: str, backup_path: Optional[str] = None) -> bool: Восстанавливает модуль/расширение из указанной резервной копии zip-файла (или из последней, если backup_path равен None). Правильно обрабатывает восстановление Git-репо, если метаданные в резервной копии существуют.
  • list_backups(name: Optional[str] = None) -> list[str]: Перечисляет пути к доступным файлам резервного копирования, опционально отфильтровывая их по имени модуля/расширения.
  • install_deps(name: str, directory: str) -> Tuple[int, Union[str, list[str]]]: Устанавливает/обновляет зависимости из файла requirements.txt. Возвращает код выхода pip и вывод/список требований.
  • uninstall_mod_deps(name: str, modules_deps: dict[str, list[str]]): Удаляет зависимости, специфичные для модуля, избегая их удаления, если они разделяются с другими модулями. (Требуется текущая карта зависимостей).
  • uninstall_packages(pkgs: list[str], modules_deps: dict[str, list[str]]): Удаляет указанные пакеты, если они не требуются ни одному загруженному модулю.
  • uninstall_module(name: str, modules_deps: dict[str, list[str]]) -> bool: Удаляет каталог модуля и его уникальные зависимости. Возвращает статус успеха.
  • set_module_auto_load(name: str, auto_load: bool) -> bool: Устанавливает флаг auto_load в файле info.yaml модуля (или потенциально config.yaml, проверьте реализацию). Возвращает статус успеха.
  • cleanup_old_backups(name: str, keep_count: int = 5) -> int: Удаляет старые резервные копии для модуля/расширения, сохраняя указанное количество. Возвращает количество удаленных резервных копий.

INFO

Не забывайте обрабатывать возможные ошибки и проверять возвращаемые значения при использовании этих функций.