@@ -54,19 +54,26 @@ async def get_context_for_event(
5454
5555 if ev .internal_metadata .outlier :
5656 # We don't have state for outliers, so we can't compute the context
57- # except for invites with `invite_room_state` set. (Such events are
58- # known as 'out-of-band memberships' for the user.
59- if (
60- ev .type != EventTypes .Member
61- or ev .content .get ("membership" ) != Membership .INVITE
62- ):
57+ # except for invites and knocks. (Such events are known as 'out-of-band
58+ # memberships' for the user).
59+ if ev .type != EventTypes .Member :
6360 return ctx
6461
65- invite_room_state = ev .unsigned .get ("invite_room_state" , [])
62+ # We might be able to pull out the display name for the sender straight
63+ # from the membership event
64+ event_display_name = ev .content .get ("displayname" )
65+ if event_display_name and ev .state_key == ev .sender :
66+ ctx ["sender_display_name" ] = event_display_name
67+
68+ room_state = None
69+ if ev .content .get ("membership" ) == Membership .INVITE :
70+ room_state = ev .unsigned .get ("invite_room_state" , [])
71+ elif ev .content .get ("membership" ) == Membership .KNOCK :
72+ room_state = ev .unsigned .get ("knock_room_state" , [])
6673
6774 # Ideally we'd reuse the logic in `calculate_room_name`, but that gets
6875 # complicated to handle partial events vs pulling events from the DB.
69- for state_dict in invite_room_state :
76+ for state_dict in room_state :
7077 type_tuple = (state_dict ["type" ], state_dict .get ("state_key" ))
7178 if type_tuple == (EventTypes .Member , ev .sender ):
7279 display_name = state_dict ["content" ].get ("displayname" )
0 commit comments