16
16
17
17
from synapse .api .constants import EventTypes , Membership , RoomCreationPreset
18
18
from synapse .events import EventBase
19
- from synapse .types import UserID , create_requester
19
+ from synapse .types import Requester , UserID , create_requester
20
20
from synapse .util .caches .descriptors import cached
21
21
22
22
if TYPE_CHECKING :
@@ -35,6 +35,7 @@ def __init__(self, hs: "HomeServer"):
35
35
self ._room_creation_handler = hs .get_room_creation_handler ()
36
36
self ._room_member_handler = hs .get_room_member_handler ()
37
37
self ._event_creation_handler = hs .get_event_creation_handler ()
38
+ self ._message_handler = hs .get_message_handler ()
38
39
self ._is_mine_id = hs .is_mine_id
39
40
self ._server_name = hs .hostname
40
41
@@ -107,6 +108,10 @@ async def get_or_create_notice_room_for_user(self, user_id: str) -> str:
107
108
108
109
assert self ._is_mine_id (user_id ), "Cannot send server notices to remote users"
109
110
111
+ requester = create_requester (
112
+ self .server_notices_mxid , authenticated_entity = self ._server_name
113
+ )
114
+
110
115
rooms = await self ._store .get_rooms_for_local_user_where_membership_is (
111
116
user_id , [Membership .INVITE , Membership .JOIN ]
112
117
)
@@ -125,6 +130,12 @@ async def get_or_create_notice_room_for_user(self, user_id: str) -> str:
125
130
room .room_id ,
126
131
user_id ,
127
132
)
133
+ await self ._update_notice_user_profile_if_changed (
134
+ requester ,
135
+ room .room_id ,
136
+ self ._config .servernotices .server_notices_mxid_display_name ,
137
+ self ._config .servernotices .server_notices_mxid_avatar_url ,
138
+ )
128
139
return room .room_id
129
140
130
141
# apparently no existing notice room: create a new one
@@ -143,9 +154,6 @@ async def get_or_create_notice_room_for_user(self, user_id: str) -> str:
143
154
"avatar_url" : self ._config .servernotices .server_notices_mxid_avatar_url ,
144
155
}
145
156
146
- requester = create_requester (
147
- self .server_notices_mxid , authenticated_entity = self ._server_name
148
- )
149
157
info , _ = await self ._room_creation_handler .create_room (
150
158
requester ,
151
159
config = {
@@ -194,3 +202,46 @@ async def maybe_invite_user_to_room(self, user_id: str, room_id: str) -> None:
194
202
room_id = room_id ,
195
203
action = "invite" ,
196
204
)
205
+
206
+ async def _update_notice_user_profile_if_changed (
207
+ self ,
208
+ requester : Requester ,
209
+ room_id : str ,
210
+ display_name : Optional [str ],
211
+ avatar_url : Optional [str ],
212
+ ) -> None :
213
+ """
214
+ Updates the notice user's profile if it's different from what is in the room.
215
+
216
+ Args:
217
+ requester: The user who is performing the update.
218
+ room_id: The ID of the server notice room
219
+ display_name: The displayname of the server notice user
220
+ avatar_url: The avatar url of the server notice user
221
+ """
222
+ logger .debug ("Checking whether notice user profile has changed for %s" , room_id )
223
+
224
+ assert self .server_notices_mxid is not None
225
+
226
+ notice_user_data_in_room = await self ._message_handler .get_room_data (
227
+ self .server_notices_mxid ,
228
+ room_id ,
229
+ EventTypes .Member ,
230
+ self .server_notices_mxid ,
231
+ )
232
+
233
+ assert notice_user_data_in_room is not None
234
+
235
+ notice_user_profile_changed = (
236
+ display_name != notice_user_data_in_room .content .get ("displayname" )
237
+ or avatar_url != notice_user_data_in_room .content .get ("avatar_url" )
238
+ )
239
+ if notice_user_profile_changed :
240
+ logger .info ("Updating notice user profile in room %s" , room_id )
241
+ await self ._room_member_handler .update_membership (
242
+ requester = requester ,
243
+ target = UserID .from_string (self .server_notices_mxid ),
244
+ room_id = room_id ,
245
+ action = "join" ,
246
+ content = {"displayname" : display_name , "avatar_url" : avatar_url },
247
+ )
0 commit comments