Skip to content

Commit

Permalink
🍻 version 0.55.1
Browse files Browse the repository at this point in the history
add caches for Extension's message provide
  • Loading branch information
RF-Tar-Railt committed Feb 7, 2025
1 parent 3239b66 commit 68b7301
Show file tree
Hide file tree
Showing 7 changed files with 45 additions and 44 deletions.
2 changes: 1 addition & 1 deletion src/nonebot_plugin_alconna/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@
from .uniseg import SupportAdapterModule as SupportAdapterModule
from .extension import add_global_extension as add_global_extension

__version__ = "0.55.0"
__version__ = "0.55.1"
__supported_adapters__ = set(m.value for m in SupportAdapterModule.__members__.values()) # noqa: C401
__plugin_meta__ = PluginMetadata(
name="Alconna 插件",
Expand Down
4 changes: 2 additions & 2 deletions src/nonebot_plugin_alconna/builtins/extensions/discord.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from nonebot.adapters import Event
from nonebot.typing import T_State
from nonebot.adapters.discord import Bot
from nonebot.adapters.discord.message import Message, parse_message
from nonebot.adapters.discord.message import parse_message
from nonebot.adapters.discord.event import ApplicationCommandInteractionEvent
from nonebot.adapters.discord.commands.matcher import ApplicationCommandConfig
from nonebot.adapters.discord.commands.storage import _application_command_storage
Expand Down Expand Up @@ -142,7 +142,7 @@ def _handle_options(options: list[ApplicationCommandInteractionDataOption]):
cmd += " "
cmd += " ".join(_handle_options(data.options))

return Message(cmd.rstrip())
return UniMessage(cmd.rstrip())

@classmethod
async def send_deferred_response(cls) -> None:
Expand Down
23 changes: 13 additions & 10 deletions src/nonebot_plugin_alconna/builtins/extensions/reply.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
from typing import Optional

from tarina import LRU
from arclet.alconna import Alconna
from nonebot.internal.adapter import Bot, Event

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

async def message_provider(self, event, state, bot, use_origin: bool = False):
if event.get_type() != "message":
return None
try:
msg = event.get_message()
except (NotImplementedError, ValueError):
return None
uni_msg = UniMessage.generate_sync(message=msg, bot=bot)
async def receive_wrapper(self, bot: Bot, event: Event, command: Alconna, receive: UniMessage) -> UniMessage:
if not (reply := await reply_fetch(event, bot)):
return uni_msg
return receive
msg_id = UniMessage.get_message_id(event, bot)
self.cache[msg_id] = reply
return uni_msg
return receive


class ReplyMergeExtension(Extension):
Expand Down Expand Up @@ -81,6 +76,8 @@ def __init__(self, add_left: bool = False, sep: str = " "):
self.add_left = add_left
self.sep = sep

cache: "LRU[int, UniMessage]" = LRU(20)

@property
def priority(self) -> int:
return 14
Expand All @@ -90,13 +87,17 @@ def id(self) -> str:
return "builtins.extensions.reply:ReplyMergeExtension"

async def message_provider(self, event, state, bot, use_origin: bool = False):
event_id = id(event)
if event_id in self.cache:
return self.cache[event_id]
if event.get_type() != "message":
return None
try:
msg = event.get_message()
except (NotImplementedError, ValueError):
return None
uni_msg = UniMessage.generate_sync(message=msg, bot=bot)
self.cache[event_id] = uni_msg
if not (reply := await reply_fetch(event, bot)):
return uni_msg
if not reply.msg:
Expand All @@ -108,9 +109,11 @@ async def message_provider(self, event, state, bot, use_origin: bool = False):
if self.add_left:
uni_msg_reply += self.sep
uni_msg_reply.extend(uni_msg)
self.cache[event_id] = uni_msg_reply
return uni_msg_reply
uni_msg += self.sep
uni_msg.extend(uni_msg_reply)
self.cache[event_id] = uni_msg
return uni_msg


Expand Down
25 changes: 12 additions & 13 deletions src/nonebot_plugin_alconna/builtins/plugins/with/extension.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import random
from typing import Any, Callable, ClassVar, Optional

from tarina import LRU
from arclet.alconna import Alconna
from nonebot.typing import T_State
from nonebot.internal.adapter import Bot, Event

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

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

async def message_provider(self, event: Event, state: T_State, bot: Bot, use_origin: bool = False):
if event.get_type() != "message":
return None
try:
msg = event.get_message()
except (NotImplementedError, ValueError):
return None
uni_msg = UniMessage.generate_sync(message=msg, bot=bot)
async def receive_wrapper(self, bot: Bot, event: Event, command: Alconna, receive: UniMessage) -> UniMessage:
event_id = id(event)
if event_id in self.cache:
return self.cache[event_id]
target = UniMessage.get_target(event, bot)
prefix = self.supplier(target) # type: ignore
if not prefix or not self.command.endswith(prefix):
return uni_msg
return f"{random.choice(self.prefixes)}{prefix}{self.sep}" + uni_msg
prefix = self.supplier(target)
if not prefix or not command.header_display.endswith(prefix):
return receive
res = UniMessage.text(random.choice(self.prefixes) + prefix + self.sep) + receive
self.cache[event_id] = res
return res
20 changes: 14 additions & 6 deletions src/nonebot_plugin_alconna/extension.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
from abc import ABCMeta, abstractmethod
from typing import TYPE_CHECKING, Any, Union, Generic, Literal, TypeVar, ClassVar

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

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

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

Expand Down Expand Up @@ -125,6 +125,8 @@ def id(self) -> str:

_callbacks = set()

unimsg_cache: LRU[int, UniMessage] = LRU(16)


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

async def message_provider(
self, event: Event, state: T_State, bot: Bot, use_origin: bool = False
) -> Message | UniMessage | None:
if event.get_type() != "message":
) -> UniMessage | None:
event_id = id(event)
if (uni_msg := unimsg_cache.get(event_id)) is not None:
msg = uni_msg
elif event.get_type() != "message":
msg = None
else:
try:
Expand All @@ -218,6 +223,9 @@ async def message_provider(
msg = getattr(event, "original_message", msg) # type: ignore
except (NotImplementedError, ValueError):
pass
if msg is not None:
msg = UniMessage.generate_without_reply(message=msg, bot=bot)
unimsg_cache[event_id] = msg
exc = None
for ext in self.context:
if not ext._overrides["message_provider"]:
Expand All @@ -232,7 +240,7 @@ async def message_provider(

return msg

async def receive_wrapper(self, bot: Bot, event: Event, command: Alconna, receive: TM) -> TM:
async def receive_wrapper(self, bot: Bot, event: Event, command: Alconna, receive: UniMessage) -> UniMessage:
res = receive
for ext in self.context:
if ext._overrides["receive_wrapper"]:
Expand Down
13 changes: 2 additions & 11 deletions src/nonebot_plugin_alconna/rule.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import asyncio
import weakref
import importlib
from typing import Any, Union, Literal, Optional

from nonebot.typing import T_State
Expand All @@ -19,7 +18,6 @@

from .i18n import Lang
from .config import Config
from .adapters import MAPPING
from .uniseg import UniMsg, UniMessage
from .model import CompConfig, CommandResult
from .uniseg.constraint import UNISEG_MESSAGE
Expand Down Expand Up @@ -286,18 +284,11 @@ async def __call__(self, event: Event, state: T_State, bot: Bot) -> bool:
return False
msg = await self.executor.receive_wrapper(bot, event, cmd, msg)
Arparma._additional.update(bot=lambda: bot, event=lambda: event, state=lambda: state)
adapter_name = bot.adapter.get_name()
if adapter_name in MAPPING and MAPPING[adapter_name] not in _modules:
importlib.import_module(f"nonebot_plugin_alconna.adapters.{MAPPING[adapter_name]}")
if isinstance(msg, UniMessage):
_msg = msg
else:
_msg = await UniMessage.generate(message=msg, adapter=adapter_name)
state[UNISEG_MESSAGE] = _msg
state[UNISEG_MESSAGE] = msg

with output_manager.capture(cmd.name) as cap:
output_manager.set_action(lambda x: x, cmd.name)
task = asyncio.create_task(self.handle(cmd, bot, event, state, _msg))
task = asyncio.create_task(self.handle(cmd, bot, event, state, msg))
if session_id:
self._tasks[session_id] = task
task.add_done_callback(lambda _: self._tasks.pop(session_id, None))
Expand Down
2 changes: 1 addition & 1 deletion src/nonebot_plugin_alconna/uniseg/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@
from .constraint import SupportAdapterModule as SupportAdapterModule
from .adapters import alter_get_builder, alter_get_fetcher, alter_get_exporter

__version__ = "0.55.0"
__version__ = "0.55.1"

__plugin_meta__ = PluginMetadata(
name="Universal Segment 插件",
Expand Down

0 comments on commit 68b7301

Please sign in to comment.