events: Add filename and formatted fields to media messages
For MSC2530 media captions
This commit is contained in:
parent
1a1c61ee1e
commit
631911a1de
@ -22,6 +22,7 @@ Improvements:
|
|||||||
- Add unstable support for manually marking rooms as unread through [MSC2867](https://github.com/matrix-org/matrix-spec-proposals/pull/2867)
|
- Add unstable support for manually marking rooms as unread through [MSC2867](https://github.com/matrix-org/matrix-spec-proposals/pull/2867)
|
||||||
and the room account data `m.marked_unread` event (unstable type `com.famedly.marked_unread`)
|
and the room account data `m.marked_unread` event (unstable type `com.famedly.marked_unread`)
|
||||||
- Implement `From<JoinRule>` for `SpaceRoomJoinRule`
|
- Implement `From<JoinRule>` for `SpaceRoomJoinRule`
|
||||||
|
- Add `filename` and `formatted` fields to media event contents to support media captions as per [MSC2530](https://github.com/matrix-org/matrix-spec-proposals/pull/2530)
|
||||||
|
|
||||||
# 0.27.11
|
# 0.27.11
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@ use js_int::UInt;
|
|||||||
use ruma_common::OwnedMxcUri;
|
use ruma_common::OwnedMxcUri;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
use super::FormattedBody;
|
||||||
use crate::room::{EncryptedFile, MediaSource};
|
use crate::room::{EncryptedFile, MediaSource};
|
||||||
|
|
||||||
/// The payload for an audio message.
|
/// The payload for an audio message.
|
||||||
@ -12,8 +13,19 @@ use crate::room::{EncryptedFile, MediaSource};
|
|||||||
#[serde(tag = "msgtype", rename = "m.audio")]
|
#[serde(tag = "msgtype", rename = "m.audio")]
|
||||||
pub struct AudioMessageEventContent {
|
pub struct AudioMessageEventContent {
|
||||||
/// The textual representation of this message.
|
/// The textual representation of this message.
|
||||||
|
///
|
||||||
|
/// If the `filename` field is not set or has the same value, this is the filename of the
|
||||||
|
/// uploaded file. Otherwise, this should be interpreted as a user-written media caption.
|
||||||
pub body: String,
|
pub body: String,
|
||||||
|
|
||||||
|
/// Formatted form of the message `body`, if `body` is a caption.
|
||||||
|
#[serde(flatten)]
|
||||||
|
pub formatted: Option<FormattedBody>,
|
||||||
|
|
||||||
|
/// The original filename of the uploaded file.
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub filename: Option<String>,
|
||||||
|
|
||||||
/// The source of the audio clip.
|
/// The source of the audio clip.
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
pub source: MediaSource,
|
pub source: MediaSource,
|
||||||
@ -44,6 +56,8 @@ impl AudioMessageEventContent {
|
|||||||
pub fn new(body: String, source: MediaSource) -> Self {
|
pub fn new(body: String, source: MediaSource) -> Self {
|
||||||
Self {
|
Self {
|
||||||
body,
|
body,
|
||||||
|
formatted: None,
|
||||||
|
filename: None,
|
||||||
source,
|
source,
|
||||||
info: None,
|
info: None,
|
||||||
#[cfg(feature = "unstable-msc3245-v1-compat")]
|
#[cfg(feature = "unstable-msc3245-v1-compat")]
|
||||||
@ -64,6 +78,24 @@ impl AudioMessageEventContent {
|
|||||||
Self::new(body, MediaSource::Encrypted(Box::new(file)))
|
Self::new(body, MediaSource::Encrypted(Box::new(file)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Creates a new `AudioMessageEventContent` from `self` with the `filename` field set to the
|
||||||
|
/// given value.
|
||||||
|
///
|
||||||
|
/// Since the field is public, you can also assign to it directly. This method merely acts
|
||||||
|
/// as a shorthand for that, because it is very common to set this field.
|
||||||
|
pub fn filename(self, filename: impl Into<Option<String>>) -> Self {
|
||||||
|
Self { filename: filename.into(), ..self }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Creates a new `AudioMessageEventContent` from `self` with the `formatted` field set to the
|
||||||
|
/// given value.
|
||||||
|
///
|
||||||
|
/// Since the field is public, you can also assign to it directly. This method merely acts
|
||||||
|
/// as a shorthand for that, because it is very common to set this field.
|
||||||
|
pub fn formatted(self, formatted: impl Into<Option<FormattedBody>>) -> Self {
|
||||||
|
Self { formatted: formatted.into(), ..self }
|
||||||
|
}
|
||||||
|
|
||||||
/// Creates a new `AudioMessageEventContent` from `self` with the `info` field set to the given
|
/// Creates a new `AudioMessageEventContent` from `self` with the `info` field set to the given
|
||||||
/// value.
|
/// value.
|
||||||
///
|
///
|
||||||
|
@ -2,6 +2,7 @@ use js_int::UInt;
|
|||||||
use ruma_common::OwnedMxcUri;
|
use ruma_common::OwnedMxcUri;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
use super::FormattedBody;
|
||||||
use crate::room::{EncryptedFile, MediaSource, ThumbnailInfo};
|
use crate::room::{EncryptedFile, MediaSource, ThumbnailInfo};
|
||||||
|
|
||||||
/// The payload for a file message.
|
/// The payload for a file message.
|
||||||
@ -11,9 +12,14 @@ use crate::room::{EncryptedFile, MediaSource, ThumbnailInfo};
|
|||||||
pub struct FileMessageEventContent {
|
pub struct FileMessageEventContent {
|
||||||
/// A human-readable description of the file.
|
/// A human-readable description of the file.
|
||||||
///
|
///
|
||||||
/// This is recommended to be the filename of the original upload.
|
/// If the `filename` field is not set or has the same value, this is the filename of the
|
||||||
|
/// uploaded file. Otherwise, this should be interpreted as a user-written media caption.
|
||||||
pub body: String,
|
pub body: String,
|
||||||
|
|
||||||
|
/// Formatted form of the message `body`, if `body` is a caption.
|
||||||
|
#[serde(flatten)]
|
||||||
|
pub formatted: Option<FormattedBody>,
|
||||||
|
|
||||||
/// The original filename of the uploaded file.
|
/// The original filename of the uploaded file.
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub filename: Option<String>,
|
pub filename: Option<String>,
|
||||||
@ -30,7 +36,7 @@ pub struct FileMessageEventContent {
|
|||||||
impl FileMessageEventContent {
|
impl FileMessageEventContent {
|
||||||
/// Creates a new `FileMessageEventContent` with the given body and source.
|
/// Creates a new `FileMessageEventContent` with the given body and source.
|
||||||
pub fn new(body: String, source: MediaSource) -> Self {
|
pub fn new(body: String, source: MediaSource) -> Self {
|
||||||
Self { body, filename: None, source, info: None }
|
Self { body, formatted: None, filename: None, source, info: None }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Creates a new non-encrypted `FileMessageEventContent` with the given body and url.
|
/// Creates a new non-encrypted `FileMessageEventContent` with the given body and url.
|
||||||
@ -53,6 +59,15 @@ impl FileMessageEventContent {
|
|||||||
Self { filename: filename.into(), ..self }
|
Self { filename: filename.into(), ..self }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Creates a new `FileMessageEventContent` from `self` with the `formatted` field set to the
|
||||||
|
/// given value.
|
||||||
|
///
|
||||||
|
/// Since the field is public, you can also assign to it directly. This method merely acts
|
||||||
|
/// as a shorthand for that, because it is very common to set this field.
|
||||||
|
pub fn formatted(self, formatted: impl Into<Option<FormattedBody>>) -> Self {
|
||||||
|
Self { formatted: formatted.into(), ..self }
|
||||||
|
}
|
||||||
|
|
||||||
/// Creates a new `FileMessageEventContent` from `self` with the `info` field set to the given
|
/// Creates a new `FileMessageEventContent` from `self` with the `info` field set to the given
|
||||||
/// value.
|
/// value.
|
||||||
///
|
///
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
use ruma_common::OwnedMxcUri;
|
use ruma_common::OwnedMxcUri;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
use super::FormattedBody;
|
||||||
use crate::room::{EncryptedFile, ImageInfo, MediaSource};
|
use crate::room::{EncryptedFile, ImageInfo, MediaSource};
|
||||||
|
|
||||||
/// The payload for an image message.
|
/// The payload for an image message.
|
||||||
@ -10,10 +11,18 @@ use crate::room::{EncryptedFile, ImageInfo, MediaSource};
|
|||||||
pub struct ImageMessageEventContent {
|
pub struct ImageMessageEventContent {
|
||||||
/// A textual representation of the image.
|
/// A textual representation of the image.
|
||||||
///
|
///
|
||||||
/// Could be the alt text of the image, the filename of the image, or some kind of content
|
/// If the `filename` field is not set or has the same value, this is the filename of the
|
||||||
/// description for accessibility e.g. "image attachment".
|
/// uploaded file. Otherwise, this should be interpreted as a user-written media caption.
|
||||||
pub body: String,
|
pub body: String,
|
||||||
|
|
||||||
|
/// Formatted form of the message `body`, if `body` is a caption.
|
||||||
|
#[serde(flatten)]
|
||||||
|
pub formatted: Option<FormattedBody>,
|
||||||
|
|
||||||
|
/// The original filename of the uploaded file.
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub filename: Option<String>,
|
||||||
|
|
||||||
/// The source of the image.
|
/// The source of the image.
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
pub source: MediaSource,
|
pub source: MediaSource,
|
||||||
@ -26,7 +35,7 @@ pub struct ImageMessageEventContent {
|
|||||||
impl ImageMessageEventContent {
|
impl ImageMessageEventContent {
|
||||||
/// Creates a new `ImageMessageEventContent` with the given body and source.
|
/// Creates a new `ImageMessageEventContent` with the given body and source.
|
||||||
pub fn new(body: String, source: MediaSource) -> Self {
|
pub fn new(body: String, source: MediaSource) -> Self {
|
||||||
Self { body, source, info: None }
|
Self { body, formatted: None, filename: None, source, info: None }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Creates a new non-encrypted `ImageMessageEventContent` with the given body and url.
|
/// Creates a new non-encrypted `ImageMessageEventContent` with the given body and url.
|
||||||
@ -40,6 +49,24 @@ impl ImageMessageEventContent {
|
|||||||
Self::new(body, MediaSource::Encrypted(Box::new(file)))
|
Self::new(body, MediaSource::Encrypted(Box::new(file)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Creates a new `ImageMessageEventContent` from `self` with the `filename` field set to the
|
||||||
|
/// given value.
|
||||||
|
///
|
||||||
|
/// Since the field is public, you can also assign to it directly. This method merely acts
|
||||||
|
/// as a shorthand for that, because it is very common to set this field.
|
||||||
|
pub fn filename(self, filename: impl Into<Option<String>>) -> Self {
|
||||||
|
Self { filename: filename.into(), ..self }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Creates a new `ImageMessageEventContent` from `self` with the `formatted` field set to the
|
||||||
|
/// given value.
|
||||||
|
///
|
||||||
|
/// Since the field is public, you can also assign to it directly. This method merely acts
|
||||||
|
/// as a shorthand for that, because it is very common to set this field.
|
||||||
|
pub fn formatted(self, formatted: impl Into<Option<FormattedBody>>) -> Self {
|
||||||
|
Self { formatted: formatted.into(), ..self }
|
||||||
|
}
|
||||||
|
|
||||||
/// Creates a new `ImageMessageEventContent` from `self` with the `info` field set to the given
|
/// Creates a new `ImageMessageEventContent` from `self` with the `info` field set to the given
|
||||||
/// value.
|
/// value.
|
||||||
///
|
///
|
||||||
|
@ -4,6 +4,7 @@ use js_int::UInt;
|
|||||||
use ruma_common::OwnedMxcUri;
|
use ruma_common::OwnedMxcUri;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
use super::FormattedBody;
|
||||||
use crate::room::{EncryptedFile, MediaSource, ThumbnailInfo};
|
use crate::room::{EncryptedFile, MediaSource, ThumbnailInfo};
|
||||||
|
|
||||||
/// The payload for a video message.
|
/// The payload for a video message.
|
||||||
@ -11,10 +12,20 @@ use crate::room::{EncryptedFile, MediaSource, ThumbnailInfo};
|
|||||||
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
|
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
|
||||||
#[serde(tag = "msgtype", rename = "m.video")]
|
#[serde(tag = "msgtype", rename = "m.video")]
|
||||||
pub struct VideoMessageEventContent {
|
pub struct VideoMessageEventContent {
|
||||||
/// A description of the video, e.g. "Gangnam Style", or some kind of content description for
|
/// A description of the video.
|
||||||
/// accessibility, e.g. "video attachment".
|
///
|
||||||
|
/// If the `filename` field is not set or has the same value, this is the filename of the
|
||||||
|
/// uploaded file. Otherwise, this should be interpreted as a user-written media caption.
|
||||||
pub body: String,
|
pub body: String,
|
||||||
|
|
||||||
|
/// Formatted form of the message `body`, if `body` is a caption.
|
||||||
|
#[serde(flatten)]
|
||||||
|
pub formatted: Option<FormattedBody>,
|
||||||
|
|
||||||
|
/// The original filename of the uploaded file.
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub filename: Option<String>,
|
||||||
|
|
||||||
/// The source of the video clip.
|
/// The source of the video clip.
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
pub source: MediaSource,
|
pub source: MediaSource,
|
||||||
@ -27,7 +38,7 @@ pub struct VideoMessageEventContent {
|
|||||||
impl VideoMessageEventContent {
|
impl VideoMessageEventContent {
|
||||||
/// Creates a new `VideoMessageEventContent` with the given body and source.
|
/// Creates a new `VideoMessageEventContent` with the given body and source.
|
||||||
pub fn new(body: String, source: MediaSource) -> Self {
|
pub fn new(body: String, source: MediaSource) -> Self {
|
||||||
Self { body, source, info: None }
|
Self { body, formatted: None, filename: None, source, info: None }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Creates a new non-encrypted `VideoMessageEventContent` with the given body and url.
|
/// Creates a new non-encrypted `VideoMessageEventContent` with the given body and url.
|
||||||
@ -41,6 +52,24 @@ impl VideoMessageEventContent {
|
|||||||
Self::new(body, MediaSource::Encrypted(Box::new(file)))
|
Self::new(body, MediaSource::Encrypted(Box::new(file)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Creates a new `VideoMessageEventContent` from `self` with the `filename` field set to the
|
||||||
|
/// given value.
|
||||||
|
///
|
||||||
|
/// Since the field is public, you can also assign to it directly. This method merely acts
|
||||||
|
/// as a shorthand for that, because it is very common to set this field.
|
||||||
|
pub fn filename(self, filename: impl Into<Option<String>>) -> Self {
|
||||||
|
Self { filename: filename.into(), ..self }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Creates a new `VideoMessageEventContent` from `self` with the `formatted` field set to the
|
||||||
|
/// given value.
|
||||||
|
///
|
||||||
|
/// Since the field is public, you can also assign to it directly. This method merely acts
|
||||||
|
/// as a shorthand for that, because it is very common to set this field.
|
||||||
|
pub fn formatted(self, formatted: impl Into<Option<FormattedBody>>) -> Self {
|
||||||
|
Self { formatted: formatted.into(), ..self }
|
||||||
|
}
|
||||||
|
|
||||||
/// Creates a new `VideoMessageEventContent` from `self` with the `info` field set to the given
|
/// Creates a new `VideoMessageEventContent` from `self` with the `info` field set to the given
|
||||||
/// value.
|
/// value.
|
||||||
///
|
///
|
||||||
|
Loading…
x
Reference in New Issue
Block a user