mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2024-12-26 01:09:22 -05:00
Add get_users_with_read_receipts_in_room cache
This commit is contained in:
parent
e5b0bbcd33
commit
43db0d9f6a
@ -87,13 +87,13 @@ def evaluator_for_event(event, hs, store):
|
|||||||
all_in_room = yield store.get_users_in_room(room_id)
|
all_in_room = yield store.get_users_in_room(room_id)
|
||||||
all_in_room = set(all_in_room)
|
all_in_room = set(all_in_room)
|
||||||
|
|
||||||
receipts = yield store.get_receipts_for_room(room_id, "m.read")
|
users_with_receipts = yield store.get_users_with_read_receipts_in_room(room_id)
|
||||||
|
|
||||||
# any users with pushers must be ours: they have pushers
|
# any users with pushers must be ours: they have pushers
|
||||||
user_ids = set(users_with_pushers)
|
user_ids = set(users_with_pushers)
|
||||||
for r in receipts:
|
for uid in users_with_receipts:
|
||||||
if hs.is_mine_id(r['user_id']) and r['user_id'] in all_in_room:
|
if hs.is_mine_id(uid) and uid in all_in_room:
|
||||||
user_ids.add(r['user_id'])
|
user_ids.add(uid)
|
||||||
|
|
||||||
# if this event is an invite event, we may need to run rules for the user
|
# if this event is an invite event, we may need to run rules for the user
|
||||||
# who's been invited, otherwise they won't get told they've been invited
|
# who's been invited, otherwise they won't get told they've been invited
|
||||||
|
@ -34,6 +34,26 @@ class ReceiptsStore(SQLBaseStore):
|
|||||||
"ReceiptsRoomChangeCache", self._receipts_id_gen.get_current_token()
|
"ReceiptsRoomChangeCache", self._receipts_id_gen.get_current_token()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@cachedInlineCallbacks()
|
||||||
|
def get_users_with_read_receipts_in_room(self, room_id):
|
||||||
|
receipts = yield self.get_receipts_for_room(room_id, "m.read")
|
||||||
|
defer.returnValue(set(r['user_id'] for r in receipts))
|
||||||
|
|
||||||
|
def _invalidate_get_users_with_receipts_in_room(self, room_id, receipt_type,
|
||||||
|
user_id):
|
||||||
|
if receipt_type != "m.read":
|
||||||
|
return
|
||||||
|
|
||||||
|
# Returns an ObservableDeferred
|
||||||
|
res = self.get_users_with_read_receipts_in_room.cache.get((room_id,), None)
|
||||||
|
|
||||||
|
if res and res.called and user_id in res.result:
|
||||||
|
# We'd only be adding to the set, so no point invalidating if the
|
||||||
|
# user is already there
|
||||||
|
return
|
||||||
|
|
||||||
|
self.get_users_with_read_receipts_in_room.invalidate((room_id,))
|
||||||
|
|
||||||
@cached(num_args=2)
|
@cached(num_args=2)
|
||||||
def get_receipts_for_room(self, room_id, receipt_type):
|
def get_receipts_for_room(self, room_id, receipt_type):
|
||||||
return self._simple_select_list(
|
return self._simple_select_list(
|
||||||
@ -228,6 +248,10 @@ class ReceiptsStore(SQLBaseStore):
|
|||||||
txn.call_after(
|
txn.call_after(
|
||||||
self.get_receipts_for_room.invalidate, (room_id, receipt_type)
|
self.get_receipts_for_room.invalidate, (room_id, receipt_type)
|
||||||
)
|
)
|
||||||
|
txn.call_after(
|
||||||
|
self._invalidate_get_users_with_receipts_in_room,
|
||||||
|
room_id, receipt_type, user_id,
|
||||||
|
)
|
||||||
txn.call_after(
|
txn.call_after(
|
||||||
self.get_receipts_for_user.invalidate, (user_id, receipt_type)
|
self.get_receipts_for_user.invalidate, (user_id, receipt_type)
|
||||||
)
|
)
|
||||||
@ -373,6 +397,10 @@ class ReceiptsStore(SQLBaseStore):
|
|||||||
txn.call_after(
|
txn.call_after(
|
||||||
self.get_receipts_for_room.invalidate, (room_id, receipt_type)
|
self.get_receipts_for_room.invalidate, (room_id, receipt_type)
|
||||||
)
|
)
|
||||||
|
txn.call_after(
|
||||||
|
self._invalidate_get_users_with_receipts_in_room,
|
||||||
|
room_id, receipt_type, user_id,
|
||||||
|
)
|
||||||
txn.call_after(
|
txn.call_after(
|
||||||
self.get_receipts_for_user.invalidate, (user_id, receipt_type)
|
self.get_receipts_for_user.invalidate, (user_id, receipt_type)
|
||||||
)
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user