Skip to content

📋 Получение информации о Других Модулях

Вашему модулю может понадобиться взаимодействовать с другими модулями, загруженными ботом, или получать информацию о них. Для этого в ModuleLoader, доступном через self.loader (если дано разрешение use_loader), предусмотрены методы.

Получение информации о загруженных модулях (свойство loaded_modules)

Класс BaseModule предоставляет удобное свойство loaded_modules, которое является сокращением для self.loader.get_modules_info().

  • self.loaded_modules: Возвращает словарь, в котором ключами являются имена внутренних каталогов текущих загруженных модулей, а значениями - соответствующие им объекты ModuleInfo (base.module.ModuleInfo).

Пример использования:

# Внутри метода BaseModule или ModuleExtension

def list_loaded_modules(self):
    """Логгирует имена и версии всех загруженных в данный момент модулей."""
    if not self.loader: # Проверьте, есть ли доступ для погрузчика
        self.logger.error("Невозможно составить список модулей: Доступ к загрузчику не предоставлен.")
        return

    loaded: dict[str, ModuleInfo] = self.loaded_modules # Используйте свойство

    if not loaded:
        self.logger.info("В настоящее время другие модули не загружены.")
        return

    self.logger.info("Текущие загруженные модули:")
    for internal_name, info in loaded.items():
        # info is a ModuleInfo dataclass instance
        self.logger.info(
            f"- {info.name} (v{info.version}) "
            f"[Внутренний: {internal_name}, Автор: {info.author}]"
        )

async def check_for_core_module(self, message: Message):
    """Проверяет, загружен ли модуль с именем 'Core'."""
    if not self.loader:
        await message.reply("Ошибка: Требуется доступ к загрузчику.")
        return

    core_loaded = False
    for info in self.loaded_modules.values():
        if info.name.lower() == "core":
            core_loaded = True
            break

    if core_loaded:
        await message.reply("В настоящее время загружен модуль Core.")
    else:
        await message.reply("Модуль Core не загружен.")

Другие информационные методы (через self.loader)

  • get_all_modules_info() -> dict[str, ModuleInfo]: Аналогична loaded_modules, но включает информацию для всех модулей, найденных в каталоге modules/, даже тех, которые не удалось загрузить или у которых auto_load: false. Полезно для пользовательских интерфейсов управления.
  • get_module(name: str) -> Optional[BaseModule]: Получает реальный запущенный экземпляр другого загруженного модуля по имени его внутренней директории. Используйте с осторожностью, так как прямой вызов методов других модулей может создать тесную связь.
  • get_module_info(name: str) -> Optional[ModuleInfo]: Получение ModuleInfo для конкретного модуля (по внутреннему имени), независимо от того, загружен он или нет.
  • get_module_help(name: str) -> Optional[Union[HelpPage, str]]: Получение страницы/строки справки для конкретного загруженного модуля.
  • get_module_perms(name: str) -> list[Permissions]: Получение объявленных разрешений для конкретного загруженного модуля.
  • get_int_name(name: str) -> Optional[str]: Преобразование удобного для пользователя имени (из info.name) обратно во внутреннее имя каталога.

Использование этих методов позволяет модулям быть осведомленными о своем окружении и потенциально адаптировать свое поведение в зависимости от того, какие другие модули активны. Не забудьте сначала запросить разрешение use_loader.