mirror of
				https://github.com/nonebot/nonebot2.git
				synced 2025-11-04 00:46:43 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			72 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
"""本模块定义插件对象。
 | 
						|
 | 
						|
FrontMatter:
 | 
						|
    sidebar_position: 3
 | 
						|
    description: nonebot.plugin.plugin 模块
 | 
						|
"""
 | 
						|
from types import ModuleType
 | 
						|
from dataclasses import field, dataclass
 | 
						|
from typing import TYPE_CHECKING, Set, Dict, Type, Optional
 | 
						|
 | 
						|
from nonebot.matcher import Matcher
 | 
						|
 | 
						|
from .export import Export
 | 
						|
 | 
						|
if TYPE_CHECKING:
 | 
						|
    from .manager import PluginManager
 | 
						|
 | 
						|
plugins: Dict[str, "Plugin"] = {}
 | 
						|
"""已加载的插件"""
 | 
						|
 | 
						|
 | 
						|
@dataclass(eq=False)
 | 
						|
class Plugin(object):
 | 
						|
    """存储插件信息"""
 | 
						|
 | 
						|
    name: str
 | 
						|
    """插件名称,使用 文件/文件夹 名称作为插件名"""
 | 
						|
    module: ModuleType
 | 
						|
    """插件模块对象"""
 | 
						|
    module_name: str
 | 
						|
    """点分割模块路径"""
 | 
						|
    manager: "PluginManager"
 | 
						|
    """导入该插件的插件管理器"""
 | 
						|
    export: Export = field(default_factory=Export)
 | 
						|
    """插件内定义的导出内容"""
 | 
						|
    matcher: Set[Type[Matcher]] = field(default_factory=set)
 | 
						|
    """插件内定义的 `Matcher`"""
 | 
						|
    parent_plugin: Optional["Plugin"] = None
 | 
						|
    """父插件"""
 | 
						|
    sub_plugins: Set["Plugin"] = field(default_factory=set)
 | 
						|
    """子插件集合"""
 | 
						|
 | 
						|
 | 
						|
def get_plugin(name: str) -> Optional[Plugin]:
 | 
						|
    """获取已经导入的某个插件。
 | 
						|
 | 
						|
    如果为 `load_plugins` 文件夹导入的插件,则为文件(夹)名。
 | 
						|
 | 
						|
    参数:
 | 
						|
        name: 插件名,即 {ref}`nonebot.plugin.plugin.Plugin.name`。
 | 
						|
    """
 | 
						|
    return plugins.get(name)
 | 
						|
 | 
						|
 | 
						|
def get_loaded_plugins() -> Set[Plugin]:
 | 
						|
    """获取当前已导入的所有插件。"""
 | 
						|
    return set(plugins.values())
 | 
						|
 | 
						|
 | 
						|
def _new_plugin(fullname: str, module: ModuleType, manager: "PluginManager") -> Plugin:
 | 
						|
    name = fullname.rsplit(".", 1)[-1] if "." in fullname else fullname
 | 
						|
    if name in plugins:
 | 
						|
        raise RuntimeError("Plugin already exists! Check your plugin name.")
 | 
						|
    plugin = Plugin(name, module, fullname, manager)
 | 
						|
    return plugin
 | 
						|
 | 
						|
 | 
						|
def _confirm_plugin(plugin: Plugin) -> None:
 | 
						|
    if plugin.name in plugins:
 | 
						|
        raise RuntimeError("Plugin already exists! Check your plugin name.")
 | 
						|
    plugins[plugin.name] = plugin
 |