mirror of
https://github.com/nonebot/nonebot2.git
synced 2025-02-17 16:20:05 +08:00
🐛 fix missing escape in builtin plugin #117
This commit is contained in:
parent
054df580eb
commit
ab256e57b1
@ -14,8 +14,6 @@ class MessageSegment(BaseMessageSegment):
|
|||||||
|
|
||||||
@overrides(BaseMessageSegment)
|
@overrides(BaseMessageSegment)
|
||||||
def __init__(self, type: str, data: Dict[str, Any]) -> None:
|
def __init__(self, type: str, data: Dict[str, Any]) -> None:
|
||||||
if type == "text":
|
|
||||||
data["text"] = unescape(data["text"])
|
|
||||||
super().__init__(type=type, data=data)
|
super().__init__(type=type, data=data)
|
||||||
|
|
||||||
@overrides(BaseMessageSegment)
|
@overrides(BaseMessageSegment)
|
||||||
@ -215,17 +213,16 @@ class Message(BaseMessage):
|
|||||||
r"(?P<params>"
|
r"(?P<params>"
|
||||||
r"(?:,[a-zA-Z0-9-_.]+=[^,\]]+)*"
|
r"(?:,[a-zA-Z0-9-_.]+=[^,\]]+)*"
|
||||||
r"),?\]", msg):
|
r"),?\]", msg):
|
||||||
yield "text", unescape(msg[text_begin:cqcode.pos +
|
yield "text", msg[text_begin:cqcode.pos + cqcode.start()]
|
||||||
cqcode.start()])
|
|
||||||
text_begin = cqcode.pos + cqcode.end()
|
text_begin = cqcode.pos + cqcode.end()
|
||||||
yield cqcode.group("type"), cqcode.group("params").lstrip(",")
|
yield cqcode.group("type"), cqcode.group("params").lstrip(",")
|
||||||
yield "text", unescape(msg[text_begin:])
|
yield "text", msg[text_begin:]
|
||||||
|
|
||||||
for type_, data in _iter_message(msg):
|
for type_, data in _iter_message(msg):
|
||||||
if type_ == "text":
|
if type_ == "text":
|
||||||
if data:
|
if data:
|
||||||
# only yield non-empty text segment
|
# only yield non-empty text segment
|
||||||
yield MessageSegment(type_, {"text": data})
|
yield MessageSegment(type_, {"text": unescape(data)})
|
||||||
else:
|
else:
|
||||||
data = {
|
data = {
|
||||||
k: unescape(v) for k, v in map(
|
k: unescape(v) for k, v in map(
|
||||||
|
@ -1,24 +1,22 @@
|
|||||||
from functools import reduce
|
from functools import reduce
|
||||||
|
|
||||||
from nonebot.rule import to_me
|
from nonebot.rule import to_me
|
||||||
from nonebot.typing import T_State
|
|
||||||
from nonebot.plugin import on_command
|
from nonebot.plugin import on_command
|
||||||
from nonebot.permission import SUPERUSER
|
from nonebot.permission import SUPERUSER
|
||||||
from nonebot.adapters import Bot, Event, Message, MessageSegment
|
from nonebot.adapters.cqhttp import Bot, unescape, MessageEvent, Message, MessageSegment
|
||||||
|
|
||||||
say = on_command("say", to_me(), permission=SUPERUSER)
|
say = on_command("say", to_me(), permission=SUPERUSER)
|
||||||
|
|
||||||
|
|
||||||
@say.handle()
|
@say.handle()
|
||||||
async def say_unescape(bot: Bot, event: Event, state: T_State):
|
async def say_unescape(bot: Bot, event: MessageEvent):
|
||||||
MessageImpl = event.get_message().__class__
|
|
||||||
|
|
||||||
def _unescape(message: Message, segment: MessageSegment):
|
def _unescape(message: Message, segment: MessageSegment):
|
||||||
if segment.is_text():
|
if segment.is_text():
|
||||||
return message.append(str(segment))
|
return message.append(unescape(str(segment)))
|
||||||
return message.append(segment)
|
return message.append(segment)
|
||||||
|
|
||||||
message = reduce(_unescape, event.get_message(), MessageImpl())
|
message = reduce(_unescape, event.get_message(), Message()) # type: ignore
|
||||||
await bot.send(message=message, event=event)
|
await bot.send(message=message, event=event)
|
||||||
|
|
||||||
|
|
||||||
@ -26,5 +24,5 @@ echo = on_command("echo", to_me())
|
|||||||
|
|
||||||
|
|
||||||
@echo.handle()
|
@echo.handle()
|
||||||
async def echo_escape(bot: Bot, event: Event, state: T_State):
|
async def echo_escape(bot: Bot, event: MessageEvent):
|
||||||
await bot.send(message=event.get_message(), event=event)
|
await bot.send(message=event.get_message(), event=event)
|
||||||
|
@ -17,17 +17,19 @@
|
|||||||
.. _typing:
|
.. _typing:
|
||||||
https://docs.python.org/3/library/typing.html
|
https://docs.python.org/3/library/typing.html
|
||||||
"""
|
"""
|
||||||
|
from collections.abc import Callable as BaseCallable
|
||||||
from typing import Any, Dict, Union, TypeVar, Protocol, overload, Optional, Callable, NoReturn, Awaitable, TYPE_CHECKING
|
from typing import Any, Dict, Union, TypeVar, Optional, Callable, NoReturn, Awaitable, TYPE_CHECKING
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from nonebot.adapters import Bot, Event
|
from nonebot.adapters import Bot, Event
|
||||||
from nonebot.matcher import Matcher
|
from nonebot.matcher import Matcher
|
||||||
|
|
||||||
|
T_Wrapped = TypeVar("T_Wrapped", bound=BaseCallable)
|
||||||
|
|
||||||
|
|
||||||
def overrides(InterfaceClass: object):
|
def overrides(InterfaceClass: object):
|
||||||
|
|
||||||
def overrider(func: Callable) -> Callable:
|
def overrider(func: T_Wrapped) -> T_Wrapped:
|
||||||
assert func.__name__ in dir(
|
assert func.__name__ in dir(
|
||||||
InterfaceClass), f"Error method: {func.__name__}"
|
InterfaceClass), f"Error method: {func.__name__}"
|
||||||
return func
|
return func
|
||||||
|
Loading…
x
Reference in New Issue
Block a user