feat: send read receipts over federation
currently they will only be sent if a PDU has to be sent as well
This commit is contained in:
parent
24793891e0
commit
8f27e6123b
6 changed files with 197 additions and 10 deletions
|
@ -50,6 +50,8 @@ pub struct Rooms {
|
|||
|
||||
/// Participating servers in a room.
|
||||
pub(super) roomserverids: sled::Tree, // RoomServerId = RoomId + ServerName
|
||||
pub(super) serverroomids: sled::Tree, // ServerRoomId = ServerName + RoomId
|
||||
|
||||
pub(super) userroomid_joined: sled::Tree,
|
||||
pub(super) roomuserid_joined: sled::Tree,
|
||||
pub(super) roomuseroncejoinedids: sled::Tree,
|
||||
|
@ -1597,6 +1599,10 @@ impl Rooms {
|
|||
roomserver_id.push(0xff);
|
||||
roomserver_id.extend_from_slice(user_id.server_name().as_bytes());
|
||||
|
||||
let mut serverroom_id = user_id.server_name().as_bytes().to_vec();
|
||||
serverroom_id.push(0xff);
|
||||
serverroom_id.extend_from_slice(room_id.as_bytes());
|
||||
|
||||
let mut userroom_id = user_id.as_bytes().to_vec();
|
||||
userroom_id.push(0xff);
|
||||
userroom_id.extend_from_slice(room_id.as_bytes());
|
||||
|
@ -1700,6 +1706,7 @@ impl Rooms {
|
|||
}
|
||||
|
||||
self.roomserverids.insert(&roomserver_id, &[])?;
|
||||
self.serverroomids.insert(&serverroom_id, &[])?;
|
||||
self.userroomid_joined.insert(&userroom_id, &[])?;
|
||||
self.roomuserid_joined.insert(&roomuser_id, &[])?;
|
||||
self.userroomid_invitestate.remove(&userroom_id)?;
|
||||
|
@ -1725,6 +1732,7 @@ impl Rooms {
|
|||
}
|
||||
|
||||
self.roomserverids.insert(&roomserver_id, &[])?;
|
||||
self.serverroomids.insert(&serverroom_id, &[])?;
|
||||
self.userroomid_invitestate.insert(
|
||||
&userroom_id,
|
||||
serde_json::to_vec(&last_state.unwrap_or_default())
|
||||
|
@ -1745,6 +1753,7 @@ impl Rooms {
|
|||
.all(|u| u.server_name() != user_id.server_name())
|
||||
{
|
||||
self.roomserverids.remove(&roomserver_id)?;
|
||||
self.serverroomids.remove(&serverroom_id)?;
|
||||
}
|
||||
self.userroomid_leftstate.insert(
|
||||
&userroom_id,
|
||||
|
@ -2152,6 +2161,25 @@ impl Rooms {
|
|||
})
|
||||
}
|
||||
|
||||
/// Returns an iterator of all rooms a server participates in (as far as we know).
|
||||
pub fn server_rooms(&self, server: &ServerName) -> impl Iterator<Item = Result<RoomId>> {
|
||||
let mut prefix = server.as_bytes().to_vec();
|
||||
prefix.push(0xff);
|
||||
|
||||
self.serverroomids.scan_prefix(prefix).keys().map(|key| {
|
||||
Ok(RoomId::try_from(
|
||||
utils::string_from_bytes(
|
||||
&key?
|
||||
.rsplit(|&b| b == 0xff)
|
||||
.next()
|
||||
.expect("rsplit always returns an element"),
|
||||
)
|
||||
.map_err(|_| Error::bad_database("RoomId in serverroomids is invalid unicode."))?,
|
||||
)
|
||||
.map_err(|_| Error::bad_database("RoomId in serverroomids is invalid."))?)
|
||||
})
|
||||
}
|
||||
|
||||
/// Returns an iterator over all joined members of a room.
|
||||
#[tracing::instrument(skip(self))]
|
||||
pub fn room_members(&self, room_id: &RoomId) -> impl Iterator<Item = Result<UserId>> {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue