Don't share room members models between accounts
Is unsafe and creates subtile bugs, like "invite member → member declines → member disappears from the member list, then reappears a second after" (race condition)
This commit is contained in:
parent
707ac61ff6
commit
438b0d26a4
@ -29,8 +29,8 @@ class Backend:
|
|||||||
Account, # Logged-in accounts
|
Account, # Logged-in accounts
|
||||||
(Device, str), # Devices of user_id
|
(Device, str), # Devices of user_id
|
||||||
(Room, str), # Rooms for user_id
|
(Room, str), # Rooms for user_id
|
||||||
(Member, str), # Members in room_id
|
|
||||||
(Upload, str), # Uploads running in room_id
|
(Upload, str), # Uploads running in room_id
|
||||||
|
(Member, str, str), # Members for account user_id for room_id
|
||||||
(Event, str, str), # Events for account user_id for room_id
|
(Event, str, str), # Events for account user_id for room_id
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -409,7 +409,7 @@ class MatrixClient(nio.AsyncClient):
|
|||||||
event_type: Type[nio.Event], **event_fields,
|
event_type: Type[nio.Event], **event_fields,
|
||||||
) -> None:
|
) -> None:
|
||||||
|
|
||||||
our_info = self.models[Member, room_id][self.user_id]
|
our_info = self.models[Member, self.user_id, room_id][self.user_id]
|
||||||
|
|
||||||
event = Event(
|
event = Event(
|
||||||
source = None,
|
source = None,
|
||||||
@ -427,7 +427,7 @@ class MatrixClient(nio.AsyncClient):
|
|||||||
self.local_echoes_uuid.add(uuid)
|
self.local_echoes_uuid.add(uuid)
|
||||||
|
|
||||||
for user_id in self.models[Account]:
|
for user_id in self.models[Account]:
|
||||||
if user_id in self.models[Member, room_id]:
|
if user_id in self.models[Member, self.user_id, room_id]:
|
||||||
self.models[Event, user_id, room_id][f"echo-{uuid}"] = event
|
self.models[Event, user_id, room_id][f"echo-{uuid}"] = event
|
||||||
self.models[Event, user_id, room_id].sync_now()
|
self.models[Event, user_id, room_id].sync_now()
|
||||||
|
|
||||||
@ -577,7 +577,7 @@ class MatrixClient(nio.AsyncClient):
|
|||||||
await super().room_forget(room_id)
|
await super().room_forget(room_id)
|
||||||
self.models[Room, self.user_id].pop(room_id, None)
|
self.models[Room, self.user_id].pop(room_id, None)
|
||||||
self.models.pop((Event, self.user_id, room_id), None)
|
self.models.pop((Event, self.user_id, room_id), None)
|
||||||
self.models.pop((Member, room_id), None)
|
self.models.pop((Member, self.user_id, room_id), None)
|
||||||
|
|
||||||
|
|
||||||
async def room_mass_invite(
|
async def room_mass_invite(
|
||||||
@ -825,12 +825,12 @@ class MatrixClient(nio.AsyncClient):
|
|||||||
# List members that left the room, then remove them from our model
|
# List members that left the room, then remove them from our model
|
||||||
left_the_room = [
|
left_the_room = [
|
||||||
user_id
|
user_id
|
||||||
for user_id in self.models[Member, room.room_id]
|
for user_id in self.models[Member, self.user_id, room.room_id]
|
||||||
if user_id not in room.users
|
if user_id not in room.users
|
||||||
]
|
]
|
||||||
|
|
||||||
for user_id in left_the_room:
|
for user_id in left_the_room:
|
||||||
del self.models[Member, room.room_id][user_id]
|
del self.models[Member, self.user_id, room.room_id][user_id]
|
||||||
|
|
||||||
# Add the room members to the added room
|
# Add the room members to the added room
|
||||||
new_dict = {
|
new_dict = {
|
||||||
@ -844,13 +844,13 @@ class MatrixClient(nio.AsyncClient):
|
|||||||
invited = member.invited,
|
invited = member.invited,
|
||||||
) for user_id, member in room.users.items()
|
) for user_id, member in room.users.items()
|
||||||
}
|
}
|
||||||
self.models[Member, room.room_id].update(new_dict)
|
self.models[Member, self.user_id, room.room_id].update(new_dict)
|
||||||
|
|
||||||
|
|
||||||
async def get_member_name_avatar(self, room_id: str, user_id: str,
|
async def get_member_name_avatar(self, room_id: str, user_id: str,
|
||||||
) -> Tuple[str, str]:
|
) -> Tuple[str, str]:
|
||||||
try:
|
try:
|
||||||
item = self.models[Member, room_id][user_id]
|
item = self.models[Member, self.user_id, room_id][user_id]
|
||||||
except KeyError: # e.g. user is not anymore in the room
|
except KeyError: # e.g. user is not anymore in the room
|
||||||
try:
|
try:
|
||||||
info = await self.backend.get_profile(user_id)
|
info = await self.backend.get_profile(user_id)
|
||||||
|
@ -13,7 +13,7 @@ HColumnLayout {
|
|||||||
|
|
||||||
|
|
||||||
readonly property var originSource:
|
readonly property var originSource:
|
||||||
modelSources[["Member", chat.roomId]] || []
|
modelSources[["Member", chat.userId, chat.roomId]] || []
|
||||||
|
|
||||||
|
|
||||||
onOriginSourceChanged: filterLimiter.restart()
|
onOriginSourceChanged: filterLimiter.restart()
|
||||||
|
Loading…
Reference in New Issue
Block a user