events: Preserve invite in RedactedRoomPowerLevelsEventContent
According to MSC2176
This commit is contained in:
parent
eeacf27183
commit
ce13fdb3a7
@ -9,9 +9,12 @@ use ruma_macros::EventContent;
|
|||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
events::{EmptyStateKey, MessageLikeEventType, StateEventType, TimelineEventType},
|
events::{
|
||||||
|
EmptyStateKey, EventContent, MessageLikeEventType, RedactContent,
|
||||||
|
RedactedStateEventContent, StateEventType, StaticEventContent, TimelineEventType,
|
||||||
|
},
|
||||||
power_levels::{default_power_level, NotificationPowerLevels},
|
power_levels::{default_power_level, NotificationPowerLevels},
|
||||||
OwnedUserId, UserId,
|
OwnedUserId, RoomVersionId, UserId,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// The content of an `m.room.power_levels` event.
|
/// The content of an `m.room.power_levels` event.
|
||||||
@ -19,7 +22,7 @@ use crate::{
|
|||||||
/// Defines the power levels (privileges) of users in the room.
|
/// Defines the power levels (privileges) of users in the room.
|
||||||
#[derive(Clone, Debug, Deserialize, Serialize, EventContent)]
|
#[derive(Clone, Debug, Deserialize, Serialize, EventContent)]
|
||||||
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
|
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
|
||||||
#[ruma_event(type = "m.room.power_levels", kind = State, state_key_type = EmptyStateKey)]
|
#[ruma_event(type = "m.room.power_levels", kind = State, state_key_type = EmptyStateKey, custom_redacted)]
|
||||||
pub struct RoomPowerLevelsEventContent {
|
pub struct RoomPowerLevelsEventContent {
|
||||||
/// The level required to ban a user.
|
/// The level required to ban a user.
|
||||||
#[serde(
|
#[serde(
|
||||||
@ -27,7 +30,6 @@ pub struct RoomPowerLevelsEventContent {
|
|||||||
skip_serializing_if = "is_default_power_level",
|
skip_serializing_if = "is_default_power_level",
|
||||||
deserialize_with = "crate::serde::deserialize_v1_powerlevel"
|
deserialize_with = "crate::serde::deserialize_v1_powerlevel"
|
||||||
)]
|
)]
|
||||||
#[ruma_event(skip_redaction)]
|
|
||||||
pub ban: Int,
|
pub ban: Int,
|
||||||
|
|
||||||
/// The level required to send specific event types.
|
/// The level required to send specific event types.
|
||||||
@ -38,7 +40,6 @@ pub struct RoomPowerLevelsEventContent {
|
|||||||
skip_serializing_if = "BTreeMap::is_empty",
|
skip_serializing_if = "BTreeMap::is_empty",
|
||||||
deserialize_with = "crate::serde::btreemap_deserialize_v1_powerlevel_values"
|
deserialize_with = "crate::serde::btreemap_deserialize_v1_powerlevel_values"
|
||||||
)]
|
)]
|
||||||
#[ruma_event(skip_redaction)]
|
|
||||||
pub events: BTreeMap<TimelineEventType, Int>,
|
pub events: BTreeMap<TimelineEventType, Int>,
|
||||||
|
|
||||||
/// The default level required to send message events.
|
/// The default level required to send message events.
|
||||||
@ -47,7 +48,6 @@ pub struct RoomPowerLevelsEventContent {
|
|||||||
skip_serializing_if = "crate::serde::is_default",
|
skip_serializing_if = "crate::serde::is_default",
|
||||||
deserialize_with = "crate::serde::deserialize_v1_powerlevel"
|
deserialize_with = "crate::serde::deserialize_v1_powerlevel"
|
||||||
)]
|
)]
|
||||||
#[ruma_event(skip_redaction)]
|
|
||||||
pub events_default: Int,
|
pub events_default: Int,
|
||||||
|
|
||||||
/// The level required to invite a user.
|
/// The level required to invite a user.
|
||||||
@ -64,7 +64,6 @@ pub struct RoomPowerLevelsEventContent {
|
|||||||
skip_serializing_if = "is_default_power_level",
|
skip_serializing_if = "is_default_power_level",
|
||||||
deserialize_with = "crate::serde::deserialize_v1_powerlevel"
|
deserialize_with = "crate::serde::deserialize_v1_powerlevel"
|
||||||
)]
|
)]
|
||||||
#[ruma_event(skip_redaction)]
|
|
||||||
pub kick: Int,
|
pub kick: Int,
|
||||||
|
|
||||||
/// The level required to redact an event.
|
/// The level required to redact an event.
|
||||||
@ -73,7 +72,6 @@ pub struct RoomPowerLevelsEventContent {
|
|||||||
skip_serializing_if = "is_default_power_level",
|
skip_serializing_if = "is_default_power_level",
|
||||||
deserialize_with = "crate::serde::deserialize_v1_powerlevel"
|
deserialize_with = "crate::serde::deserialize_v1_powerlevel"
|
||||||
)]
|
)]
|
||||||
#[ruma_event(skip_redaction)]
|
|
||||||
pub redact: Int,
|
pub redact: Int,
|
||||||
|
|
||||||
/// The default level required to send state events.
|
/// The default level required to send state events.
|
||||||
@ -82,7 +80,6 @@ pub struct RoomPowerLevelsEventContent {
|
|||||||
skip_serializing_if = "is_default_power_level",
|
skip_serializing_if = "is_default_power_level",
|
||||||
deserialize_with = "crate::serde::deserialize_v1_powerlevel"
|
deserialize_with = "crate::serde::deserialize_v1_powerlevel"
|
||||||
)]
|
)]
|
||||||
#[ruma_event(skip_redaction)]
|
|
||||||
pub state_default: Int,
|
pub state_default: Int,
|
||||||
|
|
||||||
/// The power levels for specific users.
|
/// The power levels for specific users.
|
||||||
@ -93,7 +90,6 @@ pub struct RoomPowerLevelsEventContent {
|
|||||||
skip_serializing_if = "BTreeMap::is_empty",
|
skip_serializing_if = "BTreeMap::is_empty",
|
||||||
deserialize_with = "crate::serde::btreemap_deserialize_v1_powerlevel_values"
|
deserialize_with = "crate::serde::btreemap_deserialize_v1_powerlevel_values"
|
||||||
)]
|
)]
|
||||||
#[ruma_event(skip_redaction)]
|
|
||||||
pub users: BTreeMap<OwnedUserId, Int>,
|
pub users: BTreeMap<OwnedUserId, Int>,
|
||||||
|
|
||||||
/// The default power level for every user in the room.
|
/// The default power level for every user in the room.
|
||||||
@ -102,7 +98,6 @@ pub struct RoomPowerLevelsEventContent {
|
|||||||
skip_serializing_if = "crate::serde::is_default",
|
skip_serializing_if = "crate::serde::is_default",
|
||||||
deserialize_with = "crate::serde::deserialize_v1_powerlevel"
|
deserialize_with = "crate::serde::deserialize_v1_powerlevel"
|
||||||
)]
|
)]
|
||||||
#[ruma_event(skip_redaction)]
|
|
||||||
pub users_default: Int,
|
pub users_default: Int,
|
||||||
|
|
||||||
/// The power level requirements for specific notification types.
|
/// The power level requirements for specific notification types.
|
||||||
@ -138,6 +133,51 @@ impl Default for RoomPowerLevelsEventContent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl RedactContent for RoomPowerLevelsEventContent {
|
||||||
|
type Redacted = RedactedRoomPowerLevelsEventContent;
|
||||||
|
|
||||||
|
fn redact(self, version: &RoomVersionId) -> Self::Redacted {
|
||||||
|
let Self {
|
||||||
|
ban,
|
||||||
|
events,
|
||||||
|
events_default,
|
||||||
|
invite,
|
||||||
|
kick,
|
||||||
|
redact,
|
||||||
|
state_default,
|
||||||
|
users,
|
||||||
|
users_default,
|
||||||
|
..
|
||||||
|
} = self;
|
||||||
|
|
||||||
|
let invite = match version {
|
||||||
|
RoomVersionId::V1
|
||||||
|
| RoomVersionId::V2
|
||||||
|
| RoomVersionId::V3
|
||||||
|
| RoomVersionId::V4
|
||||||
|
| RoomVersionId::V5
|
||||||
|
| RoomVersionId::V6
|
||||||
|
| RoomVersionId::V7
|
||||||
|
| RoomVersionId::V8
|
||||||
|
| RoomVersionId::V9
|
||||||
|
| RoomVersionId::V10 => int!(0),
|
||||||
|
_ => invite,
|
||||||
|
};
|
||||||
|
|
||||||
|
RedactedRoomPowerLevelsEventContent {
|
||||||
|
ban,
|
||||||
|
events,
|
||||||
|
events_default,
|
||||||
|
invite,
|
||||||
|
kick,
|
||||||
|
redact,
|
||||||
|
state_default,
|
||||||
|
users,
|
||||||
|
users_default,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Used with `#[serde(skip_serializing_if)]` to omit default power levels.
|
/// Used with `#[serde(skip_serializing_if)]` to omit default power levels.
|
||||||
#[allow(clippy::trivially_copy_pass_by_ref)]
|
#[allow(clippy::trivially_copy_pass_by_ref)]
|
||||||
fn is_default_power_level(l: &Int) -> bool {
|
fn is_default_power_level(l: &Int) -> bool {
|
||||||
@ -171,6 +211,106 @@ impl StrippedRoomPowerLevelsEvent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Redacted form of [`RoomPowerLevelsEventContent`].
|
||||||
|
#[derive(Clone, Debug, Deserialize, Serialize)]
|
||||||
|
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
|
||||||
|
pub struct RedactedRoomPowerLevelsEventContent {
|
||||||
|
/// The level required to ban a user.
|
||||||
|
#[serde(
|
||||||
|
default = "default_power_level",
|
||||||
|
skip_serializing_if = "is_default_power_level",
|
||||||
|
deserialize_with = "crate::serde::deserialize_v1_powerlevel"
|
||||||
|
)]
|
||||||
|
pub ban: Int,
|
||||||
|
|
||||||
|
/// The level required to send specific event types.
|
||||||
|
///
|
||||||
|
/// This is a mapping from event type to power level required.
|
||||||
|
#[serde(
|
||||||
|
default,
|
||||||
|
skip_serializing_if = "BTreeMap::is_empty",
|
||||||
|
deserialize_with = "crate::serde::btreemap_deserialize_v1_powerlevel_values"
|
||||||
|
)]
|
||||||
|
pub events: BTreeMap<TimelineEventType, Int>,
|
||||||
|
|
||||||
|
/// The default level required to send message events.
|
||||||
|
#[serde(
|
||||||
|
default,
|
||||||
|
skip_serializing_if = "crate::serde::is_default",
|
||||||
|
deserialize_with = "crate::serde::deserialize_v1_powerlevel"
|
||||||
|
)]
|
||||||
|
pub events_default: Int,
|
||||||
|
|
||||||
|
/// The level required to invite a user.
|
||||||
|
///
|
||||||
|
/// This field was redacted in room versions 1 through 10. Starting from room version 11 it is
|
||||||
|
/// preserved.
|
||||||
|
#[serde(
|
||||||
|
default,
|
||||||
|
skip_serializing_if = "crate::serde::is_default",
|
||||||
|
deserialize_with = "crate::serde::deserialize_v1_powerlevel"
|
||||||
|
)]
|
||||||
|
pub invite: Int,
|
||||||
|
|
||||||
|
/// The level required to kick a user.
|
||||||
|
#[serde(
|
||||||
|
default = "default_power_level",
|
||||||
|
skip_serializing_if = "is_default_power_level",
|
||||||
|
deserialize_with = "crate::serde::deserialize_v1_powerlevel"
|
||||||
|
)]
|
||||||
|
pub kick: Int,
|
||||||
|
|
||||||
|
/// The level required to redact an event.
|
||||||
|
#[serde(
|
||||||
|
default = "default_power_level",
|
||||||
|
skip_serializing_if = "is_default_power_level",
|
||||||
|
deserialize_with = "crate::serde::deserialize_v1_powerlevel"
|
||||||
|
)]
|
||||||
|
pub redact: Int,
|
||||||
|
|
||||||
|
/// The default level required to send state events.
|
||||||
|
#[serde(
|
||||||
|
default = "default_power_level",
|
||||||
|
skip_serializing_if = "is_default_power_level",
|
||||||
|
deserialize_with = "crate::serde::deserialize_v1_powerlevel"
|
||||||
|
)]
|
||||||
|
pub state_default: Int,
|
||||||
|
|
||||||
|
/// The power levels for specific users.
|
||||||
|
///
|
||||||
|
/// This is a mapping from `user_id` to power level for that user.
|
||||||
|
#[serde(
|
||||||
|
default,
|
||||||
|
skip_serializing_if = "BTreeMap::is_empty",
|
||||||
|
deserialize_with = "crate::serde::btreemap_deserialize_v1_powerlevel_values"
|
||||||
|
)]
|
||||||
|
pub users: BTreeMap<OwnedUserId, Int>,
|
||||||
|
|
||||||
|
/// The default power level for every user in the room.
|
||||||
|
#[serde(
|
||||||
|
default,
|
||||||
|
skip_serializing_if = "crate::serde::is_default",
|
||||||
|
deserialize_with = "crate::serde::deserialize_v1_powerlevel"
|
||||||
|
)]
|
||||||
|
pub users_default: Int,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl EventContent for RedactedRoomPowerLevelsEventContent {
|
||||||
|
type EventType = StateEventType;
|
||||||
|
|
||||||
|
fn event_type(&self) -> Self::EventType {
|
||||||
|
StateEventType::RoomPowerLevels
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl StaticEventContent for RedactedRoomPowerLevelsEventContent {
|
||||||
|
const TYPE: &'static str = "m.room.power_levels";
|
||||||
|
}
|
||||||
|
|
||||||
|
impl RedactedStateEventContent for RedactedRoomPowerLevelsEventContent {
|
||||||
|
type StateKey = EmptyStateKey;
|
||||||
|
}
|
||||||
|
|
||||||
/// The effective power levels of a room.
|
/// The effective power levels of a room.
|
||||||
///
|
///
|
||||||
/// This struct contains the same fields as [`RoomPowerLevelsEventContent`] and be created from that
|
/// This struct contains the same fields as [`RoomPowerLevelsEventContent`] and be created from that
|
||||||
@ -332,7 +472,7 @@ impl From<RedactedRoomPowerLevelsEventContent> for RoomPowerLevels {
|
|||||||
ban: c.ban,
|
ban: c.ban,
|
||||||
events: c.events,
|
events: c.events,
|
||||||
events_default: c.events_default,
|
events_default: c.events_default,
|
||||||
invite: int!(0),
|
invite: c.invite,
|
||||||
kick: c.kick,
|
kick: c.kick,
|
||||||
redact: c.redact,
|
redact: c.redact,
|
||||||
state_default: c.state_default,
|
state_default: c.state_default,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user