@@ -163,7 +163,10 @@ async def received_client_receipt(
163163 if not is_new :
164164 return
165165
166- if self .federation_sender and receipt_type != ReceiptTypes .READ_PRIVATE :
166+ if self .federation_sender and receipt_type not in (
167+ ReceiptTypes .READ_PRIVATE ,
168+ ReceiptTypes .UNSTABLE_READ_PRIVATE ,
169+ ):
167170 await self .federation_sender .send_read_receipt (receipt )
168171
169172
@@ -203,24 +206,38 @@ def filter_out_private_receipts(
203206 for event_id , orig_event_content in room .get ("content" , {}).items ():
204207 event_content = orig_event_content
205208 # If there are private read receipts, additional logic is necessary.
206- if ReceiptTypes .READ_PRIVATE in event_content :
209+ if (
210+ ReceiptTypes .READ_PRIVATE in event_content
211+ or ReceiptTypes .UNSTABLE_READ_PRIVATE in event_content
212+ ):
207213 # Make a copy without private read receipts to avoid leaking
208214 # other user's private read receipts..
209215 event_content = {
210216 receipt_type : receipt_value
211217 for receipt_type , receipt_value in event_content .items ()
212- if receipt_type != ReceiptTypes .READ_PRIVATE
218+ if receipt_type
219+ not in (
220+ ReceiptTypes .READ_PRIVATE ,
221+ ReceiptTypes .UNSTABLE_READ_PRIVATE ,
222+ )
213223 }
214224
215225 # Copy the current user's private read receipt from the
216226 # original content, if it exists.
217- user_private_read_receipt = orig_event_content [
218- ReceiptTypes .READ_PRIVATE
219- ] .get (user_id , None )
227+ user_private_read_receipt = orig_event_content . get (
228+ ReceiptTypes .READ_PRIVATE , {}
229+ ) .get (user_id , None )
220230 if user_private_read_receipt :
221231 event_content [ReceiptTypes .READ_PRIVATE ] = {
222232 user_id : user_private_read_receipt
223233 }
234+ user_unstable_private_read_receipt = orig_event_content .get (
235+ ReceiptTypes .UNSTABLE_READ_PRIVATE , {}
236+ ).get (user_id , None )
237+ if user_unstable_private_read_receipt :
238+ event_content [ReceiptTypes .UNSTABLE_READ_PRIVATE ] = {
239+ user_id : user_unstable_private_read_receipt
240+ }
224241
225242 # Include the event if there is at least one non-private read
226243 # receipt or the current user has a private read receipt.
@@ -256,10 +273,9 @@ async def get_new_events(
256273 room_ids , from_key = from_key , to_key = to_key
257274 )
258275
259- if self .config .experimental .msc2285_enabled :
260- events = ReceiptEventSource .filter_out_private_receipts (
261- events , user .to_string ()
262- )
276+ events = ReceiptEventSource .filter_out_private_receipts (
277+ events , user .to_string ()
278+ )
263279
264280 return events , to_key
265281
0 commit comments