aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/HydroRollCore/rule.py
diff options
context:
space:
mode:
author简律纯 <i@jyunko.cn>2023-08-13 12:28:01 +0800
committer简律纯 <i@jyunko.cn>2023-08-13 12:28:01 +0800
commit697e9157669e467f41c5cd4b542aee861b320712 (patch)
tree5e19c64615e5ae76a4dea5adecf2dffdb0f315b1 /HydroRollCore/rule.py
parent72fbe4b835ea6cf5664e3ade112fd47e33fde880 (diff)
downloadinfini-697e9157669e467f41c5cd4b542aee861b320712.tar.gz
infini-697e9157669e467f41c5cd4b542aee861b320712.zip
refactor: brandly new edition
Diffstat (limited to 'HydroRollCore/rule.py')
-rw-r--r--HydroRollCore/rule.py79
1 files changed, 19 insertions, 60 deletions
diff --git a/HydroRollCore/rule.py b/HydroRollCore/rule.py
index 8a72c8c6..8e10b18b 100644
--- a/HydroRollCore/rule.py
+++ b/HydroRollCore/rule.py
@@ -1,22 +1,14 @@
-"""iamai 插件。
-
-所有 iamai 插件的基类。所有用户编写的插件必须继承自 `Plugin` 类。
-"""
-from enum import Enum
from abc import ABC, abstractmethod
-from typing import TYPE_CHECKING, Type, Generic, NoReturn, Optional
-
-from hydrorollcore.config import ConfigModel
-from hydrorollcore.utils import is_config_class
-from hydrorollcore.typing import T_Event, T_State, T_Config
-from hydrorollcore.exceptions import SkipException, StopException
+import os, os.path
+from enum import Enum
+from iamai.config import ConfigModel
+from iamai.utils import is_config_class
+from typing import Generic, NoReturn, Optional, Type, TYPE_CHECKING
+from HydroRoll.typing import T_Event, T_Config
if TYPE_CHECKING:
from iamai.bot import Bot
-
-__all__ = ["Rule", "RuleLoadType"]
-
-
+
class RuleLoadType(Enum):
"""插件加载类型。"""
@@ -24,35 +16,32 @@ class RuleLoadType(Enum):
NAME = "name"
FILE = "file"
CLASS = "class"
+
-
-class Rule(ABC, Generic[T_Event, T_State, T_Config]):
+class Rule(ABC, Generic[T_Event, T_Config]):
"""所有 iamai 插件的基类。
Attributes:
event: 当前正在被此插件处理的事件。
priority: 插件的优先级,数字越小表示优先级越高,默认为 0。
block: 插件执行结束后是否阻止事件的传播。True 表示阻止。
- __plugin_load_type__: 插件加载类型,由 iamai 自动设置,反映了此插件是如何被加载的。
- __plugin_file_path__: 当插件加载类型为 `PluginLoadType.CLASS` 时为 `None`,
+ __rule_load_type__: 插件加载类型,由 iamai 自动设置,反映了此插件是如何被加载的。
+ __rule_file_path__: 当插件加载类型为 `RuleLoadType.CLASS` 时为 `None`,
否则为定义插件在的 Python 模块的位置。
"""
event: T_Event
priority: int = 0
- block: bool = False
Config: Type[ConfigModel]
- __plugin_load_type__: PluginLoadType
- __plugin_file_path__: Optional[str]
+ __rule_load_type__: RuleLoadType
+ __rule_file_path__: Optional[str]
def __init__(self, event: T_Event):
self.event = event
if not hasattr(self, "priority"):
self.priority = 0
- if not hasattr(self, "block"):
- self.block = False
self.get = self.bot.get
@@ -64,48 +53,18 @@ class Rule(ABC, Generic[T_Event, T_State, T_Config]):
@property
def name(self) -> str:
- """插件类名称。"""
+ """规则类名称。"""
return self.__class__.__name__
@property
def bot(self) -> "Bot":
"""机器人对象。"""
return self.event.adapter.bot
-
+
@property
def config(self) -> Optional[T_Config]:
- """插件配置。"""
- config_class: ConfigModel = getattr(self, "Config", None)
+ """规则包配置。"""
+ config_class: ConfigModel = getattr(self, "Rule", None)
if is_config_class(config_class):
- return getattr(self.bot.config.plugin, config_class.__config_name__, None)
- return None
-
- def stop(self) -> NoReturn:
- """停止当前事件传播。"""
- raise StopException()
-
- def skip(self) -> NoReturn:
- """跳过自身继续当前事件传播。"""
- raise SkipException()
-
- @property
- def state(self) -> T_State:
- """插件状态。"""
- return self.bot.plugin_state[self.name]
-
- @state.setter
- def state(self, value: T_State):
- self.bot.plugin_state[self.name] = value
-
- @abstractmethod
- async def handle(self) -> None:
- """处理事件的方法。当 `rule()` 方法返回 `True` 时 iamai 会调用此方法。每个插件必须实现此方法。"""
- raise NotImplementedError
-
- @abstractmethod
- async def rule(self) -> bool:
- """匹配事件的方法。事件处理时,会按照插件的优先级依次调用此方法,当此方法返回 `True` 时将事件交由此插件处理。每个插件必须实现此方法。
-
- 注意:不建议直接在此方法内实现对事件的处理,事件的具体处理请交由 `handle()` 方法。
- """
- raise NotImplementedError \ No newline at end of file
+ return getattr(self.config.rule, config_class.__config_name__, None)
+ return None \ No newline at end of file