55# file, You can obtain one at http://mozilla.org/MPL/2.0/.
66from __future__ import annotations
77
8+ from collections import defaultdict
89import asyncio
910import logging
1011import sys
@@ -143,6 +144,7 @@ class BaseMatrixHandler:
143144 media_config : MediaRepoConfig
144145 versions : VersionsResponse
145146 minimum_spec_version : Version = SpecVersions .V11
147+ room_locks : dict [str , asyncio .Lock ]
146148
147149 user_id_prefix : str
148150 user_id_suffix : str
@@ -159,6 +161,7 @@ def __init__(
159161 self .media_config = MediaRepoConfig (upload_size = 50 * 1024 * 1024 )
160162 self .versions = VersionsResponse .deserialize ({"versions" : ["v1.3" ]})
161163 self .az .matrix_event_handler (self .int_handle_event )
164+ self .room_locks = defaultdict (asyncio .Lock )
162165
163166 self .e2ee = None
164167 self .require_e2ee = False
@@ -400,19 +403,20 @@ async def handle_puppet_invite(
400403 await intent .leave_room (room_id , reason = "You're not allowed to invite this ghost." )
401404 return
402405
403- portal = await self .bridge .get_portal (room_id )
404- if portal :
405- try :
406- await portal .handle_matrix_invite (invited_by , puppet )
407- except br .RejectMatrixInvite as e :
408- await intent .leave_room (room_id , reason = e .message )
409- except br .IgnoreMatrixInvite :
410- pass
406+ async with self .room_locks [room_id ]:
407+ portal = await self .bridge .get_portal (room_id )
408+ if portal :
409+ try :
410+ await portal .handle_matrix_invite (invited_by , puppet )
411+ except br .RejectMatrixInvite as e :
412+ await intent .leave_room (room_id , reason = e .message )
413+ except br .IgnoreMatrixInvite :
414+ pass
415+ else :
416+ await intent .join_room (room_id )
417+ return
411418 else :
412- await intent .join_room (room_id )
413- return
414- else :
415- await self .handle_puppet_nonportal_invite (room_id , puppet , invited_by , evt )
419+ await self .handle_puppet_nonportal_invite (room_id , puppet , invited_by , evt )
416420
417421 async def handle_invite (
418422 self , room_id : RoomID , user_id : UserID , invited_by : br .BaseUser , evt : StateEvent
0 commit comments