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/hydrorollcore/event.py | 43 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 5 deletions(-) (limited to 'src/hydrorollcore/event.py') 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() -- cgit v1.2.3-70-g09d2 From 81cd8ab9d26d0560efd8238620a0c0152eb5b6b8 Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Mon, 11 Dec 2023 00:21:20 +0800 Subject: :recycle: 重构log.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hydrorollcore/__init__.py | 4 +--- src/hydrorollcore/cli.py | 2 +- src/hydrorollcore/event.py | 2 +- src/hydrorollcore/log.py | 40 ---------------------------------------- src/hydrorollcore/logging.py | 40 ++++++++++++++++++++++++++++++++++++++++ src/hydrorollcore/manager.py | 18 ++++++++++++++++++ src/hydrorollcore/rule.py | 2 ++ 7 files changed, 63 insertions(+), 45 deletions(-) delete mode 100644 src/hydrorollcore/log.py create mode 100644 src/hydrorollcore/logging.py create mode 100644 src/hydrorollcore/manager.py (limited to 'src/hydrorollcore/event.py') diff --git a/src/hydrorollcore/__init__.py b/src/hydrorollcore/__init__.py index 12d44f21..2aca9dd7 100644 --- a/src/hydrorollcore/__init__.py +++ b/src/hydrorollcore/__init__.py @@ -1,8 +1,6 @@ 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", "Event", "ConfigTyping"] +__all__ = ["Rule", "Cli", "Result", "Dice", "Event", "ConfigTyping"] diff --git a/src/hydrorollcore/cli.py b/src/hydrorollcore/cli.py index 0b906f25..51d8d983 100644 --- a/src/hydrorollcore/cli.py +++ b/src/hydrorollcore/cli.py @@ -1,6 +1,6 @@ from pathlib import Path from .consts import templates -from .log import logger +from .logging import logger import argparse import os diff --git a/src/hydrorollcore/event.py b/src/hydrorollcore/event.py index bec0399e..4e9c6611 100644 --- a/src/hydrorollcore/event.py +++ b/src/hydrorollcore/event.py @@ -1,5 +1,5 @@ from .typing import Dict -from .log import logger +from .logging import logger import re diff --git a/src/hydrorollcore/log.py b/src/hydrorollcore/log.py deleted file mode 100644 index a559561f..00000000 --- a/src/hydrorollcore/log.py +++ /dev/null @@ -1,40 +0,0 @@ -"""HydroRollCore 日志。 - -HydroRollCore 使用 [loguru](https://github.com/Delgan/loguru) 来记录日志信息。 -自定义 logger 请参考 [loguru](https://github.com/Delgan/loguru) 文档。 -""" -from datetime import datetime -from multilogging import multilogger -from pathlib import Path -from .settings import DEBUG - - -__all__ = ["logger", "error_or_exception"] - -logger = multilogger( - name="HydroRoll", payload="Core", level="DEBUG" if DEBUG else "INFO" -) -current_path = Path(__file__).resolve().parent -LOG_PATH = current_path / "logs" -if not LOG_PATH.exists(): - LOG_PATH.mkdir(parents=True, exist_ok=True) -logger.add( - sink=LOG_PATH / (datetime.now().strftime("%Y-%m-%d") + ".log"), - level="INFO", - rotation="10 MB", -) # 每个日志文件最大为 10MB - - -def error_or_exception(message: str, exception: Exception, verbose: bool = True): - # 弃用的方法 - # logger.remove() - # logger.add( - # sys.stderr, - # format="{time:YYYY-MM-DD HH:mm:ss.SSS} [{level}] > {name}:{function}:{line} - {message}", - # ) - - if verbose: - logger.exception(exception) - logger.critical(message) - else: - logger.critical(f"{message} {exception!r}") diff --git a/src/hydrorollcore/logging.py b/src/hydrorollcore/logging.py new file mode 100644 index 00000000..a559561f --- /dev/null +++ b/src/hydrorollcore/logging.py @@ -0,0 +1,40 @@ +"""HydroRollCore 日志。 + +HydroRollCore 使用 [loguru](https://github.com/Delgan/loguru) 来记录日志信息。 +自定义 logger 请参考 [loguru](https://github.com/Delgan/loguru) 文档。 +""" +from datetime import datetime +from multilogging import multilogger +from pathlib import Path +from .settings import DEBUG + + +__all__ = ["logger", "error_or_exception"] + +logger = multilogger( + name="HydroRoll", payload="Core", level="DEBUG" if DEBUG else "INFO" +) +current_path = Path(__file__).resolve().parent +LOG_PATH = current_path / "logs" +if not LOG_PATH.exists(): + LOG_PATH.mkdir(parents=True, exist_ok=True) +logger.add( + sink=LOG_PATH / (datetime.now().strftime("%Y-%m-%d") + ".log"), + level="INFO", + rotation="10 MB", +) # 每个日志文件最大为 10MB + + +def error_or_exception(message: str, exception: Exception, verbose: bool = True): + # 弃用的方法 + # logger.remove() + # logger.add( + # sys.stderr, + # format="{time:YYYY-MM-DD HH:mm:ss.SSS} [{level}] > {name}:{function}:{line} - {message}", + # ) + + if verbose: + logger.exception(exception) + logger.critical(message) + else: + logger.critical(f"{message} {exception!r}") diff --git a/src/hydrorollcore/manager.py b/src/hydrorollcore/manager.py new file mode 100644 index 00000000..83db77ce --- /dev/null +++ b/src/hydrorollcore/manager.py @@ -0,0 +1,18 @@ +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(roll_string: str): + ... + + +manager = Manager() diff --git a/src/hydrorollcore/rule.py b/src/hydrorollcore/rule.py index 127ed805..a1f04151 100644 --- a/src/hydrorollcore/rule.py +++ b/src/hydrorollcore/rule.py @@ -1,6 +1,7 @@ from abc import ABCMeta, abstractmethod from enum import Enum from .exceptions import HydroError +from .typing import Dict __all__ = ["RuleLoadType", "Result", "Dice", "Rule"] @@ -62,6 +63,7 @@ class Rule(metaclass=ABCMeta): """规则基类""" name: str + dices: Dict[str, str] = {} priority: int = 0 @abstractmethod -- cgit v1.2.3-70-g09d2 From 0a688b5105daf563baffedcfb21e16332fe4494e Mon Sep 17 00:00:00 2001 From: Sourcery AI <> Date: Sun, 10 Dec 2023 16:40:29 +0000 Subject: 'Refactored by Sourcery' --- src/hydrorollcore/event.py | 8 +++----- src/hydrorollcore/manager.py | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) (limited to 'src/hydrorollcore/event.py') diff --git a/src/hydrorollcore/event.py b/src/hydrorollcore/event.py index 4e9c6611..9ce34bd9 100644 --- a/src/hydrorollcore/event.py +++ b/src/hydrorollcore/event.py @@ -15,12 +15,10 @@ class Events: 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: + if string := self._events.get(name.lower()): return self._format(string, **kwargs) + logger.warning(f"事件[{name.lower()}]不存在,将返回空字符串!") + return "" def _format(self, string: str, **kwargs): pattern = r"{(.*?)}" diff --git a/src/hydrorollcore/manager.py b/src/hydrorollcore/manager.py index 83db77ce..42e79563 100644 --- a/src/hydrorollcore/manager.py +++ b/src/hydrorollcore/manager.py @@ -11,7 +11,7 @@ class Manager: def __init__(self, _events: Events = None) -> None: self.events = _events if _events else events - def roll(roll_string: str): + def roll(self): ... -- cgit v1.2.3-70-g09d2