From 5b0a76e6832615f0275dd8deb1f1bf7c6e5eab3f Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Sun, 10 Dec 2023 21:16:08 +0800 Subject: :sparkles: 使用logger替代print MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hydrorollcore/cli.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'src/hydrorollcore/cli.py') diff --git a/src/hydrorollcore/cli.py b/src/hydrorollcore/cli.py index 8b03b60b..6daff17a 100644 --- a/src/hydrorollcore/cli.py +++ b/src/hydrorollcore/cli.py @@ -1,7 +1,6 @@ from pathlib import Path from .consts import templates - -# from tkinter import messagebox +from .log import logger import argparse import os @@ -9,18 +8,19 @@ import sys class Cli: - def parse_args(self): + def parse_args(self, args: list = 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("--gui", action="store_true", help="显示弹窗") parser.add_argument("--path", help="指定路径") - args = parser.parse_args() + args = parser.parse_args(args if args else sys.argv[1:]) - # if args.gui: - # messagebox.showinfo("提示", "这是一个弹窗!") + if args.gui: + logger.critical("选项[--gui]尚未被支持!") + sys.exit(1) if not args.path: path = Path(os.getcwd()).resolve() @@ -28,12 +28,12 @@ class Cli: path = Path(args.path).resolve() if args.new and args.run: - print("无法确定的指令要求: 你同时指定了new与run指令。") + logger.error("无法确定的指令要求: 你同时指定了new与run指令。") sys.exit(1) if args.new: if path.exists(): - print("指定的文件夹已经存在!") + logger.error("指定的文件夹已经存在!") sys.exit(1) path.mkdir(parents=True, exist_ok=True) @@ -41,4 +41,4 @@ class Cli: (path / "event.py").write_text(templates.EVENT) (path / "dice.py").write_text(templates.DICE) - print("HydroRoll 规则包模板已创建!") + logger.success("HydroRoll 规则包模板已创建!") -- cgit v1.2.3-70-g09d2 From d4378483f04635633d0106e0744e17c2221d73c5 Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Sun, 10 Dec 2023 21:19:28 +0800 Subject: :bug: 修复编码错误 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hydrorollcore/cli.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/hydrorollcore/cli.py') diff --git a/src/hydrorollcore/cli.py b/src/hydrorollcore/cli.py index 6daff17a..41743ce8 100644 --- a/src/hydrorollcore/cli.py +++ b/src/hydrorollcore/cli.py @@ -37,8 +37,8 @@ class Cli: sys.exit(1) path.mkdir(parents=True, exist_ok=True) - (path / "rule.py").write_text(templates.RULE) - (path / "event.py").write_text(templates.EVENT) - (path / "dice.py").write_text(templates.DICE) + (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 规则包模板已创建!") -- cgit v1.2.3-70-g09d2 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 (limited to 'src/hydrorollcore/cli.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 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/cli.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 1d7fc0e7ee206841ed298e607a26c808f64f3919 Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Mon, 11 Dec 2023 00:40:11 +0800 Subject: :bug: 修复cli.py类型问题 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hydrorollcore/cli.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/hydrorollcore/cli.py') diff --git a/src/hydrorollcore/cli.py b/src/hydrorollcore/cli.py index 79b75f33..e372b4b4 100644 --- a/src/hydrorollcore/cli.py +++ b/src/hydrorollcore/cli.py @@ -9,7 +9,7 @@ import importlib class Cli: - def parse_args(self, args: list = None): + def parse_args(self, argv: list[str] | None = None): parser = argparse.ArgumentParser(description="HydroRoll 命令行工具") parser.add_argument("--new", action="store_true", help="创建一个 HydroRoll 规则包模板") @@ -17,7 +17,7 @@ class Cli: parser.add_argument("--gui", action="store_true", help="显示弹窗") parser.add_argument("--path", help="指定路径") - args = parser.parse_args(args if args else sys.argv[1:]) + args = parser.parse_args(argv if argv else sys.argv[1:]) if args.gui: logger.critical("选项[--gui]尚未被支持!") -- cgit v1.2.3-70-g09d2