Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
 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)
Ejemplo n.º 3
0
 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")