aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/tests/examples/ndice/src/ndice.py
diff options
context:
space:
mode:
author苏向夜 <fu050409@163.com>2024-01-27 22:28:09 +0800
committer苏向夜 <fu050409@163.com>2024-01-27 22:28:09 +0800
commit63d3232e9765553e9e5418542d890977fc14621b (patch)
treec872494a383e444710ae6740423d6da6278f60e4 /tests/examples/ndice/src/ndice.py
parent1d9a500b727e8879cdaeb9c378ac717001c56ccc (diff)
downloadinfini-63d3232e9765553e9e5418542d890977fc14621b.tar.gz
infini-63d3232e9765553e9e5418542d890977fc14621b.zip
:sparkles: test(ci): add ndice package as example tests
Diffstat (limited to 'tests/examples/ndice/src/ndice.py')
-rw-r--r--tests/examples/ndice/src/ndice.py156
1 files changed, 156 insertions, 0 deletions
diff --git a/tests/examples/ndice/src/ndice.py b/tests/examples/ndice/src/ndice.py
new file mode 100644
index 00000000..a0b88f5e
--- /dev/null
+++ b/tests/examples/ndice/src/ndice.py
@@ -0,0 +1,156 @@
+# Initialized `__init__.py` generated by ipm.
+# Documents at https://ipm.hydroroll.team/
+
+from infini.register import Register
+from infini.router import Startswith
+from infini.input import Input
+from infini.output import Output
+from .dicer import Dicer
+
+import re
+
+register = Register()
+register.regist_textevent(
+ "ndice.roll",
+ "[{{ username }}]掷骰: "
+ "{% if descs|length == 1 %}"
+ "{{ descs[0] }}"
+ "{% else %}"
+ "{{ db }}=[...]="
+ "{% for outcome in outcomes %}"
+ "{{ outcome }}"
+ "{% if not loop.last %}, {% endif %}"
+ "{% endfor %}"
+ "{% endif %}",
+)
+register.regist_textevent(
+ "ndice.error.bad_roll_string", "[{{ username }}]掷骰时出现异常, 疑似掷骰表达式错误."
+)
+register.regist_textevent("ndice.error.too_much_round", "[{{ username }}]给入的掷骰轮数超出预期.")
+register.regist_textevent(
+ "ndice.error.unknown",
+ "未知错误: {{ error }}, 可能是掷骰语法异常.\nBUG提交: https://gitee.com/unvisitor/issues",
+)
+register.regist_textevent("ndice.error.bad_round", "多轮检定的轮数应当是整型数.")
+register.regist_textevent("ndice.error.too_much_round", "多轮检定的轮数超出预期.")
+
+
+def translate_punctuation(string: str) -> str:
+ punctuation_mapping = {
+ ",": ",",
+ "。": ".",
+ "!": "!",
+ "?": "?",
+ ";": ";",
+ ":": ":",
+ "“": '"',
+ "”": '"',
+ "‘": "'",
+ "’": "'",
+ "(": "(",
+ ")": ")",
+ "【": "[",
+ "】": "]",
+ "《": "<",
+ "》": ">",
+ }
+ for ch_punct, en_punct in punctuation_mapping.items():
+ string = string.replace(ch_punct, en_punct)
+ return string
+
+
+def format_str(message: str, begin=None, lower=True) -> str:
+ regex = r"[<\[](.*?)[\]>]"
+ message = str(message).lower() if lower else str(message)
+ msg = translate_punctuation(
+ re.sub("\s+", " ", re.sub(regex, "", message)).strip(" ")
+ )
+ if msg.startswith("/"):
+ msg = "." + msg[1:]
+
+ if begin:
+ if isinstance(begin, str):
+ begin = [
+ begin,
+ ]
+ elif isinstance(begin, tuple):
+ begin = list(begin)
+
+ begin.sort(reverse=True)
+ for b in begin:
+ msg = msg.replace(b, "").lstrip(" ")
+
+ return msg
+
+
+def roll(_: Input, args: str, name: str = None) -> str:
+ time = 1
+ if "#" in args:
+ args = args.split("#")
+
+ try:
+ time = int(args[0].strip())
+ if time > 20:
+ return Output(
+ "text", "ndice.error.too_much_round", variables={"username": name}
+ )
+ except ValueError:
+ return Output("text", "ndice.error.bad_round", variables={"username": name})
+
+ if len(args) == 1:
+ args = "1d100"
+ else:
+ args = args[1]
+ else:
+ args = args.strip()
+
+ args = args.split()
+ if len(args) > 1:
+ reason = args[1]
+ else:
+ reason = None
+
+ roll_string = args[0]
+ descs = []
+ outcomes = []
+
+ try:
+ dice = Dicer(roll_string).roll()
+ descs.append(dice.description())
+ outcomes.append(dice.outcome)
+
+ for _ in range(time - 1):
+ dice.roll()
+ descs.append(dice.description())
+ outcomes.append(dice.outcome)
+ except ValueError:
+ return Output(
+ "text",
+ "ndice.error.bad_roll_string",
+ status=1,
+ variables={"username": name},
+ )
+
+ return Output(
+ "text",
+ "ndice.roll",
+ variables={
+ "username": name,
+ "descs": descs,
+ "outcomes": outcomes,
+ "db": dice.db,
+ },
+ )
+
+
+@register.handler(router=Startswith(".r"), priority=0)
+def roll_handler(input: Input):
+ args = format_str(input.get_plain_text(), begin=(".r", ".roll"))
+ name = input.variables.get("nickname") or "苏向夜"
+ if not args:
+ return roll(input, "1d100", name=name)
+
+ try:
+ return roll(input, args, name=name)
+ except Exception as error:
+ return Output("text", "ndice.error.unknown", variables={"error": str(error)})