Propagate read receipt events
This commit is contained in:
@@ -2,6 +2,7 @@ use crate::matrix_connection::sync_thread::MatrixSyncTaskID;
|
||||
use crate::users::{APIToken, UserEmail};
|
||||
use matrix_sdk::Room;
|
||||
use matrix_sdk::ruma::events::reaction::OriginalSyncReactionEvent;
|
||||
use matrix_sdk::ruma::events::receipt::SyncReceiptEvent;
|
||||
use matrix_sdk::ruma::events::room::message::OriginalSyncRoomMessageEvent;
|
||||
use matrix_sdk::ruma::events::room::redaction::OriginalSyncRoomRedactionEvent;
|
||||
use matrix_sdk::sync::SyncResponse;
|
||||
@@ -32,6 +33,8 @@ pub enum BroadcastMessage {
|
||||
ReactionEvent(BxRoomEvent<OriginalSyncReactionEvent>),
|
||||
/// New room redaction
|
||||
RoomRedactionEvent(BxRoomEvent<OriginalSyncRoomRedactionEvent>),
|
||||
/// Message fully read event
|
||||
ReceiptEvent(BxRoomEvent<SyncReceiptEvent>),
|
||||
/// Raw Matrix sync response
|
||||
MatrixSyncResponse { user: UserEmail, sync: SyncResponse },
|
||||
}
|
||||
|
||||
@@ -29,6 +29,19 @@ pub struct WsRoomEvent<E> {
|
||||
pub data: Box<E>,
|
||||
}
|
||||
|
||||
#[derive(Debug, serde::Serialize)]
|
||||
pub struct WsReceiptEntry {
|
||||
event: OwnedEventId,
|
||||
user: OwnedUserId,
|
||||
ts: Option<MilliSecondsSinceUnixEpoch>,
|
||||
}
|
||||
|
||||
#[derive(Debug, serde::Serialize)]
|
||||
pub struct WsReceiptEvent {
|
||||
pub room_id: OwnedRoomId,
|
||||
pub receipts: Vec<WsReceiptEntry>,
|
||||
}
|
||||
|
||||
/// Messages sent to the client
|
||||
#[derive(Debug, serde::Serialize)]
|
||||
#[serde(tag = "type")]
|
||||
@@ -41,6 +54,9 @@ pub enum WsMessage {
|
||||
|
||||
/// Room reaction event
|
||||
RoomRedactionEvent(WsRoomEvent<RoomRedactionEventContent>),
|
||||
|
||||
/// Fully read message event
|
||||
ReceiptEvent(WsReceiptEvent),
|
||||
}
|
||||
|
||||
impl WsMessage {
|
||||
@@ -73,6 +89,25 @@ impl WsMessage {
|
||||
data: Box::new(evt.data.content.clone()),
|
||||
}))
|
||||
}
|
||||
BroadcastMessage::ReceiptEvent(evt) if &evt.user == user => {
|
||||
let mut receipts = vec![];
|
||||
for (event_id, r) in &evt.data.content.0 {
|
||||
for user_receipts in r.values() {
|
||||
for (user, receipt) in user_receipts {
|
||||
receipts.push(WsReceiptEntry {
|
||||
event: event_id.clone(),
|
||||
user: user.clone(),
|
||||
ts: receipt.ts,
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Some(Self::ReceiptEvent(WsReceiptEvent {
|
||||
room_id: evt.room.room_id().to_owned(),
|
||||
receipts,
|
||||
}))
|
||||
}
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ use crate::matrix_connection::matrix_manager::MatrixManagerMsg;
|
||||
use futures_util::StreamExt;
|
||||
use matrix_sdk::Room;
|
||||
use matrix_sdk::ruma::events::reaction::OriginalSyncReactionEvent;
|
||||
use matrix_sdk::ruma::events::receipt::SyncReceiptEvent;
|
||||
use matrix_sdk::ruma::events::room::message::OriginalSyncRoomMessageEvent;
|
||||
use matrix_sdk::ruma::events::room::redaction::OriginalSyncRoomRedactionEvent;
|
||||
use ractor::ActorRef;
|
||||
@@ -91,11 +92,25 @@ async fn sync_thread_task(
|
||||
room,
|
||||
}))
|
||||
{
|
||||
log::warn!("Failed to forward reaction event! {e}");
|
||||
log::warn!("Failed to forward redaction event! {e}");
|
||||
}
|
||||
},
|
||||
));
|
||||
|
||||
let tx_receipt_handle = tx.clone();
|
||||
let user_receipt_handle = client.email.clone();
|
||||
handlers.push(
|
||||
client.add_event_handler(async move |event: SyncReceiptEvent, room: Room| {
|
||||
if let Err(e) = tx_receipt_handle.send(BroadcastMessage::ReceiptEvent(BxRoomEvent {
|
||||
user: user_receipt_handle.clone(),
|
||||
data: Box::new(event),
|
||||
room,
|
||||
})) {
|
||||
log::warn!("Failed to forward receipt event! {e}");
|
||||
}
|
||||
}),
|
||||
);
|
||||
|
||||
loop {
|
||||
tokio::select! {
|
||||
// Message from tokio broadcast
|
||||
|
||||
@@ -45,10 +45,24 @@ export interface RoomRedactionEvent extends BaseRoomEvent {
|
||||
};
|
||||
}
|
||||
|
||||
export interface ReceiptEventEntry {
|
||||
event: string;
|
||||
user: string;
|
||||
ts?: number;
|
||||
}
|
||||
|
||||
export interface RoomReceiptEvent {
|
||||
time: number;
|
||||
type: "ReceiptEvent";
|
||||
room_id: string;
|
||||
receipts: ReceiptEventEntry[];
|
||||
}
|
||||
|
||||
export type WsMessage =
|
||||
| RoomMessageEvent
|
||||
| RoomReactionEvent
|
||||
| RoomRedactionEvent;
|
||||
| RoomRedactionEvent
|
||||
| RoomReceiptEvent;
|
||||
|
||||
export class WsApi {
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user