# Ultroid - UserBot # Copyright (C) 2021-2025 TeamUltroid # # This file is a part of < https://github.com/TeamUltroid/Ultroid/ > # PLease read the GNU Affero General Public License in # . import contextlib import glob import os from importlib import import_module from logging import Logger from . import LOGS from .fns.tools import get_all_files class Loader: def __init__(self, path="plugins", key="Official", logger: Logger = LOGS): self.path = path self.key = key self._logger = logger def load( self, log=True, func=import_module, include=None, exclude=None, after_load=None, load_all=False, ): _single = os.path.isfile(self.path) if include: if log: self._logger.info("Including: {}".format("• ".join(include))) files = glob.glob(f"{self.path}/_*.py") for file in include: path = f"{self.path}/{file}.py" if os.path.exists(path): files.append(path) elif _single: files = [self.path] else: if load_all: files = get_all_files(self.path, ".py") else: files = glob.glob(f"{self.path}/*.py") if exclude: for path in exclude: if not path.startswith("_"): with contextlib.suppress(ValueError): files.remove(f"{self.path}/{path}.py") if log and not _single: self._logger.info( f"• Installing {self.key} Plugins || Count : {len(files)} •" ) for plugin in sorted(files): if func == import_module: plugin = plugin.replace(".py", "").replace("/", ".").replace("\\", ".") try: modl = func(plugin) except ModuleNotFoundError as er: modl = None self._logger.error(f"{plugin}: '{er.name}' not installed!") continue except Exception as exc: modl = None self._logger.error(f"pyUltroid - {self.key} - ERROR - {plugin}") self._logger.exception(exc) continue if _single and log: self._logger.info(f"Successfully Loaded {plugin}!") if callable(after_load): if func == import_module: plugin = plugin.split(".")[-1] after_load(self, modl, plugin_name=plugin)