diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/csapi/definitions/public_rooms_response.h | 69 | ||||
-rw-r--r-- | lib/csapi/list_public_rooms.h | 10 | ||||
-rw-r--r-- | lib/csapi/space_hierarchy.h | 71 |
3 files changed, 139 insertions, 11 deletions
diff --git a/lib/csapi/definitions/public_rooms_response.h b/lib/csapi/definitions/public_rooms_response.h index ca512280..da917a98 100644 --- a/lib/csapi/definitions/public_rooms_response.h +++ b/lib/csapi/definitions/public_rooms_response.h @@ -6,13 +6,76 @@ #include "converters.h" -#include "csapi/definitions/public_rooms_chunk.h" - namespace Quotient { + +struct PublicRoomsChunk { + /// The canonical alias of the room, if any. + QString canonicalAlias; + + /// The name of the room, if any. + QString name; + + /// The number of members joined to the room. + int numJoinedMembers; + + /// The ID of the room. + QString roomId; + + /// The topic of the room, if any. + QString topic; + + /// Whether the room may be viewed by guest users without joining. + bool worldReadable; + + /// Whether guest users may join the room and participate in it. + /// If they can, they will be subject to ordinary power level + /// rules like any other user. + bool guestCanJoin; + + /// The URL for the room's avatar, if one is set. + QUrl avatarUrl; + + /// The room's join rule. When not present, the room is assumed to + /// be `public`. Note that rooms with `invite` join rules are not + /// expected here, but rooms with `knock` rules are given their + /// near-public nature. + QString joinRule; +}; + +template <> +struct JsonObjectConverter<PublicRoomsChunk> { + static void dumpTo(QJsonObject& jo, const PublicRoomsChunk& pod) + { + addParam<IfNotEmpty>(jo, QStringLiteral("canonical_alias"), + pod.canonicalAlias); + addParam<IfNotEmpty>(jo, QStringLiteral("name"), pod.name); + addParam<>(jo, QStringLiteral("num_joined_members"), + pod.numJoinedMembers); + addParam<>(jo, QStringLiteral("room_id"), pod.roomId); + addParam<IfNotEmpty>(jo, QStringLiteral("topic"), pod.topic); + addParam<>(jo, QStringLiteral("world_readable"), pod.worldReadable); + addParam<>(jo, QStringLiteral("guest_can_join"), pod.guestCanJoin); + addParam<IfNotEmpty>(jo, QStringLiteral("avatar_url"), pod.avatarUrl); + addParam<IfNotEmpty>(jo, QStringLiteral("join_rule"), pod.joinRule); + } + static void fillFrom(const QJsonObject& jo, PublicRoomsChunk& pod) + { + fromJson(jo.value("canonical_alias"_ls), pod.canonicalAlias); + fromJson(jo.value("name"_ls), pod.name); + fromJson(jo.value("num_joined_members"_ls), pod.numJoinedMembers); + fromJson(jo.value("room_id"_ls), pod.roomId); + fromJson(jo.value("topic"_ls), pod.topic); + fromJson(jo.value("world_readable"_ls), pod.worldReadable); + fromJson(jo.value("guest_can_join"_ls), pod.guestCanJoin); + fromJson(jo.value("avatar_url"_ls), pod.avatarUrl); + fromJson(jo.value("join_rule"_ls), pod.joinRule); + } +}; + /// A list of the rooms on the server. struct PublicRoomsResponse { /// A paginated chunk of public rooms. - QVector<QJsonObject> chunk; + QVector<PublicRoomsChunk> chunk; /// A pagination token for the response. The absence of this token /// means there are no more results to fetch and the client should diff --git a/lib/csapi/list_public_rooms.h b/lib/csapi/list_public_rooms.h index 701a74f6..e1f03db7 100644 --- a/lib/csapi/list_public_rooms.h +++ b/lib/csapi/list_public_rooms.h @@ -4,7 +4,7 @@ #pragma once -#include "csapi/definitions/public_rooms_chunk.h" +#include "csapi/definitions/public_rooms_response.h" #include "jobs/basejob.h" @@ -103,9 +103,9 @@ public: // Result properties /// A paginated chunk of public rooms. - QVector<QJsonObject> chunk() const + QVector<PublicRoomsChunk> chunk() const { - return loadFromJson<QVector<QJsonObject>>("chunk"_ls); + return loadFromJson<QVector<PublicRoomsChunk>>("chunk"_ls); } /// A pagination token for the response. The absence of this token @@ -182,9 +182,9 @@ public: // Result properties /// A paginated chunk of public rooms. - QVector<QJsonObject> chunk() const + QVector<PublicRoomsChunk> chunk() const { - return loadFromJson<QVector<QJsonObject>>("chunk"_ls); + return loadFromJson<QVector<PublicRoomsChunk>>("chunk"_ls); } /// A pagination token for the response. The absence of this token diff --git a/lib/csapi/space_hierarchy.h b/lib/csapi/space_hierarchy.h index adffe2f8..5b3c1f80 100644 --- a/lib/csapi/space_hierarchy.h +++ b/lib/csapi/space_hierarchy.h @@ -5,7 +5,6 @@ #pragma once #include "csapi/../../event-schemas/schema/core-event-schema/stripped_state.h" -#include "csapi/definitions/public_rooms_chunk.h" #include "jobs/basejob.h" @@ -25,6 +24,53 @@ namespace Quotient { */ class QUOTIENT_API GetSpaceHierarchyJob : public BaseJob { public: + // Inner data structures + + /// Paginates over the space tree in a depth-first manner to locate child + /// rooms of a given space. + /// + /// Where a child room is unknown to the local server, federation is used to + /// fill in the details. The servers listed in the `via` array should be + /// contacted to attempt to fill in missing rooms. + /// + /// Only [`m.space.child`](#mspacechild) state events of the room are + /// considered. Invalid child rooms and parent events are not covered by + /// this endpoint. + struct ChildRoomsChunk { + /// The canonical alias of the room, if any. + QString canonicalAlias; + /// The name of the room, if any. + QString name; + /// The number of members joined to the room. + int numJoinedMembers; + /// The ID of the room. + QString roomId; + /// The topic of the room, if any. + QString topic; + /// Whether the room may be viewed by guest users without joining. + bool worldReadable; + /// Whether guest users may join the room and participate in it. + /// If they can, they will be subject to ordinary power level + /// rules like any other user. + bool guestCanJoin; + /// The URL for the room's avatar, if one is set. + QUrl avatarUrl; + /// The room's join rule. When not present, the room is assumed to + /// be `public`. + QString joinRule; + /// The `type` of room (from + /// [`m.room.create`](/client-server-api/#mroomcreate)), if any. + QString roomType; + /// The [`m.space.child`](#mspacechild) events of the space-room, + /// represented as [Stripped State Events](#stripped-state) with an + /// added `origin_server_ts` key. + /// + /// If the room is not a space-room, this should be empty. + QVector<QJsonObject> childrenState; + }; + + // Construction/destruction + /*! \brief Retrieve a portion of a space tree. * * \param roomId @@ -75,9 +121,9 @@ public: // Result properties /// The rooms for the current page, with the current filters. - QVector<QJsonObject> rooms() const + QVector<ChildRoomsChunk> rooms() const { - return loadFromJson<QVector<QJsonObject>>("rooms"_ls); + return loadFromJson<QVector<ChildRoomsChunk>>("rooms"_ls); } /// A token to supply to `from` to keep paginating the responses. Not @@ -85,4 +131,23 @@ public: QString nextBatch() const { return loadFromJson<QString>("next_batch"_ls); } }; +template <> +struct JsonObjectConverter<GetSpaceHierarchyJob::ChildRoomsChunk> { + static void fillFrom(const QJsonObject& jo, + GetSpaceHierarchyJob::ChildRoomsChunk& result) + { + fromJson(jo.value("canonical_alias"_ls), result.canonicalAlias); + fromJson(jo.value("name"_ls), result.name); + fromJson(jo.value("num_joined_members"_ls), result.numJoinedMembers); + fromJson(jo.value("room_id"_ls), result.roomId); + fromJson(jo.value("topic"_ls), result.topic); + fromJson(jo.value("world_readable"_ls), result.worldReadable); + fromJson(jo.value("guest_can_join"_ls), result.guestCanJoin); + fromJson(jo.value("avatar_url"_ls), result.avatarUrl); + fromJson(jo.value("join_rule"_ls), result.joinRule); + fromJson(jo.value("room_type"_ls), result.roomType); + fromJson(jo.value("children_state"_ls), result.childrenState); + } +}; + } // namespace Quotient |