|
|
|
|
@ -1,5 +1,6 @@
|
|
|
|
|
use std::{collections::HashSet, sync::Arc}; |
|
|
|
|
|
|
|
|
|
use itertools::Itertools; |
|
|
|
|
use ruma::{ |
|
|
|
|
events::{AnyStrippedStateEvent, AnySyncStateEvent}, |
|
|
|
|
serde::Raw, |
|
|
|
|
@ -21,7 +22,11 @@ impl service::rooms::state_cache::Data for KeyValueDatabase {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fn mark_as_joined(&self, user_id: &UserId, room_id: &RoomId) -> Result<()> { |
|
|
|
|
let mut roomuser_id = room_id.as_bytes().to_vec(); |
|
|
|
|
let roomid = room_id.as_bytes().to_vec(); |
|
|
|
|
let mut roomid_prefix = room_id.as_bytes().to_vec(); |
|
|
|
|
roomid_prefix.push(0xff); |
|
|
|
|
|
|
|
|
|
let mut roomuser_id = roomid_prefix.clone(); |
|
|
|
|
roomuser_id.push(0xff); |
|
|
|
|
roomuser_id.extend_from_slice(user_id.as_bytes()); |
|
|
|
|
|
|
|
|
|
@ -36,6 +41,16 @@ impl service::rooms::state_cache::Data for KeyValueDatabase {
|
|
|
|
|
self.userroomid_leftstate.remove(&userroom_id)?; |
|
|
|
|
self.roomuserid_leftcount.remove(&roomuser_id)?; |
|
|
|
|
|
|
|
|
|
if self.roomuserid_joined.scan_prefix(roomid_prefix).count() == 0 |
|
|
|
|
&& self |
|
|
|
|
.roomuserid_invitecount |
|
|
|
|
.scan_prefix(roomid_prefix) |
|
|
|
|
.count() |
|
|
|
|
== 0 |
|
|
|
|
{ |
|
|
|
|
self.roomid_inviteviaservers.remove(&roomid)?; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Ok(()) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -44,6 +59,7 @@ impl service::rooms::state_cache::Data for KeyValueDatabase {
|
|
|
|
|
user_id: &UserId, |
|
|
|
|
room_id: &RoomId, |
|
|
|
|
last_state: Option<Vec<Raw<AnyStrippedStateEvent>>>, |
|
|
|
|
invite_via: Option<Vec<OwnedServerName>>, |
|
|
|
|
) -> Result<()> { |
|
|
|
|
let mut roomuser_id = room_id.as_bytes().to_vec(); |
|
|
|
|
roomuser_id.push(0xff); |
|
|
|
|
@ -67,12 +83,30 @@ impl service::rooms::state_cache::Data for KeyValueDatabase {
|
|
|
|
|
self.userroomid_leftstate.remove(&userroom_id)?; |
|
|
|
|
self.roomuserid_leftcount.remove(&roomuser_id)?; |
|
|
|
|
|
|
|
|
|
if let Some(servers) = invite_via { |
|
|
|
|
let mut prev_servers = self.servers_invite_via(room_id)?.unwrap_or(Vec::new()); |
|
|
|
|
prev_servers.append(&mut servers); |
|
|
|
|
let servers = prev_servers.iter().rev().unique().rev().collect_vec(); |
|
|
|
|
|
|
|
|
|
let servers = servers |
|
|
|
|
.iter() |
|
|
|
|
.map(|server| server.as_bytes()) |
|
|
|
|
.collect_vec() |
|
|
|
|
.join(&[0xff][..]); |
|
|
|
|
|
|
|
|
|
self.roomid_inviteviaservers |
|
|
|
|
.insert(&room_id.as_bytes().to_vec(), &servers)?; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Ok(()) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fn mark_as_left(&self, user_id: &UserId, room_id: &RoomId) -> Result<()> { |
|
|
|
|
let mut roomuser_id = room_id.as_bytes().to_vec(); |
|
|
|
|
roomuser_id.push(0xff); |
|
|
|
|
let roomid = room_id.as_bytes().to_vec(); |
|
|
|
|
let mut roomid_prefix = room_id.as_bytes().to_vec(); |
|
|
|
|
roomid_prefix.push(0xff); |
|
|
|
|
|
|
|
|
|
let mut roomuser_id = roomid_prefix.clone(); |
|
|
|
|
roomuser_id.extend_from_slice(user_id.as_bytes()); |
|
|
|
|
|
|
|
|
|
let mut userroom_id = user_id.as_bytes().to_vec(); |
|
|
|
|
@ -92,6 +126,16 @@ impl service::rooms::state_cache::Data for KeyValueDatabase {
|
|
|
|
|
self.userroomid_invitestate.remove(&userroom_id)?; |
|
|
|
|
self.roomuserid_invitecount.remove(&roomuser_id)?; |
|
|
|
|
|
|
|
|
|
if self.roomuserid_joined.scan_prefix(roomid_prefix).count() == 0 |
|
|
|
|
&& self |
|
|
|
|
.roomuserid_invitecount |
|
|
|
|
.scan_prefix(roomid_prefix) |
|
|
|
|
.count() |
|
|
|
|
== 0 |
|
|
|
|
{ |
|
|
|
|
self.roomid_inviteviaservers.remove(&roomid)?; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Ok(()) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -604,4 +648,41 @@ impl service::rooms::state_cache::Data for KeyValueDatabase {
|
|
|
|
|
|
|
|
|
|
Ok(self.userroomid_leftstate.get(&userroom_id)?.is_some()) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#[tracing::instrument(skip(self))] |
|
|
|
|
fn servers_invite_via(&self, room_id: &RoomId) -> Result<Option<Vec<OwnedServerName>>> { |
|
|
|
|
let room_id = room_id.as_bytes().to_vec(); |
|
|
|
|
|
|
|
|
|
self.roomid_inviteviaservers |
|
|
|
|
.get(&room_id)? |
|
|
|
|
.map(|servers| { |
|
|
|
|
let state = serde_json::from_slice(&servers) |
|
|
|
|
.map_err(|_| Error::bad_database("Invalid state in userroomid_leftstate."))?; |
|
|
|
|
|
|
|
|
|
Ok(state) |
|
|
|
|
}) |
|
|
|
|
.transpose() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#[tracing::instrument(skip(self))] |
|
|
|
|
fn add_servers_invite_via( |
|
|
|
|
&self, |
|
|
|
|
room_id: &RoomId, |
|
|
|
|
servers: &Vec<OwnedServerName>, |
|
|
|
|
) -> Result<()> { |
|
|
|
|
let mut prev_servers = self.servers_invite_via(room_id)?.unwrap_or(Vec::new()); |
|
|
|
|
prev_servers.append(&mut servers); |
|
|
|
|
let servers = prev_servers.iter().rev().unique().rev().collect_vec(); |
|
|
|
|
|
|
|
|
|
let servers = servers |
|
|
|
|
.iter() |
|
|
|
|
.map(|server| server.as_bytes()) |
|
|
|
|
.collect_vec() |
|
|
|
|
.join(&[0xff][..]); |
|
|
|
|
|
|
|
|
|
self.roomid_inviteviaservers |
|
|
|
|
.insert(&room_id.as_bytes().to_vec(), &servers)?; |
|
|
|
|
|
|
|
|
|
Ok(()) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|