|
|
|
@ -12,7 +12,10 @@ use lru_cache::LruCache;
|
|
|
|
|
use ruma::{
|
|
|
|
|
events::{
|
|
|
|
|
push_rules::{PushRulesEvent, PushRulesEventContent},
|
|
|
|
|
room::message::RoomMessageEventContent,
|
|
|
|
|
room::{
|
|
|
|
|
member::{MembershipState, RoomMemberEventContent},
|
|
|
|
|
message::RoomMessageEventContent,
|
|
|
|
|
},
|
|
|
|
|
GlobalAccountDataEvent, GlobalAccountDataEventType, StateEventType,
|
|
|
|
|
},
|
|
|
|
|
push::Ruleset,
|
|
|
|
@ -100,6 +103,8 @@ pub struct KeyValueDatabase {
|
|
|
|
|
pub(super) roomuserid_invitecount: Arc<dyn KvTree>, // InviteCount = Count
|
|
|
|
|
pub(super) userroomid_leftstate: Arc<dyn KvTree>,
|
|
|
|
|
pub(super) roomuserid_leftcount: Arc<dyn KvTree>,
|
|
|
|
|
pub(super) userroomid_knockedstate: Arc<dyn KvTree>,
|
|
|
|
|
pub(super) roomuserid_knockedcount: Arc<dyn KvTree>,
|
|
|
|
|
|
|
|
|
|
pub(super) alias_userid: Arc<dyn KvTree>, // User who created the alias
|
|
|
|
|
|
|
|
|
@ -328,6 +333,8 @@ impl KeyValueDatabase {
|
|
|
|
|
roomuserid_invitecount: builder.open_tree("roomuserid_invitecount")?,
|
|
|
|
|
userroomid_leftstate: builder.open_tree("userroomid_leftstate")?,
|
|
|
|
|
roomuserid_leftcount: builder.open_tree("roomuserid_leftcount")?,
|
|
|
|
|
userroomid_knockedstate: builder.open_tree("userroomid_knockedstate")?,
|
|
|
|
|
roomuserid_knockedcount: builder.open_tree("roomuserid_knockedcount")?,
|
|
|
|
|
|
|
|
|
|
alias_userid: builder.open_tree("alias_userid")?,
|
|
|
|
|
|
|
|
|
@ -941,6 +948,60 @@ impl KeyValueDatabase {
|
|
|
|
|
warn!("Migration: 12 -> 13 finished");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if services().globals.database_version()? < 14 {
|
|
|
|
|
for username in services().users.list_local_users()? {
|
|
|
|
|
let user = match UserId::parse_with_server_name(
|
|
|
|
|
username.clone(),
|
|
|
|
|
services().globals.server_name(),
|
|
|
|
|
) {
|
|
|
|
|
Ok(u) => u,
|
|
|
|
|
Err(e) => {
|
|
|
|
|
warn!("Invalid username {username}: {e}");
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
for room in
|
|
|
|
|
services()
|
|
|
|
|
.rooms
|
|
|
|
|
.metadata
|
|
|
|
|
.iter_ids()
|
|
|
|
|
.filter_map(|room_id| match room_id {
|
|
|
|
|
Ok(room_id) => Some(room_id),
|
|
|
|
|
Err(e) => {
|
|
|
|
|
warn!("Invalid room id: {e}");
|
|
|
|
|
None
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
{
|
|
|
|
|
if services()
|
|
|
|
|
.rooms
|
|
|
|
|
.state_accessor
|
|
|
|
|
.room_state_get(&room, &StateEventType::RoomMember, user.as_str())?
|
|
|
|
|
.map(|pdu| {
|
|
|
|
|
serde_json::from_str(pdu.content.get())
|
|
|
|
|
.map_err(|_| Error::bad_database("Invalid PDU in database."))
|
|
|
|
|
})
|
|
|
|
|
.transpose()?
|
|
|
|
|
.map(|content: RoomMemberEventContent| content.membership)
|
|
|
|
|
== Some(MembershipState::Knock)
|
|
|
|
|
{
|
|
|
|
|
services().rooms.state_cache.update_membership(
|
|
|
|
|
&room,
|
|
|
|
|
&user,
|
|
|
|
|
MembershipState::Knock,
|
|
|
|
|
&user,
|
|
|
|
|
None,
|
|
|
|
|
false,
|
|
|
|
|
)?;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
services().globals.bump_database_version(14)?;
|
|
|
|
|
|
|
|
|
|
warn!("Migration: 13 -> 14 finished");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
assert_eq!(
|
|
|
|
|
services().globals.database_version().unwrap(),
|
|
|
|
|
latest_database_version
|
|
|
|
|