1+ import random
12import typing
23
34from nonebot import get_bot , logger
45from nonebot .adapters .onebot .v11 import MessageEvent
56from 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
1115from .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
1640async 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+
3680TOOL_DATA = ToolData (data = FUNC_META , func = omikuji , custom_run = True )
0 commit comments