# Changelog

## Unreleased

## 0.33.0

Breaking changes:

- `PossiblyRedactedRoomMemberEventContent` is no longer a type alias for
  `RoomMemberEventContent`. It would previously fail to deserialize if the
  `third_party_invite` field was redacted as the `display_name` field was
  required but it is removed during redaction.
- The `canonical-json` feature was removed. The code that was behind it is no
  longer gated behind a cargo feature.
- The `Reply` struct variant of `message::Relation`, `encrypted::Relation` and
  `RelationWithoutReplacement` is now a tuple variant containing a
  non-exhaustive struct.
- The `(Any)FullStateEventContent` enums were renamed to
  `(Any)StateEventContentChange` to reflect better the purpose of those enums.
  The method to access `AnyStateEventContentChange` on `Any(Sync)StateEvent` is
  called `content_change()`.
- The `content()` method on `Any(Sync)StateEvent` returns an
  `AnyPossiblyRedactedStateEventContent`.
- `RequestAction` doesn't implement `(Partial)Eq` and `(Partial)Ord` anymore and
  its `Request` variant contains a non-exhaustive struct instead of a
  `SecretName`.
- `SecretEncryptedData` is now a non-constructible struct rather than an enum,
  that should always be used as `Raw<SecretEncryptedData>`. Because there is no
  indicator in the data for which algorithm was used for encrypting it, it won't
  be possible to determine reliably which algorithm is matched during
  deserialization when more algorithms are added. This type should be `.cast()`
  from and to other types when the algorithm is known from external data. The
  previous `AesHmacSha2EncryptedData` variant is now a separate struct.
- Some fields of `EncryptedFile` are now grouped by version in a new
  `EncryptedFileInfo` enum. This allows to support custom encryption algorithms
  and to hide fields that should be set to a constant value to have a stricter
  validation during construction and deserialization. Now that there are fewer
  fields, this type can be constructed with `EncryptedFile::new()`.
  - Similarly, the `hashes` field uses a stricter `EncryptedFileHashes` map type
    to ensure that a decoded hash has the appropriate format for the algorithm
    in the key.
  - `EncryptedFileInit`, `JsonWebKey` and `JsonWebKeyInit` were removed.
  - The same changes were applied to the unstable `EncryptedContent`.
- Remove support for the `m.room.aliases` event type. It was removed from the
  specification in Matrix Client-Server API r0.6.1. `m.room.canonical_alias`
  should be used instead.
- The `redacted_because` field of `RedactedUnsigned` is now a `Raw<AnyRedactionEvent>`. It is an
  enum that allows to deserialize other event types than `m.room.redaction`.
  - Add unstable support for `m.room.member` in `redacted_because`, according to MSC4293.

Bug fixes:

- Fix a double `msgtype` in a `m.location` event.
- Do not serialize `name` in `SecretStorageKeyEventContent` when its value is `None`.

Improvements:

- Support `m.key_backup` account data from
  [MSC4287](https://github.com/matrix-org/matrix-spec-proposals/pull/4287)
  via a `KeyBackupEventContent` struct.
- Add `AnyPossiblyRedactedStateEventContent`, an enum containing all the
  possibly redacted state event contents.
  - Add `AnyStrippedStateEvent::content()` to access only the content of the
    event.
- Implement `From<(Redacted)*EventContent> for PossiblyRedacted*EventContent`
  for all state events.
- Implement `RedactContent for PossiblyRedacted*EventContent` for all state
  events.
- Add support for the recently used emoji account data, according to MSC4356 /
  Matrix 1.18.
- Stabilize support for invite blocking, according to MSC4380 / Matrix 1.18.
  Since the format of the account data changed, the previous event content
  struct as well as its variants in `AnyGlobalAccountDataEvent(Content)` are now
  prefixed with `Unstable`. The new `InvitePermissionConfigEventContent` struct
  uses the new format with a `default_action` field instead of `block_all`.
- Add support for to-device event for pushing secrets, according to MSC4385.
- Add support for video/audio call intent according to MSC4075 as part of the
  `RtcNotificationEventContent` new `call_intent` field.
- Add `AnySyncTimelineEvent::is_redacted()` helper.
- Add `PossiblyRedactedSpace(Child/Parent)EventContent::is_valid()` to check the
  validity of the event content according to the Matrix specification.
- Add a convenience `event_type()` helper on event structs which allows to
  access the event type from the inner `*EventContent` type without requiring to
  have a trait in scope. It is added to the following structs:
  - `EphemeralRoomEvent`
  - `GlobalAccountDataEvent`
  - `InitialStateEvent`
  - `OriginalMessageLikeEvent`
  - `OriginalStateEvent`
  - `OriginalSyncMessageLikeEvent`
  - `OriginalSyncStateEvent`
  - `RedactedMessageLikeEvent`
  - `RedactedStateEvent`
  - `RedactedSyncMessageLikeEvent`
  - `RedactedSyncStateEvent`
  - `RoomAccountDataEvent`
  - `StrippedStateEvent`
  - `SyncEphemeralRoomEvent`
  - `ToDeviceEvent`
- Add support for reading `m.call.intent` inside rtc membership events,
  see `MembershipData::call_intent()`.
- Stabilize the `is_animated` flag for image messages and sticker events,
  according to MSC4230 / Matrix 1.18.
- Add support for the `m.room.policy` state event, according to MSC4284 / Matrix
  1.18.
- Add support for MSC4293 `redact_events` field to `RoomMemberEventContent`,
  gated behind `unstable-msc4293`.

## 0.32.1

Improvements:

- Add list of state event types recommended by the spec for servers to transfer
  upon room upgrade.

## 0.32.0

Breaking changes:

- Upgrade `js_option` to v0.2.0
- The following structs are now marked as non-exhaustive:
  `GlobalAccountDataEvent`, `RoomAccountDataEvent`, `(Sync)EphemeralRoomEvent`,
  `Original(Sync)MessageLikeEvent`, `Redacted(Sync)MessageLikeEvent`,
  `Original(Sync)StateEvent`, `Redacted(Sync)StateEvent`, `StrippedStateEvent`,
  `Original(Sync)RoomRedactionEvent`, `Redacted(Sync)RoomRedactionEvent`,
  `InitialStateEvent`, `ToDeviceEvent`, `DecryptedMegolmV1Event`, `OlmV1Keys`.
  Some of them can only be constructed through deserialization.
  - `InitialStateEvent::new()` takes a `state_key`. For events with an empty
    state key, `InitialStateEvent::with_empty_state_key()` can be used instead.
- Remove the deprecated `RoomMessageEventContent::set_mentions()`.
- The `Ord` and `PartialOrd` implementations of the `*EventType` enums are now
  ordered using the string representations of the variants. It used to be
  ordered using the variants declaration order.
- The `criterion` cargo feature used for benchmarks was renamed to `__criterion`,
  to make it obvious that it is private.

Improvements:

- Add unstable support for the `m.invite_permission_config` account data event which blocks
  invites to a user, wholesale: ([MSC4380](https://github.com/matrix-org/matrix-spec-proposals/pull/4380)).
- Add support for the room account data `m.space_order` event which powers top
  level space ordering as per [MSC3230](https://github.com/matrix-org/matrix-spec-proposals/pull/3230).
- Add `m.rtc.notification` event support and deprecate the (non MSC conformant)
  `m.call.notify` event.
- Add `dm.filament.do_not_disturb` account data event as per MSC4359.
- `RoomMemberUnsigned` has a `knock_room_state` field. This is the equivalent to
  `invite_room_state` but after a knock rather than an invite.
- The `unstable-msc4362` feature is renamed (previously `unstable-msc3414`).
- The unstable prefix for `encrypt_state_events` in `RoomEncryptionEventContent`
  is renamed to `io.element.msc4362.` (previously `io.element.msc3414.`).

## 0.31.0

Breaking changes:

- Zeroize the secret key contained in JsonWebKey if the struct gets dropped.
  This change means you can no longer move any fields out of the struct.
- Reply fallbacks are not generated anymore, according to MSC2781 / Matrix 1.13.
  As a result, the following methods of `RoomMessageEventContent(WithoutRelation)`
  were simplified:
  - `make_reply_to` and `make_reply_to_raw` have been merged into
    `make_reply_to`. It takes a `ReplyMetadata`, that can be virtually
    constructed from any event and includes built-in conversions for room
    message events.
  - `make_for_thread` also takes a `ReplyMetadata` instead of a room message
    event.
  - `make_replacement` does not take the replied-to message anymore.
- `RoomThirdPartyInviteEventContent` uses `IdentityServerBase64PublicKey`
  instead of `Base64` for the `public_key` fields, to avoid deserialization
  errors when public keys encoded using URL-safe base64 are encountered.
- The `msgtype` is no longer serialized in `AudioMessageEventContent`, `EmoteMessageEventContent`,
  `FileMessageEventContent`, `ImageMessageEventContent`, `LocationMessageEventContent`,
  `NoticeMessageEventContent`, `ServerNoticeMessageEventContent`, `TextMessageEventContent`,
  `VideoMessageEventContent` and `KeyVerificationRequestEventContent`. Instead the `msgtype`
  is now serialized on the variants of `MessageType`.
- `RedactContent::redact()` and `FullStateEventContent::redact()` take a
  `RedactionRules` instead of `RoomVersionId`. This avoids undefined behavior
  for unknown room versions.
- Add the `sender_device_keys` field to `DecryptedOlmV1Event`, according to
  MSC4147.
- `signed` in `ThirdPartyInvite` is now wrapped inside a `Raw` because it is
  signed so we need the full raw JSON to verify the signature.
- `PresenceEventContent` doesn't implement `EventContent` and `StaticEventContent` anymore.
  They are not useful when `PresenceEvent` can only contain one type.
- The `EventContent` macro now requires the `kind` attribute.
- The `EventContent` trait was removed.
  - The `event_type` method is now available on the per-kind `*EventContent` traits.
  - For an event content type to automatically implement `EventContentFromType` it must now match
    the bound `StaticEventContent + DeserializeOwned`.
- The `BundledThread::latest_event` field is now an `AnySyncMessageLikeEvent` instead of
  `AnyMessageLikeEvent`, to reflect that it may not always include a `room_id` field (if the owning
  event came from sync, for instance), which can usually be obtained from the surrounding context.
- The `(Original)(Sync)RedactEvent` events take a `RedactionRules` instead of `RoomVersionId` for
  their `redacts()` method. This avoids unexpected behavior for unknown room versions.
- `SpaceChildEventContent` now uses `OwnedSpaceChildOrder` for the `order` field. This is a type
  with strong validation according to the rules of the spec. If its deserialization fails, this
  field is set to `None` to ignore it, as recommended in the spec.
- `StaticEventContent` has a new associated type `IsPrefix` to identify event types where only the
  prefix is statically-known.
- `AnyEphemeralRoomEvent` was removed. There is no reason to use it, only
  `AnySyncEphemeralRoomEvent` can be received via `/sync`.
- The `redacted_because` field of `RedactedUnsigned` is wrapped in `Raw`. It avoids to fail
  deserialization of the whole event if only deserialization of this field fails. It is also more
  forward-compatible in case events other than `m.room.redaction` are used here in the future.
- Add `UserPowerLevel` and return it instead of `Int` for `RoomPowerLevels::for_user`.
- Remove `impl From<(Redacted)RoomPowerLevelsEventContent> for RoomPowerLevels` and replace them
  with `new`, as `RoomPowerLevels` now additionally needs `RoomPowerLevelsRules` to specify
  additional rules required to determine the power level of a user.
  - This function also now takes a new `RoomPowerLevelsSource` type, to also allow
    `RoomPowerLevels` to be constructed without `(Redacted)RoomPowerLevelsEventContent`, for when
    rooms have no `m.room.power_levels` state.
- Change `impl From<RoomPowerLevels> for RoomPowerLevelsEventContent` to a `TryFrom` implementation.
  The `users` field is now validated against the creators of the room, depending on the
  `RoomPowerLevelsRules`.
- Remove `Default` implementation for `RoomPowerLevelsEventContent` and make `new` take
  `AuthorizationRules` as a parameter.
- The `event_id` field of `PreviousRoom` is now optional and deprecated. It has been removed in new
  room versions so clients should not rely on it. They can obtain it by requesting the
  `m.room.tombstone` event in the state of the predecessor.
- The `sender_key` field of `RequestedKeyInfo` is now optional. It was deprecated in Matrix 1.3.
- Add `m.rtc.decline` support ([unstable_MSC4310](https://github.com/matrix-org/matrix-spec-proposals/pull/4310)).

Bug fixes:

- When calling `membership_change()` for a `MembershipState` change from `Knock` to `Join`,
  `MembershipChange::Joined` is returned instead of `Error`, since this change is legal in some
  cases.

Improvements:

- Add `RoomLanguageEventContent` and derived state events to specify language of a room.
- Don't print out the secret key contained in JsonWebKey and JsonWebKeyInit in
  their `Debug` implementations.
- Remove the `pdu` module and the corresponding `unstable-pdu` cargo feature. As far as we know, it
  was not used anywhere outside of the tests of ruma-state-res.
- The `EventContent` and `event_enum!` macros support declaring the same type for both global and
  room account data. The syntax to use for the `EventContent` macro is `kind = GlobalAccountData +
  RoomAccountData`.
- The `(Unstable)MediaPreviewConfigEventContent` types are also declared as room account data: they
  implement `RoomAccountDataEventContent` and have variants in the `AnyRoomAccountDataEvent*` and
  `RoomAccountDataEventType` enums. The `MediaPreviewConfigEvent` and
  `UnstableMediaPreviewConfigEvent` type aliases are renamed to `GlobalMediaPreviewConfigEvent` and
  `GlobalUnstableMediaPreviewConfigEvent`, respectively.
- The fields of `MediaPreviewConfigEventContent` are now optional. It allows to differentiate
  whether the room account data is unset or explicitly set to the default value. This allows in
  turn to know whether the room account data should override the global account data or not.
  - `MediaPreviewConfigEventContent::new()` doesn't take any arguments and creates an empty config.
    The fields can be set with a builder pattern, e.g.
    `MediaPreviewConfigEventContent::new().media_previews(Some(MediaPreviews::Off))`.
  - `MediaPreviewConfigEventContent::merge_global_and_room_config()` can be used to get the current
    config for a room.
- `m.space.child` events can be sorted with the algorithm defined in the spec by using the new
  `SpaceChildOrd` trait and `SpaceChildOrdHelper` type, and `HierarchySpaceChildEvent` specifically
  now implements `Ord` using the aforementioned trait.
- Implement types for encrypted state events, according to MSC3414.
- Add `additional_creators` field to `RoomCreateEventContent`, used to optionally specify
  additional creators of a room.
- The state key type `CallMemberStateKey` for `m.call.member` state events changed to allow any postfix
  for state keys. The `device_id()` method is not available anymore. Use the event content instead.
- Add unstable support for events with the same format as `SyncStateEvent` in `StrippedStateEvent`,
  according to MSC4319.

## 0.30.5

Bug fixes:

- If the `sender_key` and `device_id` fields of `MegolmV1AesSha2Content` are missing during
  deserialization, they default to an empty string. They are optional since Matrix 1.3.
- If the `sender_key` field of `RequestedKeyInfo` is missing during deserialization, it defaults to
  an empty string. It is optional since Matrix 1.3.
- Fix the deserialization of `RedactedRoomJoinRulesEventContent`.

## 0.30.4

Bug fixes:

- Implement `StaticEventContent` for a few event types generated manually:
  `RedactedCallMemberEventContent`, `PossiblyRedactedPolicyRuleRoomEventContent`,
  `PossiblyRedactedPolicyRuleServerEventContent`, `PossiblyRedactedPolicyRuleUserEventContent`,
  `RedactedRoomAliasesEventContent`, `RedactedRoomMemberEventContent`.

Improvements:

- Add support for the `m.room_key_bundle` to-device event, which was introduced in [MSC4268](https://github.com/matrix-org/matrix-spec-proposals/pull/4268).
- Add support for the `m.room_key.withheld` to-device event, which was introduced in Matrix 1.1.
- Fix and stabilize support for rich text in room topics, according to Matrix 1.15.
- With the `compat-lax-room-create-deser` cargo feature, the `predecessor` field of
  `RoomCreateEventContent` is ignored during deserialization if it has an invalid format.
- With the `compat-lax-room-topic-deser` cargo feature, the `topic_block` field of
  `RoomTopicEventContent` (named `m.topic` in the JSON source) is ignored during deserialization if
  it has an invalid format.

## 0.30.3

Improvements:

- Add support for ThumbHash as an alternative to BlurHash for MSC2448 in
  `ImageInfo` and `VideoInfo`.
- Add implementation of [MSC 4278](https://github.com/matrix-org/matrix-spec-proposals/pull/4278)
  using `MediaPreviewConfigEventContent` for the stable version and `MediaPreviewConfigEventContent`
  for the unstable one, both are only implemented as `GlobalAccountData` events as of right now.
- Add unstable support for rich text in room topics, according to MSC3765.

## 0.30.2

Bug fixes:

- `RelationType::Replacement` is now properly encoded/decoded as `m.replace` instead of
  `m.replacement`.

Improvements:

- Add `RECOMMENDED_STRIPPED_STATE_EVENT_TYPES` constant for servers to filter/get recommended
  stripped state events.
- Add unstable support for gallery `msgtype` as per MSC4274.
- Invalid Objects inside the `allow` array of `Restricted` are now ignored, meaning that
  `JoinRules` will not fail to deserialize if there are invalid restricted join conditions

## 0.30.1

Bug fixes:

- `make_replacement` now correctly sets the mentions on the plain replacement event, when the
  edited event had no initial mentions.

Improvements:

- Add unstable support for the `is_animated` flag for images, according to MSC4230.
- Add unstable support for MSC2545 for image packs.
- Add `is_redacted()` accessor to `Any(Sync){MessageLike/State}Event` event enums
  to know if an event is redacted without needing to clone its content.

## 0.30.0

Breaking changes:

- Take newly introduced `DirectUserIdentifier(str)` as a key for `DirectEventContent`.
  This change allows to have an email or MSISDN phone number as a key for example,
  which can be used when issuing invites through third-party systems.
  `DirectUserIdentifier` can easily be converted to an `UserId`.

Improvements:

- Add unstable support for MSC4171 for the m.member_hints state event.
- The `ruma_identifiers_storage` compile-time `cfg` setting can also be
  configured by setting the `RUMA_IDENTIFIERS_STORAGE` environment variable at
  compile time. It has the benefit of not requiring to re-compile all the crates
  of the dependency chain when the value is changed.
- The `unstable-exhaustive-types` cargo feature was replaced by the
  `ruma_unstable_exhaustive_types` compile-time `cfg` setting. Like all `cfg`
  settings, it can be enabled at compile-time with the `RUSTFLAGS` environment
  variable, or inside `.cargo/config.toml`. It can also be enabled by setting
  the `RUMA_UNSTABLE_EXHAUSTIVE_TYPES` environment variable.

## 0.29.1

Bug fixes:

- Markdown text constructors now detect even more markdown syntax like removed
  whitespace at the end or beginning of a line to decide if the text should be
  sent as HTML.

Improvements:

- Add unstable support for MSC4059 for bundling link previews in chat text messages

## 0.29.0

Bug fixes:

- Fix missing `relates_to` field on `StickerEventContent`
- Fix deserialization of `AnyGlobalAccountDataEvent` for variants with a type
  fragment.
- Fix serialization of `room::message::Relation` and `room::encrypted::Relation`
  which could cause duplicate `rel_type` keys.
- `Restricted` no longer fails to deserialize when the `allow` field is missing
- Markdown text constructors now also detect markdown syntax like backslash
  escapes and entity references to decide if the text should be sent as HTML.
- Markdown text with only inline syntax generates HTML that is not wrapped
  inside a `<p>` element anymore, as recommended by the spec.

Improvements:

- Add support for encrypted stickers as sent by several bridges under the flag
  `compat-encrypted-stickers`
- Add unstable support for MSC3489 `m.beacon` & `m.beacon_info` events
  (unstable types `org.matrix.msc3489.beacon` & `org.matrix.msc3489.beacon_info`)
- Stabilize support for muting in VoIP calls, according to Matrix 1.11
- All the root `Any*EventContent` types now have a `EventContentFromType` implementations
  automatically derived by the `event_enum!` macro.
- `CallMemberEventContent` now supports two different formats: Session memberships and Legacy
  memberships. The new format (Session) is required to reliably display the call member count
  (reliable call member events). `CallMemberEventContent` is now an enum to model the two different
  formats.
- `CallMemberStateKey` (instead of `OwnedUserId`) is now used as the state key type for
  `CallMemberEventContent`. This guarantees correct formatting of the event key.
- Add helpers for captions on audio, file, image and video messages.
- Add helpers for filenames on audio, file, image and video messages.
- Stabilize support for the `m.marked_unread` room account data according to Matrix 1.12. The
  unstable `com.famedly.marked_unread` room account data is still available behind the
  `unstable-msc2867` cargo feature to be able to migrate data from the unstable to the stable
  prefix.

Breaking changes:

- `StickerEventContent::url` was replaced by `StickerEventContent::source` which is a `StickerMediaSource`
- Use `ServerSignatures` for the `signatures` of `RoomV1Pdu`, `RoomV3Pdu` and `SignedContent`.

## 0.28.1

Improvements:

- Implement `make_for_thread` and `make_replacement` for
  `RoomMessageEventContentWithoutRelation`
- `RoomMessageEventContent::set_mentions` is deprecated and replaced by
  `add_mentions` that should be called before `make_replacement`.

## 0.28.0

Bug fixes:

- The `MembershipState::Invite` to `MembershipState::Knock` membership change
  now returns `MembershipChange::Error`, due to a spec clarification

Breaking changes:

- The properties of `SecretStorageV1AesHmacSha2Properties` are now `Option`al.
- Remove `event_id` methods from relation types
- The required power level is different whether the user wants to redact their
  own event or an event from another user:
  - `RoomPowerLevels::user_can_redact` is split into `user_can_redact_own_event`
    and `user_can_redact_event_of_other`,
  - `PowerLevelAction::Redact` is split into `RedactOwn` and `RedactOther`.
- Use `OwnedRoomId` instead of `String` for the `state_key` field of `HierarchySpaceChildEvent`
- The `sdp_mid` and `sdp_m_line_index` fields of `Candidate` are now optional,
  for better compatibility with the WebRTC specification.

Improvements:

- Don't fail event content parsing on invalid relation
  - We previously already accepted custom or slightly malformed relations
  - Now, even invalid / missing `rel_type` and `event_id` are accepted
- Implement `From<RoomPowerLevels>` for `ruma_common::push::PushConditionPowerLevelsCtx`
- Add methods on `PowerLevels` to check if some actions are permitted based on
  the target user's power level.
- 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`)
- 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) / Matrix 1.10
- Add support for multi-stream VoIP, according to MSC3077 / Matrix 1.10
- Add unstable support for muting in VoIP calls, according to MSC3291

## 0.27.11

- Add unstable support for `m.call.notify` events
  (unstable type `org.matrix.msc4075.call.notify`)

## 0.27.10

Deprecations:

- Deprecate `event_id` methods on `Relation` types
  - They will be removed in the next breaking-change release
  - Please open an issue if you are currently using them

## 0.27.9

Bug fixes:

- Fix the name of the fallback text field for extensible events in
  `RoomMessageEventContentWithoutRelation::make_reply_to_raw()`

## 0.27.8

Improvements:

- Export the `UnstableAmplitude` type from the `room::message` module under the
  `unstable-msc3245-v1-compat` feature; it was previously unnameable

## 0.27.7

Improvements:

- Remove invalid `non_exhaustive` attribute on `call::member::MembershipInit`

## 0.27.6

Improvements:

- Add unstable support for `m.call.member` events
  (unstable type `org.matrix.msc3401.call.member`)

## 0.27.5

Improvements:

- Add the Ruma logo to the documentation as a favicon / sidebar logo

## 0.27.4

Improvements:

- Add `Thread::without_fallback` as a constructor that initializes the minimal
  set of required fields

## 0.27.3

Improvements:

- Improve compatibility of unstable voice messages

## 0.27.2

Improvements:

- Added constructors for `UnstableAudioDetailsContentBlock` and `UnstableVoiceContentBlock`

## 0.27.1

Improvements:

- Calling `make_reply_to` or `make_reply_to_raw` with `AddMentions::Yes` no longer adds people
  mentioned in the original message to mentions (only the sender of the original message)
- Add convenience constructors like `text_plain` to `RoomMessageEventContentWithoutRelation`
  - These are the same that are already available on `RoomMessageEventContent`
- Add methods on `RoomMessageEventWithoutRelation` that were previously only available on
  `RoomMessageEventContent`:
  - `make_reply_to`
  - `make_reply_to_raw`
  - `add_mentions`

## 0.27.0

The crate was split out of `ruma-common` again after `ruma-common 0.11.3`.

Bug fixes:

- Parse `m.tag` `order` as a f64 value or a stringified f64 value, if the `compat-tag-info` feature
  is enabled.

Breaking changes:

- Rename the `key` field in the `SecretStorageDefaultKeyEventContent` to
  `key_id`.
- Make `in_reply_to` field of `Thread` optional
  - It was wrong to be mandatory, [the spec was unclear](https://github.com/matrix-org/matrix-spec/pull/1439)
- Remove `AnswerSessionDescription` and `OfferSessionDescription` types, use `SessionDescription`
  instead.
  - Remove `SessionDescriptionType`, use a `String` instead. A clarification in MSC2746 / Matrix 1.7
    explains that the `type` field should not be validated but passed as-is to the WebRTC API. It
    also avoids an unnecessary conversion between the WebRTC API and the Ruma type.
- The `reason` field in `CallHangupEventContent` is now required and defaults to `Reason::UserHangup`
  (MSC2746 / Matrix 1.7)
- The `Replacement` relation for `RoomMessageEventContent` now takes a
  `RoomMessageEventContentWithoutRelation` instead of a `MessageType`
- Make the `redacts` field of `Original(Sync)RoomRedactionEvent` optional to handle the format
  where the `redacts` key is moved inside the `content`, as introduced in room version 11,
  according to MSC2174 / MSC3820 / Matrix 1.8
  - `RoomRedactionEventContent::new()` was renamed to `new_v1()`, and `with_reason()` is no
    longer a constructor but a builder-type method
- Make the `creator` field of `RoomCreateEventContent` optional and deprecate it, as it was removed
  in room version 11, according to MSC2175 / MSC3820 / Matrix 1.8
  - `RoomCreateEventContent::new()` was renamed to `new_v1()`
  - `RedactedRoomCreateEventContent` is now a typedef over `RoomCreateEventContent`
- `RoomMessageEventContent::make_reply_to()` and `make_for_thread()` have an extra parameter to
  support the recommended behavior for intentional mentions in replies according to Matrix 1.7
- In Markdown, soft line breaks are transformed into hard line breaks when compiled into HTML.
- Move the HTML functions in `events::room::message::sanitize` to the ruma-html crate
  - The `unstable-sanitize` cargo feature was renamed to `html`
- Make `via` required in `Space(Child|Parent)EventContent` according to a spec clarification
- Make `name` required in `RoomNameEventContent`, the wording of the spec was confusing
- Rename `SecretEncryptionAlgorithm` to `SecretStorageEncryptionAlgorithm` and its
  `SecretStorageV1AesHmacSha2` variant to `V1AesHmacSha2`. This variant is also a tuple variant
  instead of a struct variant

Improvements:

- Add `InitialStateEvent::{new, to_raw, to_raw_any}`
- Add a convenience method to construct `RoomEncryptionEventContent` with the recommended defaults.
- Add `FullStateEventContent::redact`
- Add new methods for `RoomPowerLevels`:
  - `user_can_ban`
  - `user_can_invite`
  - `user_can_kick`
  - `user_can_redact`
  - `user_can_send_message`
  - `user_can_send_state`
  - `user_can_trigger_room_notification`
- Add `MessageType::sanitize` behind the `html` feature
- Stabilize support for annotations and reactions (MSC2677 / Matrix 1.7)
- Add support for intentional mentions push rules (MSC3952 / Matrix 1.7)
- Stabilize support for VoIP signalling improvements (MSC2746 / Matrix 1.7)
- Make the generated and stripped plain text reply fallback behavior more compatible with most
  of the Matrix ecosystem.
- Add support for intentional mentions according to MSC3952 / Matrix 1.7
- Add support for room version 11 according to MSC3820 / Matrix 1.8
  - Add preserved fields to match the new redaction algorithm, according to
    MSC2176 / MSC3821, for the following types:
    - `RedactedRoomRedactionEventContent`,
    - `RedactedRoomPowerLevelsEventContent`,
    - `RedactedRoomMemberEventContent`
- Add `RoomMessageEventContent::make_reply_to_raw` to build replies to any event
- Add support for custom `SecretStorageEncryptionAlgorithm`

## 0.26.1

Deprecation of the crate. It is now part of ruma-common 0.9.0.

## 0.26.0

Breaking changes:

- Bump versions of `ruma-common`, `ruma-identifiers`

## 0.25.0

Breaking changes:

- Remove `RedactedStrippedStateEvent`
  - It was not used anywhere since stripped state events are never actually redacted
- Use `Box<RawJsonValue>` instead of `JsonValue` for PDU `content` field
- Require `room::message::MessageType` to always contain a body
  - The `new` constructor now also has a body parameter
- Rename `*ToDeviceEventContent` structs to `ToDevice*Content`
- Remove unneeded redacted event content enums
- Update `reply` and `html_reply` types to `impl Display` on `RoomMessageEventContent`'s reply
  constructors
- Remove the `custom` module, which has been redundant for a while
  - If you are still using it and are unclear on the upgrade path, please get in touch

Improvements:

- Add `is_allowed` to `RoomServerAclEventContent`
- Add `room::message::MessageType::body` accessor method
- Implement `Redact` for event structs (in addition to `Any` event enums)
- Add `room::message::RoomMessageEventContent::{body, msgtype}` accessor methods
- Move `room::message::MessageType::VerificationRequest` out of `unstable-pre-spec`
- Move MSC implementations from `unstable-pre-spec` to per-msc features:

  ```text
  unstable-msc2448
  unstable-msc2675
  unstable-msc2676
  unstable-msc2677
  ```

## 0.24.6

Improvements:

- Add (unstable) support for [MSC3083](https://github.com/matrix-org/matrix-doc/blob/main/proposals/3083-restricted-rooms.md)

## 0.24.5

Improvements:

- Add `From` implementations for event and event content enums
- It's now an error for a `room::message::Relation` to be `Replaces` without
  there being `new_content`
  - Previously, this used to set the relation to `None`
- Unsupported relations are now deserialized to `relates_to: Some(_)` instead of
  `None`
  - It's not possible to inspect the inner value though

## 0.24.4

Improvements:

- Add a workaround for synapse putting `prev_content` in unsigned (only active
  if the `compat` feature is enabled)

## 0.24.3

Improvements:

- Add unstable support for `m.secret.request` and `m.secret.send` events

## 0.24.2

Improvements:

- Add missing constructor and `From` implementation for
  `EncryptedToDeviceEventContent`

## 0.24.1

Breaking changes:

- `room::name::NameEventContent` now uses a custom `RoomNameBox` type for its
  `name` field and makes it public, in response the constructor and `name`
  accessor had their types updated too
- Replace `InvalidEvent` by a more specific `FromStringError` for room name
  validation
- Remove unused `FromStrError`
- Remove deprecated method `room::name::NameEventContent::name`
- Make `encrypted::EncryptedToDeviceEventContent` its own type instead of a type
  alias for `EncryptedEventContent`
  - It doesn't have the `relates_to` field `EncryptedEventContent` has
- Upgrade dependencies

Improvements:

- Add the `StaticEventContent` trait for abstracting over event content struct
  types (with a type known at compile-time)

## 0.24.0

Yanked, was released too early missing another important breaking change.

## 0.23.3

Improvements:

- Add unstable blurhash field to member event content struct
- Add constructors for the unstable spaces parent and child event content types

Bug fixes:

- Remove `new_content` from the plain-text part of `m.encrypted` events
  - It is supposed to go into the encrypted payload, but we expected it in the
    plain-text part before.
  - This is technically a breaking change but since that can only be observed
    behind an unstable feature and this change doesn't break matrix-sdk, it's
    made in a point release.

## 0.23.2

Bug fixes:

- Fix reaction event (de)serialization (was broken in 0.23.0)

## 0.23.1

Improvements:

- Allow the macros exported by ruma-events to be used by crates that depend on matrix-sdk, but not
  (directly) on ruma or ruma-events

## 0.23.0

Breaking changes:

- Rename `key::verification::AcceptMethod::{MSasV1 => SasV1}`
- As above, drop `M` prefix from `key::verification::VerificationMethod` variants
  - Additionally, fix the name of the QR code one (`QrScanShowV1` to `QrCodeScanV1`)
- Remove `room::power_level::NotificationPowerLevels`, now found in `ruma_common::power_levels`
  (or `ruma::power_levels`)
- Remove `Custom` variant from event enums. If you were using this, please get in touch.
- Remove `Custom` variant from `key::verification::accept::AcceptMethod` and
  `key::verification::start::StartMethod`.
- Rename `relation` field in some events to `relates_to`
- All events that support relations now have their own `Relation` types (the `room::relationships`
  module has been removed)
  - The `room::encryption` relation type can represent any kind of relation and has `From`
    implementations so any other relation can be converted to it

Improvements:

- Add types for decrypted `m.room.encryption` event payloads (`DecryptedOlmV1Event`,
  `DecryptedMegolmV1Event`)
  - Currently, these don't have corresponding enums (and they might never get ones), instead to
    represent a decrypted event payload with an unknown event type use `AnyMessageEventContent` for
    the generic parameter

## 0.22.2

Improvements:

- Add unstable support for `m.space.child` and `m.space.parent` events

## 0.22.1

Bug fixes:

- Fix serialized format of `DummyEventContent`

## 0.22.0

Breaking changes:

- Change the structure of `StartEventContent` so that we can access transaction
  ids without the need to understand the concrete method.
- Change `get_message_events` limit field type from `Option<UInt>` to `UInt`
- Add `alt_aliases` to `CanonicalAliasEventContent`
- Replace `format` and `formatted_body` fields in `TextMessageEventContent`,
  `NoticeMessageEventContent` and `EmoteMessageEventContent` with `formatted: FormattedBody`
- Rename `override_rules` in `push_rules::Ruleset` to `override_`
- Change `push_rules::PushCondition` variants from newtype variants with separate inner types to
  struct variants
  - This change removes the types `EventMatchCondition`, `RoomMemberCountCondition` and
    `SenderNotificationPermissionCondition`
- Add PDU types: `pdu::{Pdu, PduStub}`
- `presence::PresenceState` has been moved. Import it from `ruma` or `ruma-common`.
- `EventJson` has been moved and renamed. Import it from `ruma` or `ruma-common`.
- The `in_reply_to` field of `room::message::RelatesTo` is now optional
- Use `ruma_identifiers::{ServerName, ServerKeyId}` in `signatures` fields of
  `pdu::RoomV1Pdu, RoomV1PduStub, RoomV3Pdu, RoomV3PduStub}` and
  `room::member::SignedContent`.
- Remove the `EventType::Custom` variant. You can still check for custom event types by going
  through `.as_str()`. This ensures that new event types doesn't break existing code.
- Remove the implementations of `From<EventType>` and `From<key::verification::cancel::CancelCode>`
  for `String`. Use the `Display` or `ToString` implementations for those types instead.
- Remove `PduStub`, `RoomV1PduStub` and `RoomV3PduStub` types
- Use `ruma_identifiers::MxcUri` instead of `String` for `avatar_url`, `thumbnail_url` or `url`
  fields in the following types:

  ```rust
  presence::PresenceEventContent,
  room::{
      avatar::{AvatarEventContent, ImageInfo},
      member::MemberEventContent,
      message::{
        AudioMessageEventContent, FileMessageEventContent, ImageMessageEventContent,
        VideoMessageEventContent
      }
      EncryptedFile, ImageInfo,
  },
  sticker::StickerEventContent
  ```

- Add `tag::TagName` type and use it for `tag::Tags`
- Move `FullyRead` from `EphemeralRoom` enum to `RoomAccountData` enum
- Split `Basic` enum into `GlobalAccountData` and `RoomAccountData` enums
  - Remove `DummyEvent`, `DummyEventContent`, `RoomKeyEvent`, `RoomKeyEventContent`
- Remove `BasicEventContent` trait and derive
- Make most of the types in this crate non-exhaustive

Improvements:

- Add `room::MessageFormat` and `room::FormattedBody`
- Skip serialization of optional values on `room::encryption::EncryptionEventContent`
- Rename `TextMessageEventContent::new_plain` to `plain` (the old name is still available, but
  deprecated)
- Add more constructors for types in `room::message`:
  - `TextMessageEventContent::html`
  - `NoticeMessageEventContent::plain`
  - `NoticeMessageEventContent::html`
  - `MessageEventContent::text_plain`
  - `MessageEventContent::text_html`
  - `MessageEventContent::notice_plain`
  - `MessageEventContent::notice_html`
- Add policy rule entities:
  - `policy::rule::room`
  - `policy::rule::server`
  - `policy::rule::user`
- Add policy rule recommendation:
  - `Recommendation::Ban`

## 0.21.3

Bug fixes:

- Fix `m.room.message` event serialization

Improvements:

- Skip serialization of `federate` field in `room::create::CreateEventContent`
  if it is `true` (the default value)
- `room::power_levels::PowerLevelsEventContent` now implements `Default`

## 0.21.2

Improvements:

- Update dependencies

## 0.21.1

Improvements:

- Add `EventJson::into_json`

## 0.21.0

Breaking changes:

- Replace `EventResult` with a new construct, `EventJson`
  - Instead of only capturing the json value if deserialization failed, we now
    now always capture it. To improve deserialization performance at the same
    time, we no longer use `serde_json::Value` internally and instead
    deserialize events as `Box<serde_json::value::RawValue>`. `EventJson` is
    simply a wrapper around that owned value type that additionally holds a
    generic argument: the type as which clients will usually want to deserialize
    the raw value.
- Add `struct UnsignedData` and update all `unsigned` fields types from
  `BTreeMap<String, Value>` to this new type.
  - To access any additional fields of the `unsigned` property of an event,
    deserialize the `EventJson` to another type that captures the field(s) you
    are interested in.
- Add fields `format` and `formatted_body` to `room::message::NoticeMessageEventContent`
- Remove `room::message::MessageType`
- Remove useless `algorithm` fields from encrypted event content structs
- Remove `PartialEq` implementations for most types
  - Since we're now using `serde_json::value::RawValue`, deriving no longer works
- Update the representation of `push_rules::Tweak`
- Raise minimum supported Rust version to 1.40.0

## 0.20.0

Improvements:

- Update ruma-identifiers to 0.16.0

## 0.19.0

Breaking changes:

- Update ruma-identifiers to 0.15.1
- Change timestamps, including `origin_server_rs` from `UInt` to `SystemTime`
- Change all usages of `HashMap` to `BTreeMap`
  - To support this, `EventType` now implements `PartialOrd` and `Ord`

## 0.18.0

Breaking changes:

- Update unsigned field's type from `Option<Value>` to `Map<String, Value>`

Improvements:

- Add a convenience constructor to create a plain-text `TextMessageEventContent`
- Add `m.dummy` events to the to-device event collection

## 0.17.0

Breaking changes:

- `collections::only` no longer exports a `raw` submodule. It was never meant to be exported in the
  first place.
- Renamed `stripped::{StrippedState => AnyStrippedStateEvent, StrippedStateContent => StrippedStateEvent}`

Improvements:

- Added `to_device` module with to-device variants of events (as found in the `to_device` section of
  a sync response)
- Added a helper method for computing the membership change from a `MemberEvent`

Bug fixes:

- Fixed missing `m.` in `m.relates_to` field of room messages
- Fixed (de)serialization of encrypted events using `m.olm.v1.curve25519-aes-sha2`

## 0.16.0

Breaking changes:

- `TryFromRaw::try_from_raw`'s signature has been simplified. The previous signature was a relict
  that was no longer sensible.
- All remaining non-optional `room_id` event fields (not event content fields) have been made
  optional

Improvements:

- `NameEvent`s are now validated properly and will be rejected if the `name` field is longer than
  255 bytes.

## 0.15.1

Bug fixes:

- Deserialization of custom events as part of the types from `ruma_events::collections::{all, only}`
  was implemented (this was missing after the big fallible deserializion rewrite in 0.15.0)

## 0.15.0

Improvements:

- `ruma-events` now exports a new type, `EventResult`
  - For any event or event content type `T` inside a larger type that should support deserialization
    you can use `EventResult<T>` instead
  - Conceptually, it is the same as `Result<T, InvalidEvent>`
  - `InvalidEvent` can represent either a deserialization error (the event's structure did not
    match) or a validation error (some additional constraints defined in the matrix spec were violated)
    - It also contains the original value that was attempted to be deserialized into `T` in
      `serde_json::Value` form

Breaking changes:

- The `FromStr` implementations for event types were removed (they were the previous implementation
  of fallible deserialization, but were never integrated in ruma-client-api because they didn't
  interoperate well with serde derives)

## 0.14.0

Breaking changes:

- Updated to ruma-identifiers 0.14.0.

Improvements:

- ruma-events is now checked against the RustSec advisory database.

## 0.13.0

Breaking changes:

- Events and their content types no longer implement `Deserialize` and instead implement `FromStr`
  and `TryFrom<&str>`, which take a `&str` of JSON data and return a new `InvalidEvent` type on
  error.
- Integers are now represented using the `Int` and `UInt` types from the `js_int` crate to ensure
  they are within the JavaScript-interoperable range mandated by the Matrix specification.
- Some event types have new fields or new default values for previous fields to bring them up to
  date with version r0.5.0 of the client-server specification.
- Some event types no longer have public fields and instead use a constructor function to perform
  validations not represented by the type system.
- All enums now include a "nonexhaustive" variant to prevent exhaustive pattern matching. This will
  change to use the `#[nonexhaustive]` attribute when it is stabilized.
- `ParseError` has been renamed `FromStrError`.

New features:

- This release brings ruma-events completely up to date with version r0.5.0 of the client-server
  specification. All previously supported events have been updated as necessary and the following
  events have newly added support:
  - m.dummy
  - m.forwarded_room_key
  - m.fully_read
  - m.ignored_user_list
  - m.key.verification.accept
  - m.key.verification.cancel
  - m.key.verification.key
  - m.key.verification.mac
  - m.key.verification.request
  - m.key.verification.start
  - m.push_rules
  - m.key.encrypted
  - m.key.encryption
  - m.key.server_acl
  - m.key.tombstone
  - m.room_key
  - m.room_key_request
  - m.sticker

Improvements:

- Improved documentation for the crate and for many types.
- Added many new tests.
- rustfmt and clippy are now used to ensure consistent formatting and improved code quality.

## 0.12.0

Improvements:

- ruma-events now runs on stable Rust, requiring version 1.34 or higher.

Bug fixes:

- `CanonicalAliasEvent` and `NameEvent` now allow content being absent, null, or empty, as per the spec.

## 0.11.1

Breaking changes:

- `RoomId` is now optional in certain places where it may be absent, notably the responses of the
  `/sync` API endpoint.
- A `sender` field has been added to the `StrippedStateContent` type.

Improvements:

- Depend on serde's derive feature rather than serde_derive directly for simplified imports.
- Update to Rust 2018 idioms.

## 0.11.0

Breaking changes:

- The presence event has been modified to match the latest version of the spec. The spec was
  corrected to match the behavior of the Synapse homeserver.

Improvements:

- Dependencies have been updated to the latest versions.

## 0.10.0

Breaking changes:

- The `EventType`, and collections enums have new variants to support new events.
- The `extra_content` method has been removed from the Event trait.
- The `user_id` method from the `RoomEvent` trait has been renamed `sender` to match the specification.
- The `origin_server_ts` value is now required for room events and is supported via a new
  `origin_server_ts` method on the `RoomEvent` trait.
- `MemberEventContent` has a new `is_direct` field.
- `FileMessageEventContent` has a new `filename` field.
- File and thumbnail info have been moved from several message types to dedicated `FileInfo`,
  `ImageInfo`, and `ThumbnailInfo` types.
- `LocationMessageEventContent` has a new info field.
- `PresenceEventContent`'s `currently_active` field has changed from `bool` to `Option`.
- `TypingEventContent` contains a vector of `UserId`s instead of `EventId`s.
- Height and width fields named `h` and `w` in the spec now use the full names `height` and `width`
  for their struct field names, but continue to serialize to the single-letter names.

New features:

- ruma-events now supports all events according to r0.3.0 of the Matrix client-server specification.
- Added new event: `m.room.pinned_events`.
- Added new event: `m.direct`.

Bug fixes:

- Several places where struct fields used the wrong key when serialized to JSON have been corrected.
- Fixed grammar issues in documentation.

## 0.9.0

Improvements:

- Added default values for various power level attributes.
- Removed Serde trait bounds on `StrippedStateContent`'s generic parameter.
- Updated to version 0.4 of ruma-signatures.

## 0.8.0

Breaking changes

- Updated serde to the 1.0 series.

## 0.7.0

Bug fixes:

- Make the `federate` field optional when creating a room.

## 0.6.0

Breaking changes:

- Updated ruma-identifiers to the 0.9 series.

## 0.5.0

Breaking changes:

- Updated ruma-identifiers to the 0.8 series.

## 0.4.1

Improvements:

- Relaxed version constraints on dependent crates to allow updating to new patch level versions.

## 0.4.0

Breaking changes:

- Updated serde to the 0.9 series.

The public API remains the same.

## 0.3.0

Improvements:

- `ruma_events::presence::PresenceState` now implements `Display` and `FromStr`.

## 0.2.0

Improvements:

- Added missing "stripped" versions of some state events.
- All "stripped" versions of state events are now serializable.

## 0.1.0

Initial release.
