mirror of
https://forgejo.ellis.link/continuwuation/continuwuity.git
synced 2026-11-15 05:06:53 +00:00
fix: Adjust sync watcher logic to be more explicit
This commit is contained in:
1 parent
3adeee04d7
commit
3467dffd94
22 files changed
+189
-249
No files matched your search
@@ -16,7 +16,9 @@ use ruma::{
|
||||
serde::Raw,
|
||||
};
|
||||
|
||||
use crate::{Dep, account_data, appservice::RegistrationInfo, config, globals, rooms, users};
|
||||
use crate::{
|
||||
Dep, account_data, appservice::RegistrationInfo, config, globals, rooms, sync, users,
|
||||
};
|
||||
|
||||
pub struct Service {
|
||||
appservice_in_room_cache: AppServiceInRoomCache,
|
||||
@@ -31,6 +33,7 @@ struct Services {
|
||||
metadata: Dep<rooms::metadata::Service>,
|
||||
state: Dep<rooms::state::Service>,
|
||||
state_accessor: Dep<rooms::state_accessor::Service>,
|
||||
sync: Dep<sync::Service>,
|
||||
users: Dep<users::Service>,
|
||||
}
|
||||
|
||||
@@ -67,6 +70,7 @@ impl crate::Service for Service {
|
||||
state: args.depend::<rooms::state::Service>("rooms::state"),
|
||||
state_accessor: args
|
||||
.depend::<rooms::state_accessor::Service>("rooms::state_accessor"),
|
||||
sync: args.depend::<sync::Service>("sync"),
|
||||
users: args.depend::<users::Service>("users"),
|
||||
},
|
||||
db: Data {
|
||||
|
||||
@@ -29,8 +29,9 @@ impl super::Service {
|
||||
update_joined_count: bool,
|
||||
) -> Result {
|
||||
let membership = pdu.get_content::<RoomMemberEventContent>()?;
|
||||
let is_local = self.services.globals.user_is_local(user_id);
|
||||
|
||||
if !self.services.globals.user_is_local(user_id) {
|
||||
if !is_local {
|
||||
self.services.users.record_remote_user(user_id);
|
||||
}
|
||||
|
||||
@@ -41,13 +42,14 @@ impl super::Service {
|
||||
// Add the user ID to the join list then
|
||||
self.mark_as_once_joined(user_id, room_id);
|
||||
|
||||
// Check if the room has a predecessor
|
||||
if let Ok(Some(predecessor)) = self
|
||||
.services
|
||||
.state_accessor
|
||||
.room_state_get_content(room_id, &StateEventType::RoomCreate, "")
|
||||
.await
|
||||
.map(|content: RoomCreateEventContent| content.predecessor)
|
||||
// Copy data from the predecessor if the user is local
|
||||
if is_local
|
||||
&& let Ok(Some(predecessor)) = self
|
||||
.services
|
||||
.state_accessor
|
||||
.room_state_get_content(room_id, &StateEventType::RoomCreate, "")
|
||||
.await
|
||||
.map(|content: RoomCreateEventContent| content.predecessor)
|
||||
{
|
||||
// Copy old tags to new room
|
||||
if let Ok(tag_event) = self
|
||||
@@ -109,13 +111,16 @@ impl super::Service {
|
||||
self.mark_as_joined(user_id, room_id);
|
||||
},
|
||||
| MembershipState::Invite => {
|
||||
let last_state = self
|
||||
.services
|
||||
.state
|
||||
.summary_stripped(pdu, room_id, user_id)
|
||||
.await;
|
||||
let invite_state = if is_local {
|
||||
self.services
|
||||
.state
|
||||
.summary_stripped(pdu, room_id, user_id)
|
||||
.await
|
||||
} else {
|
||||
vec![]
|
||||
};
|
||||
|
||||
self.mark_as_invited(user_id, room_id, pdu.sender(), last_state, None)
|
||||
self.mark_as_invited(user_id, room_id, pdu.sender(), invite_state, None)
|
||||
.await?;
|
||||
},
|
||||
| MembershipState::Leave | MembershipState::Ban => {
|
||||
@@ -128,6 +133,13 @@ impl super::Service {
|
||||
self.update_joined_count(room_id).await;
|
||||
}
|
||||
|
||||
// Kick the target user's sync loop if they're local and this isn't a join to
|
||||
// make sure that membership changes like invites or invite rejections get
|
||||
// synced
|
||||
if is_local && !matches!(membership.membership, MembershipState::Join) {
|
||||
self.services.sync.wake(user_id).await;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user