Add m.ignored_user_list.
This commit is contained in:
parent
f8e5a80c93
commit
0fdf51598f
@ -7,6 +7,7 @@ use crate::{
|
|||||||
},
|
},
|
||||||
direct::DirectEvent,
|
direct::DirectEvent,
|
||||||
fully_read::FullyReadEvent,
|
fully_read::FullyReadEvent,
|
||||||
|
ignored_user_list::IgnoredUserListEvent,
|
||||||
presence::PresenceEvent,
|
presence::PresenceEvent,
|
||||||
receipt::ReceiptEvent,
|
receipt::ReceiptEvent,
|
||||||
room::{
|
room::{
|
||||||
@ -50,6 +51,8 @@ pub enum Event {
|
|||||||
Direct(DirectEvent),
|
Direct(DirectEvent),
|
||||||
/// m.fully_read
|
/// m.fully_read
|
||||||
FullyRead(FullyReadEvent),
|
FullyRead(FullyReadEvent),
|
||||||
|
/// m.ignored_user_list
|
||||||
|
IgnoredUserList(IgnoredUserListEvent),
|
||||||
/// m.presence
|
/// m.presence
|
||||||
Presence(PresenceEvent),
|
Presence(PresenceEvent),
|
||||||
/// m.receipt
|
/// m.receipt
|
||||||
@ -194,6 +197,7 @@ impl Serialize for Event {
|
|||||||
Event::CallInvite(ref event) => event.serialize(serializer),
|
Event::CallInvite(ref event) => event.serialize(serializer),
|
||||||
Event::Direct(ref event) => event.serialize(serializer),
|
Event::Direct(ref event) => event.serialize(serializer),
|
||||||
Event::FullyRead(ref event) => event.serialize(serializer),
|
Event::FullyRead(ref event) => event.serialize(serializer),
|
||||||
|
Event::IgnoredUserList(ref event) => event.serialize(serializer),
|
||||||
Event::Presence(ref event) => event.serialize(serializer),
|
Event::Presence(ref event) => event.serialize(serializer),
|
||||||
Event::Receipt(ref event) => event.serialize(serializer),
|
Event::Receipt(ref event) => event.serialize(serializer),
|
||||||
Event::RoomAliases(ref event) => event.serialize(serializer),
|
Event::RoomAliases(ref event) => event.serialize(serializer),
|
||||||
@ -287,6 +291,14 @@ impl<'de> Deserialize<'de> for Event {
|
|||||||
|
|
||||||
Ok(Event::FullyRead(event))
|
Ok(Event::FullyRead(event))
|
||||||
}
|
}
|
||||||
|
EventType::IgnoredUserList => {
|
||||||
|
let event = match from_value::<IgnoredUserListEvent>(value) {
|
||||||
|
Ok(event) => event,
|
||||||
|
Err(error) => return Err(D::Error::custom(error.to_string())),
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(Event::IgnoredUserList(event))
|
||||||
|
}
|
||||||
EventType::Presence => {
|
EventType::Presence => {
|
||||||
let event = match from_value::<PresenceEvent>(value) {
|
let event = match from_value::<PresenceEvent>(value) {
|
||||||
Ok(event) => event,
|
Ok(event) => event,
|
||||||
@ -707,6 +719,7 @@ impl<'de> Deserialize<'de> for RoomEvent {
|
|||||||
}
|
}
|
||||||
EventType::Direct
|
EventType::Direct
|
||||||
| EventType::FullyRead
|
| EventType::FullyRead
|
||||||
|
| EventType::IgnoredUserList
|
||||||
| EventType::Presence
|
| EventType::Presence
|
||||||
| EventType::Receipt
|
| EventType::Receipt
|
||||||
| EventType::Tag
|
| EventType::Tag
|
||||||
@ -875,6 +888,7 @@ impl<'de> Deserialize<'de> for StateEvent {
|
|||||||
| EventType::CallInvite
|
| EventType::CallInvite
|
||||||
| EventType::Direct
|
| EventType::Direct
|
||||||
| EventType::FullyRead
|
| EventType::FullyRead
|
||||||
|
| EventType::IgnoredUserList
|
||||||
| EventType::Presence
|
| EventType::Presence
|
||||||
| EventType::Receipt
|
| EventType::Receipt
|
||||||
| EventType::RoomMessage
|
| EventType::RoomMessage
|
||||||
@ -902,6 +916,7 @@ impl_from_t_for_event!(HangupEvent, CallHangup);
|
|||||||
impl_from_t_for_event!(InviteEvent, CallInvite);
|
impl_from_t_for_event!(InviteEvent, CallInvite);
|
||||||
impl_from_t_for_event!(DirectEvent, Direct);
|
impl_from_t_for_event!(DirectEvent, Direct);
|
||||||
impl_from_t_for_event!(FullyReadEvent, FullyRead);
|
impl_from_t_for_event!(FullyReadEvent, FullyRead);
|
||||||
|
impl_from_t_for_event!(IgnoredUserListEvent, IgnoredUserList);
|
||||||
impl_from_t_for_event!(PresenceEvent, Presence);
|
impl_from_t_for_event!(PresenceEvent, Presence);
|
||||||
impl_from_t_for_event!(ReceiptEvent, Receipt);
|
impl_from_t_for_event!(ReceiptEvent, Receipt);
|
||||||
impl_from_t_for_event!(AliasesEvent, RoomAliases);
|
impl_from_t_for_event!(AliasesEvent, RoomAliases);
|
||||||
|
@ -11,6 +11,7 @@ use crate::{
|
|||||||
},
|
},
|
||||||
direct::DirectEvent,
|
direct::DirectEvent,
|
||||||
fully_read::FullyReadEvent,
|
fully_read::FullyReadEvent,
|
||||||
|
ignored_user_list::IgnoredUserListEvent,
|
||||||
presence::PresenceEvent,
|
presence::PresenceEvent,
|
||||||
receipt::ReceiptEvent,
|
receipt::ReceiptEvent,
|
||||||
room::{
|
room::{
|
||||||
@ -29,6 +30,8 @@ pub enum Event {
|
|||||||
Direct(DirectEvent),
|
Direct(DirectEvent),
|
||||||
/// m.fully_read
|
/// m.fully_read
|
||||||
FullyRead(FullyReadEvent),
|
FullyRead(FullyReadEvent),
|
||||||
|
/// m.ignored_user_list
|
||||||
|
IgnoredUserList(IgnoredUserListEvent),
|
||||||
/// m.presence
|
/// m.presence
|
||||||
Presence(PresenceEvent),
|
Presence(PresenceEvent),
|
||||||
/// m.receipt
|
/// m.receipt
|
||||||
@ -71,6 +74,7 @@ impl Serialize for Event {
|
|||||||
match *self {
|
match *self {
|
||||||
Event::Direct(ref event) => event.serialize(serializer),
|
Event::Direct(ref event) => event.serialize(serializer),
|
||||||
Event::FullyRead(ref event) => event.serialize(serializer),
|
Event::FullyRead(ref event) => event.serialize(serializer),
|
||||||
|
Event::IgnoredUserList(ref event) => event.serialize(serializer),
|
||||||
Event::Presence(ref event) => event.serialize(serializer),
|
Event::Presence(ref event) => event.serialize(serializer),
|
||||||
Event::Receipt(ref event) => event.serialize(serializer),
|
Event::Receipt(ref event) => event.serialize(serializer),
|
||||||
Event::Tag(ref event) => event.serialize(serializer),
|
Event::Tag(ref event) => event.serialize(serializer),
|
||||||
@ -114,6 +118,14 @@ impl<'de> Deserialize<'de> for Event {
|
|||||||
|
|
||||||
Ok(Event::FullyRead(event))
|
Ok(Event::FullyRead(event))
|
||||||
}
|
}
|
||||||
|
EventType::IgnoredUserList => {
|
||||||
|
let event = match from_value::<IgnoredUserListEvent>(value) {
|
||||||
|
Ok(event) => event,
|
||||||
|
Err(error) => return Err(D::Error::custom(error.to_string())),
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(Event::IgnoredUserList(event))
|
||||||
|
}
|
||||||
EventType::Presence => {
|
EventType::Presence => {
|
||||||
let event = match from_value::<PresenceEvent>(value) {
|
let event = match from_value::<PresenceEvent>(value) {
|
||||||
Ok(event) => event,
|
Ok(event) => event,
|
||||||
@ -282,6 +294,7 @@ impl<'de> Deserialize<'de> for RoomEvent {
|
|||||||
}
|
}
|
||||||
EventType::Direct
|
EventType::Direct
|
||||||
| EventType::FullyRead
|
| EventType::FullyRead
|
||||||
|
| EventType::IgnoredUserList
|
||||||
| EventType::Presence
|
| EventType::Presence
|
||||||
| EventType::Receipt
|
| EventType::Receipt
|
||||||
| EventType::RoomAliases
|
| EventType::RoomAliases
|
||||||
@ -316,6 +329,7 @@ macro_rules! impl_from_t_for_event {
|
|||||||
|
|
||||||
impl_from_t_for_event!(DirectEvent, Direct);
|
impl_from_t_for_event!(DirectEvent, Direct);
|
||||||
impl_from_t_for_event!(FullyReadEvent, FullyRead);
|
impl_from_t_for_event!(FullyReadEvent, FullyRead);
|
||||||
|
impl_from_t_for_event!(IgnoredUserListEvent, IgnoredUserList);
|
||||||
impl_from_t_for_event!(PresenceEvent, Presence);
|
impl_from_t_for_event!(PresenceEvent, Presence);
|
||||||
impl_from_t_for_event!(ReceiptEvent, Receipt);
|
impl_from_t_for_event!(ReceiptEvent, Receipt);
|
||||||
impl_from_t_for_event!(TagEvent, Tag);
|
impl_from_t_for_event!(TagEvent, Tag);
|
||||||
|
69
src/ignored_user_list.rs
Normal file
69
src/ignored_user_list.rs
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
//! Types for the *m.ignored_user_list* event.
|
||||||
|
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use ruma_identifiers::UserId;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
event! {
|
||||||
|
/// A list of users to ignore.
|
||||||
|
pub struct IgnoredUserListEvent(IgnoredUserListEventContent) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The payload of an `IgnoredUserListEvent`.
|
||||||
|
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
|
||||||
|
pub struct IgnoredUserListEventContent {
|
||||||
|
/// A list of users to ignore.
|
||||||
|
///
|
||||||
|
/// The values in the hash map are not meaningful. They are used to generate an empty JSON
|
||||||
|
/// object to support the odd structure used by the Matrix specification:
|
||||||
|
///
|
||||||
|
/// ```text
|
||||||
|
/// "@someone:example.org": {}
|
||||||
|
/// ```
|
||||||
|
pub ignored_users: HashMap<UserId, HashMap<(), ()>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use std::{collections::HashMap, convert::TryFrom};
|
||||||
|
|
||||||
|
use ruma_identifiers::UserId;
|
||||||
|
|
||||||
|
use super::IgnoredUserListEventContent;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn serialize_to_empty_json_object() {
|
||||||
|
let mut ignored_user_list_event_content = IgnoredUserListEventContent {
|
||||||
|
ignored_users: HashMap::new(),
|
||||||
|
};
|
||||||
|
|
||||||
|
let user_id = UserId::try_from("@carl:example.com").unwrap();
|
||||||
|
|
||||||
|
ignored_user_list_event_content
|
||||||
|
.ignored_users
|
||||||
|
.insert(user_id, HashMap::new());
|
||||||
|
|
||||||
|
let json = serde_json::to_string(&ignored_user_list_event_content).unwrap();
|
||||||
|
|
||||||
|
assert_eq!(json, r#"{"ignored_users":{"@carl:example.com":{}}}"#);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn deserialize_from_empty_json_object() {
|
||||||
|
let json = r#"{"ignored_users":{"@carl:example.com":{}}}"#;
|
||||||
|
|
||||||
|
let ignored_user_list_event_content: IgnoredUserListEventContent =
|
||||||
|
serde_json::from_str(&json).unwrap();
|
||||||
|
|
||||||
|
let mut expected = IgnoredUserListEventContent {
|
||||||
|
ignored_users: HashMap::new(),
|
||||||
|
};
|
||||||
|
|
||||||
|
let user_id = UserId::try_from("@carl:example.com").unwrap();
|
||||||
|
|
||||||
|
expected.ignored_users.insert(user_id, HashMap::new());
|
||||||
|
|
||||||
|
assert_eq!(ignored_user_list_event_content, expected);
|
||||||
|
}
|
||||||
|
}
|
@ -119,6 +119,7 @@ pub mod collections {
|
|||||||
}
|
}
|
||||||
pub mod direct;
|
pub mod direct;
|
||||||
pub mod fully_read;
|
pub mod fully_read;
|
||||||
|
pub mod ignored_user_list;
|
||||||
pub mod presence;
|
pub mod presence;
|
||||||
pub mod receipt;
|
pub mod receipt;
|
||||||
pub mod room;
|
pub mod room;
|
||||||
@ -145,6 +146,8 @@ pub enum EventType {
|
|||||||
Direct,
|
Direct,
|
||||||
/// m.fully_read
|
/// m.fully_read
|
||||||
FullyRead,
|
FullyRead,
|
||||||
|
/// m.ignored_user_list
|
||||||
|
IgnoredUserList,
|
||||||
/// m.presence
|
/// m.presence
|
||||||
Presence,
|
Presence,
|
||||||
/// m.receipt
|
/// m.receipt
|
||||||
@ -259,6 +262,7 @@ impl Display for EventType {
|
|||||||
EventType::CallInvite => "m.call.invite",
|
EventType::CallInvite => "m.call.invite",
|
||||||
EventType::Direct => "m.direct",
|
EventType::Direct => "m.direct",
|
||||||
EventType::FullyRead => "m.fully_read",
|
EventType::FullyRead => "m.fully_read",
|
||||||
|
EventType::IgnoredUserList => "m.ignored_user_list",
|
||||||
EventType::Presence => "m.presence",
|
EventType::Presence => "m.presence",
|
||||||
EventType::Receipt => "m.receipt",
|
EventType::Receipt => "m.receipt",
|
||||||
EventType::RoomAliases => "m.room.aliases",
|
EventType::RoomAliases => "m.room.aliases",
|
||||||
@ -295,6 +299,7 @@ impl<'a> From<&'a str> for EventType {
|
|||||||
"m.call.invite" => EventType::CallInvite,
|
"m.call.invite" => EventType::CallInvite,
|
||||||
"m.direct" => EventType::Direct,
|
"m.direct" => EventType::Direct,
|
||||||
"m.fully_read" => EventType::FullyRead,
|
"m.fully_read" => EventType::FullyRead,
|
||||||
|
"m.ignored_user_list" => EventType::IgnoredUserList,
|
||||||
"m.presence" => EventType::Presence,
|
"m.presence" => EventType::Presence,
|
||||||
"m.receipt" => EventType::Receipt,
|
"m.receipt" => EventType::Receipt,
|
||||||
"m.room.aliases" => EventType::RoomAliases,
|
"m.room.aliases" => EventType::RoomAliases,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user