diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/infini/__init__.py | 8 | ||||
| -rw-r--r-- | src/infini/__main__.py | 40 | ||||
| -rw-r--r-- | src/infini/cli.py | 45 | ||||
| -rw-r--r-- | src/infini/consts/templates.py | 6 | ||||
| -rw-r--r-- | src/infini/event.py | 7 | ||||
| -rw-r--r-- | src/infini/exceptions.py | 8 | ||||
| -rw-r--r-- | src/infini/handler.py | 52 | ||||
| -rw-r--r-- | src/infini/logging.py | 11 | ||||
| -rw-r--r-- | src/infini/manager.py | 18 | ||||
| -rw-r--r-- | src/infini/matcher.py | 41 | ||||
| -rw-r--r-- | src/infini/rule.py | 75 | ||||
| -rw-r--r-- | src/infini/utils/cli.py | 13 | ||||
| -rw-r--r-- | src/infini/utils/gui.py | 2 | ||||
| -rw-r--r-- | src/test.py | 4 |
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() |
