diff --git a/nonebot/matcher.py b/nonebot/matcher.py index d59b8871..b3206e1a 100644 --- a/nonebot/matcher.py +++ b/nonebot/matcher.py @@ -5,8 +5,6 @@ 该模块实现事件响应器的创建与运行,并提供一些快捷方法来帮助用户更好的与机器人进行对话 。 """ -import sys -import inspect from functools import wraps from datetime import datetime from contextvars import ContextVar diff --git a/nonebot/plugin/__init__.py b/nonebot/plugin/__init__.py index b17a8190..1e61d8e1 100644 --- a/nonebot/plugin/__init__.py +++ b/nonebot/plugin/__init__.py @@ -8,6 +8,7 @@ import re import json from types import ModuleType from dataclasses import dataclass +from collections import defaultdict from contextvars import Context, ContextVar, copy_context from typing import Any, Set, List, Dict, Type, Tuple, Union, Optional, TYPE_CHECKING @@ -33,7 +34,7 @@ PLUGIN_NAMESPACE = "nonebot.loaded_plugins" _export: ContextVar["Export"] = ContextVar("_export") # FIXME: tmp matchers context var will be removed -_tmp_matchers: ContextVar[Set[Type[Matcher]]] = ContextVar("_tmp_matchers") +_plugin_matchers: Dict[str, Set[Type[Matcher]]] = defaultdict(set) class Export(dict): @@ -93,17 +94,25 @@ class Plugin(object): - **类型**: ``ModuleType`` - **说明**: 插件模块对象 """ - matcher: Set[Type[Matcher]] - """ - - **类型**: ``Set[Type[Matcher]]`` - - **说明**: 插件内定义的 ``Matcher`` - """ export: Export """ - **类型**: ``Export`` - **说明**: 插件内定义的导出内容 """ + @property + def matcher(self) -> Set[Type[Matcher]]: + """ + - **类型**: ``Set[Type[Matcher]]`` + - **说明**: 插件内定义的 ``Matcher`` + """ + return _plugin_matchers[self.name] + + +def _store_matcher(matcher: Type[Matcher]): + plugin_name = matcher.module.split(".", maxsplit=1)[0] + _plugin_matchers[plugin_name].add(matcher) + def on(type: str = "", rule: Optional[Union[Rule, T_RuleChecker]] = None, @@ -146,7 +155,7 @@ def on(type: str = "", module=_current_plugin.get(), default_state=state, default_state_factory=state_factory) - _tmp_matchers.get().add(matcher) + _store_matcher(matcher) return matcher @@ -188,7 +197,7 @@ def on_metaevent( module=_current_plugin.get(), default_state=state, default_state_factory=state_factory) - _tmp_matchers.get().add(matcher) + _store_matcher(matcher) return matcher @@ -231,7 +240,7 @@ def on_message(rule: Optional[Union[Rule, T_RuleChecker]] = None, module=_current_plugin.get(), default_state=state, default_state_factory=state_factory) - _tmp_matchers.get().add(matcher) + _store_matcher(matcher) return matcher @@ -272,7 +281,7 @@ def on_notice(rule: Optional[Union[Rule, T_RuleChecker]] = None, module=_current_plugin.get(), default_state=state, default_state_factory=state_factory) - _tmp_matchers.get().add(matcher) + _store_matcher(matcher) return matcher @@ -313,7 +322,7 @@ def on_request(rule: Optional[Union[Rule, T_RuleChecker]] = None, module=_current_plugin.get(), default_state=state, default_state_factory=state_factory) - _tmp_matchers.get().add(matcher) + _store_matcher(matcher) return matcher @@ -957,7 +966,6 @@ def _load_plugin(manager: PluginManager, plugin_name: str) -> Optional[Plugin]: if plugin_name.startswith("_"): return None - _tmp_matchers.set(set()) _export.set(Export()) if plugin_name in plugins: @@ -966,8 +974,7 @@ def _load_plugin(manager: PluginManager, plugin_name: str) -> Optional[Plugin]: try: module = manager.load_plugin(plugin_name) - # FIXME: store matchers using new method - plugin = Plugin(plugin_name, module, _tmp_matchers.get(), _export.get()) + plugin = Plugin(plugin_name, module, _export.get()) plugins[plugin_name] = plugin logger.opt( colors=True).info(f'Succeeded to import "{plugin_name}"') @@ -1038,39 +1045,11 @@ def load_all_plugins(module_path: Set[str], - ``Set[Plugin]`` """ - - def _load_plugin(plugin_name: str) -> Optional[Plugin]: - if plugin_name.startswith("_"): - return None - - _tmp_matchers.set(set()) - _export.set(Export()) - - if plugin_name in plugins: - return None - - try: - module = manager.load_plugin(plugin_name) - - for m in _tmp_matchers.get(): - m.module = plugin_name - plugin = Plugin(plugin_name, module, _tmp_matchers.get(), - _export.get()) - plugins[plugin_name] = plugin - logger.opt( - colors=True).info(f'Succeeded to import "{plugin_name}"') - return plugin - except Exception as e: - logger.opt(colors=True, exception=e).error( - f'Failed to import "{plugin_name}"' - ) - return None - loaded_plugins = set() manager = PluginManager(PLUGIN_NAMESPACE, module_path, plugin_dir) for plugin_name in manager.list_plugins(): context: Context = copy_context() - result = context.run(_load_plugin, plugin_name) + result = context.run(_load_plugin, manager, plugin_name) if result: loaded_plugins.add(result) return loaded_plugins