summary refs log tree commit diff
path: root/include/MatrixClient.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/MatrixClient.h')
-rw-r--r--include/MatrixClient.h290
1 files changed, 14 insertions, 276 deletions
diff --git a/include/MatrixClient.h b/include/MatrixClient.h

index eae57281..832d6cad 100644 --- a/include/MatrixClient.h +++ b/include/MatrixClient.h
@@ -1,287 +1,25 @@ -/* - * nheko Copyright (C) 2017 Konstantinos Sideris <siderisk@auth.gr> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - #pragma once -#include <QFileInfo> -#include <QJsonDocument> -#include <QNetworkAccessManager> -#include <QNetworkReply> -#include <QNetworkRequest> -#include <QUrl> -#include <memory> -#include <mtx.hpp> -#include <mtx/errors.hpp> - -class DownloadMediaProxy : public QObject -{ - Q_OBJECT - -signals: - void imageDownloaded(const QPixmap &data); - void fileDownloaded(const QByteArray &data); - void avatarDownloaded(const QImage &img); -}; +#include <QMetaType> -class StateEventProxy : public QObject -{ - Q_OBJECT - -signals: - void stateEventSent(); - void stateEventError(const QString &msg); -}; +#include <mtx/responses.hpp> +#include <mtxclient/http/client.hpp> +Q_DECLARE_METATYPE(mtx::responses::Login) +Q_DECLARE_METATYPE(mtx::responses::Messages) +Q_DECLARE_METATYPE(mtx::responses::Notifications) +Q_DECLARE_METATYPE(mtx::responses::Rooms) Q_DECLARE_METATYPE(mtx::responses::Sync) - -/* - * MatrixClient provides the high level API to communicate with - * a Matrix homeserver. All the responses are returned through signals. - */ -class MatrixClient : public QNetworkAccessManager -{ - Q_OBJECT -public: - MatrixClient(QObject *parent = 0); - - // Client API. - void initialSync() noexcept; - void sync() noexcept; - template<class EventBody, mtx::events::EventType EventT> - std::shared_ptr<StateEventProxy> sendStateEvent(const EventBody &body, - const QString &roomId, - const QString &stateKey = ""); - void sendRoomMessage(mtx::events::MessageType ty, - int txnId, - const QString &roomid, - const QString &msg, - const QString &mime, - uint64_t media_size, - const QString &url = "") noexcept; - void login(const QString &username, const QString &password) noexcept; - void registerUser(const QString &username, - const QString &password, - const QString &server, - const QString &session = "") noexcept; - void versions() noexcept; - void fetchRoomAvatar(const QString &roomid, const QUrl &avatar_url); - //! Download user's avatar. - QSharedPointer<DownloadMediaProxy> fetchUserAvatar(const QUrl &avatarUrl); - void fetchCommunityAvatar(const QString &communityId, const QUrl &avatarUrl); - void fetchCommunityProfile(const QString &communityId); - void fetchCommunityRooms(const QString &communityId); - QSharedPointer<DownloadMediaProxy> downloadImage(const QUrl &url); - QSharedPointer<DownloadMediaProxy> downloadFile(const QUrl &url); - void messages(const QString &room_id, const QString &from_token, int limit = 30) noexcept; - void uploadImage(const QString &roomid, - const QString &filename, - const QSharedPointer<QIODevice> data); - void uploadFile(const QString &roomid, - const QString &filename, - const QSharedPointer<QIODevice> data); - void uploadAudio(const QString &roomid, - const QString &filename, - const QSharedPointer<QIODevice> data); - void uploadVideo(const QString &roomid, - const QString &filename, - const QSharedPointer<QIODevice> data); - void uploadFilter(const QString &filter) noexcept; - void joinRoom(const QString &roomIdOrAlias); - void leaveRoom(const QString &roomId); - void sendTypingNotification(const QString &roomid, int timeoutInMillis = 20000); - void removeTypingNotification(const QString &roomid); - void readEvent(const QString &room_id, const QString &event_id); - void redactEvent(const QString &room_id, const QString &event_id); - void inviteUser(const QString &room_id, const QString &user); - void createRoom(const mtx::requests::CreateRoom &request); - void getNotifications() noexcept; - - QUrl getHomeServer() { return server_; }; - int transactionId() { return txn_id_; }; - int incrementTransactionId() { return ++txn_id_; }; - - void reset() noexcept; - -public slots: - void getOwnProfile() noexcept; - void getOwnCommunities() noexcept; - void logout() noexcept; - - void setServer(const QString &server) - { - server_ = QUrl(QString("%1://%2").arg(serverProtocol_).arg(server)); - }; - void setAccessToken(const QString &token) { token_ = token; }; - void setNextBatchToken(const QString &next_batch) { next_batch_ = next_batch; }; - -signals: - void loginError(const QString &error); - void registerError(const QString &error); - void registrationFlow(const QString &user, - const QString &pass, - const QString &server, - const QString &session); - void versionError(const QString &error); - - void loggedOut(); - void invitedUser(const QString &room_id, const QString &user); - void roomCreated(const QString &room_id); - - void loginSuccess(const QString &userid, const QString &homeserver, const QString &token); - void registerSuccess(const QString &userid, - const QString &homeserver, - const QString &token); - void versionSuccess(); - void uploadFailed(int statusCode, const QString &msg); - void imageUploaded(const QString &roomid, - const QString &filename, - const QString &url, - const QString &mime, - uint64_t size); - void fileUploaded(const QString &roomid, - const QString &filename, - const QString &url, - const QString &mime, - uint64_t size); - void audioUploaded(const QString &roomid, - const QString &filename, - const QString &url, - const QString &mime, - uint64_t size); - void videoUploaded(const QString &roomid, - const QString &filename, - const QString &url, - const QString &mime, - uint64_t size); - void roomAvatarRetrieved(const QString &roomid, - const QPixmap &img, - const QString &url, - const QByteArray &data); - void userAvatarRetrieved(const QString &userId, const QImage &img); - void communityAvatarRetrieved(const QString &communityId, const QPixmap &img); - void communityProfileRetrieved(const QString &communityId, const QJsonObject &profile); - void communityRoomsRetrieved(const QString &communityId, const QJsonObject &rooms); - - // Returned profile data for the user's account. - void getOwnProfileResponse(const QUrl &avatar_url, const QString &display_name); - void getOwnCommunitiesResponse(const QList<QString> &own_communities); - void initialSyncCompleted(const mtx::responses::Sync &response); - void initialSyncFailed(int status_code = -1); - void syncCompleted(const mtx::responses::Sync &response); - void syncFailed(const QString &msg); - void joinFailed(const QString &msg); - void messageSent(const QString &event_id, const QString &roomid, int txn_id); - void messageSendFailed(const QString &roomid, int txn_id); - void emoteSent(const QString &event_id, const QString &roomid, int txn_id); - void messagesRetrieved(const QString &room_id, const mtx::responses::Messages &msgs); - void joinedRoom(const QString &room_id); - void leftRoom(const QString &room_id); - void roomCreationFailed(const QString &msg); - - void redactionFailed(const QString &error); - void redactionCompleted(const QString &room_id, const QString &event_id); - void invalidToken(); - void syncError(const QString &error); - void notificationsRetrieved(const mtx::responses::Notifications &notifications); - -private: - QNetworkReply *makeUploadRequest(QSharedPointer<QIODevice> iodev); - QJsonObject getUploadReply(QNetworkReply *reply); - void setupAuth(QNetworkRequest &req) - { - req.setRawHeader("Authorization", QString("Bearer %1").arg(token_).toLocal8Bit()); - } - - // Client API prefix. - QString clientApiUrl_; - - // Media API prefix. - QString mediaApiUrl_; - - // The Matrix server used for communication. - QUrl server_; - - // The access token used for authentication. - QString token_; - - // Increasing transaction ID. - int txn_id_; - - //! Token to be used for the next sync. - QString next_batch_; - //! http or https (default). - QString serverProtocol_; - //! Filter to be send as filter-param for (initial) /sync requests. - QString filter_; -}; +Q_DECLARE_METATYPE(std::string) +Q_DECLARE_METATYPE(std::vector<std::string>); namespace http { -//! Initialize the http module -void -init(); - -//! Retrieve the client instance. -MatrixClient * +namespace v2 { +mtx::http::Client * client(); } -template<class EventBody, mtx::events::EventType EventT> -std::shared_ptr<StateEventProxy> -MatrixClient::sendStateEvent(const EventBody &body, const QString &roomId, const QString &stateKey) -{ - QUrl endpoint(server_); - endpoint.setPath(clientApiUrl_ + QString("/rooms/%1/state/%2/%3") - .arg(roomId) - .arg(QString::fromStdString(to_string(EventT))) - .arg(stateKey)); - - QNetworkRequest request(QString(endpoint.toEncoded())); - request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); - setupAuth(request); - - auto proxy = std::shared_ptr<StateEventProxy>(new StateEventProxy, - [](StateEventProxy *p) { p->deleteLater(); }); - - auto serializedBody = nlohmann::json(body).dump(); - auto reply = put(request, QByteArray(serializedBody.data(), serializedBody.size())); - connect(reply, &QNetworkReply::finished, this, [reply, proxy]() { - reply->deleteLater(); - - int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); - auto data = reply->readAll(); - - if (status == 0 || status >= 400) { - try { - mtx::errors::Error res = nlohmann::json::parse(data); - emit proxy->stateEventError(QString::fromStdString(res.error)); - } catch (const std::exception &e) { - emit proxy->stateEventError(QString::fromStdString(e.what())); - } - - return; - } - - try { - mtx::responses::EventId res = nlohmann::json::parse(data); - emit proxy->stateEventSent(); - } catch (const std::exception &e) { - emit proxy->stateEventError(QString::fromStdString(e.what())); - } - }); - - return proxy; +//! Initialize the http module +void +init(); }