Add m.room.pinned_events
This commit is contained in:
parent
0635fbae53
commit
3a62aaf4c7
@ -19,6 +19,7 @@ use room::join_rules::JoinRulesEvent;
|
|||||||
use room::member::MemberEvent;
|
use room::member::MemberEvent;
|
||||||
use room::message::MessageEvent;
|
use room::message::MessageEvent;
|
||||||
use room::name::NameEvent;
|
use room::name::NameEvent;
|
||||||
|
use room::pinned_events::PinnedEventsEvent;
|
||||||
use room::power_levels::PowerLevelsEvent;
|
use room::power_levels::PowerLevelsEvent;
|
||||||
use room::redaction::RedactionEvent;
|
use room::redaction::RedactionEvent;
|
||||||
use room::third_party_invite::ThirdPartyInviteEvent;
|
use room::third_party_invite::ThirdPartyInviteEvent;
|
||||||
@ -67,6 +68,8 @@ pub enum Event {
|
|||||||
RoomMessage(MessageEvent),
|
RoomMessage(MessageEvent),
|
||||||
/// m.room.name
|
/// m.room.name
|
||||||
RoomName(NameEvent),
|
RoomName(NameEvent),
|
||||||
|
/// m.room.pinned_events
|
||||||
|
RoomPinnedEvents(PinnedEventsEvent),
|
||||||
/// m.room.power_levels
|
/// m.room.power_levels
|
||||||
RoomPowerLevels(PowerLevelsEvent),
|
RoomPowerLevels(PowerLevelsEvent),
|
||||||
/// m.room.redaction
|
/// m.room.redaction
|
||||||
@ -118,6 +121,8 @@ pub enum RoomEvent {
|
|||||||
RoomMessage(MessageEvent),
|
RoomMessage(MessageEvent),
|
||||||
/// m.room.name
|
/// m.room.name
|
||||||
RoomName(NameEvent),
|
RoomName(NameEvent),
|
||||||
|
/// m.room.pinned_events
|
||||||
|
RoomPinnedEvents(PinnedEventsEvent),
|
||||||
/// m.room.power_levels
|
/// m.room.power_levels
|
||||||
RoomPowerLevels(PowerLevelsEvent),
|
RoomPowerLevels(PowerLevelsEvent),
|
||||||
/// m.room.redaction
|
/// m.room.redaction
|
||||||
@ -153,6 +158,8 @@ pub enum StateEvent {
|
|||||||
RoomMember(MemberEvent),
|
RoomMember(MemberEvent),
|
||||||
/// m.room.name
|
/// m.room.name
|
||||||
RoomName(NameEvent),
|
RoomName(NameEvent),
|
||||||
|
/// m.room.pinned_events
|
||||||
|
RoomPinnedEvents(PinnedEventsEvent),
|
||||||
/// m.room.power_levels
|
/// m.room.power_levels
|
||||||
RoomPowerLevels(PowerLevelsEvent),
|
RoomPowerLevels(PowerLevelsEvent),
|
||||||
/// m.room.third_party_invite
|
/// m.room.third_party_invite
|
||||||
@ -183,6 +190,7 @@ impl Serialize for Event {
|
|||||||
Event::RoomMember(ref event) => event.serialize(serializer),
|
Event::RoomMember(ref event) => event.serialize(serializer),
|
||||||
Event::RoomMessage(ref event) => event.serialize(serializer),
|
Event::RoomMessage(ref event) => event.serialize(serializer),
|
||||||
Event::RoomName(ref event) => event.serialize(serializer),
|
Event::RoomName(ref event) => event.serialize(serializer),
|
||||||
|
Event::RoomPinnedEvents(ref event) => event.serialize(serializer),
|
||||||
Event::RoomPowerLevels(ref event) => event.serialize(serializer),
|
Event::RoomPowerLevels(ref event) => event.serialize(serializer),
|
||||||
Event::RoomRedaction(ref event) => event.serialize(serializer),
|
Event::RoomRedaction(ref event) => event.serialize(serializer),
|
||||||
Event::RoomThirdPartyInvite(ref event) => event.serialize(serializer),
|
Event::RoomThirdPartyInvite(ref event) => event.serialize(serializer),
|
||||||
@ -347,6 +355,14 @@ impl<'de> Deserialize<'de> for Event {
|
|||||||
|
|
||||||
Ok(Event::RoomName(event))
|
Ok(Event::RoomName(event))
|
||||||
}
|
}
|
||||||
|
EventType::RoomPinnedEvents => {
|
||||||
|
let event = match from_value::<PinnedEventsEvent>(value) {
|
||||||
|
Ok(event) => event,
|
||||||
|
Err(error) => return Err(D::Error::custom(error.to_string())),
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(Event::RoomPinnedEvents(event))
|
||||||
|
}
|
||||||
EventType::RoomPowerLevels => {
|
EventType::RoomPowerLevels => {
|
||||||
let event = match from_value::<PowerLevelsEvent>(value) {
|
let event = match from_value::<PowerLevelsEvent>(value) {
|
||||||
Ok(event) => event,
|
Ok(event) => event,
|
||||||
@ -441,6 +457,7 @@ impl Serialize for RoomEvent {
|
|||||||
RoomEvent::RoomMember(ref event) => event.serialize(serializer),
|
RoomEvent::RoomMember(ref event) => event.serialize(serializer),
|
||||||
RoomEvent::RoomMessage(ref event) => event.serialize(serializer),
|
RoomEvent::RoomMessage(ref event) => event.serialize(serializer),
|
||||||
RoomEvent::RoomName(ref event) => event.serialize(serializer),
|
RoomEvent::RoomName(ref event) => event.serialize(serializer),
|
||||||
|
RoomEvent::RoomPinnedEvents(ref event) => event.serialize(serializer),
|
||||||
RoomEvent::RoomPowerLevels(ref event) => event.serialize(serializer),
|
RoomEvent::RoomPowerLevels(ref event) => event.serialize(serializer),
|
||||||
RoomEvent::RoomRedaction(ref event) => event.serialize(serializer),
|
RoomEvent::RoomRedaction(ref event) => event.serialize(serializer),
|
||||||
RoomEvent::RoomThirdPartyInvite(ref event) => event.serialize(serializer),
|
RoomEvent::RoomThirdPartyInvite(ref event) => event.serialize(serializer),
|
||||||
@ -578,6 +595,14 @@ impl<'de> Deserialize<'de> for RoomEvent {
|
|||||||
|
|
||||||
Ok(RoomEvent::RoomName(event))
|
Ok(RoomEvent::RoomName(event))
|
||||||
}
|
}
|
||||||
|
EventType::RoomPinnedEvents => {
|
||||||
|
let event = match from_value::<PinnedEventsEvent>(value) {
|
||||||
|
Ok(event) => event,
|
||||||
|
Err(error) => return Err(D::Error::custom(error.to_string())),
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(RoomEvent::RoomPinnedEvents(event))
|
||||||
|
}
|
||||||
EventType::RoomPowerLevels => {
|
EventType::RoomPowerLevels => {
|
||||||
let event = match from_value::<PowerLevelsEvent>(value) {
|
let event = match from_value::<PowerLevelsEvent>(value) {
|
||||||
Ok(event) => event,
|
Ok(event) => event,
|
||||||
@ -650,6 +675,7 @@ impl Serialize for StateEvent {
|
|||||||
StateEvent::RoomJoinRules(ref event) => event.serialize(serializer),
|
StateEvent::RoomJoinRules(ref event) => event.serialize(serializer),
|
||||||
StateEvent::RoomMember(ref event) => event.serialize(serializer),
|
StateEvent::RoomMember(ref event) => event.serialize(serializer),
|
||||||
StateEvent::RoomName(ref event) => event.serialize(serializer),
|
StateEvent::RoomName(ref event) => event.serialize(serializer),
|
||||||
|
StateEvent::RoomPinnedEvents(ref event) => event.serialize(serializer),
|
||||||
StateEvent::RoomPowerLevels(ref event) => event.serialize(serializer),
|
StateEvent::RoomPowerLevels(ref event) => event.serialize(serializer),
|
||||||
StateEvent::RoomThirdPartyInvite(ref event) => event.serialize(serializer),
|
StateEvent::RoomThirdPartyInvite(ref event) => event.serialize(serializer),
|
||||||
StateEvent::RoomTopic(ref event) => event.serialize(serializer),
|
StateEvent::RoomTopic(ref event) => event.serialize(serializer),
|
||||||
@ -745,6 +771,14 @@ impl<'de> Deserialize<'de> for StateEvent {
|
|||||||
|
|
||||||
Ok(StateEvent::RoomName(event))
|
Ok(StateEvent::RoomName(event))
|
||||||
}
|
}
|
||||||
|
EventType::RoomPinnedEvents => {
|
||||||
|
let event = match from_value::<PinnedEventsEvent>(value) {
|
||||||
|
Ok(event) => event,
|
||||||
|
Err(error) => return Err(D::Error::custom(error.to_string())),
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(StateEvent::RoomPinnedEvents(event))
|
||||||
|
}
|
||||||
EventType::RoomPowerLevels => {
|
EventType::RoomPowerLevels => {
|
||||||
let event = match from_value::<PowerLevelsEvent>(value) {
|
let event = match from_value::<PowerLevelsEvent>(value) {
|
||||||
Ok(event) => event,
|
Ok(event) => event,
|
||||||
@ -821,6 +855,7 @@ impl_from_t_for_event!(JoinRulesEvent, RoomJoinRules);
|
|||||||
impl_from_t_for_event!(MemberEvent, RoomMember);
|
impl_from_t_for_event!(MemberEvent, RoomMember);
|
||||||
impl_from_t_for_event!(MessageEvent, RoomMessage);
|
impl_from_t_for_event!(MessageEvent, RoomMessage);
|
||||||
impl_from_t_for_event!(NameEvent, RoomName);
|
impl_from_t_for_event!(NameEvent, RoomName);
|
||||||
|
impl_from_t_for_event!(PinnedEventsEvent, RoomPinnedEvents);
|
||||||
impl_from_t_for_event!(PowerLevelsEvent, RoomPowerLevels);
|
impl_from_t_for_event!(PowerLevelsEvent, RoomPowerLevels);
|
||||||
impl_from_t_for_event!(RedactionEvent, RoomRedaction);
|
impl_from_t_for_event!(RedactionEvent, RoomRedaction);
|
||||||
impl_from_t_for_event!(ThirdPartyInviteEvent, RoomThirdPartyInvite);
|
impl_from_t_for_event!(ThirdPartyInviteEvent, RoomThirdPartyInvite);
|
||||||
@ -855,6 +890,7 @@ impl_from_t_for_room_event!(JoinRulesEvent, RoomJoinRules);
|
|||||||
impl_from_t_for_room_event!(MemberEvent, RoomMember);
|
impl_from_t_for_room_event!(MemberEvent, RoomMember);
|
||||||
impl_from_t_for_room_event!(MessageEvent, RoomMessage);
|
impl_from_t_for_room_event!(MessageEvent, RoomMessage);
|
||||||
impl_from_t_for_room_event!(NameEvent, RoomName);
|
impl_from_t_for_room_event!(NameEvent, RoomName);
|
||||||
|
impl_from_t_for_room_event!(PinnedEventsEvent, RoomPinnedEvents);
|
||||||
impl_from_t_for_room_event!(PowerLevelsEvent, RoomPowerLevels);
|
impl_from_t_for_room_event!(PowerLevelsEvent, RoomPowerLevels);
|
||||||
impl_from_t_for_room_event!(RedactionEvent, RoomRedaction);
|
impl_from_t_for_room_event!(RedactionEvent, RoomRedaction);
|
||||||
impl_from_t_for_room_event!(ThirdPartyInviteEvent, RoomThirdPartyInvite);
|
impl_from_t_for_room_event!(ThirdPartyInviteEvent, RoomThirdPartyInvite);
|
||||||
@ -881,6 +917,7 @@ impl_from_t_for_state_event!(HistoryVisibilityEvent, RoomHistoryVisibility);
|
|||||||
impl_from_t_for_state_event!(JoinRulesEvent, RoomJoinRules);
|
impl_from_t_for_state_event!(JoinRulesEvent, RoomJoinRules);
|
||||||
impl_from_t_for_state_event!(MemberEvent, RoomMember);
|
impl_from_t_for_state_event!(MemberEvent, RoomMember);
|
||||||
impl_from_t_for_state_event!(NameEvent, RoomName);
|
impl_from_t_for_state_event!(NameEvent, RoomName);
|
||||||
|
impl_from_t_for_state_event!(PinnedEventsEvent, RoomPinnedEvents);
|
||||||
impl_from_t_for_state_event!(PowerLevelsEvent, RoomPowerLevels);
|
impl_from_t_for_state_event!(PowerLevelsEvent, RoomPowerLevels);
|
||||||
impl_from_t_for_state_event!(ThirdPartyInviteEvent, RoomThirdPartyInvite);
|
impl_from_t_for_state_event!(ThirdPartyInviteEvent, RoomThirdPartyInvite);
|
||||||
impl_from_t_for_state_event!(TopicEvent, RoomTopic);
|
impl_from_t_for_state_event!(TopicEvent, RoomTopic);
|
||||||
|
@ -136,8 +136,9 @@ impl<'de> Deserialize<'de> for Event {
|
|||||||
EventType::CallInvite | EventType::RoomAliases | EventType::RoomAvatar |
|
EventType::CallInvite | EventType::RoomAliases | EventType::RoomAvatar |
|
||||||
EventType::RoomCanonicalAlias | EventType::RoomCreate | EventType::RoomGuestAccess |
|
EventType::RoomCanonicalAlias | EventType::RoomCreate | EventType::RoomGuestAccess |
|
||||||
EventType::RoomHistoryVisibility | EventType::RoomJoinRules | EventType::RoomMember |
|
EventType::RoomHistoryVisibility | EventType::RoomJoinRules | EventType::RoomMember |
|
||||||
EventType::RoomMessage | EventType::RoomName | EventType::RoomPowerLevels |
|
EventType::RoomMessage | EventType::RoomName | EventType::RoomPinnedEvents |
|
||||||
EventType::RoomRedaction | EventType::RoomThirdPartyInvite | EventType::RoomTopic => {
|
EventType::RoomPowerLevels | EventType::RoomRedaction | EventType::RoomThirdPartyInvite |
|
||||||
|
EventType::RoomTopic => {
|
||||||
return Err(D::Error::custom("not exclusively a basic event".to_string()));
|
return Err(D::Error::custom("not exclusively a basic event".to_string()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -241,6 +242,7 @@ impl<'de> Deserialize<'de> for RoomEvent {
|
|||||||
EventType::RoomJoinRules |
|
EventType::RoomJoinRules |
|
||||||
EventType::RoomMember |
|
EventType::RoomMember |
|
||||||
EventType::RoomName |
|
EventType::RoomName |
|
||||||
|
EventType::RoomPinnedEvents |
|
||||||
EventType::RoomPowerLevels |
|
EventType::RoomPowerLevels |
|
||||||
EventType::RoomThirdPartyInvite |
|
EventType::RoomThirdPartyInvite |
|
||||||
EventType::RoomTopic |
|
EventType::RoomTopic |
|
||||||
|
@ -169,6 +169,8 @@ pub enum EventType {
|
|||||||
RoomMessage,
|
RoomMessage,
|
||||||
/// m.room.name
|
/// m.room.name
|
||||||
RoomName,
|
RoomName,
|
||||||
|
/// m.room.pinned_events
|
||||||
|
RoomPinnedEvents,
|
||||||
/// m.room.power_levels
|
/// m.room.power_levels
|
||||||
RoomPowerLevels,
|
RoomPowerLevels,
|
||||||
/// m.room.redaction
|
/// m.room.redaction
|
||||||
@ -259,6 +261,7 @@ impl Display for EventType {
|
|||||||
EventType::RoomMember => "m.room.member",
|
EventType::RoomMember => "m.room.member",
|
||||||
EventType::RoomMessage => "m.room.message",
|
EventType::RoomMessage => "m.room.message",
|
||||||
EventType::RoomName => "m.room.name",
|
EventType::RoomName => "m.room.name",
|
||||||
|
EventType::RoomPinnedEvents=> "m.room.pinned_events",
|
||||||
EventType::RoomPowerLevels => "m.room.power_levels",
|
EventType::RoomPowerLevels => "m.room.power_levels",
|
||||||
EventType::RoomRedaction => "m.room.redaction",
|
EventType::RoomRedaction => "m.room.redaction",
|
||||||
EventType::RoomThirdPartyInvite => "m.room.third_party_invite",
|
EventType::RoomThirdPartyInvite => "m.room.third_party_invite",
|
||||||
@ -292,6 +295,7 @@ impl<'a> From<&'a str> for EventType {
|
|||||||
"m.room.member" => EventType::RoomMember,
|
"m.room.member" => EventType::RoomMember,
|
||||||
"m.room.message" => EventType::RoomMessage,
|
"m.room.message" => EventType::RoomMessage,
|
||||||
"m.room.name" => EventType::RoomName,
|
"m.room.name" => EventType::RoomName,
|
||||||
|
"m.room.pinned_events" => EventType::RoomPinnedEvents,
|
||||||
"m.room.power_levels" => EventType::RoomPowerLevels,
|
"m.room.power_levels" => EventType::RoomPowerLevels,
|
||||||
"m.room.redaction" => EventType::RoomRedaction,
|
"m.room.redaction" => EventType::RoomRedaction,
|
||||||
"m.room.third_party_invite" => EventType::RoomThirdPartyInvite,
|
"m.room.third_party_invite" => EventType::RoomThirdPartyInvite,
|
||||||
|
@ -12,6 +12,7 @@ pub mod join_rules;
|
|||||||
pub mod member;
|
pub mod member;
|
||||||
pub mod message;
|
pub mod message;
|
||||||
pub mod name;
|
pub mod name;
|
||||||
|
pub mod pinned_events;
|
||||||
pub mod power_levels;
|
pub mod power_levels;
|
||||||
pub mod redaction;
|
pub mod redaction;
|
||||||
pub mod third_party_invite;
|
pub mod third_party_invite;
|
||||||
|
63
src/room/pinned_events.rs
Normal file
63
src/room/pinned_events.rs
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
//! Types for the *m.room.pinned_events* event.
|
||||||
|
|
||||||
|
use ruma_identifiers::EventId;
|
||||||
|
|
||||||
|
state_event! {
|
||||||
|
/// Used to "pin" particular events in a room for other participants to review later.
|
||||||
|
pub struct PinnedEventsEvent(PinnedEventsContent) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The payload of a `NameEvent`.
|
||||||
|
#[derive(Clone, Debug, Deserialize, Serialize)]
|
||||||
|
pub struct PinnedEventsContent {
|
||||||
|
/// An ordered list of event IDs to pin.
|
||||||
|
pub pinned: Vec<EventId>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use ruma_identifiers::{EventId, RoomId, UserId};
|
||||||
|
use serde_json::{from_str, to_string};
|
||||||
|
|
||||||
|
use Event;
|
||||||
|
use EventType;
|
||||||
|
use RoomEvent;
|
||||||
|
use StateEvent;
|
||||||
|
use room::pinned_events::{PinnedEventsEvent, PinnedEventsContent};
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn serialization_deserialization() {
|
||||||
|
let mut content: PinnedEventsContent = PinnedEventsContent {
|
||||||
|
pinned: Vec::new()
|
||||||
|
};
|
||||||
|
|
||||||
|
content.pinned.push(EventId::new("example.com").unwrap());
|
||||||
|
content.pinned.push(EventId::new("example.com").unwrap());
|
||||||
|
|
||||||
|
let event = PinnedEventsEvent {
|
||||||
|
content: content.clone(),
|
||||||
|
event_id: EventId::new("example.com").unwrap(),
|
||||||
|
event_type: EventType::RoomPinnedEvents,
|
||||||
|
origin_server_ts: 1432804485886,
|
||||||
|
prev_content: None,
|
||||||
|
room_id: RoomId::new("example.com").unwrap(),
|
||||||
|
sender: UserId::new("example.com").unwrap(),
|
||||||
|
state_key: "".to_string(),
|
||||||
|
unsigned: None,
|
||||||
|
};
|
||||||
|
|
||||||
|
let serialized_event = to_string(&event).unwrap();
|
||||||
|
let parsed_event: PinnedEventsEvent = from_str(&serialized_event).unwrap();
|
||||||
|
|
||||||
|
assert_eq!(parsed_event.event_id(), event.event_id());
|
||||||
|
assert_eq!(parsed_event.room_id(), event.room_id());
|
||||||
|
assert_eq!(parsed_event.sender(), event.sender());
|
||||||
|
assert_eq!(parsed_event.unsigned(), event.unsigned());
|
||||||
|
assert_eq!(parsed_event.state_key(), event.state_key());
|
||||||
|
assert_eq!(parsed_event.origin_server_ts(), event.origin_server_ts());
|
||||||
|
|
||||||
|
assert_eq!(parsed_event.content().pinned, event.content.pinned);
|
||||||
|
assert_eq!(parsed_event.content().pinned[0], content.pinned[0]);
|
||||||
|
assert_eq!(parsed_event.content().pinned[1], content.pinned[1]);
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user