Skip to content

Commit 68b7301

Browse files
committed
🍻 version 0.55.1
add caches for Extension's message provide
1 parent 3239b66 commit 68b7301

File tree

7 files changed

+45
-44
lines changed

7 files changed

+45
-44
lines changed

src/nonebot_plugin_alconna/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@
137137
from .uniseg import SupportAdapterModule as SupportAdapterModule
138138
from .extension import add_global_extension as add_global_extension
139139

140-
__version__ = "0.55.0"
140+
__version__ = "0.55.1"
141141
__supported_adapters__ = set(m.value for m in SupportAdapterModule.__members__.values()) # noqa: C401
142142
__plugin_meta__ = PluginMetadata(
143143
name="Alconna 插件",

src/nonebot_plugin_alconna/builtins/extensions/discord.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from nonebot.adapters import Event
66
from nonebot.typing import T_State
77
from nonebot.adapters.discord import Bot
8-
from nonebot.adapters.discord.message import Message, parse_message
8+
from nonebot.adapters.discord.message import parse_message
99
from nonebot.adapters.discord.event import ApplicationCommandInteractionEvent
1010
from nonebot.adapters.discord.commands.matcher import ApplicationCommandConfig
1111
from nonebot.adapters.discord.commands.storage import _application_command_storage
@@ -142,7 +142,7 @@ def _handle_options(options: list[ApplicationCommandInteractionDataOption]):
142142
cmd += " "
143143
cmd += " ".join(_handle_options(data.options))
144144

145-
return Message(cmd.rstrip())
145+
return UniMessage(cmd.rstrip())
146146

147147
@classmethod
148148
async def send_deferred_response(cls) -> None:

src/nonebot_plugin_alconna/builtins/extensions/reply.py

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
from typing import Optional
22

33
from tarina import LRU
4+
from arclet.alconna import Alconna
5+
from nonebot.internal.adapter import Bot, Event
46

57
from nonebot_plugin_alconna.uniseg import reply_fetch
68
from nonebot_plugin_alconna import Reply, Extension, UniMessage
@@ -40,19 +42,12 @@ def __init__(self):
4042
def get_reply(self, message_id: str) -> Optional[Reply]:
4143
return self.cache.get(message_id, None)
4244

43-
async def message_provider(self, event, state, bot, use_origin: bool = False):
44-
if event.get_type() != "message":
45-
return None
46-
try:
47-
msg = event.get_message()
48-
except (NotImplementedError, ValueError):
49-
return None
50-
uni_msg = UniMessage.generate_sync(message=msg, bot=bot)
45+
async def receive_wrapper(self, bot: Bot, event: Event, command: Alconna, receive: UniMessage) -> UniMessage:
5146
if not (reply := await reply_fetch(event, bot)):
52-
return uni_msg
47+
return receive
5348
msg_id = UniMessage.get_message_id(event, bot)
5449
self.cache[msg_id] = reply
55-
return uni_msg
50+
return receive
5651

5752

5853
class ReplyMergeExtension(Extension):
@@ -81,6 +76,8 @@ def __init__(self, add_left: bool = False, sep: str = " "):
8176
self.add_left = add_left
8277
self.sep = sep
8378

79+
cache: "LRU[int, UniMessage]" = LRU(20)
80+
8481
@property
8582
def priority(self) -> int:
8683
return 14
@@ -90,13 +87,17 @@ def id(self) -> str:
9087
return "builtins.extensions.reply:ReplyMergeExtension"
9188

9289
async def message_provider(self, event, state, bot, use_origin: bool = False):
90+
event_id = id(event)
91+
if event_id in self.cache:
92+
return self.cache[event_id]
9393
if event.get_type() != "message":
9494
return None
9595
try:
9696
msg = event.get_message()
9797
except (NotImplementedError, ValueError):
9898
return None
9999
uni_msg = UniMessage.generate_sync(message=msg, bot=bot)
100+
self.cache[event_id] = uni_msg
100101
if not (reply := await reply_fetch(event, bot)):
101102
return uni_msg
102103
if not reply.msg:
@@ -108,9 +109,11 @@ async def message_provider(self, event, state, bot, use_origin: bool = False):
108109
if self.add_left:
109110
uni_msg_reply += self.sep
110111
uni_msg_reply.extend(uni_msg)
112+
self.cache[event_id] = uni_msg_reply
111113
return uni_msg_reply
112114
uni_msg += self.sep
113115
uni_msg.extend(uni_msg_reply)
116+
self.cache[event_id] = uni_msg
114117
return uni_msg
115118

116119

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import random
22
from typing import Any, Callable, ClassVar, Optional
33

4+
from tarina import LRU
45
from arclet.alconna import Alconna
5-
from nonebot.typing import T_State
66
from nonebot.internal.adapter import Bot, Event
77

88
from nonebot_plugin_alconna import Target, Extension, UniMessage
@@ -23,22 +23,21 @@ def id(self) -> str:
2323
prefixes: list[str]
2424
command: str
2525
sep: str
26+
cache: "LRU[int, UniMessage]" = LRU(20)
2627

2728
def post_init(self, alc: Alconna) -> None:
2829
self.prefixes = [pf for pf in alc.prefixes if isinstance(pf, str)]
2930
self.command = alc.header_display
3031
self.sep = alc.separators[0]
3132

32-
async def message_provider(self, event: Event, state: T_State, bot: Bot, use_origin: bool = False):
33-
if event.get_type() != "message":
34-
return None
35-
try:
36-
msg = event.get_message()
37-
except (NotImplementedError, ValueError):
38-
return None
39-
uni_msg = UniMessage.generate_sync(message=msg, bot=bot)
33+
async def receive_wrapper(self, bot: Bot, event: Event, command: Alconna, receive: UniMessage) -> UniMessage:
34+
event_id = id(event)
35+
if event_id in self.cache:
36+
return self.cache[event_id]
4037
target = UniMessage.get_target(event, bot)
41-
prefix = self.supplier(target) # type: ignore
42-
if not prefix or not self.command.endswith(prefix):
43-
return uni_msg
44-
return f"{random.choice(self.prefixes)}{prefix}{self.sep}" + uni_msg
38+
prefix = self.supplier(target)
39+
if not prefix or not command.header_display.endswith(prefix):
40+
return receive
41+
res = UniMessage.text(random.choice(self.prefixes) + prefix + self.sep) + receive
42+
self.cache[event_id] = res
43+
return res

src/nonebot_plugin_alconna/extension.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from abc import ABCMeta, abstractmethod
1111
from typing import TYPE_CHECKING, Any, Union, Generic, Literal, TypeVar, ClassVar
1212

13-
from tarina import lang
13+
from tarina import LRU, lang
1414
from nonebot.typing import T_State
1515
from arclet.alconna import Alconna, Arparma
1616
from nonebot.compat import PydanticUndefined
@@ -76,11 +76,11 @@ async def output_converter(self, output_type: OutputType, content: str) -> UniMe
7676

7777
async def message_provider(
7878
self, event: Event, state: T_State, bot: Bot, use_origin: bool = False
79-
) -> Message | UniMessage | None:
79+
) -> UniMessage | None:
8080
"""提供消息对象以便 Alconna 进行处理。"""
8181
return None
8282

83-
async def receive_wrapper(self, bot: Bot, event: Event, command: Alconna, receive: TM) -> TM:
83+
async def receive_wrapper(self, bot: Bot, event: Event, command: Alconna, receive: UniMessage) -> UniMessage:
8484
"""接收消息后的钩子函数。"""
8585
return receive
8686

@@ -125,6 +125,8 @@ def id(self) -> str:
125125

126126
_callbacks = set()
127127

128+
unimsg_cache: LRU[int, UniMessage] = LRU(16)
129+
128130

129131
class ExtensionExecutor:
130132
globals: ClassVar[list[type[Extension] | Extension]] = [DefaultExtension()]
@@ -205,8 +207,11 @@ async def output_converter(self, output_type: OutputType, content: str) -> UniMe
205207

206208
async def message_provider(
207209
self, event: Event, state: T_State, bot: Bot, use_origin: bool = False
208-
) -> Message | UniMessage | None:
209-
if event.get_type() != "message":
210+
) -> UniMessage | None:
211+
event_id = id(event)
212+
if (uni_msg := unimsg_cache.get(event_id)) is not None:
213+
msg = uni_msg
214+
elif event.get_type() != "message":
210215
msg = None
211216
else:
212217
try:
@@ -218,6 +223,9 @@ async def message_provider(
218223
msg = getattr(event, "original_message", msg) # type: ignore
219224
except (NotImplementedError, ValueError):
220225
pass
226+
if msg is not None:
227+
msg = UniMessage.generate_without_reply(message=msg, bot=bot)
228+
unimsg_cache[event_id] = msg
221229
exc = None
222230
for ext in self.context:
223231
if not ext._overrides["message_provider"]:
@@ -232,7 +240,7 @@ async def message_provider(
232240

233241
return msg
234242

235-
async def receive_wrapper(self, bot: Bot, event: Event, command: Alconna, receive: TM) -> TM:
243+
async def receive_wrapper(self, bot: Bot, event: Event, command: Alconna, receive: UniMessage) -> UniMessage:
236244
res = receive
237245
for ext in self.context:
238246
if ext._overrides["receive_wrapper"]:

src/nonebot_plugin_alconna/rule.py

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import asyncio
22
import weakref
3-
import importlib
43
from typing import Any, Union, Literal, Optional
54

65
from nonebot.typing import T_State
@@ -19,7 +18,6 @@
1918

2019
from .i18n import Lang
2120
from .config import Config
22-
from .adapters import MAPPING
2321
from .uniseg import UniMsg, UniMessage
2422
from .model import CompConfig, CommandResult
2523
from .uniseg.constraint import UNISEG_MESSAGE
@@ -286,18 +284,11 @@ async def __call__(self, event: Event, state: T_State, bot: Bot) -> bool:
286284
return False
287285
msg = await self.executor.receive_wrapper(bot, event, cmd, msg)
288286
Arparma._additional.update(bot=lambda: bot, event=lambda: event, state=lambda: state)
289-
adapter_name = bot.adapter.get_name()
290-
if adapter_name in MAPPING and MAPPING[adapter_name] not in _modules:
291-
importlib.import_module(f"nonebot_plugin_alconna.adapters.{MAPPING[adapter_name]}")
292-
if isinstance(msg, UniMessage):
293-
_msg = msg
294-
else:
295-
_msg = await UniMessage.generate(message=msg, adapter=adapter_name)
296-
state[UNISEG_MESSAGE] = _msg
287+
state[UNISEG_MESSAGE] = msg
297288

298289
with output_manager.capture(cmd.name) as cap:
299290
output_manager.set_action(lambda x: x, cmd.name)
300-
task = asyncio.create_task(self.handle(cmd, bot, event, state, _msg))
291+
task = asyncio.create_task(self.handle(cmd, bot, event, state, msg))
301292
if session_id:
302293
self._tasks[session_id] = task
303294
task.add_done_callback(lambda _: self._tasks.pop(session_id, None))

src/nonebot_plugin_alconna/uniseg/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
from .constraint import SupportAdapterModule as SupportAdapterModule
5959
from .adapters import alter_get_builder, alter_get_fetcher, alter_get_exporter
6060

61-
__version__ = "0.55.0"
61+
__version__ = "0.55.1"
6262

6363
__plugin_meta__ = PluginMetadata(
6464
name="Universal Segment 插件",

0 commit comments

Comments
 (0)