From 3bcfe96888320a53568b1fb34303e7a56c39a452 Mon Sep 17 00:00:00 2001 From: Mathieu Velten Date: Thu, 23 Nov 2023 14:51:00 +0100 Subject: [PATCH 01/11] Add avatar and topic settings for server notice room --- changelog.d/16679.feature | 1 + docs/server_notices.md | 4 +- .../configuration/config_documentation.md | 4 + synapse/config/server_notices.py | 12 ++ .../server_notices/server_notices_manager.py | 99 ++++++++++++++-- tests/rest/admin/test_server_notice.py | 109 ++++++++++++++++++ 6 files changed, 221 insertions(+), 8 deletions(-) create mode 100644 changelog.d/16679.feature diff --git a/changelog.d/16679.feature b/changelog.d/16679.feature new file mode 100644 index 000000000000..2398e4386759 --- /dev/null +++ b/changelog.d/16679.feature @@ -0,0 +1 @@ +Add a way to set the avatar and the topic of the server notices room. diff --git a/docs/server_notices.md b/docs/server_notices.md index 339d10a0ab3f..0585665e2ecb 100644 --- a/docs/server_notices.md +++ b/docs/server_notices.md @@ -46,11 +46,13 @@ server_notices: system_mxid_display_name: "Server Notices" system_mxid_avatar_url: "mxc://server.com/oumMVlgDnLYFaPVkExemNVVZ" room_name: "Server Notices" + room_avatar_url: "mxc://server.com/oumMVlgDnLYFaPVkExemNVVZ" + room_topic: "Room used by your server admin to notice you of important information" ``` The only compulsory setting is `system_mxid_localpart`, which defines the user id of the Server Notices user, as above. `room_name` defines the name of the -room which will be created. +room which will be created, `room_avatar_url` its avatar and `room_topic` its topic. `system_mxid_display_name` and `system_mxid_avatar_url` can be used to set the displayname and avatar of the Server Notices user. diff --git a/docs/usage/configuration/config_documentation.md b/docs/usage/configuration/config_documentation.md index 7c4e742cd5d5..e4182282f307 100644 --- a/docs/usage/configuration/config_documentation.md +++ b/docs/usage/configuration/config_documentation.md @@ -3815,6 +3815,8 @@ Sub-options for this setting include: * `system_mxid_display_name`: set the display name of the "notices" user * `system_mxid_avatar_url`: set the avatar for the "notices" user * `room_name`: set the room name of the server notices room +* `room_avatar_url`: set the room avatar URL of the server notices room +* `room_topic`: set the room topic of the server notices room Example configuration: ```yaml @@ -3823,6 +3825,8 @@ server_notices: system_mxid_display_name: "Server Notices" system_mxid_avatar_url: "mxc://server.com/oumMVlgDnLYFaPVkExemNVVZ" room_name: "Server Notices" + room_avatar_url: "mxc://server.com/oumMVlgDnLYFaPVkExemNVVZ" + room_topic: "Room used by your server admin to notice you of important information" ``` --- ### `enable_room_list_search` diff --git a/synapse/config/server_notices.py b/synapse/config/server_notices.py index ce041abe9bb3..c91563cfb953 100644 --- a/synapse/config/server_notices.py +++ b/synapse/config/server_notices.py @@ -38,6 +38,14 @@ class ServerNoticesConfig(Config): server_notices_room_name (str|None): The name to use for the server notices room. None if server notices are not enabled. + + server_notices_room_avatar_url (str|None): + The avatar URL to use for the server notices room. + None if server notices are not enabled. + + server_notices_room_topic (str|None): + The topic to use for the server notices room. + None if server notices are not enabled. """ section = "servernotices" @@ -48,6 +56,8 @@ def __init__(self, *args: Any): self.server_notices_mxid_display_name: Optional[str] = None self.server_notices_mxid_avatar_url: Optional[str] = None self.server_notices_room_name: Optional[str] = None + self.server_notices_room_avatar_url: Optional[str] = None + self.server_notices_room_topic: Optional[str] = None def read_config(self, config: JsonDict, **kwargs: Any) -> None: c = config.get("server_notices") @@ -62,3 +72,5 @@ def read_config(self, config: JsonDict, **kwargs: Any) -> None: self.server_notices_mxid_avatar_url = c.get("system_mxid_avatar_url", None) # todo: i18n self.server_notices_room_name = c.get("room_name", "Server Notices") + self.server_notices_room_avatar_url = c.get("room_avatar_url", None) + self.server_notices_room_topic = c.get("room_topic", None) diff --git a/synapse/server_notices/server_notices_manager.py b/synapse/server_notices/server_notices_manager.py index 44b999677a1e..8f16d7a076c5 100644 --- a/synapse/server_notices/server_notices_manager.py +++ b/synapse/server_notices/server_notices_manager.py @@ -160,6 +160,27 @@ async def get_or_create_notice_room_for_user(self, user_id: str) -> str: self._config.servernotices.server_notices_mxid_display_name, self._config.servernotices.server_notices_mxid_avatar_url, ) + await self._update_room_info( + requester, + room_id, + EventTypes.Name, + "name", + self._config.servernotices.server_notices_room_name, + ) + await self._update_room_info( + requester, + room_id, + EventTypes.RoomAvatar, + "url", + self._config.servernotices.server_notices_room_avatar_url, + ) + await self._update_room_info( + requester, + room_id, + EventTypes.Topic, + "topic", + self._config.servernotices.server_notices_room_topic, + ) return room_id # apparently no existing notice room: create a new one @@ -178,20 +199,36 @@ async def get_or_create_notice_room_for_user(self, user_id: str) -> str: "avatar_url": self._config.servernotices.server_notices_mxid_avatar_url, } - # `ignore_forced_encryption` is used to bypass `encryption_enabled_by_default_for_room_type` - # setting if it set, since the server notices will not be encrypted anyway. + room_config = { + "preset": RoomCreationPreset.PRIVATE_CHAT, + "power_level_content_override": {"users_default": -10}, + } + + if self._config.servernotices.server_notices_room_name: + room_config["name"] = self._config.servernotices.server_notices_room_name + if self._config.servernotices.server_notices_room_topic: + room_config["topic"] = self._config.servernotices.server_notices_room_topic + room_id, _, _ = await self._room_creation_handler.create_room( requester, - config={ - "preset": RoomCreationPreset.PRIVATE_CHAT, - "name": self._config.servernotices.server_notices_room_name, - "power_level_content_override": {"users_default": -10}, - }, + config=room_config, ratelimit=False, creator_join_profile=join_profile, ignore_forced_encryption=True, ) + # Room avatar can't be set at creation time so let's just send an event for that + if self._config.servernotices.server_notices_room_avatar_url: + await self._update_room_info( + requester, + room_id, + EventTypes.RoomAvatar, + "url", + self._config.servernotices.server_notices_room_avatar_url, + # Since we just created the room there is no need to check current value + if_changed=False, + ) + self.maybe_get_notice_room_for_user.invalidate((user_id,)) max_id = await self._account_data_handler.add_tag_to_room( @@ -275,3 +312,51 @@ async def _update_notice_user_profile_if_changed( ratelimit=False, content={"displayname": display_name, "avatar_url": avatar_url}, ) + + async def _update_room_info( + self, + requester: Requester, + room_id: str, + info_event_type: str, + info_content_key: str, + info_value: Optional[str], + if_changed: Optional[bool] = True, + ) -> None: + """ + Updates a specific notice room's info if it's different from what is set. + + Args: + requester: The user who is performing the update. + room_id: The ID of the server notice room + info_event_type: The event type holding the specific info + info_content_key: The key containing the specific info in the event's content + info_value: The expected value for the specific info + if_changed: Try to read the info first and does not send the event if it's already the same + """ + if if_changed: + room_info_event = await self._message_handler.get_room_data( + requester, + room_id, + info_event_type, + "", + ) + + if room_info_event and room_info_event.get(info_content_key) == info_value: + return + + if info_value is None: + info_value = "" + + room_info_event_dict = { + "type": info_event_type, + "room_id": room_id, + "sender": requester.user.to_string(), + "state_key": "", + "content": { + info_content_key: info_value, + }, + } + + event, _ = await self._event_creation_handler.create_and_send_nonmember_event( + requester, room_info_event_dict, ratelimit=False + ) diff --git a/tests/rest/admin/test_server_notice.py b/tests/rest/admin/test_server_notice.py index dfd14f5751bf..93b87b891b72 100644 --- a/tests/rest/admin/test_server_notice.py +++ b/tests/rest/admin/test_server_notice.py @@ -569,6 +569,115 @@ def test_update_notice_user_avatar_when_changed(self) -> None: ) self.assertEqual(notice_user_state["avatar_url"], new_avatar_url) + @override_config( + { + "server_notices": { + "system_mxid_localpart": "notices", + "room_avatar_url": "test/url", + "room_topic": "Test Topic", + } + } + ) + def test_notice_room_avatar_and_topic(self) -> None: + """ + Tests that using `room_avatar_url` and `room_topic` config properly sets + those properties for the created notice rooms. + """ + server_notice_request_content = { + "user_id": self.other_user, + "content": {"msgtype": "m.text", "body": "test msg one"}, + } + + self.make_request( + "POST", + self.url, + access_token=self.admin_user_tok, + content=server_notice_request_content, + ) + + invited_rooms = self._check_invite_and_join_status(self.other_user, 1, 0) + notice_room_id = invited_rooms[0].room_id + self.helper.join( + room=notice_room_id, user=self.other_user, tok=self.other_user_token + ) + + room_avatar_state = self.helper.get_state( + notice_room_id, + "m.room.avatar", + self.other_user_token, + state_key="", + ) + self.assertEqual(room_avatar_state["url"], "test/url") + + room_topic_state = self.helper.get_state( + notice_room_id, + "m.room.topic", + self.other_user_token, + state_key="", + ) + self.assertEqual(room_topic_state["topic"], "Test Topic") + + @override_config( + { + "server_notices": { + "system_mxid_localpart": "notices", + "room_avatar_url": "test/url", + } + } + ) + def test_update_room_avatar_when_changed(self) -> None: + """ + Tests that existing server notices room avatar is updated when it is + different from the one in homeserver config. + """ + server_notice_request_content = { + "user_id": self.other_user, + "content": {"msgtype": "m.text", "body": "test msg one"}, + } + + self.make_request( + "POST", + self.url, + access_token=self.admin_user_tok, + content=server_notice_request_content, + ) + + invited_rooms = self._check_invite_and_join_status(self.other_user, 1, 0) + notice_room_id = invited_rooms[0].room_id + self.helper.join( + room=notice_room_id, user=self.other_user, tok=self.other_user_token + ) + + room_avatar_state = self.helper.get_state( + notice_room_id, + "m.room.avatar", + self.other_user_token, + state_key="", + ) + self.assertEqual(room_avatar_state["url"], "test/url") + + # simulate a change in server config after a server restart. + new_avatar_url = "test/new-url" + self.server_notices_manager._config.servernotices.server_notices_room_avatar_url = ( + new_avatar_url + ) + self.server_notices_manager.get_or_create_notice_room_for_user.cache.invalidate_all() + + self.make_request( + "POST", + self.url, + access_token=self.admin_user_tok, + content=server_notice_request_content, + ) + + room_avatar_state = self.helper.get_state( + notice_room_id, + "m.room.avatar", + self.other_user_token, + state_key="", + ) + self.assertEqual(room_avatar_state["url"], new_avatar_url) + def _check_invite_and_join_status( self, user_id: str, expected_invites: int, expected_memberships: int ) -> Sequence[RoomsForUser]: From 5df2107913588750de7e4b16feeeb38937e7a4f5 Mon Sep 17 00:00:00 2001 From: Mathieu Velten Date: Wed, 29 Nov 2023 10:40:37 +0100 Subject: [PATCH 02/11] Re-add comment about encryption --- synapse/server_notices/server_notices_manager.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/synapse/server_notices/server_notices_manager.py b/synapse/server_notices/server_notices_manager.py index 8f16d7a076c5..686bddd7a102 100644 --- a/synapse/server_notices/server_notices_manager.py +++ b/synapse/server_notices/server_notices_manager.py @@ -209,6 +209,9 @@ async def get_or_create_notice_room_for_user(self, user_id: str) -> str: if self._config.servernotices.server_notices_room_topic: room_config["topic"] = self._config.servernotices.server_notices_room_topic + + # `ignore_forced_encryption` is used to bypass `encryption_enabled_by_default_for_room_type` + # setting if it set, since the server notices will not be encrypted anyway. room_id, _, _ = await self._room_creation_handler.create_room( requester, config=room_config, From 74b6d0e43348490a281bcd29cf648699d5904f13 Mon Sep 17 00:00:00 2001 From: Mathieu Velten Date: Wed, 29 Nov 2023 11:34:05 +0100 Subject: [PATCH 03/11] lint --- synapse/server_notices/server_notices_manager.py | 1 - 1 file changed, 1 deletion(-) diff --git a/synapse/server_notices/server_notices_manager.py b/synapse/server_notices/server_notices_manager.py index 686bddd7a102..ebd89942443a 100644 --- a/synapse/server_notices/server_notices_manager.py +++ b/synapse/server_notices/server_notices_manager.py @@ -209,7 +209,6 @@ async def get_or_create_notice_room_for_user(self, user_id: str) -> str: if self._config.servernotices.server_notices_room_topic: room_config["topic"] = self._config.servernotices.server_notices_room_topic - # `ignore_forced_encryption` is used to bypass `encryption_enabled_by_default_for_room_type` # setting if it set, since the server notices will not be encrypted anyway. room_id, _, _ = await self._room_creation_handler.create_room( From c08beed91bd2074f0a31abfd2a4618d8ff8d855c Mon Sep 17 00:00:00 2001 From: Mathieu Velten Date: Thu, 30 Nov 2023 16:04:18 +0100 Subject: [PATCH 04/11] Clear up doc --- docs/usage/configuration/config_documentation.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/usage/configuration/config_documentation.md b/docs/usage/configuration/config_documentation.md index e4182282f307..1591b42054ec 100644 --- a/docs/usage/configuration/config_documentation.md +++ b/docs/usage/configuration/config_documentation.md @@ -3815,8 +3815,10 @@ Sub-options for this setting include: * `system_mxid_display_name`: set the display name of the "notices" user * `system_mxid_avatar_url`: set the avatar for the "notices" user * `room_name`: set the room name of the server notices room -* `room_avatar_url`: set the room avatar URL of the server notices room -* `room_topic`: set the room topic of the server notices room +* `room_avatar_url`: set the room avatar of the server notices room _Added in Synapse 1.98.0._ +* `room_topic`: set the room topic of the server notices room _Added in Synapse 1.98.0._ + +Note that it will only be updated when a new notice event is sent. Example configuration: ```yaml From 4fdfa05202bb381a1c47491ba6670e067809690c Mon Sep 17 00:00:00 2001 From: Mathieu Velten Date: Thu, 7 Dec 2023 10:20:14 +0100 Subject: [PATCH 05/11] use initial_state --- .../server_notices/server_notices_manager.py | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/synapse/server_notices/server_notices_manager.py b/synapse/server_notices/server_notices_manager.py index e7d5997b5c51..1c7a00330d23 100644 --- a/synapse/server_notices/server_notices_manager.py +++ b/synapse/server_notices/server_notices_manager.py @@ -16,7 +16,7 @@ from synapse.api.constants import EventTypes, Membership, RoomCreationPreset from synapse.events import EventBase -from synapse.types import Requester, StreamKeyType, UserID, create_requester +from synapse.types import JsonDict, Requester, StreamKeyType, UserID, create_requester from synapse.util.caches.descriptors import cached if TYPE_CHECKING: @@ -199,7 +199,7 @@ async def get_or_create_notice_room_for_user(self, user_id: str) -> str: "avatar_url": self._config.servernotices.server_notices_mxid_avatar_url, } - room_config = { + room_config: JsonDict = { "preset": RoomCreationPreset.PRIVATE_CHAT, "power_level_content_override": {"users_default": -10}, } @@ -208,6 +208,16 @@ async def get_or_create_notice_room_for_user(self, user_id: str) -> str: room_config["name"] = self._config.servernotices.server_notices_room_name if self._config.servernotices.server_notices_room_topic: room_config["topic"] = self._config.servernotices.server_notices_room_topic + if self._config.servernotices.server_notices_room_avatar_url: + room_config["initial_state"] = [ + { + "type": EventTypes.RoomAvatar, + "state_key": "", + "content": { + "url": self._config.servernotices.server_notices_room_avatar_url, + }, + } + ] # `ignore_forced_encryption` is used to bypass `encryption_enabled_by_default_for_room_type` # setting if it set, since the server notices will not be encrypted anyway. @@ -219,18 +229,6 @@ async def get_or_create_notice_room_for_user(self, user_id: str) -> str: ignore_forced_encryption=True, ) - # Room avatar can't be set at creation time so let's just send an event for that - if self._config.servernotices.server_notices_room_avatar_url: - await self._update_room_info( - requester, - room_id, - EventTypes.RoomAvatar, - "url", - self._config.servernotices.server_notices_room_avatar_url, - # Since we just created the room there is no need to check current value - if_changed=False, - ) - self.maybe_get_notice_room_for_user.invalidate((user_id,)) max_id = await self._account_data_handler.add_tag_to_room( From 703e91d56900ede52b942ca1337b61374b299a7f Mon Sep 17 00:00:00 2001 From: Mathieu Velten Date: Thu, 7 Dec 2023 10:24:15 +0100 Subject: [PATCH 06/11] Apply suggestions from code review Co-authored-by: David Robertson --- docs/usage/configuration/config_documentation.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/usage/configuration/config_documentation.md b/docs/usage/configuration/config_documentation.md index d7c852b90d99..cf79df422dbc 100644 --- a/docs/usage/configuration/config_documentation.md +++ b/docs/usage/configuration/config_documentation.md @@ -3832,12 +3832,12 @@ Sub-options for this setting include: * `system_mxid_display_name`: set the display name of the "notices" user * `system_mxid_avatar_url`: set the avatar for the "notices" user * `room_name`: set the room name of the server notices room -* `room_avatar_url`: set the room avatar of the server notices room _Added in Synapse 1.98.0._ -* `room_topic`: set the room topic of the server notices room _Added in Synapse 1.98.0._ +* `room_avatar_url`: optional string. The room avatar to use for server notice rooms. If set to the empty string `""`, notice rooms will not be given an avatar. Defaults to the empty string. _Added in Synapse 1.99.0._ +* `room_topic`: optional string. The topic to use for server notice rooms. If set to the empty string `""`, notice rooms will not be given a topic. Defaults to the empty string. _Added in Synapse 1.98.0._ * `auto_join`: boolean. If true, the user will be automatically joined to the room instead of being invited. Defaults to false. _Added in Synapse 1.98.0._ -Note that it will only be updated when a new notice event is sent. +Note that the name, topic and avatar of existing server notice rooms will only be updated when a new notice event is sent. Example configuration: ```yaml From 43dad94ce0d3f6e1b310d4b7cdb478556910849e Mon Sep 17 00:00:00 2001 From: Mathieu Velten Date: Thu, 7 Dec 2023 10:26:30 +0100 Subject: [PATCH 07/11] comments --- docs/server_notices.md | 4 ++-- docs/usage/configuration/config_documentation.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/server_notices.md b/docs/server_notices.md index ac0febe8a207..33b2f4c9eeaa 100644 --- a/docs/server_notices.md +++ b/docs/server_notices.md @@ -44,9 +44,9 @@ section, which should look like this: server_notices: system_mxid_localpart: server system_mxid_display_name: "Server Notices" - system_mxid_avatar_url: "mxc://server.com/oumMVlgDnLYFaPVkExemNVVZ" + system_mxid_avatar_url: "mxc://example.com/oumMVlgDnLYFaPVkExemNVVZ" room_name: "Server Notices" - room_avatar_url: "mxc://server.com/oumMVlgDnLYFaPVkExemNVVZ" + room_avatar_url: "mxc://example.com/oumMVlgDnLYFaPVkExemNVVZ" room_topic: "Room used by your server admin to notice you of important information" auto_join: true ``` diff --git a/docs/usage/configuration/config_documentation.md b/docs/usage/configuration/config_documentation.md index cf79df422dbc..4db328b71143 100644 --- a/docs/usage/configuration/config_documentation.md +++ b/docs/usage/configuration/config_documentation.md @@ -3833,7 +3833,7 @@ Sub-options for this setting include: * `system_mxid_avatar_url`: set the avatar for the "notices" user * `room_name`: set the room name of the server notices room * `room_avatar_url`: optional string. The room avatar to use for server notice rooms. If set to the empty string `""`, notice rooms will not be given an avatar. Defaults to the empty string. _Added in Synapse 1.99.0._ -* `room_topic`: optional string. The topic to use for server notice rooms. If set to the empty string `""`, notice rooms will not be given a topic. Defaults to the empty string. _Added in Synapse 1.98.0._ +* `room_topic`: optional string. The topic to use for server notice rooms. If set to the empty string `""`, notice rooms will not be given a topic. Defaults to the empty string. _Added in Synapse 1.99.0._ * `auto_join`: boolean. If true, the user will be automatically joined to the room instead of being invited. Defaults to false. _Added in Synapse 1.98.0._ From 8d64d162db81843d6582d27f094c1bf5d60c20a6 Mon Sep 17 00:00:00 2001 From: Mathieu Velten Date: Thu, 7 Dec 2023 10:28:18 +0100 Subject: [PATCH 08/11] comments --- docs/usage/configuration/config_documentation.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/usage/configuration/config_documentation.md b/docs/usage/configuration/config_documentation.md index 4db328b71143..62b80c41bbc7 100644 --- a/docs/usage/configuration/config_documentation.md +++ b/docs/usage/configuration/config_documentation.md @@ -3844,9 +3844,9 @@ Example configuration: server_notices: system_mxid_localpart: notices system_mxid_display_name: "Server Notices" - system_mxid_avatar_url: "mxc://server.com/oumMVlgDnLYFaPVkExemNVVZ" + system_mxid_avatar_url: "mxc://example.com/oumMVlgDnLYFaPVkExemNVVZ" room_name: "Server Notices" - room_avatar_url: "mxc://server.com/oumMVlgDnLYFaPVkExemNVVZ" + room_avatar_url: "mxc://example.com/oumMVlgDnLYFaPVkExemNVVZ" room_topic: "Room used by your server admin to notice you of important information" auto_join: true ``` From d8aaaef3b4036b5cbef3ae5b5f71082021ed704c Mon Sep 17 00:00:00 2001 From: Mathieu Velten Date: Tue, 12 Dec 2023 14:36:49 +0100 Subject: [PATCH 09/11] Update changelog.d/16679.feature Co-authored-by: Erik Johnston --- changelog.d/16679.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.d/16679.feature b/changelog.d/16679.feature index 2398e4386759..85af837ae170 100644 --- a/changelog.d/16679.feature +++ b/changelog.d/16679.feature @@ -1 +1 @@ -Add a way to set the avatar and the topic of the server notices room. +Add config options to set the avatar and the topic of the server notices room. From 66debd91182c9e3f7f74c8bf2a423e2b43863203 Mon Sep 17 00:00:00 2001 From: Mathieu Velten Date: Tue, 12 Dec 2023 15:07:11 +0100 Subject: [PATCH 10/11] Update synapse/server_notices/server_notices_manager.py Co-authored-by: Erik Johnston --- synapse/server_notices/server_notices_manager.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/synapse/server_notices/server_notices_manager.py b/synapse/server_notices/server_notices_manager.py index 1c7a00330d23..fc76a283dbca 100644 --- a/synapse/server_notices/server_notices_manager.py +++ b/synapse/server_notices/server_notices_manager.py @@ -354,7 +354,16 @@ async def _update_room_info( "", ) - if room_info_event and room_info_event.get(info_content_key) == info_value: + existing_info_value = None + if room_info_event: + existing_info_value = room_info_event.get(info_content_key) + if existing_info_value == info_value: + return + if not existing_info_value and not info_value: + # A missing `info_value` can either be represented by a None + # or an empty string, so we assume that if they're both falsey + # they're equivalent. + return return if info_value is None: From 06c46b3c9d0575fc9cbca4ae94e69557c245fc00 Mon Sep 17 00:00:00 2001 From: Mathieu Velten Date: Tue, 12 Dec 2023 15:10:09 +0100 Subject: [PATCH 11/11] Address comments --- .../server_notices/server_notices_manager.py | 47 +++++++++---------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/synapse/server_notices/server_notices_manager.py b/synapse/server_notices/server_notices_manager.py index fc76a283dbca..39a54362d870 100644 --- a/synapse/server_notices/server_notices_manager.py +++ b/synapse/server_notices/server_notices_manager.py @@ -36,6 +36,7 @@ def __init__(self, hs: "HomeServer"): self._room_member_handler = hs.get_room_member_handler() self._event_creation_handler = hs.get_event_creation_handler() self._message_handler = hs.get_message_handler() + self._storage_controllers = hs.get_storage_controllers() self._is_mine_id = hs.is_mine_id self._server_name = hs.hostname @@ -302,11 +303,12 @@ async def _update_notice_user_profile_if_changed( assert self.server_notices_mxid is not None - notice_user_data_in_room = await self._message_handler.get_room_data( - create_requester(self.server_notices_mxid), - room_id, - EventTypes.Member, - self.server_notices_mxid, + notice_user_data_in_room = ( + await self._storage_controllers.state.get_current_state_event( + room_id, + EventTypes.Member, + self.server_notices_mxid, + ) ) assert notice_user_data_in_room is not None @@ -333,7 +335,6 @@ async def _update_room_info( info_event_type: str, info_content_key: str, info_value: Optional[str], - if_changed: Optional[bool] = True, ) -> None: """ Updates a specific notice room's info if it's different from what is set. @@ -344,27 +345,23 @@ async def _update_room_info( info_event_type: The event type holding the specific info info_content_key: The key containing the specific info in the event's content info_value: The expected value for the specific info - if_changed: Try to read the info first and does not send the event if it's already the same """ - if if_changed: - room_info_event = await self._message_handler.get_room_data( - requester, - room_id, - info_event_type, - "", - ) + room_info_event = await self._storage_controllers.state.get_current_state_event( + room_id, + info_event_type, + "", + ) - existing_info_value = None - if room_info_event: - existing_info_value = room_info_event.get(info_content_key) - if existing_info_value == info_value: - return - if not existing_info_value and not info_value: - # A missing `info_value` can either be represented by a None - # or an empty string, so we assume that if they're both falsey - # they're equivalent. - return - return + existing_info_value = None + if room_info_event: + existing_info_value = room_info_event.get(info_content_key) + if existing_info_value == info_value: + return + if not existing_info_value and not info_value: + # A missing `info_value` can either be represented by a None + # or an empty string, so we assume that if they're both falsey + # they're equivalent. + return if info_value is None: info_value = ""