events: Add m.relates_to to poll start events
This commit is contained in:
parent
d53362c689
commit
9bf3e03dd3
@ -10,7 +10,11 @@ mod poll_answers_serde;
|
|||||||
|
|
||||||
use poll_answers_serde::PollAnswersDeHelper;
|
use poll_answers_serde::PollAnswersDeHelper;
|
||||||
|
|
||||||
use crate::{events::message::TextContentBlock, serde::StringEnum, PrivOwnedStr};
|
use crate::{
|
||||||
|
events::{message::TextContentBlock, room::message::Relation},
|
||||||
|
serde::StringEnum,
|
||||||
|
PrivOwnedStr,
|
||||||
|
};
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
compile_poll_results,
|
compile_poll_results,
|
||||||
@ -30,7 +34,7 @@ use super::{
|
|||||||
/// [`UnstablePollStartEventContent`]: super::unstable_start::UnstablePollStartEventContent
|
/// [`UnstablePollStartEventContent`]: super::unstable_start::UnstablePollStartEventContent
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, EventContent)]
|
#[derive(Clone, Debug, Serialize, Deserialize, EventContent)]
|
||||||
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
|
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
|
||||||
#[ruma_event(type = "m.poll.start", kind = MessageLike)]
|
#[ruma_event(type = "m.poll.start", kind = MessageLike, without_relation)]
|
||||||
pub struct PollStartEventContent {
|
pub struct PollStartEventContent {
|
||||||
/// The poll content of the message.
|
/// The poll content of the message.
|
||||||
#[serde(rename = "m.poll")]
|
#[serde(rename = "m.poll")]
|
||||||
@ -40,6 +44,14 @@ pub struct PollStartEventContent {
|
|||||||
#[serde(rename = "m.text")]
|
#[serde(rename = "m.text")]
|
||||||
pub text: TextContentBlock,
|
pub text: TextContentBlock,
|
||||||
|
|
||||||
|
/// Information about related messages.
|
||||||
|
#[serde(
|
||||||
|
flatten,
|
||||||
|
skip_serializing_if = "Option::is_none",
|
||||||
|
deserialize_with = "crate::events::room::message::relation_serde::deserialize_relation"
|
||||||
|
)]
|
||||||
|
pub relates_to: Option<Relation<PollStartEventContentWithoutRelation>>,
|
||||||
|
|
||||||
/// Whether this message is automated.
|
/// Whether this message is automated.
|
||||||
#[cfg(feature = "unstable-msc3955")]
|
#[cfg(feature = "unstable-msc3955")]
|
||||||
#[serde(
|
#[serde(
|
||||||
@ -57,6 +69,7 @@ impl PollStartEventContent {
|
|||||||
Self {
|
Self {
|
||||||
poll,
|
poll,
|
||||||
text,
|
text,
|
||||||
|
relates_to: None,
|
||||||
#[cfg(feature = "unstable-msc3955")]
|
#[cfg(feature = "unstable-msc3955")]
|
||||||
automated: false,
|
automated: false,
|
||||||
}
|
}
|
||||||
@ -65,12 +78,7 @@ impl PollStartEventContent {
|
|||||||
/// Creates a new `PollStartEventContent` with the given plain text fallback
|
/// Creates a new `PollStartEventContent` with the given plain text fallback
|
||||||
/// representation and poll content.
|
/// representation and poll content.
|
||||||
pub fn with_plain_text(plain_text: impl Into<String>, poll: PollContentBlock) -> Self {
|
pub fn with_plain_text(plain_text: impl Into<String>, poll: PollContentBlock) -> Self {
|
||||||
Self {
|
Self::new(TextContentBlock::plain(plain_text), poll)
|
||||||
poll,
|
|
||||||
text: TextContentBlock::plain(plain_text),
|
|
||||||
#[cfg(feature = "unstable-msc3955")]
|
|
||||||
automated: false,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,6 +9,8 @@ use serde::{Deserialize, Serialize};
|
|||||||
mod unstable_poll_answers_serde;
|
mod unstable_poll_answers_serde;
|
||||||
mod unstable_poll_kind_serde;
|
mod unstable_poll_kind_serde;
|
||||||
|
|
||||||
|
use crate::events::room::message::Relation;
|
||||||
|
|
||||||
use self::unstable_poll_answers_serde::UnstablePollAnswersDeHelper;
|
use self::unstable_poll_answers_serde::UnstablePollAnswersDeHelper;
|
||||||
use super::{
|
use super::{
|
||||||
compile_unstable_poll_results, generate_poll_end_fallback_text,
|
compile_unstable_poll_results, generate_poll_end_fallback_text,
|
||||||
@ -29,7 +31,7 @@ use super::{
|
|||||||
/// [`PollStartEventContent`]: super::start::PollStartEventContent
|
/// [`PollStartEventContent`]: super::start::PollStartEventContent
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, EventContent)]
|
#[derive(Clone, Debug, Serialize, Deserialize, EventContent)]
|
||||||
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
|
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
|
||||||
#[ruma_event(type = "org.matrix.msc3381.poll.start", kind = MessageLike)]
|
#[ruma_event(type = "org.matrix.msc3381.poll.start", kind = MessageLike, without_relation)]
|
||||||
pub struct UnstablePollStartEventContent {
|
pub struct UnstablePollStartEventContent {
|
||||||
/// The poll content of the message.
|
/// The poll content of the message.
|
||||||
#[serde(rename = "org.matrix.msc3381.poll.start")]
|
#[serde(rename = "org.matrix.msc3381.poll.start")]
|
||||||
@ -38,18 +40,26 @@ pub struct UnstablePollStartEventContent {
|
|||||||
/// Text representation of the message, for clients that don't support polls.
|
/// Text representation of the message, for clients that don't support polls.
|
||||||
#[serde(rename = "org.matrix.msc1767.text")]
|
#[serde(rename = "org.matrix.msc1767.text")]
|
||||||
pub text: Option<String>,
|
pub text: Option<String>,
|
||||||
|
|
||||||
|
/// Information about related messages.
|
||||||
|
#[serde(
|
||||||
|
flatten,
|
||||||
|
skip_serializing_if = "Option::is_none",
|
||||||
|
deserialize_with = "crate::events::room::message::relation_serde::deserialize_relation"
|
||||||
|
)]
|
||||||
|
pub relates_to: Option<Relation<UnstablePollStartEventContentWithoutRelation>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl UnstablePollStartEventContent {
|
impl UnstablePollStartEventContent {
|
||||||
/// Creates a new `PollStartEventContent` with the given poll content.
|
/// Creates a new `PollStartEventContent` with the given poll content.
|
||||||
pub fn new(poll_start: UnstablePollStartContentBlock) -> Self {
|
pub fn new(poll_start: UnstablePollStartContentBlock) -> Self {
|
||||||
Self { poll_start, text: None }
|
Self { poll_start, text: None, relates_to: None }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Creates a new `PollStartEventContent` with the given plain text fallback
|
/// Creates a new `PollStartEventContent` with the given plain text fallback
|
||||||
/// representation and poll content.
|
/// representation and poll content.
|
||||||
pub fn plain_text(text: impl Into<String>, poll_start: UnstablePollStartContentBlock) -> Self {
|
pub fn plain_text(text: impl Into<String>, poll_start: UnstablePollStartContentBlock) -> Self {
|
||||||
Self { poll_start, text: Some(text.into()) }
|
Self { poll_start, text: Some(text.into()), relates_to: None }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,6 +25,7 @@ use ruma_common::{
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
relation::Reference,
|
relation::Reference,
|
||||||
|
room::message::Relation,
|
||||||
AnyMessageLikeEvent, MessageLikeEvent,
|
AnyMessageLikeEvent, MessageLikeEvent,
|
||||||
},
|
},
|
||||||
owned_event_id, MilliSecondsSinceUnixEpoch,
|
owned_event_id, MilliSecondsSinceUnixEpoch,
|
||||||
@ -176,6 +177,33 @@ fn start_event_deserialization() {
|
|||||||
},
|
},
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"m.new_content": {
|
||||||
|
"m.text": [
|
||||||
|
{ "body": "How's the weather?\n1. Not bad…\n2. Fine.\n3. Amazing!" }
|
||||||
|
],
|
||||||
|
"m.poll": {
|
||||||
|
"question": { "m.text": [{ "body": "How's the weather?" }] },
|
||||||
|
"max_selections": 2,
|
||||||
|
"answers": [
|
||||||
|
{
|
||||||
|
"m.id": "not-bad",
|
||||||
|
"m.text": [{ "body": "Not bad…" }],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"m.id": "fine",
|
||||||
|
"m.text": [{ "body": "Fine." }],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"m.id": "amazing",
|
||||||
|
"m.text": [{ "body": "Amazing!" }],
|
||||||
|
},
|
||||||
|
]
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"m.relates_to": {
|
||||||
|
"rel_type": "m.replace",
|
||||||
|
"event_id": "$previous_event_id",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
"event_id": "$event:notareal.hs",
|
"event_id": "$event:notareal.hs",
|
||||||
"origin_server_ts": 134_829_848,
|
"origin_server_ts": 134_829_848,
|
||||||
@ -205,6 +233,7 @@ fn start_event_deserialization() {
|
|||||||
assert_eq!(answers[1].text[0].body, "Fine.");
|
assert_eq!(answers[1].text[0].body, "Fine.");
|
||||||
assert_eq!(answers[2].id, "amazing");
|
assert_eq!(answers[2].id, "amazing");
|
||||||
assert_eq!(answers[2].text[0].body, "Amazing!");
|
assert_eq!(answers[2].text[0].body, "Amazing!");
|
||||||
|
assert_matches!(message_event.content.relates_to, Some(Relation::Replacement(_)));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -413,6 +442,31 @@ fn unstable_start_event_deserialization() {
|
|||||||
},
|
},
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"m.new_content": {
|
||||||
|
"org.matrix.msc1767.text": "How's the weather?\n1. Not bad…\n2. Fine.\n3. Amazing!",
|
||||||
|
"org.matrix.msc3381.poll.start": {
|
||||||
|
"question": { "org.matrix.msc1767.text": "How's the weather?" },
|
||||||
|
"max_selections": 2,
|
||||||
|
"answers": [
|
||||||
|
{
|
||||||
|
"id": "not-bad",
|
||||||
|
"org.matrix.msc1767.text": "Not bad…",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "fine",
|
||||||
|
"org.matrix.msc1767.text": "Fine.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "amazing",
|
||||||
|
"org.matrix.msc1767.text": "Amazing!",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"m.relates_to": {
|
||||||
|
"rel_type": "m.replace",
|
||||||
|
"event_id": "$previous_event_id",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
"event_id": "$event:notareal.hs",
|
"event_id": "$event:notareal.hs",
|
||||||
"origin_server_ts": 134_829_848,
|
"origin_server_ts": 134_829_848,
|
||||||
@ -442,6 +496,7 @@ fn unstable_start_event_deserialization() {
|
|||||||
assert_eq!(answers[1].text, "Fine.");
|
assert_eq!(answers[1].text, "Fine.");
|
||||||
assert_eq!(answers[2].id, "amazing");
|
assert_eq!(answers[2].id, "amazing");
|
||||||
assert_eq!(answers[2].text, "Amazing!");
|
assert_eq!(answers[2].text, "Amazing!");
|
||||||
|
assert_matches!(message_event.content.relates_to, Some(Relation::Replacement(_)));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user