events: Add details to MembershipChange::ProfileChanged
This commit is contained in:
parent
b3ccdcade0
commit
2669be6087
@ -323,7 +323,7 @@ impl OriginalRoomMemberEvent {
|
|||||||
/// Check [the specification][spec] for details.
|
/// Check [the specification][spec] for details.
|
||||||
///
|
///
|
||||||
/// [spec]: https://spec.matrix.org/v1.2/client-server-api/#mroommember
|
/// [spec]: https://spec.matrix.org/v1.2/client-server-api/#mroommember
|
||||||
pub fn membership_change(&self) -> MembershipChange {
|
pub fn membership_change(&self) -> MembershipChange<'_> {
|
||||||
membership_change(self.details(), self.prev_details(), &self.sender, &self.state_key)
|
membership_change(self.details(), self.prev_details(), &self.sender, &self.state_key)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -346,10 +346,10 @@ impl RedactedRoomMemberEvent {
|
|||||||
/// Check [the specification][spec] for details.
|
/// Check [the specification][spec] for details.
|
||||||
///
|
///
|
||||||
/// [spec]: https://spec.matrix.org/v1.2/client-server-api/#mroommember
|
/// [spec]: https://spec.matrix.org/v1.2/client-server-api/#mroommember
|
||||||
pub fn membership_change(
|
pub fn membership_change<'a>(
|
||||||
&self,
|
&'a self,
|
||||||
prev_details: Option<MembershipDetails<'_>>,
|
prev_details: Option<MembershipDetails<'a>>,
|
||||||
) -> MembershipChange {
|
) -> MembershipChange<'a> {
|
||||||
membership_change(self.details(), prev_details, &self.sender, &self.state_key)
|
membership_change(self.details(), prev_details, &self.sender, &self.state_key)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -379,7 +379,7 @@ impl OriginalSyncRoomMemberEvent {
|
|||||||
/// Check [the specification][spec] for details.
|
/// Check [the specification][spec] for details.
|
||||||
///
|
///
|
||||||
/// [spec]: https://spec.matrix.org/v1.2/client-server-api/#mroommember
|
/// [spec]: https://spec.matrix.org/v1.2/client-server-api/#mroommember
|
||||||
pub fn membership_change(&self) -> MembershipChange {
|
pub fn membership_change(&self) -> MembershipChange<'_> {
|
||||||
membership_change(self.details(), self.prev_details(), &self.sender, &self.state_key)
|
membership_change(self.details(), self.prev_details(), &self.sender, &self.state_key)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -402,10 +402,10 @@ impl RedactedSyncRoomMemberEvent {
|
|||||||
/// Check [the specification][spec] for details.
|
/// Check [the specification][spec] for details.
|
||||||
///
|
///
|
||||||
/// [spec]: https://spec.matrix.org/v1.2/client-server-api/#mroommember
|
/// [spec]: https://spec.matrix.org/v1.2/client-server-api/#mroommember
|
||||||
pub fn membership_change(
|
pub fn membership_change<'a>(
|
||||||
&self,
|
&'a self,
|
||||||
prev_details: Option<MembershipDetails<'_>>,
|
prev_details: Option<MembershipDetails<'a>>,
|
||||||
) -> MembershipChange {
|
) -> MembershipChange<'a> {
|
||||||
membership_change(self.details(), prev_details, &self.sender, &self.state_key)
|
membership_change(self.details(), prev_details, &self.sender, &self.state_key)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -428,10 +428,10 @@ impl StrippedRoomMemberEvent {
|
|||||||
/// Check [the specification][spec] for details.
|
/// Check [the specification][spec] for details.
|
||||||
///
|
///
|
||||||
/// [spec]: https://spec.matrix.org/v1.2/client-server-api/#mroommember
|
/// [spec]: https://spec.matrix.org/v1.2/client-server-api/#mroommember
|
||||||
pub fn membership_change(
|
pub fn membership_change<'a>(
|
||||||
&self,
|
&'a self,
|
||||||
prev_details: Option<MembershipDetails<'_>>,
|
prev_details: Option<MembershipDetails<'a>>,
|
||||||
) -> MembershipChange {
|
) -> MembershipChange<'a> {
|
||||||
membership_change(self.details(), prev_details, &self.sender, &self.state_key)
|
membership_change(self.details(), prev_details, &self.sender, &self.state_key)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,7 @@ pub struct MembershipDetails<'a> {
|
|||||||
/// Translation of the membership change in `m.room.member` event.
|
/// Translation of the membership change in `m.room.member` event.
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
|
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
|
||||||
pub enum MembershipChange {
|
pub enum MembershipChange<'a> {
|
||||||
/// No change.
|
/// No change.
|
||||||
None,
|
None,
|
||||||
|
|
||||||
@ -48,25 +48,45 @@ pub enum MembershipChange {
|
|||||||
|
|
||||||
/// `displayname` or `avatar_url` changed.
|
/// `displayname` or `avatar_url` changed.
|
||||||
ProfileChanged {
|
ProfileChanged {
|
||||||
/// Whether the `displayname` changed.
|
/// The details of the displayname change, if applicable.
|
||||||
displayname_changed: bool,
|
displayname_change: Option<Change<Option<&'a str>>>,
|
||||||
|
|
||||||
/// Whether the `avatar_url` changed.
|
/// The details of the avatar url change, if applicable.
|
||||||
avatar_url_changed: bool,
|
avatar_url_change: Option<Change<Option<&'a MxcUri>>>,
|
||||||
},
|
},
|
||||||
|
|
||||||
/// Not implemented.
|
/// Not implemented.
|
||||||
NotImplemented,
|
NotImplemented,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A simple representation of a change, containing old and new data.
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub struct Change<T> {
|
||||||
|
/// The old data.
|
||||||
|
pub old: T,
|
||||||
|
|
||||||
|
/// The new data.
|
||||||
|
pub new: T,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: PartialEq> Change<T> {
|
||||||
|
fn new(old: T, new: T) -> Option<Self> {
|
||||||
|
if old == new {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(Self { old, new })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Internal function so all `RoomMemberEventContent` state event kinds can share the same
|
/// Internal function so all `RoomMemberEventContent` state event kinds can share the same
|
||||||
/// implementation.
|
/// implementation.
|
||||||
pub(super) fn membership_change(
|
pub(super) fn membership_change<'a>(
|
||||||
details: MembershipDetails<'_>,
|
details: MembershipDetails<'a>,
|
||||||
prev_details: Option<MembershipDetails<'_>>,
|
prev_details: Option<MembershipDetails<'a>>,
|
||||||
sender: &UserId,
|
sender: &UserId,
|
||||||
state_key: &UserId,
|
state_key: &UserId,
|
||||||
) -> MembershipChange {
|
) -> MembershipChange<'a> {
|
||||||
use MembershipChange as Ch;
|
use MembershipChange as Ch;
|
||||||
use MembershipState as St;
|
use MembershipState as St;
|
||||||
|
|
||||||
@ -83,8 +103,8 @@ pub(super) fn membership_change(
|
|||||||
(St::Invite, St::Ban) | (St::Leave, St::Ban) => Ch::Banned,
|
(St::Invite, St::Ban) | (St::Leave, St::Ban) => Ch::Banned,
|
||||||
(St::Join, St::Invite) | (St::Ban, St::Invite) | (St::Ban, St::Join) => Ch::Error,
|
(St::Join, St::Invite) | (St::Ban, St::Invite) | (St::Ban, St::Join) => Ch::Error,
|
||||||
(St::Join, St::Join) => Ch::ProfileChanged {
|
(St::Join, St::Join) => Ch::ProfileChanged {
|
||||||
displayname_changed: prev_details.displayname != details.displayname,
|
displayname_change: Change::new(prev_details.displayname, details.displayname),
|
||||||
avatar_url_changed: prev_details.avatar_url != details.avatar_url,
|
avatar_url_change: Change::new(prev_details.avatar_url, details.avatar_url),
|
||||||
},
|
},
|
||||||
(St::Join, St::Leave) if sender == state_key => Ch::Left,
|
(St::Join, St::Leave) if sender == state_key => Ch::Left,
|
||||||
(St::Join, St::Leave) => Ch::Kicked,
|
(St::Join, St::Leave) => Ch::Kicked,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user