Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

✨ 支持插件加载优先级 #75

Merged
merged 1 commit into from
Aug 1, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 35 additions & 8 deletions kirami/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -237,23 +237,50 @@ def load_adapters(self, adapters: set[str]) -> None:

def load_plugins(self) -> None:
"""加载插件"""
plugins = {
path_to_module_name(pp) if (pp := Path(p)).exists() else p
for p in plugin_config.plugins
plugin_priorities = {
(
path_to_module_name(plugin_path)
if (plugin_path := Path(plugin)).exists()
else plugin
): float(priority) if priority else bot_config.plugin_priority
for plugin, _, priority in (p.partition(":") for p in plugin_config.plugins)
}
manager = PluginManager(plugins, plugin_config.plugin_dirs)
plugins = manager.available_plugins

plugin_dir_priorities = {
plugin_dir: float(priority) if priority else bot_config.plugin_priority
for plugin_dir, _, priority in (
pd.partition(":") for pd in plugin_config.plugin_dirs
)
}

manager = PluginManager(plugin_priorities, plugin_dir_priorities)
_managers.append(manager)
plugins = manager.available_plugins
plugin_names = (
manager._third_party_plugin_names | manager._searched_plugin_names
)

if plugin_config.whitelist:
plugins &= plugin_config.whitelist

if plugin_config.blacklist:
plugins -= plugin_config.blacklist

loaded_plugins = set(
filter(None, (manager.load_plugin(name) for name in plugins))
)
def get_plugin_priority(plugin_name: str) -> float:
plugin = plugin_names[plugin_name]
if isinstance(plugin, str):
return plugin_priorities[plugin]
if isinstance(plugin, Path):
for plugin_dir, priority in plugin_dir_priorities.items():
if plugin.is_relative_to(Path(plugin_dir).resolve()):
return priority
return bot_config.plugin_priority

sorted_plugins = sorted(plugins, key=get_plugin_priority)

loaded_plugins = {
plugin for name in sorted_plugins if (plugin := manager.load_plugin(name))
}

self.loading_state(loaded_plugins)

Expand Down
3 changes: 3 additions & 0 deletions kirami/config/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,9 @@ class BotConfig(BaseConfig):
default_policy_allow: set[str] = {"*"}
"""默认权限策略允许的内容列表"""

plugin_priority: float = float("inf")
"""插件加载的默认优先级"""

_env_file: str | None = Field(default=None, alias="env_file")
"""配置文件名默认从 `.env.{env_name}` 中读取配置"""

Expand Down
Loading