Skip to content

Commit f4677ec

Browse files
committed
🐛 version 0.57.2
fix template args in got
1 parent 0b5b30a commit f4677ec

File tree

6 files changed

+55
-13
lines changed

6 files changed

+55
-13
lines changed

src/nonebot_plugin_alconna/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@
143143
from .uniseg import SupportAdapterModule as SupportAdapterModule
144144
from .extension import add_global_extension as add_global_extension
145145

146-
__version__ = "0.57.1"
146+
__version__ = "0.57.2"
147147
__supported_adapters__ = set(m.value for m in SupportAdapterModule.__members__.values()) # noqa: C401
148148
__plugin_meta__ = PluginMetadata(
149149
name="Alconna 插件",

src/nonebot_plugin_alconna/consts.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
ALCONNA_RESULT: Literal["_alc_result"] = "_alc_result"
88
ALCONNA_EXEC_RESULT: Literal["_alc_exec_result"] = "_alc_exec_result"
99
ALCONNA_ARG_KEY: Literal["_alc_arg_{key}"] = "_alc_arg_{key}"
10-
ALCONNA_ARG_PATH: Literal["_alc_arg_path"] = "_alc_arg_path"
10+
ALCONNA_ARG_KEYS: Literal["_alc_arg_keys"] = "_alc_arg_keys"
1111
ALCONNA_EXTENSION: Literal["_alc_extension"] = "_alc_extension"
1212

1313
log = logger_wrapper("Plugin-Alconna")

src/nonebot_plugin_alconna/matcher.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
from .uniseg.message import current_send_wrapper
4242
from .extension import Extension, ExtensionExecutor
4343
from .uniseg import Text, Segment, UniMessage, get_target, get_message_id
44-
from .consts import ALCONNA_RESULT, ALCONNA_ARG_KEY, ALCONNA_ARG_PATH, log
44+
from .consts import ALCONNA_RESULT, ALCONNA_ARG_KEY, ALCONNA_ARG_KEYS, log
4545
from .params import CHECK, MIDDLEWARE, Check, AlconnaParam, ExtensionParam, assign, _seminal, _Dispatch, merge_path
4646

4747
_M = Union[str, Message, MessageSegment, MessageTemplate, Segment, UniMessage, UniMessageTemplate]
@@ -219,7 +219,7 @@ def set_path_arg(cls_or_self, path: str, content: Any) -> None:
219219
state = current_matcher.get().state
220220
key = merge_path(path, cls_or_self.basepath)
221221
state[ALCONNA_ARG_KEY.format(key=key)] = content
222-
state[ALCONNA_ARG_PATH] = key
222+
state.setdefault(ALCONNA_ARG_KEYS, []).append(key)
223223

224224
@_method
225225
def get_path_arg(cls_or_self, path: str, default: Any) -> Any:
@@ -228,7 +228,8 @@ def get_path_arg(cls_or_self, path: str, default: Any) -> Any:
228228
state = cls_or_self.state
229229
else:
230230
state = current_matcher.get().state
231-
return state.get(ALCONNA_ARG_KEY.format(key=merge_path(path, cls_or_self.basepath)), default)
231+
key = merge_path(path, cls_or_self.basepath)
232+
return state.get(ALCONNA_ARG_KEY.format(key), default)
232233

233234
@classmethod
234235
def assign(
@@ -620,6 +621,9 @@ def convert(cls, message: _M) -> Message | UniMessage | str:
620621
return message.format(**state[ALCONNA_RESULT].result.all_matched_args, **state)
621622
if isinstance(message, UniMessageTemplate):
622623
extra = {"$event": event, "$target": get_target(event, bot)}
624+
if keys := state.get(ALCONNA_ARG_KEYS, []):
625+
for key in keys:
626+
extra[key.split(".")[-1]] = state.get(ALCONNA_ARG_KEY.format(key=key))
623627
try:
624628
msg_id = get_message_id(event, bot)
625629
except Exception:

src/nonebot_plugin_alconna/params.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from .typings import CHECK, MIDDLEWARE
1818
from .model import T, Match, Query, CommandResult
1919
from .extension import Extension, ExtensionExecutor, SelectedExtensions
20-
from .consts import ALCONNA_RESULT, ALCONNA_ARG_KEY, ALCONNA_ARG_PATH, ALCONNA_EXTENSION, ALCONNA_EXEC_RESULT
20+
from .consts import ALCONNA_RESULT, ALCONNA_ARG_KEY, ALCONNA_ARG_KEYS, ALCONNA_EXTENSION, ALCONNA_EXEC_RESULT
2121

2222
T_Duplication = TypeVar("T_Duplication", bound=Duplication)
2323
T_Extension = TypeVar("T_Extension", bound=Extension)
@@ -310,10 +310,11 @@ async def _solve(self, matcher: Matcher, event: Event, state: T_State, **kwargs:
310310
return q
311311
if t == Literal["context"]:
312312
return res.result.context
313-
if (key := ALCONNA_ARG_KEY.format(key=self.extra["name"])) in state:
314-
return state[key]
315-
if (path := state.get(ALCONNA_ARG_PATH)) and path.endswith(f".{self.extra['name']}"):
316-
return state[ALCONNA_ARG_KEY.format(key=path)]
313+
keys: list[str] = state.get(ALCONNA_ARG_KEYS, [])
314+
if (key := self.extra["name"]) in keys:
315+
return state[ALCONNA_ARG_KEY.format(key=key)]
316+
if any(k := key for key in keys if key.endswith(f".{self.extra['name']}")):
317+
return state[ALCONNA_ARG_KEY.format(key=k)]
317318
if self.extra["name"] in res.result.all_matched_args:
318319
return res.result.all_matched_args[self.extra["name"]]
319320
if (

src/nonebot_plugin_alconna/uniseg/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
from .constraint import SupportAdapterModule as SupportAdapterModule
6464
from .adapters import alter_get_builder, alter_get_fetcher, alter_get_exporter
6565

66-
__version__ = "0.57.1"
66+
__version__ = "0.57.2"
6767

6868
__plugin_meta__ = PluginMetadata(
6969
name="Universal Segment 插件",

tests/test_uniseg.py

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import pytest
22
from nonebug import App
33
from nonebot import get_adapter
4-
from arclet.alconna import Alconna
4+
from arclet.alconna import Args, Alconna
55
from nonebot.adapters.onebot.v11.event import Reply
66
from nonebot.compat import model_dump, type_validate_python
77
from nonebot.adapters.onebot.v11 import Bot, Adapter, Message, MessageSegment
@@ -135,7 +135,7 @@ async def test_fallback(app: App):
135135
@pytest.mark.asyncio()
136136
async def test_unimsg_template(app: App):
137137
from nonebot_plugin_alconna.uniseg import FallbackSegment
138-
from nonebot_plugin_alconna import At, Text, Other, UniMessage, on_alconna
138+
from nonebot_plugin_alconna import At, Text, Match, Other, UniMessage, on_alconna
139139

140140
assert UniMessage.template("{} {}").format("hello", Other(FallbackSegment.text("123"))) == UniMessage(
141141
[Text("hello "), Other(FallbackSegment.text("123"))]
@@ -159,6 +159,43 @@ async def _():
159159
ctx.should_call_send(event, MessageSegment.reply(event.message_id) + MessageSegment.at(23))
160160
ctx.should_finished(matcher)
161161

162+
matcher1 = on_alconna(Alconna("test_unimsg_template1", Args["foo?", str]["bar?", str]))
163+
164+
@matcher1.handle()
165+
async def _(foo: Match[str], bar: Match[str]):
166+
if foo.available:
167+
matcher1.set_path_arg("foo", foo.result)
168+
if bar.available:
169+
matcher1.set_path_arg("bar", bar.result)
170+
171+
@matcher1.got_path(
172+
"foo",
173+
prompt=UniMessage.template("{:At(user, $event.get_user_id())} 请确认目标 foo"),
174+
)
175+
@matcher1.got_path(
176+
"bar",
177+
prompt=UniMessage.template("{:At(user, $event.get_user_id())} 请确认目标 bar"),
178+
)
179+
async def _():
180+
await matcher1.send(
181+
UniMessage.template("{:At(user, $event.get_user_id())} 已确认目标为 {foo}, {bar}"),
182+
)
183+
184+
async with app.test_matcher(matcher1) as ctx1:
185+
adapter = get_adapter(Adapter)
186+
bot = ctx1.create_bot(base=Bot, adapter=adapter)
187+
event = fake_group_message_event_v11(message=Message("test_unimsg_template1"), user_id=123)
188+
ctx1.receive_event(bot, event)
189+
ctx1.should_call_send(event, MessageSegment.at(123) + " 请确认目标 foo")
190+
ctx1.should_rejected(matcher1)
191+
event1 = fake_group_message_event_v11(message=Message("123"), user_id=123)
192+
ctx1.receive_event(bot, event1)
193+
ctx1.should_call_send(event1, MessageSegment.at(123) + " 请确认目标 bar")
194+
ctx1.should_rejected(matcher1)
195+
event2 = fake_group_message_event_v11(message=Message("456"), user_id=123)
196+
ctx1.receive_event(bot, event2)
197+
ctx1.should_call_send(event2, MessageSegment.at(123) + " 已确认目标为 123, 456")
198+
162199

163200
@pytest.mark.asyncio()
164201
async def test_uniseg_recv(app: App):

0 commit comments

Comments
 (0)