nonebot2/nonebot/plugin/load.py

127 lines
3.9 KiB
Python
Raw Normal View History

2021-11-11 17:33:30 +08:00
import json
import warnings
2021-11-11 17:33:30 +08:00
from typing import Set, Iterable, Optional
2021-11-08 01:02:35 +08:00
2021-11-11 17:33:30 +08:00
import tomlkit
from . import _managers
2021-11-08 01:02:35 +08:00
from .export import Export
from .manager import PluginManager
from .plugin import Plugin, get_plugin
def load_plugin(module_path: str) -> Optional[Plugin]:
"""
2022-01-12 18:19:21 +08:00
使用 `PluginManager` 加载单个插件可以是本地插件或是通过 `pip` 安装的插件
2021-11-08 01:02:35 +08:00
2022-01-12 18:31:12 +08:00
参数:
2022-01-12 19:10:29 +08:00
module_path: 插件名称 `path.to.your.plugin`
2021-11-08 01:02:35 +08:00
"""
2021-11-11 17:33:30 +08:00
manager = PluginManager([module_path])
_managers.append(manager)
return manager.load_plugin(module_path)
2021-11-08 01:02:35 +08:00
def load_plugins(*plugin_dir: str) -> Set[Plugin]:
"""
2022-01-12 18:19:21 +08:00
导入目录下多个插件 `_` 开头的插件不会被导入
2021-11-08 01:02:35 +08:00
2022-01-12 18:31:12 +08:00
参数:
2022-01-12 19:10:29 +08:00
plugin_dir: 插件路径
2021-11-08 01:02:35 +08:00
"""
2021-11-11 17:33:30 +08:00
manager = PluginManager(search_path=plugin_dir)
_managers.append(manager)
return manager.load_all_plugins()
def load_all_plugins(
module_path: Iterable[str], plugin_dir: Iterable[str]
) -> Set[Plugin]:
2021-11-08 01:02:35 +08:00
"""
2022-01-12 18:19:21 +08:00
导入指定列表中的插件以及指定目录下多个插件 `_` 开头的插件不会被导入
2021-11-08 01:02:35 +08:00
2022-01-12 18:31:12 +08:00
参数:
2022-01-12 19:10:29 +08:00
module_path: 指定插件集合
plugin_dir: 指定插件路径集合
2021-11-08 01:02:35 +08:00
"""
2021-11-11 17:33:30 +08:00
manager = PluginManager(module_path, plugin_dir)
_managers.append(manager)
return manager.load_all_plugins()
2021-11-08 01:02:35 +08:00
def load_from_json(file_path: str, encoding: str = "utf-8") -> Set[Plugin]:
"""
2022-01-12 18:19:21 +08:00
导入指定 json 文件中的 `plugins` 以及 `plugin_dirs` 下多个插件 `_` 开头的插件不会被导入
2021-11-08 01:02:35 +08:00
2022-01-12 18:31:12 +08:00
参数:
2022-01-12 19:10:29 +08:00
file_path: 指定 json 文件路径
encoding: 指定 json 文件编码
"""
2021-11-08 01:02:35 +08:00
with open(file_path, "r", encoding=encoding) as f:
data = json.load(f)
plugins = data.get("plugins")
plugin_dirs = data.get("plugin_dirs")
assert isinstance(plugins, list), "plugins must be a list of plugin name"
assert isinstance(plugin_dirs, list), "plugin_dirs must be a list of directories"
2021-11-08 01:02:35 +08:00
return load_all_plugins(set(plugins), set(plugin_dirs))
def load_from_toml(file_path: str, encoding: str = "utf-8") -> Set[Plugin]:
"""
2022-01-12 18:19:21 +08:00
导入指定 toml 文件 `[tool.nonebot]` 中的 `plugins` 以及 `plugin_dirs` 下多个插件
`_` 开头的插件不会被导入
2021-11-08 01:02:35 +08:00
2022-01-12 18:31:12 +08:00
参数:
2022-01-12 19:10:29 +08:00
file_path: 指定 toml 文件路径
encoding: 指定 toml 文件编码
"""
2021-11-08 01:02:35 +08:00
with open(file_path, "r", encoding=encoding) as f:
data = tomlkit.parse(f.read()) # type: ignore
nonebot_data = data.get("tool", {}).get("nonebot")
2021-11-08 01:02:35 +08:00
if not nonebot_data:
nonebot_data = data.get("nonebot", {}).get("plugins")
if nonebot_data:
warnings.warn(
"[nonebot.plugins] table are now deprecated. Use [tool.nonebot] instead.",
DeprecationWarning,
)
else:
raise ValueError("Cannot find '[tool.nonebot]' in given toml file!")
2021-11-08 01:02:35 +08:00
plugins = nonebot_data.get("plugins", [])
plugin_dirs = nonebot_data.get("plugin_dirs", [])
assert isinstance(plugins, list), "plugins must be a list of plugin name"
assert isinstance(plugin_dirs, list), "plugin_dirs must be a list of directories"
2021-11-11 17:33:30 +08:00
return load_all_plugins(plugins, plugin_dirs)
2021-11-08 01:02:35 +08:00
2022-01-10 22:52:10 +08:00
def load_builtin_plugin(name: str) -> Optional[Plugin]:
2021-11-08 01:02:35 +08:00
"""
2022-01-12 18:16:05 +08:00
导入 NoneBot 内置插件
2021-11-08 01:02:35 +08:00
"""
return load_plugin(f"nonebot.plugins.{name}")
2022-01-10 22:52:10 +08:00
def load_builtin_plugins(*plugins) -> Set[Plugin]:
"""
2022-01-12 18:16:05 +08:00
导入多个 NoneBot 内置插件
2022-01-10 22:52:10 +08:00
"""
return load_all_plugins([f"nonebot.plugins.{p}" for p in plugins], [])
2021-11-11 17:33:30 +08:00
def require(name: str) -> Export:
2021-11-08 01:02:35 +08:00
"""
2022-01-12 18:16:05 +08:00
获取一个插件的导出内容
2021-11-08 01:02:35 +08:00
2022-01-12 18:31:12 +08:00
参数:
2022-01-12 19:10:29 +08:00
name: 插件名 `load_plugin` 参数一致如果为 `load_plugins` 导入的插件则为文件()
2021-11-08 01:02:35 +08:00
2022-01-12 18:45:35 +08:00
异常:
2022-01-12 19:10:29 +08:00
RuntimeError: 插件无法加载
2021-11-08 01:02:35 +08:00
"""
plugin = get_plugin(name) or load_plugin(name)
if not plugin:
raise RuntimeError(f'Cannot load plugin "{name}"!')
2021-11-08 01:02:35 +08:00
return plugin.export