From 714d69b2ba39e42285fb3604e3f24fbbd3b05582 Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Sat, 9 Dec 2023 21:18:44 +0800 Subject: :recycle: 使用multilogger及pathlib替代 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hydrorollcore/log.py | 30 +++++++++++++++++------------- src/hydrorollcore/settings.py | 1 + 2 files changed, 18 insertions(+), 13 deletions(-) create mode 100644 src/hydrorollcore/settings.py diff --git a/src/hydrorollcore/log.py b/src/hydrorollcore/log.py index 3eb07e7a..ec5c25f8 100644 --- a/src/hydrorollcore/log.py +++ b/src/hydrorollcore/log.py @@ -3,28 +3,32 @@ HydroRollCore 使用 [loguru](https://github.com/Delgan/loguru) 来记录日志信息。 自定义 logger 请参考 [loguru](https://github.com/Delgan/loguru) 文档。 """ -import os -import sys from datetime import datetime +from multilogging import multilogger +from pathlib import Path +from .settings import DEBUG -from loguru import logger as _logger __all__ = ["logger", "error_or_exception"] -logger = _logger -current_path = os.path.dirname(os.path.abspath("__file__")) -log_path = os.path.join( - current_path, "logs", datetime.now().strftime("%Y-%m-%d") + ".log" +logger = multilogger( + name="HydroRoll", payload="Core", level="DEBUG" if DEBUG else "INFO" ) +current_path = Path(__file__).resolve().parent +LOG_PATH = current_path / "logs" / (datetime.now().strftime("%Y-%m-%d") + ".log") +if not LOG_PATH.exists(): + LOG_PATH.mkdir(parents=True, exist_ok=True) +logger.add(sink=LOG_PATH, level="INFO", rotation="10 MB") # 每个日志文件最大为 10MB def error_or_exception(message: str, exception: Exception, verbose: bool): - logger.remove() - logger.add( - sys.stderr, - format="{time:YYYY-MM-DD HH:mm:ss.SSS} [{level}] > {name}:{function}:{line} - {message}", - ) - logger.add(sink=log_path, level="INFO", rotation="10 MB") # 每个日志文件最大为 10MB + # 弃用的方法 + # logger.remove() + # logger.add( + # sys.stderr, + # format="{time:YYYY-MM-DD HH:mm:ss.SSS} [{level}] > {name}:{function}:{line} - {message}", + # ) + if verbose: logger.exception(message) else: diff --git a/src/hydrorollcore/settings.py b/src/hydrorollcore/settings.py new file mode 100644 index 00000000..51c64dd2 --- /dev/null +++ b/src/hydrorollcore/settings.py @@ -0,0 +1 @@ +DEBUG = True -- cgit v1.2.3-70-g09d2 From e6b74981c6f713fb30d9c439cce2c1226d36acb5 Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Sat, 9 Dec 2023 21:20:40 +0800 Subject: :sparkles: 新增掷骰基类 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hydrorollcore/rule.py | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/hydrorollcore/rule.py b/src/hydrorollcore/rule.py index a1b07cb9..7dd24836 100644 --- a/src/hydrorollcore/rule.py +++ b/src/hydrorollcore/rule.py @@ -13,6 +13,34 @@ class RuleLoadType(Enum): CLASS = "class" +class Result(metaclass=ABCMeta): + """规则检定结果基类""" + + event: str + + +class Dice(metaclass=ABCMeta): + """掷骰基类""" + + roll_string: str + db: str + outcome: int + + def __repr__(self) -> str: + return f'' + + def __str__(self) -> str: + return self.db.upper() + + @abstractmethod + def parse(self) -> "Dice": + raise NotImplementedError + + @abstractmethod + def roll(self) -> int: + raise NotImplementedError + + class Rule(metaclass=ABCMeta): """规则基类""" @@ -20,9 +48,9 @@ class Rule(metaclass=ABCMeta): priority: int = 0 @abstractmethod - def __init__(self): + def __init__(self) -> None: raise NotImplementedError @abstractmethod - async def run(self): + def check(self) -> Result: raise NotImplementedError -- cgit v1.2.3-70-g09d2 From c6a15e6f8fc96ae9fe61bbadcaca8e14af593320 Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Sat, 9 Dec 2023 21:48:31 +0800 Subject: :sparkles: 完善Result基类 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hydrorollcore/__init__.py | 4 ++-- src/hydrorollcore/rule.py | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/hydrorollcore/__init__.py b/src/hydrorollcore/__init__.py index f0a096fd..7a2bba77 100644 --- a/src/hydrorollcore/__init__.py +++ b/src/hydrorollcore/__init__.py @@ -1,6 +1,6 @@ from HydroRollCore.cli import Cli from HydroRollCore.config import Config -from HydroRollCore.rule import Rule +from HydroRollCore.rule import Rule, Result, Dice from HydroRollCore.core import Core -__all__ = ["Core", "Rule", "Config", "Cli"] +__all__ = ["Core", "Rule", "Config", "Cli", "Result", "Dice"] diff --git a/src/hydrorollcore/rule.py b/src/hydrorollcore/rule.py index 7dd24836..d2ea4a19 100644 --- a/src/hydrorollcore/rule.py +++ b/src/hydrorollcore/rule.py @@ -1,5 +1,6 @@ from abc import ABCMeta, abstractmethod from enum import Enum +from .exceptions import HydroError __all__ = ["RuleLoadType", "Rule"] @@ -17,6 +18,17 @@ 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): @@ -32,12 +44,17 @@ class Dice(metaclass=ABCMeta): 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 -- cgit v1.2.3-70-g09d2 From 8e92c375fc5ce1605c268cf8f7fae57cf5574e6b Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Sat, 9 Dec 2023 21:48:48 +0800 Subject: :memo: 更新文档 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 93 ++++++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 54 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index aa8cb626..1092a1ac 100644 --- a/README.md +++ b/README.md @@ -1,63 +1,78 @@

HydroRollCore'水系核心

- - - - - - - - - - - [![.github/workflows/python-publish.yml](https://github.com/HydroRoll-Team/HydroRollCore/actions/workflows/python-publish.yml/badge.svg)](https://github.com/HydroRoll-Team/HydroRollCore/actions/workflows/python-publish.yml) - [![CodeQL](https://github.com/HydroRoll-Team/HydroRollCore/actions/workflows/codeql.yml/badge.svg)](https://github.com/HydroRoll-Team/HydroRollCore/actions/workflows/codeql.yml) - [![Netlify Status](https://api.netlify.com/api/v1/badges/ecbe4af3-223f-4fa4-a182-a37a776fd05b/deploy-status)](https://app.netlify.com/sites/grps-v1/deploys) + + + + + pypi + + + hydro + + +[![.github/workflows/python-publish.yml](https://github.com/HydroRoll-Team/HydroRollCore/actions/workflows/python-publish.yml/badge.svg)](https://github.com/HydroRoll-Team/HydroRollCore/actions/workflows/python-publish.yml) +[![CodeQL](https://github.com/HydroRoll-Team/HydroRollCore/actions/workflows/codeql.yml/badge.svg)](https://github.com/HydroRoll-Team/HydroRollCore/actions/workflows/codeql.yml) +[![Netlify Status](https://api.netlify.com/api/v1/badges/ecbe4af3-223f-4fa4-a182-a37a776fd05b/deploy-status)](https://app.netlify.com/sites/grps-v1/deploys)

-## 🎁 Getting +## 🎁 Getting hydro 1. 安装库 -> [!IMPORTANT] -> -> 强烈推荐使用`pdm`管理你的`Bot`项目。 + > [!IMPORTANT] + > + > 强烈推荐使用`pdm`管理你的`Bot`项目。 -在命令行输入。 + 在终端中执行: -``` shell -git clone https://github.com/HydroRoll-Team/HydroRollCore.git -cd HydroRollCore -pdm install -# 或者使用pip -# pip install HydroRollCore -``` + ```bash + git clone https://github.com/HydroRoll-Team/HydroRollCore.git + cd HydroRollCore + pdm install + ``` + + 你可以使用`pip`进行安装: + + ```bash + pip install HydroRollCore + ``` 2. 创建规则包实例 -``` shell -mkdir myrules && cd myrules && mkdir rule1 -echo.> config.toml -echo.> __init__.py -``` + ``` shell + mkdir myrules && cd myrules && mkdir rule1 + echo.> config.toml + echo.> __init__.py + ``` + + 在 `__init__.py` 创建一个 `rule` 实例并继承 `Rule` 基类, 通过编写合适的相关方法与类注册规则包实现规则的自定义。 -在 `__init__.py` 创建一个 `rule` 实例并继承 `Rule` 基类, 通过编写合适的相关方法与类注册规则包实现规则的自定义。 + ``` python + from HydroRollCore import Rule, Result, Dice -``` python -from HydroRollCore import Rule + class MyRule(Rule): + """自设规则包""" -class Myrule(Rule): - """自设规则包,继承 Rules 基类""" -``` + name = "MyRule" + priority: int = 0 + + def __init__(self) -> None: + """初始化你的规则包""" + + def check(self, dice: Dice) -> Result: + """声明规则包检定方式""" + return Result("myevent.event1", True) + ``` 3. 合理修改你的 `config.toml` 配置文件,完成注册! ### 🎍Sites -https://grps.hydroroll.team _(recommend)_ -https://grps-v1.netlify.app -~~https://hydroroll-team.github.io/HydroRollCore/~~ + + _(recommend)_ + +~~~~ ## 📄 License -- cgit v1.2.3-70-g09d2 From ed3f3e483f66ca6e3469b6bc2d2d183227ac9c54 Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Sat, 9 Dec 2023 22:20:17 +0800 Subject: :memo: 修订文档显示异常 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 1092a1ac..0dc52238 100644 --- a/README.md +++ b/README.md @@ -19,11 +19,11 @@ ## 🎁 Getting hydro -1. 安装库 +> [!IMPORTANT] +> +> 强烈推荐使用`pdm`管理你的`HydroBot`项目。 - > [!IMPORTANT] - > - > 强烈推荐使用`pdm`管理你的`Bot`项目。 +1. 安装库 在终端中执行: -- cgit v1.2.3-70-g09d2 From 2838466c563df69d9de8c6e9b69f14b07b8cf2c0 Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Sat, 9 Dec 2023 22:21:11 +0800 Subject: :bug: 修复Rule参数不全的问题 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hydrorollcore/rule.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hydrorollcore/rule.py b/src/hydrorollcore/rule.py index d2ea4a19..127ed805 100644 --- a/src/hydrorollcore/rule.py +++ b/src/hydrorollcore/rule.py @@ -2,7 +2,7 @@ from abc import ABCMeta, abstractmethod from enum import Enum from .exceptions import HydroError -__all__ = ["RuleLoadType", "Rule"] +__all__ = ["RuleLoadType", "Result", "Dice", "Rule"] class RuleLoadType(Enum): @@ -69,5 +69,5 @@ class Rule(metaclass=ABCMeta): raise NotImplementedError @abstractmethod - def check(self) -> Result: + def check(self, dice: Dice) -> Result: raise NotImplementedError -- cgit v1.2.3-70-g09d2 From e20c3f29ae8297a8c76587e1e6b732a147798786 Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Sat, 9 Dec 2023 22:21:40 +0800 Subject: :bug: 修复logger.exception参数问题 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hydrorollcore/log.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/hydrorollcore/log.py b/src/hydrorollcore/log.py index ec5c25f8..ed62d0ae 100644 --- a/src/hydrorollcore/log.py +++ b/src/hydrorollcore/log.py @@ -21,7 +21,7 @@ if not LOG_PATH.exists(): logger.add(sink=LOG_PATH, level="INFO", rotation="10 MB") # 每个日志文件最大为 10MB -def error_or_exception(message: str, exception: Exception, verbose: bool): +def error_or_exception(message: str, exception: Exception, verbose: bool = True): # 弃用的方法 # logger.remove() # logger.add( @@ -30,6 +30,7 @@ def error_or_exception(message: str, exception: Exception, verbose: bool): # ) if verbose: - logger.exception(message) + logger.exception(exception) + logger.critical(message) else: logger.critical(f"{message} {exception!r}") -- cgit v1.2.3-70-g09d2 From 974230ca750963bb0346589da98b05f2d47454ed Mon Sep 17 00:00:00 2001 From: 苏向夜 Date: Sat, 9 Dec 2023 22:34:27 +0800 Subject: :sparkles: 新增事件及模板 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hydrorollcore/cli.py | 42 +++++++++++++++++------ src/hydrorollcore/consts/__init__.py | 0 src/hydrorollcore/consts/templates.py | 63 +++++++++++++++++++++++++++++++++++ src/hydrorollcore/event.py | 12 +++++++ src/hydrorollcore/utils.py | 2 +- 5 files changed, 108 insertions(+), 11 deletions(-) create mode 100644 src/hydrorollcore/consts/__init__.py create mode 100644 src/hydrorollcore/consts/templates.py create mode 100644 src/hydrorollcore/event.py diff --git a/src/hydrorollcore/cli.py b/src/hydrorollcore/cli.py index 8ce0fd9e..8b03b60b 100644 --- a/src/hydrorollcore/cli.py +++ b/src/hydrorollcore/cli.py @@ -1,22 +1,44 @@ +from pathlib import Path +from .consts import templates + +# from tkinter import messagebox + import argparse -from tkinter import messagebox +import os +import sys class Cli: def parse_args(self): - # 创建解析器对象 parser = argparse.ArgumentParser(description="HydroRoll 命令行工具") - # 添加命令行参数 - parser.add_argument("--gui", action="store_true", help="显示弹窗") + 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() - # 处理命令行参数 - if args.gui: - messagebox.showinfo("提示", "这是一个弹窗!") + # if args.gui: + # messagebox.showinfo("提示", "这是一个弹窗!") + + if not args.path: + path = Path(os.getcwd()).resolve() + else: + path = Path(args.path).resolve() + + if args.new and args.run: + print("无法确定的指令要求: 你同时指定了new与run指令。") + sys.exit(1) + + if args.new: + if path.exists(): + print("指定的文件夹已经存在!") + 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) - if args.path: - print("输入的路径:", args.path) + print("HydroRoll 规则包模板已创建!") diff --git a/src/hydrorollcore/consts/__init__.py b/src/hydrorollcore/consts/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/hydrorollcore/consts/templates.py b/src/hydrorollcore/consts/templates.py new file mode 100644 index 00000000..4cf72989 --- /dev/null +++ b/src/hydrorollcore/consts/templates.py @@ -0,0 +1,63 @@ +RULE = """from HydroRollCore import Rule, Result, Dice + +class MyRule(Rule): + \"\"\"自设规则包\"\"\" + + name = "MyRule" + priority: int = 0 + + def __init__(self) -> None: + \"\"\"初始化你的规则包\"\"\" + + def check(self, dice: Dice) -> Result: + \"\"\"声明规则包检定方式\"\"\" + return Result("myevent.event1", True) +""" + +EVENT = """from HydroRollCore import Event + +__events__ = ["MyEvent"] + +class MyEvent(Event): + name = "event1" + output = "检定成功!" +""" + +DICE = """from HydroRollCore import Dice + +class BaseDice(Dice): + \"\"\"多面骰\"\"\" + + def __init__(self, roll_string: str = "") -> None: + self.roll_string = roll_string + self.parse() + + def parse(self) -> "Dice": + self.dices = [] + split = re.split(r"[dD]", self.roll_string) + + if split[0]: + self.a = int(split[0]) + else: + self.a = 1 + + if split[1]: + self.b = int(split[1]) + else: + self.b = 100 + + self.db = f"{self.a}D{self.b}" + self.dices += [f"D{self.b}"] * self.a + return self + + def roll(self) -> int: + self.results = [] + + for _ in range(self.a): + result = random.randint(1, self.b) + + self.results.append(result) + + self.outcome = sum(self.results) + return self.outcome +""" diff --git a/src/hydrorollcore/event.py b/src/hydrorollcore/event.py new file mode 100644 index 00000000..e8edeb98 --- /dev/null +++ b/src/hydrorollcore/event.py @@ -0,0 +1,12 @@ +from abc import ABCMeta + + +class Event(metaclass=ABCMeta): + """事件基类""" + + name: str + output: str + + def __init__(self, name: str, output: str) -> None: + self.name = name + self.output = output diff --git a/src/hydrorollcore/utils.py b/src/hydrorollcore/utils.py index 71187856..1333815a 100644 --- a/src/hydrorollcore/utils.py +++ b/src/hydrorollcore/utils.py @@ -189,4 +189,4 @@ def sync_func_wrapper( async def _wrapper(*args: _P.args, **kwargs: _P.kwargs): return func(*args, **kwargs) - return _wrapper \ No newline at end of file + return _wrapper -- cgit v1.2.3-70-g09d2 From 672373d8d973d3c862fc7365aed39fee29613638 Mon Sep 17 00:00:00 2001 From: Sourcery AI <> Date: Sat, 9 Dec 2023 14:37:56 +0000 Subject: 'Refactored by Sourcery' --- src/hydrorollcore/cli.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/hydrorollcore/cli.py b/src/hydrorollcore/cli.py index 8b03b60b..5351d96d 100644 --- a/src/hydrorollcore/cli.py +++ b/src/hydrorollcore/cli.py @@ -22,11 +22,7 @@ class Cli: # if args.gui: # messagebox.showinfo("提示", "这是一个弹窗!") - if not args.path: - path = Path(os.getcwd()).resolve() - else: - path = Path(args.path).resolve() - + path = Path(args.path).resolve() if args.path else Path(os.getcwd()).resolve() if args.new and args.run: print("无法确定的指令要求: 你同时指定了new与run指令。") sys.exit(1) -- cgit v1.2.3-70-g09d2