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