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 crate::users::{APIToken, UserEmail};
|
||||||
use matrix_sdk::Room;
|
use matrix_sdk::Room;
|
||||||
use matrix_sdk::ruma::events::reaction::OriginalSyncReactionEvent;
|
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::message::OriginalSyncRoomMessageEvent;
|
||||||
use matrix_sdk::ruma::events::room::redaction::OriginalSyncRoomRedactionEvent;
|
use matrix_sdk::ruma::events::room::redaction::OriginalSyncRoomRedactionEvent;
|
||||||
use matrix_sdk::sync::SyncResponse;
|
use matrix_sdk::sync::SyncResponse;
|
||||||
@@ -32,6 +33,8 @@ pub enum BroadcastMessage {
|
|||||||
ReactionEvent(BxRoomEvent<OriginalSyncReactionEvent>),
|
ReactionEvent(BxRoomEvent<OriginalSyncReactionEvent>),
|
||||||
/// New room redaction
|
/// New room redaction
|
||||||
RoomRedactionEvent(BxRoomEvent<OriginalSyncRoomRedactionEvent>),
|
RoomRedactionEvent(BxRoomEvent<OriginalSyncRoomRedactionEvent>),
|
||||||
|
/// Message fully read event
|
||||||
|
ReceiptEvent(BxRoomEvent<SyncReceiptEvent>),
|
||||||
/// Raw Matrix sync response
|
/// Raw Matrix sync response
|
||||||
MatrixSyncResponse { user: UserEmail, sync: SyncResponse },
|
MatrixSyncResponse { user: UserEmail, sync: SyncResponse },
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,6 +29,19 @@ pub struct WsRoomEvent<E> {
|
|||||||
pub data: Box<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
|
/// Messages sent to the client
|
||||||
#[derive(Debug, serde::Serialize)]
|
#[derive(Debug, serde::Serialize)]
|
||||||
#[serde(tag = "type")]
|
#[serde(tag = "type")]
|
||||||
@@ -41,6 +54,9 @@ pub enum WsMessage {
|
|||||||
|
|
||||||
/// Room reaction event
|
/// Room reaction event
|
||||||
RoomRedactionEvent(WsRoomEvent<RoomRedactionEventContent>),
|
RoomRedactionEvent(WsRoomEvent<RoomRedactionEventContent>),
|
||||||
|
|
||||||
|
/// Fully read message event
|
||||||
|
ReceiptEvent(WsReceiptEvent),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl WsMessage {
|
impl WsMessage {
|
||||||
@@ -73,6 +89,25 @@ impl WsMessage {
|
|||||||
data: Box::new(evt.data.content.clone()),
|
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,
|
_ => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ use crate::matrix_connection::matrix_manager::MatrixManagerMsg;
|
|||||||
use futures_util::StreamExt;
|
use futures_util::StreamExt;
|
||||||
use matrix_sdk::Room;
|
use matrix_sdk::Room;
|
||||||
use matrix_sdk::ruma::events::reaction::OriginalSyncReactionEvent;
|
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::message::OriginalSyncRoomMessageEvent;
|
||||||
use matrix_sdk::ruma::events::room::redaction::OriginalSyncRoomRedactionEvent;
|
use matrix_sdk::ruma::events::room::redaction::OriginalSyncRoomRedactionEvent;
|
||||||
use ractor::ActorRef;
|
use ractor::ActorRef;
|
||||||
@@ -91,11 +92,25 @@ async fn sync_thread_task(
|
|||||||
room,
|
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 {
|
loop {
|
||||||
tokio::select! {
|
tokio::select! {
|
||||||
// Message from tokio broadcast
|
// 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 =
|
export type WsMessage =
|
||||||
| RoomMessageEvent
|
| RoomMessageEvent
|
||||||
| RoomReactionEvent
|
| RoomReactionEvent
|
||||||
| RoomRedactionEvent;
|
| RoomRedactionEvent
|
||||||
|
| RoomReceiptEvent;
|
||||||
|
|
||||||
export class WsApi {
|
export class WsApi {
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user