▶️ Использование Загрузчика и Менеджера
Чтобы взаимодействовать с системой загрузки модулей или выполнять задачи по управлению модулями (установка, обновление, удаление), вашему модулю необходимо запросить разрешение use_loader.
WARNING
Запрос use_loader предоставляет значительный контроль над модулями бота. Включайте его только для модулей, которым вы полностью доверяете.
Запрос Разрешения
Добавьте use_loader в список разрешений в файле config.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.
# Внутри метода вашего класса 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в файлеconfig.yamlмодуля. Возвращает статус успеха.cleanup_old_backups(name: str, keep_count: int = 5) -> int:Удаляет старые резервные копии для модуля/расширения, сохраняя указанное количество. Возвращает количество удаленных резервных копий.
INFO
Не забывайте обрабатывать возможные ошибки и проверять возвращаемые значения при использовании этих функций.