Skip to content

Commit 8903f41

Browse files
移除冗余代码,添加command
1 parent aacc51e commit 8903f41

File tree

5 files changed

+96
-12
lines changed

5 files changed

+96
-12
lines changed

nonebot_plugin_omikuji/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
require("nonebot_plugin_orm")
1111
from importlib import metadata
1212

13-
from nonebot_plugin_suggarchat.API import ToolsManager
13+
from nonebot_plugin_suggarchat.API import Menu, ToolsManager
1414

1515
from . import llm_tool, sql_models
1616
from .cache import OmikujiCache
@@ -40,6 +40,7 @@ async def init():
4040
conf = get_config()
4141
if conf.enable_omikuji:
4242
ToolsManager().register_tool(TOOL_DATA)
43+
Menu().reg_menu("omikuji", "抽御神签", "[可选]主题")
4344
logger.info("正在初始化缓存数据......")
4445
os.makedirs(get_cache_dir(), exist_ok=True)
4546
for cache in get_cache_dir().glob("*.json"):

nonebot_plugin_omikuji/commands.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import random
2+
import typing
3+
4+
from nonebot import on_command
5+
from nonebot.adapters.onebot.v11 import Bot, GroupMessageEvent, Message, MessageEvent
6+
from nonebot.params import CommandArg
7+
8+
from .cache import cache_omikuji, get_cached_omikuji
9+
from .config import get_config
10+
from .models import OMIKUJI_THEMES, THEME_TYPE
11+
from .utils import format_omikuji, generate_omikuji
12+
13+
omikuji = on_command(
14+
"omikuji",
15+
aliases={"御神签", "抽签"},
16+
priority=10,
17+
block=True,
18+
rule=lambda: get_config().enable_omikuji,
19+
)
20+
21+
22+
@omikuji.handle()
23+
async def _(bot: Bot, event: MessageEvent, args: Message = CommandArg()):
24+
if args:
25+
theme = args.extract_plain_text()
26+
if theme not in OMIKUJI_THEMES:
27+
await omikuji.finish(
28+
f"当前可用御神签主题:{''.join(i + ',' for i in OMIKUJI_THEMES)}"
29+
)
30+
else:
31+
theme = random.choice(list(OMIKUJI_THEMES))
32+
theme = typing.cast(THEME_TYPE, theme)
33+
is_group = isinstance(event, GroupMessageEvent)
34+
if (data := await get_cached_omikuji(event)) is None:
35+
data = await generate_omikuji(theme, is_group)
36+
await cache_omikuji(event, data)
37+
msg = format_omikuji(data)
38+
await omikuji.finish(msg)

nonebot_plugin_omikuji/llm_tool.py

Lines changed: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,40 @@
1+
import random
12
import typing
23

34
from nonebot import get_bot, logger
45
from nonebot.adapters.onebot.v11 import MessageEvent
56
from nonebot_plugin_suggarchat.API import (
7+
FunctionDefinitionSchema,
8+
FunctionParametersSchema,
9+
FunctionPropertySchema,
610
ToolContext,
711
ToolData,
12+
ToolFunctionSchema,
813
)
914

10-
from .cache import get_cached_omikuji
1115
from .config import get_config
12-
from .models import FUNC_META
13-
from .utils import format_omikuji, get_omikuji
16+
from .models import OMIKUJI_THEMES, OmikujiData
17+
from .utils import generate_omikuji
18+
19+
LEVEL = ["大吉", "吉", "中吉", "小吉", "末吉", "凶", "大凶"]
20+
21+
22+
def format_omikuji(data: OmikujiData, user_name: str | None = ""):
23+
ln = "\n"
24+
msg = f"""{data.intro}
25+
{(user_name + "," if user_name else "")}你的签上刻了什么?
26+
27+
=== 御神签 第{data.sign_number} ===
28+
✨ 天启:{data.divine_title}
29+
🌸 运势:{data.level} - {data.theme}
30+
31+
{"".join(f"▫ {section.name}{ln}{section.content}{ln}" for section in data.sections)}
32+
33+
⚖ 真言偈:{data.maxim}
34+
35+
{data.end}
36+
"""
37+
return msg
1438

1539

1640
async def omikuji(ctx: ToolContext):
@@ -21,16 +45,36 @@ async def omikuji(ctx: ToolContext):
2145
ctx.event._nbevent,
2246
"轻轻摇动古老的签筒,竹签哗啦作响... 心中默念所求之事... 一支签缓缓落下。",
2347
)
24-
if (data := await get_cached_omikuji(nb_event)) is None:
25-
data = await get_omikuji(
26-
ctx.data["theme"],
27-
is_group=hasattr(nb_event, "group_id"),
28-
)
48+
level = random.choice(LEVEL)
49+
data = await generate_omikuji(
50+
ctx.data["theme"],
51+
level=level,
52+
is_group=hasattr(nb_event, "group_id"),
53+
)
2954
if get_config().omikuji_send_by_chat:
3055
return data.model_dump_json()
3156
msg = format_omikuji(data)
3257
await bot.send(nb_event, msg)
3358
ctx.matcher.cancel_nonebot_process()
3459

3560

61+
FUNC_META = ToolFunctionSchema(
62+
strict=True,
63+
function=FunctionDefinitionSchema(
64+
name="御神签(omikuji)",
65+
description="抽取一个御神签",
66+
parameters=FunctionParametersSchema(
67+
type="object",
68+
properties={
69+
"theme": FunctionPropertySchema(
70+
type="string",
71+
description="御神签主题(如果包含不良内容则随机选择)",
72+
enum=OMIKUJI_THEMES,
73+
)
74+
},
75+
required=["theme"],
76+
),
77+
),
78+
)
79+
3680
TOOL_DATA = ToolData(data=FUNC_META, func=omikuji, custom_run=True)

nonebot_plugin_omikuji/sql_models.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import asyncio
44
from datetime import datetime
55
from functools import lru_cache
6-
from typing import Literal
76

87
from nonebot_plugin_orm import Model
98
from sqlalchemy import JSON, Index, String, UniqueConstraint
@@ -21,7 +20,7 @@ class OmikujiCache(Model):
2120
__tablename__ = "omikuji_cache"
2221
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
2322
level: Mapped[str] = mapped_column(String(64), nullable=False)
24-
theme: Mapped[Literal[THEME_TYPE]] = mapped_column(String(64), nullable=False)
23+
theme: Mapped[THEME_TYPE] = mapped_column(String(64), nullable=False)
2524
sections: Mapped[dict[str, list[str]]] = mapped_column(
2625
JSON,
2726
default={},

nonebot_plugin_omikuji/utils.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,9 @@ async def _hit_cache_omikuji(
5353
end=random.choice([i.content for i in cache.end]),
5454
)
5555
return model
56-
async def get_omikuji(
56+
57+
58+
async def generate_omikuji(
5759
theme: THEME_TYPE,
5860
is_group: bool = False,
5961
level: str = "",

0 commit comments

Comments
 (0)