async def fetchMessage(self, count: int) -> T.List[T.Union[FriendMessage, GroupMessage, ExternalEvent]]: from mirai.event.external.enums import ExternalEvents result = assertOperatorSuccess( await fetch.http_get(f"{self.baseurl}/fetchMessage", { "sessionKey": self.session_key, "count": count } ), raise_exception=True, return_as_is=True)['data'] # 因为重新生成一个开销太大, 所以就直接在原数据内进行遍历替换 try: for index in range(len(result)): # 判断当前项是否为 Message if result[index]['type'] in MessageTypes: if 'messageChain' in result[index]: result[index]['messageChain'] = MessageChain.parse_obj(result[index]['messageChain']) result[index] = \ MessageTypes[result[index]['type']].parse_obj(result[index]) elif hasattr(ExternalEvents, result[index]['type']): # 判断当前项为 Event result[index] = \ ExternalEvents[result[index]['type']].value.parse_obj(result[index]) except pydantic.ValidationError: ProtocolLogger.error(f"parse failed: {result}") traceback.print_exc() raise return result
def parse_obj(cls, obj): from .components import MessageComponents result = [] for i in obj: if not isinstance(i, dict): raise TypeError("invaild value") try: result.append(MessageComponents[i['type']].parse_obj(i)) except: Protocol.error(f"error throwed by message serialization: {i['type']}, it's {i}") raise return cls(__root__=result)
def __init__(self, text, **_): if len(text) > 128: ProtocolLogger.warn(f"mirai does not support for long string: now its length is {len(text)}") super().__init__(text=text, type="Plain")