feat: support /make_join and /send_join for restricted rooms

from https://gitlab.com/famedly/conduit/-/merge_requests/618

Signed-off-by: strawberry <strawberry@puppygock.gay>
This commit is contained in:
Matthias Ahouansou 2024-04-03 14:16:11 -04:00 committed by June
parent ed960f41ac
commit 49eb418786
2 changed files with 75 additions and 46 deletions

View file

@ -13,6 +13,7 @@ use ruma::{
history_visibility::{HistoryVisibility, RoomHistoryVisibilityEventContent},
member::{MembershipState, RoomMemberEventContent},
name::RoomNameEventContent,
power_levels::RoomPowerLevelsEventContent,
},
StateEventType,
},
@ -139,6 +140,18 @@ impl Service {
Ok(visibility)
}
/// Whether a user's power level is sufficient to invite other users
pub fn user_can_invite(&self, user_id: &UserId, room_id: &RoomId) -> Result<bool> {
self.room_state_get(room_id, &StateEventType::RoomPowerLevels, "")?
.map(|pdu_event| {
serde_json::from_str(pdu_event.content.get()).map(|content: RoomPowerLevelsEventContent| {
content.users.get(user_id).unwrap_or(&content.users_default) >= &content.invite
})
})
.unwrap_or(Ok(false))
.map_err(|_| Error::bad_database("Invalid history visibility event in database."))
}
/// Whether a user is allowed to see an event, based on
/// the room's history_visibility at that event's state.
#[tracing::instrument(skip(self, user_id, room_id, event_id))]