Skip to content

Commit 44919c0

Browse files
committed
adjust find_meme
1 parent e228507 commit 44919c0

3 files changed

Lines changed: 99 additions & 75 deletions

File tree

nonebot_plugin_memes_api/matchers/info.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,23 @@
11
from arclet.alconna import TextFormatter
22
from nonebot.matcher import Matcher
3-
from nonebot_plugin_alconna import Image, Text
3+
from nonebot_plugin_alconna import Alconna, Args, Image, Text, on_alconna
44

5-
from ..request import MemeInfo, generate_meme_preview
6-
from .utils import find_meme_and_handle
5+
from ..request import generate_meme_preview
6+
from .utils import find_meme
77

8+
info_matcher = on_alconna(
9+
Alconna("表情详情", Args["meme_name", str]),
10+
aliases={"表情帮助", "表情示例"},
11+
block=True,
12+
priority=11,
13+
use_cmd_start=True,
14+
)
15+
16+
17+
@info_matcher.handle()
18+
async def _(matcher: Matcher, meme_name: str):
19+
meme = await find_meme(matcher, meme_name)
820

9-
@find_meme_and_handle("表情详情", aliases={"表情帮助", "表情示例"})
10-
async def _(matcher: Matcher, user_id: str, meme: MemeInfo):
1121
keywords = "、".join([f'"{keyword}"' for keyword in meme.keywords])
1222
shortcuts = "、".join(
1323
[f'"{shortcut.humanized or shortcut.key}"' for shortcut in meme.shortcuts]

nonebot_plugin_memes_api/matchers/manage.py

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
from nonebot.matcher import Matcher
22
from nonebot.permission import SUPERUSER, Permission
3+
from nonebot_plugin_alconna import Alconna, Args, on_alconna
34
from nonebot_plugin_session import EventSession, SessionLevel
45

56
from ..manager import MemeMode, meme_manager
6-
from ..request import MemeInfo
7-
from .utils import find_meme_and_handle
7+
from .utils import UserId, find_meme
88

99

1010
def _is_private(session: EventSession) -> bool:
@@ -23,25 +23,59 @@ def _is_private(session: EventSession) -> bool:
2323
pass
2424

2525

26-
@find_meme_and_handle("禁用表情", permission=PERM_EDIT)
27-
async def _(matcher: Matcher, user_id: str, meme: MemeInfo):
26+
block_matcher = on_alconna(
27+
Alconna("禁用表情", Args["meme_name", str]),
28+
block=True,
29+
priority=11,
30+
use_cmd_start=True,
31+
permission=PERM_EDIT,
32+
)
33+
unblock_matcher = on_alconna(
34+
Alconna("启用表情", Args["meme_name", str]),
35+
block=True,
36+
priority=11,
37+
use_cmd_start=True,
38+
permission=PERM_EDIT,
39+
)
40+
block_gl_matcher = on_alconna(
41+
Alconna("全局禁用表情", Args["meme_name", str]),
42+
block=True,
43+
priority=11,
44+
use_cmd_start=True,
45+
permission=PERM_GLOBAL,
46+
)
47+
unblock_gl_matcher = on_alconna(
48+
Alconna("全局启用表情", Args["meme_name", str]),
49+
block=True,
50+
priority=11,
51+
use_cmd_start=True,
52+
permission=PERM_GLOBAL,
53+
)
54+
55+
56+
@block_matcher.handle()
57+
async def _(matcher: Matcher, user_id: UserId, meme_name: str):
58+
meme = await find_meme(matcher, meme_name)
2859
meme_manager.block(user_id, meme.key)
2960
await matcher.finish(f"表情 {meme.key} 禁用成功")
3061

3162

32-
@find_meme_and_handle("启用表情", permission=PERM_EDIT)
33-
async def _(matcher: Matcher, user_id: str, meme: MemeInfo):
63+
@unblock_matcher.handle()
64+
async def _(matcher: Matcher, user_id: UserId, meme_name: str):
65+
meme = await find_meme(matcher, meme_name)
3466
meme_manager.unblock(user_id, meme.key)
3567
await matcher.finish(f"表情 {meme.key} 启用成功")
3668

3769

38-
@find_meme_and_handle("全局禁用表情", permission=PERM_GLOBAL)
39-
async def _(matcher: Matcher, user_id: str, meme: MemeInfo):
70+
@block_gl_matcher.handle()
71+
async def _(matcher: Matcher, meme_name: str):
72+
meme = await find_meme(matcher, meme_name)
4073
meme_manager.change_mode(MemeMode.WHITE, meme.key)
4174
await matcher.finish(f"表情 {meme.key} 已设为白名单模式")
4275

4376

44-
@find_meme_and_handle("全局启用表情", permission=PERM_GLOBAL)
45-
async def _(matcher: Matcher, user_id: str, meme: MemeInfo):
77+
@unblock_gl_matcher.handle()
78+
async def _(matcher: Matcher, meme_name: str):
79+
meme = await find_meme(matcher, meme_name)
4680
meme_manager.change_mode(MemeMode.BLACK, meme.key)
4781
await matcher.finish(f"表情 {meme.key} 已设为黑名单模式")
Lines changed: 40 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
1-
from collections.abc import Awaitable
2-
from typing import Annotated, Callable, Optional
1+
from typing import Annotated
32

43
from nonebot.adapters import Event
54
from nonebot.matcher import Matcher
6-
from nonebot.permission import Permission
7-
from nonebot_plugin_alconna import Alconna, Args, on_alconna
85
from nonebot_plugin_session import SessionId, SessionIdType
96
from nonebot_plugin_waiter import waiter
107

@@ -14,65 +11,48 @@
1411
UserId = Annotated[str, SessionId(SessionIdType.GROUP, include_bot_type=False)]
1512

1613

17-
def find_meme_and_handle(
18-
command: str,
19-
*,
20-
aliases: Optional[set[str]] = None,
21-
permission: Optional[Permission] = None,
22-
):
23-
def wrapper(func: Callable[[Matcher, str, MemeInfo], Awaitable[None]]):
24-
find_matcher = on_alconna(
25-
Alconna(command, Args["meme_name", str]),
26-
aliases=aliases,
27-
block=True,
28-
priority=11,
29-
use_cmd_start=True,
30-
permission=permission,
31-
)
32-
33-
@find_matcher.handle()
34-
async def _(matcher: Matcher, user_id: UserId, meme_name: str):
35-
found_memes = meme_manager.find(meme_name)
36-
found_num = len(found_memes)
37-
38-
if found_num == 0:
39-
if searched_memes := meme_manager.search(meme_name, limit=5):
40-
await matcher.finish(
41-
f"表情 {meme_name} 不存在,你可能在找:\n"
42-
+ "\n".join(
43-
f"* {meme.key} ({'/'.join(meme.keywords)})"
44-
for meme in searched_memes
45-
)
46-
)
47-
else:
48-
await matcher.finish(f"表情 {meme_name} 不存在!")
14+
async def find_meme(matcher: Matcher, meme_name: str) -> MemeInfo:
15+
found_memes = meme_manager.find(meme_name)
16+
found_num = len(found_memes)
4917

50-
if found_num == 1:
51-
await func(matcher, user_id, found_memes[0])
52-
53-
await matcher.send(
54-
f"找到 {found_num} 个表情,请发送编号选择:\n"
18+
if found_num == 0:
19+
if searched_memes := meme_manager.search(meme_name, limit=5):
20+
await matcher.finish(
21+
f"表情 {meme_name} 不存在,你可能在找:\n"
5522
+ "\n".join(
56-
f"{i + 1}. {meme.key} ({'/'.join(meme.keywords)})"
57-
for i, meme in enumerate(found_memes)
23+
f"* {meme.key} ({'/'.join(meme.keywords)})"
24+
for meme in searched_memes
5825
)
5926
)
27+
else:
28+
await matcher.finish(f"表情 {meme_name} 不存在!")
6029

61-
@waiter(waits=["message"], keep_session=True)
62-
async def get_response(event: Event):
63-
return event.get_plaintext()
64-
65-
for _ in range(3):
66-
resp = await get_response.wait(timeout=15)
67-
if resp is None:
68-
await matcher.finish()
69-
elif not resp.isdigit():
70-
await matcher.send("输入错误,请输入数字")
71-
continue
72-
elif not (1 <= (index := int(resp)) <= found_num):
73-
await matcher.send("输入错误,请输入正确的数字")
74-
continue
75-
else:
76-
await func(matcher, user_id, found_memes[index - 1])
30+
if found_num == 1:
31+
return found_memes[0]
7732

78-
return wrapper
33+
await matcher.send(
34+
f"找到 {found_num} 个表情,请发送编号选择:\n"
35+
+ "\n".join(
36+
f"{i + 1}. {meme.key} ({'/'.join(meme.keywords)})"
37+
for i, meme in enumerate(found_memes)
38+
)
39+
)
40+
41+
@waiter(waits=["message"], keep_session=True)
42+
async def get_response(event: Event):
43+
return event.get_plaintext()
44+
45+
for _ in range(3):
46+
resp = await get_response.wait(timeout=15)
47+
if resp is None:
48+
await matcher.finish()
49+
elif not resp.isdigit():
50+
await matcher.send("输入错误,请输入数字")
51+
continue
52+
elif not (1 <= (index := int(resp)) <= found_num):
53+
await matcher.send("输入错误,请输入正确的数字")
54+
continue
55+
else:
56+
return found_memes[index - 1]
57+
58+
await matcher.finish()

0 commit comments

Comments
 (0)