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