// SPDX-FileCopyrightText: 2017 Kitsune Ral // SPDX-FileCopyrightText: 2019 Karol Kosek // SPDX-License-Identifier: LGPL-2.1-or-later #include "roommemberevent.h" #include "converters.h" #include "logging.h" #include namespace Quotient { template <> struct JsonConverter { static Membership load(const QJsonValue& jv) { const auto& ms = jv.toString(); if (ms.isEmpty()) { qCWarning(EVENTS) << "Empty membership state"; return Membership::Invalid; } const auto it = std::find(MembershipStrings.begin(), MembershipStrings.end(), ms); if (it != MembershipStrings.end()) return Membership(1U << (it - MembershipStrings.begin())); qCWarning(EVENTS) << "Unknown Membership value: " << ms; return Membership::Invalid; } }; } // namespace Quotient using namespace Quotient; MemberEventContent::MemberEventContent(const QJsonObject& json) : membership(fromJson(json["membership"_ls])) , isDirect(json["is_direct"_ls].toBool()) , displayName(fromJson>(json["displayname"_ls])) , avatarUrl(fromJson>(json["avatar_url"_ls])) , reason(json["reason"_ls].toString()) { if (displayName) displayName = sanitized(*displayName); } void MemberEventContent::fillJson(QJsonObject* o) const { Q_ASSERT(o); if (membership != Membership::Invalid) o->insert( QStringLiteral("membership"), MembershipStrings[qCountTrailingZeroBits( std::underlying_type_t(membership)) + 1]); if (displayName) o->insert(QStringLiteral("displayname"), *displayName); if (avatarUrl && avatarUrl->isValid()) o->insert(QStringLiteral("avatar_url"), avatarUrl->toString()); if (!reason.isEmpty()) o->insert(QStringLiteral("reason"), reason); } bool RoomMemberEvent::changesMembership() const { return !prevContent() || prevContent()->membership != membership(); } bool RoomMemberEvent::isInvite() const { return membership() == Membership::Invite && changesMembership(); } bool RoomMemberEvent::isRejectedInvite() const { return membership() == Membership::Leave && prevContent() && prevContent()->membership == Membership::Invite; } bool RoomMemberEvent::isJoin() const { return membership() == Membership::Join && changesMembership(); } bool RoomMemberEvent::isLeave() const { return membership() == Membership::Leave && prevContent() && prevContent()->membership != membership() && prevContent()->membership != Membership::Ban && prevContent()->membership != Membership::Invite; } bool RoomMemberEvent::isBan() const { return membership() == Membership::Ban && changesMembership(); } bool RoomMemberEvent::isUnban() const { return membership() == Membership::Leave && prevContent() && prevContent()->membership == Membership::Ban; } bool RoomMemberEvent::isRename() const { return prevContent() && prevContent()->displayName ? newDisplayName() != *prevContent()->displayName : newDisplayName().has_value(); } bool RoomMemberEvent::isAvatarUpdate() const { return prevContent() && prevContent()->avatarUrl ? newAvatarUrl() != *prevContent()->avatarUrl : newAvatarUrl().has_value(); } '>17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
/******************************************************************************
 * THIS FILE IS GENERATED - ANY EDITS WILL BE OVERWRITTEN
 */

#pragma once

#include "converters.h"

#include "events/eventloader.h"
#include "jobs/basejob.h"

namespace Quotient {

// Operations

/*! \brief Listen on the event stream.
 *
 * This will listen for new events related to a particular room and return
 * them to the caller. This will block until an event is received, or until
 * the ``timeout`` is reached.
 *
 * This API is the same as the normal ``/events`` endpoint, but can be
 * called by users who have not joined the room.
 *
 * Note that the normal ``/events`` endpoint has been deprecated. This
 * API will also be deprecated at some point, but its replacement is not
 * yet known.
 */
class PeekEventsJob : public BaseJob {
public:
    /*! \brief Listen on the event stream.
     *
     * \param from
     *   The token to stream from. This token is either from a previous
     *   request to this API or from the initial sync API.
     * \param timeout
     *   The maximum time in milliseconds to wait for an event.
     * \param roomId
     *   The room ID for which events should be returned.
     */
    explicit PeekEventsJob(const QString& from = {},
                           Omittable<int> timeout = none,
                           const QString& roomId = {});

    /*! \brief Construct a URL without creating a full-fledged job object
     *
     * This function can be used when a URL for PeekEventsJob
     * is necessary but the job itself isn't.
     */
    static QUrl makeRequestUrl(QUrl baseUrl, const QString& from = {},
                               Omittable<int> timeout = none,
                               const QString& roomId = {});
    ~PeekEventsJob() override;

    // Result properties

    /// A token which correlates to the first value in ``chunk``. This
    /// is usually the same token supplied to ``from=``.
    const QString& begin() const;

    /// A token which correlates to the last value in ``chunk``. This
    /// token should be used in the next request to ``/events``.
    const QString& end() const;

    /// An array of events.
    RoomEvents&& chunk();

protected:
    Status parseJson(const QJsonDocument& data) override;

private:
    class Private;
    QScopedPointer<Private> d;
};

} // namespace Quotient