🔀 Merge pull request #255

Fix: prompt type error
This commit is contained in:
Ju4tCode 2021-03-02 01:57:45 -06:00 committed by GitHub
commit 1df24a683e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 46 additions and 10 deletions

View File

@ -179,7 +179,7 @@ await bot.send_msg(message="hello world")
## _class_ `MessageSegment` ## _class_ `MessageSegment`
基类:`abc.ABC` 基类:`abc.ABC`, `Mapping`
消息段基类 消息段基类

View File

@ -307,7 +307,7 @@ CQHTTP 协议 Bot 适配。继承属性参考 [BaseBot](./#class-basebot) 。
## _class_ `MessageSegment` ## _class_ `MessageSegment`
基类:[`nonebot.adapters._base.MessageSegment`](README.md#nonebot.adapters._base.MessageSegment) 基类:`abc.ABC`, `Mapping`
CQHTTP 协议 MessageSegment 适配。具体方法参考协议消息段类型或源码。 CQHTTP 协议 MessageSegment 适配。具体方法参考协议消息段类型或源码。

View File

@ -199,7 +199,7 @@ sidebarDepth: 0
## _class_ `MessageSegment` ## _class_ `MessageSegment`
基类:[`nonebot.adapters._base.MessageSegment`](README.md#nonebot.adapters._base.MessageSegment) 基类:`abc.ABC`, `Mapping`
钉钉 协议 MessageSegment 适配。具体方法参考协议消息段类型或源码。 钉钉 协议 MessageSegment 适配。具体方法参考协议消息段类型或源码。

View File

@ -722,7 +722,7 @@ mirai-api-http 正向 Websocket 协议 Bot 适配。
## _class_ `MessageSegment` ## _class_ `MessageSegment`
基类:[`nonebot.adapters._base.MessageSegment`](README.md#nonebot.adapters._base.MessageSegment) 基类:`abc.ABC`, `Mapping`
Mirai-API-HTTP 协议 MessageSegment 适配。具体方法参考 [mirai-api-http 消息类型](https://github.com/project-mirai/mirai-api-http/blob/master/docs/MessageType.md) Mirai-API-HTTP 协议 MessageSegment 适配。具体方法参考 [mirai-api-http 消息类型](https://github.com/project-mirai/mirai-api-http/blob/master/docs/MessageType.md)

View File

@ -152,7 +152,7 @@ T_MessageSegment = TypeVar("T_MessageSegment", bound="MessageSegment")
@dataclass @dataclass
class MessageSegment(abc.ABC): class MessageSegment(abc.ABC, Mapping):
"""消息段基类""" """消息段基类"""
type: str type: str
""" """
@ -166,10 +166,16 @@ class MessageSegment(abc.ABC):
""" """
@abc.abstractmethod @abc.abstractmethod
def __str__(self: T_MessageSegment) -> str: def __str__(self) -> str:
"""该消息段所代表的 str在命令匹配部分使用""" """该消息段所代表的 str在命令匹配部分使用"""
raise NotImplementedError raise NotImplementedError
def __len__(self) -> int:
return len(str(self))
def __ne__(self: T_MessageSegment, other: T_MessageSegment) -> bool:
return not self == other
@abc.abstractmethod @abc.abstractmethod
def __add__(self: T_MessageSegment, other: Union[str, T_MessageSegment, def __add__(self: T_MessageSegment, other: Union[str, T_MessageSegment,
T_Message]) -> T_Message: T_Message]) -> T_Message:
@ -203,9 +209,24 @@ class MessageSegment(abc.ABC):
def __setitem__(self, key, value): def __setitem__(self, key, value):
return setattr(self, key, value) return setattr(self, key, value)
def get(self, key, default=None): def __iter__(self):
yield from self.data.__iter__()
def __contains__(self, key: object) -> bool:
return key in self.data
def get(self, key: str, default=None):
return getattr(self, key, default) return getattr(self, key, default)
def keys(self):
return self.data.keys()
def values(self):
return self.data.values()
def items(self):
return self.data.items()
def copy(self: T_MessageSegment) -> T_MessageSegment: def copy(self: T_MessageSegment) -> T_MessageSegment:
return copy(self) return copy(self)

View File

@ -10,7 +10,7 @@ from functools import wraps
from datetime import datetime from datetime import datetime
from contextvars import ContextVar from contextvars import ContextVar
from collections import defaultdict from collections import defaultdict
from typing import Type, List, Dict, Union, Callable, Optional, NoReturn, TYPE_CHECKING from typing import Type, List, Dict, Union, Mapping, Iterable, Callable, Optional, NoReturn, TYPE_CHECKING
from nonebot.rule import Rule from nonebot.rule import Rule
from nonebot.log import logger from nonebot.log import logger
@ -345,8 +345,23 @@ class Matcher(metaclass=MatcherMeta):
state["_current_key"] = key state["_current_key"] = key
if key not in state: if key not in state:
if prompt: if prompt:
await bot.send(event=event, if isinstance(prompt, str):
message=str(prompt).format(**state)) await bot.send(event=event,
message=prompt.format(**state))
elif isinstance(prompt, Mapping):
if prompt.is_text():
await bot.send(event=event,
message=str(prompt).format(**state))
else:
await bot.send(event=event, message=prompt)
elif isinstance(prompt, Iterable):
await bot.send(
event=event,
message=prompt.__class__(
str(prompt).format(**state)) # type: ignore
)
else:
logger.warning("Unknown prompt type, ignored.")
raise PausedException raise PausedException
else: else:
state["_skip_key"] = True state["_skip_key"] = True