aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/infini/__init__.py8
-rw-r--r--src/infini/__main__.py40
-rw-r--r--src/infini/cli.py45
-rw-r--r--src/infini/consts/templates.py6
-rw-r--r--src/infini/event.py7
-rw-r--r--src/infini/exceptions.py8
-rw-r--r--src/infini/handler.py52
-rw-r--r--src/infini/logging.py11
-rw-r--r--src/infini/manager.py18
-rw-r--r--src/infini/matcher.py41
-rw-r--r--src/infini/rule.py75
-rw-r--r--src/infini/utils/cli.py13
-rw-r--r--src/infini/utils/gui.py2
-rw-r--r--src/test.py4
14 files changed, 168 insertions, 162 deletions
diff --git a/src/infini/__init__.py b/src/infini/__init__.py
index 9c88b4f9..5f6d1105 100644
--- a/src/infini/__init__.py
+++ b/src/infini/__init__.py
@@ -1,6 +1,4 @@
-from infini.cli import Cli
-from infini.rule import Rule, Result, Dice
-from infini.typing import Config as ConfigTyping
-from infini.event import Event
+from infini.handler import Handler, Result
+from infini.event import MessageEvent
-__all__ = ["Rule", "Cli", "Result", "Dice", "Event", "ConfigTyping"]
+__all__ = ["Handler", "Result", "MessageEvent"]
diff --git a/src/infini/__main__.py b/src/infini/__main__.py
new file mode 100644
index 00000000..b7a282e9
--- /dev/null
+++ b/src/infini/__main__.py
@@ -0,0 +1,40 @@
+from pathlib import Path
+from .utils.cli import parse_args
+from .consts import templates
+from .logging import logger
+
+import os
+import importlib
+import sys
+
+
+def main():
+ args = parse_args()
+
+ if args.gui:
+ logger.critical("选项[--gui]尚未被支持!")
+ sys.exit(1)
+
+ path = Path(args.path).resolve() if args.path else Path(os.getcwd()).resolve()
+ if args.new and args.run:
+ logger.error("无法确定的指令要求: 你同时指定了new与run指令。")
+ sys.exit(1)
+
+ if args.new:
+ if path.exists():
+ logger.error("指定的文件夹已经存在!")
+ sys.exit(1)
+
+ path.mkdir(parents=True, exist_ok=True)
+ (path / "rule.py").write_text(templates.RULE, encoding="utf-8")
+ (path / "event.py").write_text(templates.EVENT, encoding="utf-8")
+ (path / "dice.py").write_text(templates.DICE, encoding="utf-8")
+
+ logger.success("HydroRoll 规则包模板已创建!")
+
+ if args.run:
+ sys.path.append(str(path))
+ importlib.import_module("event")
+
+if __name__ == "__main__":
+ main() \ No newline at end of file
diff --git a/src/infini/cli.py b/src/infini/cli.py
deleted file mode 100644
index e372b4b4..00000000
--- a/src/infini/cli.py
+++ /dev/null
@@ -1,45 +0,0 @@
-from pathlib import Path
-from .consts import templates
-from .logging import logger
-
-import argparse
-import os
-import sys
-import importlib
-
-
-class Cli:
- def parse_args(self, argv: list[str] | None = None):
- parser = argparse.ArgumentParser(description="HydroRoll 命令行工具")
-
- parser.add_argument("--new", action="store_true", help="创建一个 HydroRoll 规则包模板")
- parser.add_argument("--run", action="store_true", help="运行 HydroRoll 规则包")
- parser.add_argument("--gui", action="store_true", help="显示弹窗")
- parser.add_argument("--path", help="指定路径")
-
- args = parser.parse_args(argv if argv else sys.argv[1:])
-
- if args.gui:
- logger.critical("选项[--gui]尚未被支持!")
- sys.exit(1)
-
- path = Path(args.path).resolve() if args.path else Path(os.getcwd()).resolve()
- if args.new and args.run:
- logger.error("无法确定的指令要求: 你同时指定了new与run指令。")
- sys.exit(1)
-
- if args.new:
- if path.exists():
- logger.error("指定的文件夹已经存在!")
- sys.exit(1)
-
- path.mkdir(parents=True, exist_ok=True)
- (path / "rule.py").write_text(templates.RULE, encoding="utf-8")
- (path / "event.py").write_text(templates.EVENT, encoding="utf-8")
- (path / "dice.py").write_text(templates.DICE, encoding="utf-8")
-
- logger.success("HydroRoll 规则包模板已创建!")
-
- if args.run:
- sys.path.append(str(path))
- importlib.import_module("event")
diff --git a/src/infini/consts/templates.py b/src/infini/consts/templates.py
index e2edc2d6..f645d822 100644
--- a/src/infini/consts/templates.py
+++ b/src/infini/consts/templates.py
@@ -1,7 +1,7 @@
-RULE = """from infini import Rule, Result, Dice
+RULE = """from infini import Handler, Result
-class MyRule(Rule):
+class HandlerRule(Handler):
\"\"\"自设规则包\"\"\"
name = "MyRule"
@@ -10,7 +10,7 @@ class MyRule(Rule):
def __init__(self) -> None:
\"\"\"初始化你的规则包\"\"\"
- def check(self, dice: Dice) -> Result:
+ def check(self) -> Result:
\"\"\"声明规则包检定方式\"\"\"
return Result("myevent.event1", True)
"""
diff --git a/src/infini/event.py b/src/infini/event.py
index 9ce34bd9..21dc724c 100644
--- a/src/infini/event.py
+++ b/src/infini/event.py
@@ -1,9 +1,10 @@
+from abc import ABCMeta
from .typing import Dict
from .logging import logger
import re
-__all__ = ["Event", "events"]
+__all__ = ["MessageEvent", "events"]
class Events:
@@ -30,8 +31,8 @@ class Events:
return string
-class Event:
- """事件基类"""
+class MessageEvent(metaclass=ABCMeta):
+ """消息事件基类"""
name: str
output: str
diff --git a/src/infini/exceptions.py b/src/infini/exceptions.py
index 62c88fa1..2ca7dfdb 100644
--- a/src/infini/exceptions.py
+++ b/src/infini/exceptions.py
@@ -4,3 +4,11 @@ class HydroError(Exception):
class RuleLoadError(HydroError):
"""规则导入错误"""
+
+
+class EventError(HydroError):
+ """事件处理时异常"""
+
+
+class UnknownMatcherEvent(EventError):
+ """未知的给入实现"""
diff --git a/src/infini/handler.py b/src/infini/handler.py
new file mode 100644
index 00000000..fb6d50e5
--- /dev/null
+++ b/src/infini/handler.py
@@ -0,0 +1,52 @@
+from abc import ABCMeta, abstractmethod
+from .exceptions import HydroError
+from .typing import Dict, Callable
+
+
+__all__ = ["Result", "Handler"]
+
+
+class Result(metaclass=ABCMeta):
+ """规则包运行结果基类"""
+
+ event: str
+ status: bool
+ exception: HydroError | None = None
+
+ def __init__(self, event: str, status: bool, exception: HydroError | None) -> None:
+ self.event = event
+ self.status = status
+ self.exception = exception
+
+ def ok(self):
+ """规则执行期间是否产生异常"""
+ return isinstance(self.exception, HydroError)
+
+
+class Handler(metaclass=ABCMeta):
+ """规则包业务基类"""
+
+ name: str
+ priority: int = 0
+
+ def __init_subclass__(cls) -> None:
+ handlers.regist(cls.name, cls.process)
+
+ @abstractmethod
+ def process(self) -> Result:
+ raise NotImplementedError
+
+
+class Handlers:
+ """规则包业务集合"""
+
+ _handlers: Dict[str, Callable] = {}
+
+ def regist(self, name: str, handler: Callable) -> None:
+ self._handlers[name.lower()] = handler
+
+ def match(self, name: str) -> Callable | None:
+ return self._handlers.get(name.lower())
+
+
+handlers = Handlers()
diff --git a/src/infini/logging.py b/src/infini/logging.py
index a1458ef4..1346c7f7 100644
--- a/src/infini/logging.py
+++ b/src/infini/logging.py
@@ -1,6 +1,6 @@
-"""infini 日志。
+"""Infini 日志。
-infini 使用 [loguru](https://github.com/Delgan/loguru) 来记录日志信息。
+Infini 使用 [loguru](https://github.com/Delgan/loguru) 来记录日志信息。
自定义 logger 请参考 [loguru](https://github.com/Delgan/loguru) 文档。
"""
from datetime import datetime
@@ -26,13 +26,6 @@ logger.add(
def error_or_exception(message: str, exception: Exception, verbose: bool = True):
- # 弃用的方法
- # logger.remove()
- # logger.add(
- # sys.stderr,
- # format="<magenta>{time:YYYY-MM-DD HH:mm:ss.SSS}</magenta> <level>[{level}]</level> > <cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - <level>{message}</level>",
- # )
-
if verbose:
logger.exception(exception)
logger.critical(message)
diff --git a/src/infini/manager.py b/src/infini/manager.py
deleted file mode 100644
index 42e79563..00000000
--- a/src/infini/manager.py
+++ /dev/null
@@ -1,18 +0,0 @@
-from .event import Events, events
-from .logging import logger
-from .typing import Dict
-
-
-class Manager:
- """事件处理单元"""
-
- events: Events
-
- def __init__(self, _events: Events = None) -> None:
- self.events = _events if _events else events
-
- def roll(self):
- ...
-
-
-manager = Manager()
diff --git a/src/infini/matcher.py b/src/infini/matcher.py
new file mode 100644
index 00000000..635d8ad7
--- /dev/null
+++ b/src/infini/matcher.py
@@ -0,0 +1,41 @@
+from .event import Events, events
+from .handler import Handlers, Result
+from .exceptions import UnknownMatcherEvent
+from .typing import Callable
+
+
+class MatcherEvent:
+ """Matcher 事件"""
+
+ name: str
+ kwargs: dict
+
+ def __init__(self, name: str, **kwargs):
+ self.name = name
+ self.kwargs = kwargs
+
+ def __repr__(self) -> str:
+ return f"<MatcherEvent [{self.name}]>"
+
+
+class Matcher:
+ """事件处理单元"""
+
+ events: Events
+ handlers: Handlers
+
+ def __init__(self, _events: Events | None = None) -> None:
+ self.events = _events if _events else events
+
+ def match(self, name: str) -> Callable:
+ if handler := self.handlers.match(name):
+ return handler
+ else:
+ raise UnknownMatcherEvent(f"未知的规则包: {name}")
+
+ def run(self, event: MatcherEvent) -> str:
+ result: Result = self.match(event.name)()
+ return self.events.process(result.event, **event.kwargs)
+
+
+matcher = Matcher()
diff --git a/src/infini/rule.py b/src/infini/rule.py
deleted file mode 100644
index a1f04151..00000000
--- a/src/infini/rule.py
+++ /dev/null
@@ -1,75 +0,0 @@
-from abc import ABCMeta, abstractmethod
-from enum import Enum
-from .exceptions import HydroError
-from .typing import Dict
-
-__all__ = ["RuleLoadType", "Result", "Dice", "Rule"]
-
-
-class RuleLoadType(Enum):
- """The Type Of Rules To Be Loaded"""
-
- DIR = "dir"
- NAME = "name"
- FILE = "file"
- CLASS = "class"
-
-
-class Result(metaclass=ABCMeta):
- """规则检定结果基类"""
-
- event: str
- status: bool
- exception: HydroError | None = None
-
- def __init__(self, event: str, status: bool, exception: HydroError | None) -> None:
- self.event = event
- self.status = status
- self.exception = exception
-
- def ok(self):
- """规则执行期间是否产生异常"""
- return isinstance(self.exception, HydroError)
-
-
-class Dice(metaclass=ABCMeta):
- """掷骰基类"""
-
- roll_string: str
- db: str
- outcome: int
-
- def __repr__(self) -> str:
- return f'<HydroDice "{self.db.upper()}">'
-
- def __str__(self) -> str:
- return self.db.upper()
-
- def __int__(self) -> int:
- return self.outcome
-
- @abstractmethod
- def parse(self) -> "Dice":
- """解析传入的掷骰字符串`roll_string`,返回一个`Dice`对象"""
- raise NotImplementedError
-
- @abstractmethod
- def roll(self) -> int:
- """掷骰方法,返回掷骰结果"""
- raise NotImplementedError
-
-
-class Rule(metaclass=ABCMeta):
- """规则基类"""
-
- name: str
- dices: Dict[str, str] = {}
- priority: int = 0
-
- @abstractmethod
- def __init__(self) -> None:
- raise NotImplementedError
-
- @abstractmethod
- def check(self, dice: Dice) -> Result:
- raise NotImplementedError
diff --git a/src/infini/utils/cli.py b/src/infini/utils/cli.py
new file mode 100644
index 00000000..ea886de7
--- /dev/null
+++ b/src/infini/utils/cli.py
@@ -0,0 +1,13 @@
+import argparse
+import sys
+
+def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
+ parser = argparse.ArgumentParser(description="HydroRoll 命令行工具")
+
+ parser.add_argument("--new", action="store_true", help="创建一个 HydroRoll 规则包模板")
+ parser.add_argument("--run", action="store_true", help="运行 HydroRoll 规则包")
+ parser.add_argument("--gui", action="store_true", help="显示弹窗")
+ parser.add_argument("--path", help="指定路径")
+
+ args = parser.parse_args(argv if argv else sys.argv[1:])
+ return args \ No newline at end of file
diff --git a/src/infini/utils/gui.py b/src/infini/utils/gui.py
new file mode 100644
index 00000000..d7bc24ae
--- /dev/null
+++ b/src/infini/utils/gui.py
@@ -0,0 +1,2 @@
+"""Infini 核心图形界面"""
+# TODO
diff --git a/src/test.py b/src/test.py
deleted file mode 100644
index 349b1bfd..00000000
--- a/src/test.py
+++ /dev/null
@@ -1,4 +0,0 @@
-import infini
-
-client = infini.Cli()
-client.parse_args()