diff --git a/nio/rooms.py b/nio/rooms.py index 572e5021..9e3ca4ad 100644 --- a/nio/rooms.py +++ b/nio/rooms.py @@ -412,10 +412,16 @@ def handle_event(self, event: Event) -> None: self.users[user_id].power_level = level elif isinstance(event, RoomSpaceParentEvent): - self.parents.add(event.state_key) + if "via" in event.source.get("content", {}): + self.parents.add(event.state_key) + else: + self.parents.discard(event.state_key) elif isinstance(event, RoomSpaceChildEvent): - self.children.add(event.state_key) + if "via" in event.source.get("content", {}): + self.children.add(event.state_key) + else: + self.children.discard(event.state_key) def handle_account_data(self, event: AccountDataEvent) -> None: if isinstance(event, FullyReadEvent): diff --git a/nio/schemas.py b/nio/schemas.py index 2508f483..9fc2c10f 100644 --- a/nio/schemas.py +++ b/nio/schemas.py @@ -962,7 +962,6 @@ class Schemas: "canonical": {"type": "boolean", "default": False}, "via": {"type": "array", "items": {"type": "string"}}, }, - "required": ["via"], }, }, "required": ["type", "sender", "content", "state_key"], @@ -981,7 +980,6 @@ class Schemas: "via": {"type": "array", "items": {"type": "string"}}, "order": {"type": "string"}, }, - "required": ["via"], }, }, "required": ["type", "sender", "content", "state_key"], diff --git a/tests/room_test.py b/tests/room_test.py index cce621c2..c02e5ac1 100644 --- a/tests/room_test.py +++ b/tests/room_test.py @@ -481,22 +481,80 @@ def test_space_parent(self): assert room.parents == set() room.handle_event( RoomSpaceParentEvent( - {"event_id": "event_id", "sender": BOB_ID, "origin_server_ts": 0}, + { + "event_id": "event_id", + "sender": BOB_ID, + "origin_server_ts": 0, + "content": {}, + }, + "!X:example.org", + ) + ) + assert "!X:example.org" not in room.parents + room.handle_event( + RoomSpaceParentEvent( + { + "event_id": "event_id", + "sender": BOB_ID, + "origin_server_ts": 0, + "content": {"via": ["!A:example.org"]}, + }, "!X:example.org", ) ) assert "!X:example.org" in room.parents + room.handle_event( + RoomSpaceParentEvent( + { + "event_id": "event_id", + "sender": BOB_ID, + "origin_server_ts": 0, + "content": {}, + }, + "!X:example.org", + ) + ) + assert "!X:example.org" not in room.parents def test_space_child(self): room = self.test_room assert room.children == set() room.handle_event( RoomSpaceChildEvent( - {"event_id": "event_id", "sender": BOB_ID, "origin_server_ts": 0}, + { + "event_id": "event_id", + "sender": BOB_ID, + "origin_server_ts": 0, + "content": {}, + }, + "!X:example.org", + ) + ) + assert "!X:example.org" not in room.children + room.handle_event( + RoomSpaceChildEvent( + { + "event_id": "event_id", + "sender": BOB_ID, + "origin_server_ts": 0, + "content": {"via": ["!A:example.org"]}, + }, "!X:example.org", ) ) assert "!X:example.org" in room.children + room.handle_event( + RoomSpaceChildEvent( + { + "event_id": "event_id", + "sender": BOB_ID, + "origin_server_ts": 0, + "content": {}, + }, + "!X:example.org", + ) + ) + assert "!X:example.org" not in room.children def test_room_avatar_event(self): room = self.test_room