1/******************************************************************************
2 * THIS FILE IS GENERATED - ANY EDITS WILL BE OVERWRITTEN
3 */
4
5#pragma once
6
7#include <Quotient/jobs/basejob.h>
8
9namespace Quotient {
10
11/*! \brief Create a new room
12 *
13 * Create a new room with various configuration options.
14 *
15 * The server MUST apply the normal state resolution rules when creating
16 * the new room, including checking power levels for each event. It MUST
17 * apply the events implied by the request in the following order:
18 *
19 * 1. The `m.room.create` event itself. Must be the first event in the
20 * room.
21 *
22 * 2. An `m.room.member` event for the creator to join the room. This is
23 * needed so the remaining events can be sent.
24 *
25 * 3. A default `m.room.power_levels` event, giving the room creator
26 * (and not other members) permission to send state events. Overridden
27 * by the `power_level_content_override` parameter.
28 *
29 * 4. An `m.room.canonical_alias` event if `room_alias_name` is given.
30 *
31 * 5. Events set by the `preset`. Currently these are the `m.room.join_rules`,
32 * `m.room.history_visibility`, and `m.room.guest_access` state events.
33 *
34 * 6. Events listed in `initial_state`, in the order that they are
35 * listed.
36 *
37 * 7. Events implied by `name` and `topic` (`m.room.name` and `m.room.topic`
38 * state events).
39 *
40 * 8. Invite events implied by `invite` and `invite_3pid` (`m.room.member` with
41 * `membership: invite` and `m.room.third_party_invite`).
42 *
43 * The available presets do the following with respect to room state:
44 *
45 * | Preset | `join_rules` | `history_visibility` |
46 * `guest_access` | Other |
47 * |------------------------|--------------|----------------------|----------------|-------|
48 * | `private_chat` | `invite` | `shared` | `can_join`
49 * | | | `trusted_private_chat` | `invite` | `shared` |
50 * `can_join` | All invitees are given the same power level as the room
51 * creator. | | `public_chat` | `public` | `shared` |
52 * `forbidden` | |
53 *
54 * The server will create a `m.room.create` event in the room with the
55 * requesting user as the creator, alongside other keys provided in the
56 * `creation_content`.
57 */
58class QUOTIENT_API CreateRoomJob : public BaseJob {
59public:
60 // Inner data structures
61
62 /// Create a new room with various configuration options.
63 ///
64 /// The server MUST apply the normal state resolution rules when creating
65 /// the new room, including checking power levels for each event. It MUST
66 /// apply the events implied by the request in the following order:
67 ///
68 /// 1. The `m.room.create` event itself. Must be the first event in the
69 /// room.
70 ///
71 /// 2. An `m.room.member` event for the creator to join the room. This is
72 /// needed so the remaining events can be sent.
73 ///
74 /// 3. A default `m.room.power_levels` event, giving the room creator
75 /// (and not other members) permission to send state events. Overridden
76 /// by the `power_level_content_override` parameter.
77 ///
78 /// 4. An `m.room.canonical_alias` event if `room_alias_name` is given.
79 ///
80 /// 5. Events set by the `preset`. Currently these are the
81 /// `m.room.join_rules`,
82 /// `m.room.history_visibility`, and `m.room.guest_access` state events.
83 ///
84 /// 6. Events listed in `initial_state`, in the order that they are
85 /// listed.
86 ///
87 /// 7. Events implied by `name` and `topic` (`m.room.name` and
88 /// `m.room.topic`
89 /// state events).
90 ///
91 /// 8. Invite events implied by `invite` and `invite_3pid` (`m.room.member`
92 /// with
93 /// `membership: invite` and `m.room.third_party_invite`).
94 ///
95 /// The available presets do the following with respect to room state:
96 ///
97 /// | Preset | `join_rules` | `history_visibility` |
98 /// `guest_access` | Other |
99 /// |------------------------|--------------|----------------------|----------------|-------|
100 /// | `private_chat` | `invite` | `shared` |
101 /// `can_join` | | | `trusted_private_chat` | `invite` |
102 /// `shared` | `can_join` | All invitees are given the same
103 /// power level as the room creator. | | `public_chat` | `public`
104 /// | `shared` | `forbidden` | |
105 ///
106 /// The server will create a `m.room.create` event in the room with the
107 /// requesting user as the creator, alongside other keys provided in the
108 /// `creation_content`.
109 struct Invite3pid {
110 /// The hostname+port of the identity server which should be used for
111 /// third-party identifier lookups.
112 QString idServer;
113 /// An access token previously registered with the identity server.
114 /// Servers can treat this as optional to distinguish between
115 /// r0.5-compatible clients and this specification version.
116 QString idAccessToken;
117 /// The kind of address being passed in the address field, for example
118 /// `email` (see [the list of recognised
119 /// values](/appendices/#3pid-types)).
120 QString medium;
121 /// The invitee's third-party identifier.
122 QString address;
123 };
124
125 /// Create a new room with various configuration options.
126 ///
127 /// The server MUST apply the normal state resolution rules when creating
128 /// the new room, including checking power levels for each event. It MUST
129 /// apply the events implied by the request in the following order:
130 ///
131 /// 1. The `m.room.create` event itself. Must be the first event in the
132 /// room.
133 ///
134 /// 2. An `m.room.member` event for the creator to join the room. This is
135 /// needed so the remaining events can be sent.
136 ///
137 /// 3. A default `m.room.power_levels` event, giving the room creator
138 /// (and not other members) permission to send state events. Overridden
139 /// by the `power_level_content_override` parameter.
140 ///
141 /// 4. An `m.room.canonical_alias` event if `room_alias_name` is given.
142 ///
143 /// 5. Events set by the `preset`. Currently these are the
144 /// `m.room.join_rules`,
145 /// `m.room.history_visibility`, and `m.room.guest_access` state events.
146 ///
147 /// 6. Events listed in `initial_state`, in the order that they are
148 /// listed.
149 ///
150 /// 7. Events implied by `name` and `topic` (`m.room.name` and
151 /// `m.room.topic`
152 /// state events).
153 ///
154 /// 8. Invite events implied by `invite` and `invite_3pid` (`m.room.member`
155 /// with
156 /// `membership: invite` and `m.room.third_party_invite`).
157 ///
158 /// The available presets do the following with respect to room state:
159 ///
160 /// | Preset | `join_rules` | `history_visibility` |
161 /// `guest_access` | Other |
162 /// |------------------------|--------------|----------------------|----------------|-------|
163 /// | `private_chat` | `invite` | `shared` |
164 /// `can_join` | | | `trusted_private_chat` | `invite` |
165 /// `shared` | `can_join` | All invitees are given the same
166 /// power level as the room creator. | | `public_chat` | `public`
167 /// | `shared` | `forbidden` | |
168 ///
169 /// The server will create a `m.room.create` event in the room with the
170 /// requesting user as the creator, alongside other keys provided in the
171 /// `creation_content`.
172 struct StateEvent {
173 /// The type of event to send.
174 QString type;
175 /// The content of the event.
176 QJsonObject content;
177 /// The state_key of the state event. Defaults to an empty string.
178 QString stateKey{};
179 };
180
181 // Construction/destruction
182
183 /*! \brief Create a new room
184 *
185 * \param visibility
186 * A `public` visibility indicates that the room will be shown
187 * in the published room list. A `private` visibility will hide
188 * the room from the published room list. Rooms default to
189 * `private` visibility if this key is not included. NB: This
190 * should not be confused with `join_rules` which also uses the
191 * word `public`.
192 *
193 * \param roomAliasName
194 * The desired room alias **local part**. If this is included, a
195 * room alias will be created and mapped to the newly created
196 * room. The alias will belong on the *same* homeserver which
197 * created the room. For example, if this was set to "foo" and
198 * sent to the homeserver "example.com" the complete room alias
199 * would be `#foo:example.com`.
200 *
201 * The complete room alias will become the canonical alias for
202 * the room and an `m.room.canonical_alias` event will be sent
203 * into the room.
204 *
205 * \param name
206 * If this is included, an `m.room.name` event will be sent
207 * into the room to indicate the name of the room. See Room
208 * Events for more information on `m.room.name`.
209 *
210 * \param topic
211 * If this is included, an `m.room.topic` event will be sent
212 * into the room to indicate the topic for the room. See Room
213 * Events for more information on `m.room.topic`.
214 *
215 * \param invite
216 * A list of user IDs to invite to the room. This will tell the
217 * server to invite everyone in the list to the newly created room.
218 *
219 * \param invite3pid
220 * A list of objects representing third-party IDs to invite into
221 * the room.
222 *
223 * \param roomVersion
224 * The room version to set for the room. If not provided, the homeserver
225 * is to use its configured default. If provided, the homeserver will return
226 * a 400 error with the errcode `M_UNSUPPORTED_ROOM_VERSION` if it does not
227 * support the room version.
228 *
229 * \param creationContent
230 * Extra keys, such as `m.federate`, to be added to the content
231 * of the [`m.room.create`](/client-server-api/#mroomcreate) event. The
232 * server will overwrite the following keys: `creator`, `room_version`.
233 * Future versions of the specification may allow the server to overwrite
234 * other keys.
235 *
236 * \param initialState
237 * A list of state events to set in the new room. This allows
238 * the user to override the default state events set in the new
239 * room. The expected format of the state events are an object
240 * with type, state_key and content keys set.
241 *
242 * Takes precedence over events set by `preset`, but gets
243 * overridden by `name` and `topic` keys.
244 *
245 * \param preset
246 * Convenience parameter for setting various default state events
247 * based on a preset.
248 *
249 * If unspecified, the server should use the `visibility` to determine
250 * which preset to use. A visbility of `public` equates to a preset of
251 * `public_chat` and `private` visibility equates to a preset of
252 * `private_chat`.
253 *
254 * \param isDirect
255 * This flag makes the server set the `is_direct` flag on the
256 * `m.room.member` events sent to the users in `invite` and
257 * `invite_3pid`. See [Direct
258 * Messaging](/client-server-api/#direct-messaging) for more information.
259 *
260 * \param powerLevelContentOverride
261 * The power level content to override in the default power level
262 * event. This object is applied on top of the generated
263 * [`m.room.power_levels`](/client-server-api/#mroompower_levels)
264 * event content prior to it being sent to the room. Defaults to
265 * overriding nothing.
266 */
267 explicit CreateRoomJob(const QString& visibility = {},
268 const QString& roomAliasName = {},
269 const QString& name = {}, const QString& topic = {},
270 const QStringList& invite = {},
271 const QVector<Invite3pid>& invite3pid = {},
272 const QString& roomVersion = {},
273 const QJsonObject& creationContent = {},
274 const QVector<StateEvent>& initialState = {},
275 const QString& preset = {},
276 Omittable<bool> isDirect = none,
277 const QJsonObject& powerLevelContentOverride = {});
278
279 // Result properties
280
281 /// The created room's ID.
282 QString roomId() const { return loadFromJson<QString>(keyName: "room_id"_ls); }
283};
284
285template <>
286struct JsonObjectConverter<CreateRoomJob::Invite3pid> {
287 static void dumpTo(QJsonObject& jo, const CreateRoomJob::Invite3pid& pod)
288 {
289 addParam<>(container&: jo, QStringLiteral("id_server"), value: pod.idServer);
290 addParam<>(container&: jo, QStringLiteral("id_access_token"), value: pod.idAccessToken);
291 addParam<>(container&: jo, QStringLiteral("medium"), value: pod.medium);
292 addParam<>(container&: jo, QStringLiteral("address"), value: pod.address);
293 }
294};
295
296template <>
297struct JsonObjectConverter<CreateRoomJob::StateEvent> {
298 static void dumpTo(QJsonObject& jo, const CreateRoomJob::StateEvent& pod)
299 {
300 addParam<>(container&: jo, QStringLiteral("type"), value: pod.type);
301 addParam<>(container&: jo, QStringLiteral("content"), value: pod.content);
302 addParam<IfNotEmpty>(container&: jo, QStringLiteral("state_key"), value: pod.stateKey);
303 }
304};
305
306} // namespace Quotient
307