From 627b435ea364c538463f220b4e48daa40ad64b19 Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Sun, 10 Dec 2023 23:36:45 +0800 Subject: :sparkles: 实现消息事件 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/.gitignore | 2 ++ src/hydrorollcore/__init__.py | 4 +++- src/hydrorollcore/cli.py | 5 +++++ src/hydrorollcore/event.py | 43 ++++++++++++++++++++++++++++++++++++++----- src/hydrorollcore/typing.py | 1 + src/test.py | 4 ++++ 6 files changed, 53 insertions(+), 6 deletions(-) create mode 100644 src/.gitignore create mode 100644 src/test.py diff --git a/src/.gitignore b/src/.gitignore new file mode 100644 index 00000000..3119f231 --- /dev/null +++ b/src/.gitignore @@ -0,0 +1,2 @@ +logs/ +test/ \ No newline at end of file diff --git a/src/hydrorollcore/__init__.py b/src/hydrorollcore/__init__.py index 7a2bba77..12d44f21 100644 --- a/src/hydrorollcore/__init__.py +++ b/src/hydrorollcore/__init__.py @@ -2,5 +2,7 @@ from HydroRollCore.cli import Cli from HydroRollCore.config import Config from HydroRollCore.rule import Rule, Result, Dice from HydroRollCore.core import Core +from HydroRollCore.typing import Config as ConfigTyping +from HydroRollCore.event import Event -__all__ = ["Core", "Rule", "Config", "Cli", "Result", "Dice"] +__all__ = ["Core", "Rule", "Config", "Cli", "Result", "Dice", "Event", "ConfigTyping"] diff --git a/src/hydrorollcore/cli.py b/src/hydrorollcore/cli.py index 41743ce8..0b906f25 100644 --- a/src/hydrorollcore/cli.py +++ b/src/hydrorollcore/cli.py @@ -5,6 +5,7 @@ from .log import logger import argparse import os import sys +import importlib class Cli: @@ -42,3 +43,7 @@ class Cli: (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/hydrorollcore/event.py b/src/hydrorollcore/event.py index e8edeb98..bec0399e 100644 --- a/src/hydrorollcore/event.py +++ b/src/hydrorollcore/event.py @@ -1,12 +1,45 @@ -from abc import ABCMeta +from .typing import Dict +from .log import logger +import re -class Event(metaclass=ABCMeta): +__all__ = ["Event", "events"] + + +class Events: + """事件集合""" + + _events: Dict[str, str] = {} + + def regist(self, name: str, output: str) -> None: + self._events[name.lower()] = output + + def process(self, name: str, **kwargs) -> str: + string = self._events.get(name.lower()) + if not string: + logger.warning(f"事件[{name.lower()}]不存在,将返回空字符串!") + return "" + else: + return self._format(string, **kwargs) + + def _format(self, string: str, **kwargs): + pattern = r"{(.*?)}" + values = re.findall(pattern, string) + for value in values: + kwarg = kwargs.get(value) + value = kwarg if kwarg else "" + string = re.sub(pattern, value, string) + return string + + +class Event: """事件基类""" name: str output: str - def __init__(self, name: str, output: str) -> None: - self.name = name - self.output = output + def __init_subclass__(cls) -> None: + events.regist(cls.name, cls.output) + + +events = Events() diff --git a/src/hydrorollcore/typing.py b/src/hydrorollcore/typing.py index d22e3e18..333a763b 100644 --- a/src/hydrorollcore/typing.py +++ b/src/hydrorollcore/typing.py @@ -1,5 +1,6 @@ from pydantic import BaseModel from typing import ( + Dict as Dict, TYPE_CHECKING as TYPE_CHECKING, TypeVar as TypeVar, Callable as Callable, diff --git a/src/test.py b/src/test.py new file mode 100644 index 00000000..370adb41 --- /dev/null +++ b/src/test.py @@ -0,0 +1,4 @@ +import HydroRollCore + +client = HydroRollCore.Cli() +client.parse_args() -- cgit v1.2.3-70-g09d2