diff --git a/src/api/client_server/read_marker.rs b/src/api/client_server/read_marker.rs index 2daabf73..edc6c287 100644 --- a/src/api/client_server/read_marker.rs +++ b/src/api/client_server/read_marker.rs @@ -42,15 +42,10 @@ pub(crate) async fn set_read_marker_route( )?; } - if body.private_read_receipt.is_some() || body.read_receipt.is_some() { - services() - .rooms - .user - .reset_notification_counts(sender_user, &body.room_id)?; - } + let mut content = BTreeMap::new(); - if let Some(event) = &body.private_read_receipt { - let count = services().rooms.timeline.get_pdu_count(event)?.ok_or( + if let Some(event_id) = &body.private_read_receipt { + let count = services().rooms.timeline.get_pdu_count(event_id)?.ok_or( Error::BadRequest(ErrorKind::InvalidParam, "Event does not exist."), )?; let count = match count { @@ -67,34 +62,49 @@ pub(crate) async fn set_read_marker_route( sender_user, count, )?; - } - if let Some(event) = &body.read_receipt { - let mut user_receipts = BTreeMap::new(); - user_receipts.insert( - sender_user.clone(), - ruma::events::receipt::Receipt { - ts: Some(MilliSecondsSinceUnixEpoch::now()), - thread: ReceiptThread::Unthreaded, - }, + let receipt = ruma::events::receipt::Receipt::new( + MilliSecondsSinceUnixEpoch::now(), ); - let mut receipts = BTreeMap::new(); - receipts.insert(ReceiptType::Read, user_receipts); + let user_receipts = + [(sender_user.clone(), receipt)].into_iter().collect(); - let mut receipt_content = BTreeMap::new(); - receipt_content.insert(event.to_owned(), receipts); + let receipts = + [(ReceiptType::ReadPrivate, user_receipts)].into_iter().collect(); + + content.insert(event_id.to_owned(), receipts); + } + + if let Some(event_id) = &body.read_receipt { + let receipt = ruma::events::receipt::Receipt::new( + MilliSecondsSinceUnixEpoch::now(), + ); + + let user_receipts = + [(sender_user.clone(), receipt)].into_iter().collect(); + + let receipts = + [(ReceiptType::Read, user_receipts)].into_iter().collect(); + + content.insert(event_id.to_owned(), receipts); + } + + if 0 < content.keys().len() { + services() + .rooms + .user + .reset_notification_counts(sender_user, &body.room_id)?; services().rooms.edus.read_receipt.readreceipt_update( sender_user, &body.room_id, ruma::events::receipt::ReceiptEvent { - content: ruma::events::receipt::ReceiptEventContent( - receipt_content, - ), + content: ruma::events::receipt::ReceiptEventContent(content), room_id: body.room_id.clone(), }, )?; + for server in services().rooms.state_cache.room_servers(&body.room_id) { services().sending.trigger_edu_send(&server?)?; }