예제 #1
0
 def _fix_prev_content(raw_event: JSON) -> None:
     try:
         raw_event["unsigned"]["prev_content"]
     except KeyError:
         try:
             raw_event.setdefault("unsigned", {})["prev_content"] = raw_event["prev_content"]
         except KeyError:
             pass
예제 #2
0
 def deserialize(cls, raw: JSON) -> Cookies:
     cookie = SimpleCookie()
     for key, data in raw.items():
         cookie[key] = data.pop("value")
         cookie[key].update(data)
     cookies = cls()
     cookies.jar.update_cookies(cookie, ig_url)
     return cookies
예제 #3
0
    def handle_sync(self, data: JSON) -> List[asyncio.Task]:
        """
        Handle a /sync object.

        Args:
            data: The data from a /sync request.
        """
        tasks = []

        otk_count = data.get("device_one_time_keys_count", {})
        tasks += self.dispatch_internal_event(
            InternalEventType.DEVICE_OTK_COUNT,
            custom_type=DeviceOTKCount(curve25519=otk_count.get("curve25519", 0),
                                       signed_curve25519=otk_count.get("signed_curve25519", 0)))

        device_lists = data.get("device_lists", {})
        tasks += self.dispatch_internal_event(InternalEventType.DEVICE_LISTS,
                                              custom_type=DeviceLists(
                                                  changed=device_lists.get("changed", []),
                                                  left=device_lists.get("left", [])))

        for raw_event in data.get("account_data", {}).get("events", []):
            tasks += self.dispatch_event(AccountDataEvent.deserialize(raw_event),
                                         source=SyncStream.ACCOUNT_DATA)
        for raw_event in data.get("ephemeral", {}).get("events", []):
            tasks += self.dispatch_event(EphemeralEvent.deserialize(raw_event),
                                         source=SyncStream.EPHEMERAL)
        for raw_event in data.get("to_device", {}).get("events", []):
            tasks += self.dispatch_event(ToDeviceEvent.deserialize(raw_event),
                                         source=SyncStream.TO_DEVICE)

        rooms = data.get("rooms", {})
        for room_id, room_data in rooms.get("join", {}).items():
            for raw_event in room_data.get("state", {}).get("events", []):
                raw_event["room_id"] = room_id
                tasks += self.dispatch_event(StateEvent.deserialize(raw_event),
                                             source=SyncStream.JOINED_ROOM | SyncStream.STATE)

            for raw_event in room_data.get("timeline", {}).get("events", []):
                raw_event["room_id"] = room_id
                tasks += self.dispatch_event(Event.deserialize(raw_event),
                                             source=SyncStream.JOINED_ROOM | SyncStream.TIMELINE)
        for room_id, room_data in rooms.get("invite", {}).items():
            events: List[Dict[str, Any]] = room_data.get("invite_state", {}).get("events", [])
            for raw_event in events:
                raw_event["room_id"] = room_id
            raw_invite = next(raw_event for raw_event in events
                              if raw_event.get("type", "") == "m.room.member"
                              and raw_event.get("state_key", "") == self.mxid)
            # These aren't required by the spec, so make sure they're set
            raw_invite.setdefault("event_id", None)
            raw_invite.setdefault("origin_server_ts", int(time() * 1000))
            raw_invite.setdefault("unsigned", {})

            invite = StateEvent.deserialize(raw_invite)
            invite.unsigned.invite_room_state = [StrippedStateEvent.deserialize(raw_event)
                                                 for raw_event in events
                                                 if raw_event != raw_invite]
            tasks += self.dispatch_event(invite, source=SyncStream.INVITED_ROOM | SyncStream.STATE)
        for room_id, room_data in rooms.get("leave", {}).items():
            for raw_event in room_data.get("timeline", {}).get("events", []):
                if "state_key" in raw_event:
                    raw_event["room_id"] = room_id
                    tasks += self.dispatch_event(StateEvent.deserialize(raw_event),
                                                 source=SyncStream.LEFT_ROOM | SyncStream.TIMELINE)
        return tasks