mirror of
https://forgejo.ellis.link/continuwuation/continuwuity.git
synced 2026-05-26 20:49:55 +00:00
Implement room v12 (#943)
**Does not yet work!** Currently, state resolution does not correctly resolve conflicting states. Everything else appears to work as expected, so stateres will be fixed soon, then we should be clear for takeoff. Also: a lot of things currently accept a nullable room ID that really just don't need to. This will need tidying up before merge. Some authentication checks have also been disabled temporarily but nothing important. A lot of things are tagged with `TODO(hydra)`, those need resolving before merge. External contributors should PR to the `hydra/public` branch, *not* ` main`. --- This PR should be squash merged. Reviewed-on: https://forgejo.ellis.link/continuwuation/continuwuity/pulls/943 Co-authored-by: nexy7574 <git@nexy7574.co.uk> Co-committed-by: nexy7574 <git@nexy7574.co.uk>
This commit is contained in:
+44
-3
@@ -31,7 +31,8 @@ use crate::Result;
|
||||
pub struct Pdu {
|
||||
pub event_id: OwnedEventId,
|
||||
|
||||
pub room_id: OwnedRoomId,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub room_id: Option<OwnedRoomId>,
|
||||
|
||||
pub sender: OwnedUserId,
|
||||
|
||||
@@ -110,7 +111,27 @@ impl Event for Pdu {
|
||||
fn redacts(&self) -> Option<&EventId> { self.redacts.as_deref() }
|
||||
|
||||
#[inline]
|
||||
fn room_id(&self) -> &RoomId { &self.room_id }
|
||||
fn room_id(&self) -> Option<&RoomId> { self.room_id.as_deref() }
|
||||
|
||||
#[inline]
|
||||
fn room_id_or_hash(&self) -> OwnedRoomId {
|
||||
if *self.event_type() != TimelineEventType::RoomCreate {
|
||||
return self
|
||||
.room_id()
|
||||
.expect("Event must have a room ID")
|
||||
.to_owned();
|
||||
}
|
||||
if let Some(room_id) = &self.room_id {
|
||||
// v1-v11
|
||||
room_id.clone()
|
||||
} else {
|
||||
// v12+
|
||||
let constructed_hash = self.event_id.as_str().replace('$', "!");
|
||||
RoomId::parse(&constructed_hash)
|
||||
.expect("event ID can be parsed")
|
||||
.to_owned()
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn sender(&self) -> &UserId { &self.sender }
|
||||
@@ -163,7 +184,27 @@ impl Event for &Pdu {
|
||||
fn redacts(&self) -> Option<&EventId> { self.redacts.as_deref() }
|
||||
|
||||
#[inline]
|
||||
fn room_id(&self) -> &RoomId { &self.room_id }
|
||||
fn room_id(&self) -> Option<&RoomId> { self.room_id.as_ref().map(AsRef::as_ref) }
|
||||
|
||||
#[inline]
|
||||
fn room_id_or_hash(&self) -> OwnedRoomId {
|
||||
if *self.event_type() != TimelineEventType::RoomCreate {
|
||||
return self
|
||||
.room_id()
|
||||
.expect("Event must have a room ID")
|
||||
.to_owned();
|
||||
}
|
||||
if let Some(room_id) = &self.room_id {
|
||||
// v1-v11
|
||||
room_id.clone()
|
||||
} else {
|
||||
// v12+
|
||||
let constructed_hash = self.event_id.as_str().replace('$', "!");
|
||||
RoomId::parse(&constructed_hash)
|
||||
.expect("event ID can be parsed")
|
||||
.to_owned()
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn sender(&self) -> &UserId { &self.sender }
|
||||
|
||||
Reference in New Issue
Block a user