//! [POST /_matrix/client/r0/createRoom](https://matrix.org/docs/spec/client_server/r0.6.0#post-matrix-client-r0-createroom) use assign::assign; use ruma_api::ruma_api; use ruma_common::Raw; use ruma_events::{ room::{ create::{CreateEventContent, PreviousRoom}, power_levels::PowerLevelsEventContent, }, AnyInitialStateEvent, }; use ruma_identifiers::{RoomId, RoomVersionId, UserId}; use serde::{Deserialize, Serialize}; use super::Visibility; use crate::r0::membership::Invite3pid; ruma_api! { metadata: { description: "Create a new room.", method: POST, name: "create_room", path: "/_matrix/client/r0/createRoom", rate_limited: false, requires_authentication: true, } #[derive(Default)] #[non_exhaustive] request: { /// Extra keys to be added to the content of the `m.room.create`. #[serde(skip_serializing_if = "Option::is_none")] pub creation_content: Option, /// List of state events to send to the new room. /// /// Takes precedence over events set by preset, but gets overriden by /// name and topic keys. #[serde(default, skip_serializing_if = "Vec::is_empty")] pub initial_state: Vec, /// A list of user IDs to invite to the room. /// /// This will tell the server to invite everyone in the list to the newly created room. #[serde(default, skip_serializing_if = "Vec::is_empty")] pub invite: Vec, /// List of third party IDs of users to invite. #[serde(default, skip_serializing_if = "Vec::is_empty")] pub invite_3pid: Vec, /// If set, this sets the `is_direct` flag on room invites. #[serde(skip_serializing_if = "Option::is_none")] pub is_direct: Option, /// If this is included, an `m.room.name` event will be sent into the room to indicate /// the name of the room. #[serde(skip_serializing_if = "Option::is_none")] pub name: Option, /// Power level content to override in the default power level event. #[serde(skip_serializing_if = "Option::is_none")] pub power_level_content_override: Option>, /// Convenience parameter for setting various default state events based on a preset. #[serde(skip_serializing_if = "Option::is_none")] pub preset: Option, /// The desired room alias local part. #[serde(skip_serializing_if = "Option::is_none")] pub room_alias_name: Option, /// Room version to set for the room. Defaults to homeserver's default if not specified. #[serde(skip_serializing_if = "Option::is_none")] pub room_version: Option, /// If this is included, an `m.room.topic` event will be sent into the room to indicate /// the topic for the room. #[serde(skip_serializing_if = "Option::is_none")] pub topic: Option, /// A public visibility indicates that the room will be shown in the published room /// list. A private visibility will hide the room from the published room list. Rooms /// default to private visibility if this key is not included. #[serde(skip_serializing_if = "Option::is_none")] pub visibility: Option, } #[non_exhaustive] response: { /// The created room's ID. pub room_id: RoomId, } error: crate::Error } impl Request { /// Creates a `Request` will all-default parameters. pub fn new() -> Self { Default::default() } } impl Response { /// Creates a `Response` with the given room id. pub fn new(room_id: RoomId) -> Self { Self { room_id } } } /// Extra options to be added to the `m.room.create` event. /// /// This is the same as the event content struct for `m.room.create`, but without some fields that /// servers are supposed to ignore. #[derive(Clone, Debug, Deserialize, Serialize)] pub struct CreationContent { /// Whether users on other servers can join this room. /// /// Defaults to `true` if key does not exist. #[serde( rename = "m.federate", default = "ruma_serde::default_true", skip_serializing_if = "ruma_serde::is_true" )] pub federate: bool, /// A reference to the room this room replaces, if the previous room was upgraded. #[serde(skip_serializing_if = "Option::is_none")] pub predecessor: Option, } impl CreationContent { /// Given a `CreationContent` and the other fields that a homeserver has to fill, construct /// a `CreateEventContent`. pub fn into_event_content( Self { federate, predecessor }: Self, creator: UserId, room_version: RoomVersionId, ) -> CreateEventContent { assign!(CreateEventContent::new(creator), { federate, room_version, predecessor }) } } /// A convenience parameter for setting a few default state events. #[derive(Clone, Copy, Debug, Deserialize, Serialize)] #[serde(rename_all = "snake_case")] pub enum RoomPreset { /// `join_rules` is set to `invite` and `history_visibility` is set to `shared`. PrivateChat, /// `join_rules` is set to `public` and `history_visibility` is set to `shared`. PublicChat, /// Same as `PrivateChat`, but all initial invitees get the same power level as the creator. TrustedPrivateChat, }