Skip to content

Commit 471baa7

Browse files
committed
✨ add onebot11.MessageSentExtension
1 parent 11b03eb commit 471baa7

File tree

3 files changed

+58
-2
lines changed

3 files changed

+58
-2
lines changed
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
from __future__ import annotations
2+
3+
from tarina import LRU
4+
from nonebot.typing import T_State
5+
from nonebot.adapters.onebot.v11 import Message
6+
from nonebot.internal.adapter import Bot, Event
7+
from nonebot.adapters.onebot.v11 import Event as OneBot11Event
8+
9+
from nonebot_plugin_alconna import Extension, UniMessage, get_message_id
10+
11+
12+
class MessageSentExtension(Extension):
13+
"""
14+
用于提取自身上报消息事件中的消息内容
15+
16+
推荐配合 `add_global_extension` 使用
17+
18+
注意: 该扩展仅提供消息内容,无法配置 Alconna 响应器响应自身消息。
19+
20+
Example:
21+
>>> from nonebot_plugin_alconna import add_global_extension
22+
>>> from nonebot_plugin_alconna.builtins.extensions.onebot11 import MessageSentExtension
23+
>>>
24+
>>> add_global_extension(MessageSentExtension())
25+
"""
26+
27+
cache: LRU[str, UniMessage] = LRU(20)
28+
29+
@property
30+
def priority(self) -> int:
31+
return 8
32+
33+
@property
34+
def id(self) -> str:
35+
return "builtins.extensions.onebot11:MessageSentExtension"
36+
37+
def validate(self, bot: Bot, event: Event) -> bool:
38+
return isinstance(event, OneBot11Event) and event.get_type() == "message_sent"
39+
40+
async def message_provider(
41+
self, event: Event, state: T_State, bot: Bot, use_origin: bool = False
42+
) -> UniMessage | None:
43+
if event.get_type() == "message_sent" and hasattr(event, "message"):
44+
msg_id = get_message_id(event, bot)
45+
if use_origin and (uni_msg := self.cache.get(msg_id)) is not None:
46+
return uni_msg
47+
if (uni_msg := self.cache.get(msg_id)) is not None:
48+
return uni_msg
49+
msg = Message._validate(event.message) # type: ignore
50+
uni_msg = UniMessage.generate_without_reply(message=msg, bot=bot)
51+
self.cache[msg_id] = uni_msg
52+
return uni_msg
53+
return None

src/nonebot_plugin_alconna/extension.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ async def message_provider(
146146
exc = e
147147
if exc is not None:
148148
raise exc
149-
if event.get_type().startswith("message"):
149+
if event.get_type() == "message":
150150
msg_id = get_message_id(event, bot)
151151
if use_origin and (uni_msg := unimsg_origin_cache.get(msg_id)) is not None:
152152
return uni_msg

tests/test_onebot.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,10 @@ async def _(city: str):
3434

3535
@pytest.mark.asyncio()
3636
async def test_sent(app: App):
37-
from nonebot_plugin_alconna import Alconna, AlconnaMatcher, on_alconna
37+
from nonebot_plugin_alconna.builtins.extensions.onebot11 import MessageSentExtension
38+
from nonebot_plugin_alconna import Alconna, AlconnaMatcher, on_alconna, add_global_extension
39+
40+
add_global_extension(MessageSentExtension())
3841

3942
mat1 = on_alconna("sent1", response_self=True)
4043
mat2 = on_alconna("sent2", response_self=False)

0 commit comments

Comments
 (0)