diff --git a/src/rocketchatrestapi-qt5/autotests/serverinfojobtest.cpp b/src/rocketchatrestapi-qt5/autotests/serverinfojobtest.cpp index 2e4ed837..a2a1819e 100644 --- a/src/rocketchatrestapi-qt5/autotests/serverinfojobtest.cpp +++ b/src/rocketchatrestapi-qt5/autotests/serverinfojobtest.cpp @@ -1,53 +1,69 @@ /* Copyright (c) 2018-2019 Montel Laurent This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License or ( at your option ) version 3 or, at the discretion of KDE e.V. ( which shall act as a proxy as in section 14 of the GPLv3 ), any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "serverinfojobtest.h" #include "serverinfojob.h" #include "restapimethod.h" #include "ruqola_restapi_helper.h" #include QTEST_GUILESS_MAIN(ServerInfoJobTest) using namespace RocketChatRestApi; ServerInfoJobTest::ServerInfoJobTest(QObject *parent) : QObject(parent) { } void ServerInfoJobTest::shouldHaveDefaultValue() { ServerInfoJob job; verifyDefaultValue(&job); QVERIFY(!job.requireHttpAuthentication()); QVERIFY(!job.hasQueryParameterSupport()); + QVERIFY(job.useDeprecatedVersion()); } void ServerInfoJobTest::shouldGenerateRequest() { - ServerInfoJob job; - RestApiMethod *method = new RestApiMethod; - method->setServerUrl(QStringLiteral("http://www.kde.org")); - job.setRestApiMethod(method); - const QNetworkRequest request = job.request(); - QCOMPARE(request.url(), QUrl(QStringLiteral("http://www.kde.org/api/v1/info"))); - QCOMPARE(request.attribute(QNetworkRequest::HttpPipeliningAllowedAttribute).toBool(), true); - QCOMPARE(request.attribute(QNetworkRequest::HTTP2AllowedAttribute).toBool(), true); - - delete method; + { + ServerInfoJob job; + RestApiMethod *method = new RestApiMethod; + method->setServerUrl(QStringLiteral("http://www.kde.org")); + job.setRestApiMethod(method); + const QNetworkRequest request = job.request(); + QCOMPARE(request.url(), QUrl(QStringLiteral("http://www.kde.org/api/v1/info"))); + QCOMPARE(request.attribute(QNetworkRequest::HttpPipeliningAllowedAttribute).toBool(), true); + QCOMPARE(request.attribute(QNetworkRequest::HTTP2AllowedAttribute).toBool(), true); + + delete method; + } + { + ServerInfoJob job; + job.setUseDeprecatedVersion(false); + RestApiMethod *method = new RestApiMethod; + method->setServerUrl(QStringLiteral("http://www.kde.org")); + job.setRestApiMethod(method); + const QNetworkRequest request = job.request(); + QCOMPARE(request.url(), QUrl(QStringLiteral("http://www.kde.org/api/info"))); + QCOMPARE(request.attribute(QNetworkRequest::HttpPipeliningAllowedAttribute).toBool(), true); + QCOMPARE(request.attribute(QNetworkRequest::HTTP2AllowedAttribute).toBool(), true); + + delete method; + } } diff --git a/src/rocketchatrestapi-qt5/restapimethod.cpp b/src/rocketchatrestapi-qt5/restapimethod.cpp index 3dc3221d..8714b549 100644 --- a/src/rocketchatrestapi-qt5/restapimethod.cpp +++ b/src/rocketchatrestapi-qt5/restapimethod.cpp @@ -1,49 +1,49 @@ /* Copyright (c) 2018-2019 Montel Laurent This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License or ( at your option ) version 3 or, at the discretion of KDE e.V. ( which shall act as a proxy as in section 14 of the GPLv3 ), any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "restapimethod.h" #include "rocketchatqtrestapi_debug.h" using namespace RocketChatRestApi; RestApiMethod::RestApiMethod() { } QString RestApiMethod::serverUrl() const { return mServerUrl; } void RestApiMethod::setServerUrl(const QString &serverUrl) { mServerUrl = serverUrl; } -QUrl RestApiMethod::generateUrl(RestApiUtil::RestApiUrlType type, const QString &urlExtension) +QUrl RestApiMethod::generateUrl(RestApiUtil::RestApiUrlType type, const QString &urlExtension, bool useV1Extension) { if (mServerUrl.isEmpty()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Server url is empty"; return {}; } - QString urlStr = RestApiUtil::adaptUrl(mServerUrl) + RestApiUtil::apiUri() + RestApiUtil::restUrl(type); + QString urlStr = RestApiUtil::adaptUrl(mServerUrl) + (useV1Extension ? RestApiUtil::apiUri() : QStringLiteral("/api/")) + RestApiUtil::restUrl(type); if (!urlExtension.isEmpty()) { urlStr += QLatin1Char('/') + urlExtension; } return QUrl(urlStr); } diff --git a/src/rocketchatrestapi-qt5/restapimethod.h b/src/rocketchatrestapi-qt5/restapimethod.h index 0cc8696c..834df376 100644 --- a/src/rocketchatrestapi-qt5/restapimethod.h +++ b/src/rocketchatrestapi-qt5/restapimethod.h @@ -1,42 +1,42 @@ /* Copyright (c) 2018-2019 Montel Laurent This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License or ( at your option ) version 3 or, at the discretion of KDE e.V. ( which shall act as a proxy as in section 14 of the GPLv3 ), any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef RESTAPIMETHOD_H #define RESTAPIMETHOD_H #include "librestapi_private_export.h" #include "restapiutil.h" #include #include namespace RocketChatRestApi { class LIBROCKETCHATRESTAPI_QT5_TESTS_EXPORT RestApiMethod { public: RestApiMethod(); Q_REQUIRED_RESULT QString serverUrl() const; void setServerUrl(const QString &serverUrl); - Q_REQUIRED_RESULT QUrl generateUrl(RestApiUtil::RestApiUrlType type, const QString &urlExtension = QString()); + Q_REQUIRED_RESULT QUrl generateUrl(RestApiUtil::RestApiUrlType type, const QString &urlExtension = QString(), bool useV1Extension = true); private: QString mServerUrl; }; } #endif // RESTAPIMETHOD_H diff --git a/src/rocketchatrestapi-qt5/restapirequest.cpp b/src/rocketchatrestapi-qt5/restapirequest.cpp index 556caff0..327552b1 100644 --- a/src/rocketchatrestapi-qt5/restapirequest.cpp +++ b/src/rocketchatrestapi-qt5/restapirequest.cpp @@ -1,1491 +1,1492 @@ /* Copyright (c) 2017-2019 Montel Laurent This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License or ( at your option ) version 3 or, at the discretion of KDE e.V. ( which shall act as a proxy as in section 14 of the GPLv3 ), any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "restapimethod.h" #include "restapirequest.h" #include "rocketchatqtrestapi_debug.h" #include "serverinfojob.h" #include "uploadfilejob.h" #include "settings/privateinfojob.h" #include "channellistjob.h" #include "downloadfilejob.h" #include "spotlightjob.h" #include "users/getavatarjob.h" #include "users/setavatarjob.h" #include "users/forgotpasswordjob.h" #include "users/usersinfojob.h" #include "users/getpresencejob.h" #include "users/getusernamesuggestionjob.h" #include "misc/owninfojob.h" #include "emoji/loademojicustomjob.h" #include "authentication/logoutjob.h" #include "authentication/loginjob.h" #include "chat/starmessagejob.h" #include "chat/postmessagejob.h" #include "chat/deletemessagejob.h" #include "chat/updatemessagejob.h" #include "chat/reactonmessagejob.h" #include "chat/searchmessagejob.h" #include "chat/ignoreuserjob.h" #include "chat/reportmessagejob.h" #include "chat/pinmessagejob.h" #include "chat/followmessagejob.h" #include "chat/unfollowmessagejob.h" #include "chat/getthreadsjob.h" #include "chat/getthreadmessagesjob.h" #include "chat/sendmessagejob.h" #include "channels/changechanneltopicjob.h" #include "channels/changechannelannouncementjob.h" #include "channels/createchanneljob.h" #include "channels/leavechanneljob.h" #include "channels/channelclosejob.h" #include "channels/channelhistoryjob.h" #include "channels/changechanneldescriptionjob.h" #include "channels/archivechanneljob.h" #include "channels/channelfilesjob.h" #include "channels/channelinvitejob.h" #include "channels/setchanneltypejob.h" #include "channels/getchannelrolesjob.h" #include "channels/setjoincodechanneljob.h" #include "channels/channeljoinjob.h" #include "channels/channelinfojob.h" #include "channels/changechannelnamejob.h" #include "channels/channelgetallusermentionsjob.h" #include "channels/channelkickjob.h" #include "channels/channeladdownerjob.h" #include "channels/channelremoveownerjob.h" #include "channels/channeladdmoderatorjob.h" #include "channels/channelremovemoderatorjob.h" #include "channels/channeldeletejob.h" #include "channels/channelmembersjob.h" #include "channels/changechannelreadonlyjob.h" #include "channels/changechannelencryptedjob.h" #include "channels/channeladdleaderjob.h" #include "channels/channelremoveleaderjob.h" #include "groups/changegroupsannouncementjob.h" #include "groups/changegroupstopicjob.h" #include "groups/creategroupsjob.h" #include "groups/leavegroupsjob.h" #include "groups/changegroupsdescriptionjob.h" #include "groups/archivegroupsjob.h" #include "groups/groupsinvitejob.h" #include "groups/setgrouptypejob.h" #include "groups/getgrouprolesjob.h" #include "groups/changegroupsnamejob.h" #include "groups/groupsinfojob.h" #include "groups/groupskickjob.h" #include "groups/groupaddleaderjob.h" #include "groups/groupremoveleaderjob.h" #include "groups/groupaddownerjob.h" #include "groups/groupremoveownerjob.h" #include "groups/groupaddmoderatorjob.h" #include "groups/groupremovemoderatorjob.h" #include "groups/groupsdeletejob.h" #include "groups/changegroupsreadonlyjob.h" #include "groups/changegroupsencryptedjob.h" #include "rooms/getroomsjob.h" #include "rooms/roomfavoritejob.h" #include "rooms/savenotificationjob.h" #include "rooms/roomstartdiscussionjob.h" #include "rooms/getdiscussionsjob.h" #include "directmessage/createdmjob.h" #include "directmessage/opendmjob.h" #include "subscriptions/markroomasreadjob.h" #include "subscriptions/markroomasunreadjob.h" #include "permissions/listpermissionsjob.h" #include "commands/listcommandsjob.h" #include "e2e/fetchmykeysjob.h" #include "video-conference/videoconfupdatejitsitimeoutjob.h" #include #include #include #include #include using namespace RocketChatRestApi; RestApiRequest::RestApiRequest(QObject *parent) : QObject(parent) { mRestApiMethod = new RestApiMethod; mCookieJar = new QNetworkCookieJar; mNetworkAccessManager = new QNetworkAccessManager(this); mNetworkAccessManager->setCookieJar(mCookieJar); connect(mNetworkAccessManager, &QNetworkAccessManager::finished, this, &RestApiRequest::slotResult); connect(mNetworkAccessManager, &QNetworkAccessManager::sslErrors, this, &RestApiRequest::slotSslErrors); } RestApiRequest::~RestApiRequest() { delete mRestApiMethod; } void RestApiRequest::setRestApiLogger(RocketChatRestApi::AbstractLogger *logger) { mRuqolaLogger = logger; } void RestApiRequest::initializeCookies() { QString url = serverUrl(); if (!url.isEmpty()) { QString host; QStringList lsthost = url.split(QStringLiteral("//")); if (lsthost.count() < 2) { host = url; } else { host = lsthost.at(1); } if (!mUserId.isEmpty()) { QNetworkCookie userIdCookie; userIdCookie.setDomain(host); userIdCookie.setName(QByteArrayLiteral("rc_uid")); userIdCookie.setValue(mUserId.toLocal8Bit()); mCookieJar->insertCookie(userIdCookie); } if (!mAuthToken.isEmpty()) { QNetworkCookie tokenCookie; tokenCookie.setDomain(host); tokenCookie.setName(QByteArrayLiteral("rc_token")); tokenCookie.setValue(mAuthToken.toLocal8Bit()); mCookieJar->insertCookie(tokenCookie); } } else { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "We can not initialize cookies as server url is empty."; } } void RestApiRequest::setAuthToken(const QString &authToken) { const bool isChanged = (mAuthToken != authToken); mAuthToken = authToken; if (isChanged) { if (!mAuthToken.isEmpty()) { initializeCookies(); } } } void RestApiRequest::setUserId(const QString &userId) { const bool isChanged = (mUserId != userId); mUserId = userId; if (isChanged) { if (!mUserId.isEmpty()) { initializeCookies(); } } } void RestApiRequest::slotResult(QNetworkReply *reply) { if (reply->error() != QNetworkReply::NoError) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << " Error reply - "<errorString(); } } void RestApiRequest::slotSslErrors(QNetworkReply *reply, const QList &error) { qCDebug(ROCKETCHATQTRESTAPI_LOG) << " void RestApiRequest::slotSslErrors(QNetworkReply *reply, const QList &error)" << error.count(); reply->ignoreSslErrors(error); } void RestApiRequest::setPassword(const QString &password) { mPassword = password; } void RestApiRequest::setUserName(const QString &userName) { mUserName = userName; } QString RestApiRequest::serverUrl() const { return mRestApiMethod->serverUrl(); } void RestApiRequest::setServerUrl(const QString &serverUrl) { mRestApiMethod->setServerUrl(serverUrl); } QString RestApiRequest::authToken() const { return mAuthToken; } QString RestApiRequest::userId() const { return mUserId; } void RestApiRequest::login() { LoginJob *job = new LoginJob(this); connect(job, &LoginJob::loginDone, this, &RestApiRequest::slotLogin); initializeRestApiJob(job); job->setPassword(mPassword); job->setUserName(mUserName); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::slotLogin(const QString &authToken, const QString &userId) { mAuthToken = authToken; mUserId = userId; } void RestApiRequest::slotLogout() { mUserId.clear(); mAuthToken.clear(); Q_EMIT logoutDone(); } void RestApiRequest::initializeRestApiJob(RocketChatRestApi::RestApiAbstractJob *job) { connect(job, &RocketChatRestApi::RestApiAbstractJob::failed, this, &RestApiRequest::failed); job->setNetworkAccessManager(mNetworkAccessManager); job->setRestApiLogger(mRuqolaLogger); job->setRestApiMethod(mRestApiMethod); if (job->requireHttpAuthentication()) { job->setAuthToken(mAuthToken); job->setUserId(mUserId); } } void RestApiRequest::logout() { LogoutJob *job = new LogoutJob(this); connect(job, &LogoutJob::logoutDone, this, &RestApiRequest::slotLogout); initializeRestApiJob(job); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::channelList() { ChannelListJob *job = new ChannelListJob(this); connect(job, &ChannelListJob::channelListDone, this, &RestApiRequest::channelListDone); initializeRestApiJob(job); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::getAvatar(const QString &userId) { GetAvatarJob *job = new GetAvatarJob(this); connect(job, &GetAvatarJob::avatar, this, &RestApiRequest::avatar); connect(job, &GetAvatarJob::redownloadAvatar, this, &RestApiRequest::redownloadAvatar); initializeRestApiJob(job); job->setAvatarUserId(userId); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::getPrivateSettings() { PrivateInfoJob *job = new PrivateInfoJob(this); connect(job, &PrivateInfoJob::privateInfoDone, this, &RestApiRequest::privateInfoDone); initializeRestApiJob(job); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::getOwnInfo() { OwnInfoJob *job = new OwnInfoJob(this); connect(job, &OwnInfoJob::ownInfoDone, this, &RestApiRequest::getOwnInfoDone); initializeRestApiJob(job); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::starMessage(const QString &messageId, bool starred) { StarMessageJob *job = new StarMessageJob(this); initializeRestApiJob(job); job->setMessageId(messageId); job->setStarMessage(starred); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::downloadFile(const QUrl &url, const QString &mimeType, bool storeInCache, const QUrl &localFileUrl) { DownloadFileJob *job = new DownloadFileJob(this); connect(job, &DownloadFileJob::downloadFileDone, this, &RestApiRequest::downloadFileDone); job->setUrl(url); job->setMimeType(mimeType); job->setLocalFileUrl(localFileUrl); job->setStoreInCache(storeInCache); initializeRestApiJob(job); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } -void RestApiRequest::serverInfo() +void RestApiRequest::serverInfo(bool useDeprecatedVersion) { ServerInfoJob *job = new ServerInfoJob(this); + job->setUseDeprecatedVersion(useDeprecatedVersion); initializeRestApiJob(job); connect(job, &ServerInfoJob::serverInfoDone, this, &RestApiRequest::getServerInfoDone); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::uploadFile(const QString &roomId, const QString &description, const QString &text, const QUrl &filename) { UploadFileJob *job = new UploadFileJob(this); initializeRestApiJob(job); job->setDescription(description); job->setMessageText(text); job->setFilenameUrl(filename); job->setRoomId(roomId); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::changeChannelTopic(const QString &roomId, const QString &topic) { ChangeChannelTopicJob *job = new ChangeChannelTopicJob(this); initializeRestApiJob(job); job->setRoomId(roomId); job->setTopic(topic); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::changeGroupsTopic(const QString &roomId, const QString &topic) { ChangeGroupsTopicJob *job = new ChangeGroupsTopicJob(this); initializeRestApiJob(job); job->setRoomId(roomId); job->setTopic(topic); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::changeChannelReadOnly(const QString &roomId, bool b) { ChangeChannelReadonlyJob *job = new ChangeChannelReadonlyJob(this); initializeRestApiJob(job); job->setRoomId(roomId); job->setReadOnly(b); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::changeGroupsReadOnly(const QString &roomId, bool b) { ChangeGroupsReadonlyJob *job = new ChangeGroupsReadonlyJob(this); initializeRestApiJob(job); job->setRoomId(roomId); job->setReadOnly(b); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::changeChannelEncrypted(const QString &roomId, bool b) { ChangeChannelEncryptedJob *job = new ChangeChannelEncryptedJob(this); initializeRestApiJob(job); job->setRoomId(roomId); job->setEncrypted(b); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::changeGroupsEncrypted(const QString &roomId, bool b) { ChangeGroupsEncryptedJob *job = new ChangeGroupsEncryptedJob(this); initializeRestApiJob(job); job->setRoomId(roomId); job->setEncrypted(b); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::changeChannelAnnouncement(const QString &roomId, const QString &announcement) { ChangeChannelAnnouncementJob *job = new ChangeChannelAnnouncementJob(this); initializeRestApiJob(job); job->setRoomId(roomId); job->setAnnouncement(announcement); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::changeGroupsAnnouncement(const QString &roomId, const QString &announcement) { ChangeGroupsAnnouncementJob *job = new ChangeGroupsAnnouncementJob(this); initializeRestApiJob(job); job->setRoomId(roomId); job->setAnnouncement(announcement); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::changeChannelDescription(const QString &roomId, const QString &description) { ChangeChannelDescriptionJob *job = new ChangeChannelDescriptionJob(this); initializeRestApiJob(job); job->setRoomId(roomId); job->setDescription(description); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::changeGroupsDescription(const QString &roomId, const QString &description) { ChangeGroupsDescriptionJob *job = new ChangeGroupsDescriptionJob(this); initializeRestApiJob(job); job->setRoomId(roomId); job->setDescription(description); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::postMessage(const QString &roomId, const QString &text) { PostMessageJob *job = new PostMessageJob(this); initializeRestApiJob(job); job->setRoomId(roomId); job->setText(text); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::deleteMessage(const QString &roomId, const QString &messageId) { DeleteMessageJob *job = new DeleteMessageJob(this); initializeRestApiJob(job); job->setRoomId(roomId); job->setMessageId(messageId); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::slotAddJoinCodeToChannel(const QString &channelId, const QString &password) { setJoinCodeChannel(channelId, password); } void RestApiRequest::createChannels(const QString &channelName, bool readOnly, const QStringList &members, const QString &password) { CreateChannelJob *job = new CreateChannelJob(this); connect(job, &CreateChannelJob::addJoinCodeToChannel, this, &RestApiRequest::slotAddJoinCodeToChannel); initializeRestApiJob(job); job->setChannelName(channelName); job->setReadOnly(readOnly); job->setMembers(members); job->setPassword(password); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::createGroups(const QString &channelName, bool readOnly, const QStringList &members) { CreateGroupsJob *job = new CreateGroupsJob(this); initializeRestApiJob(job); job->setChannelName(channelName); job->setReadOnly(readOnly); job->setMembers(members); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::leaveChannel(const QString &roomId) { LeaveChannelJob *job = new LeaveChannelJob(this); initializeRestApiJob(job); job->setRoomId(roomId); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::leaveGroups(const QString &roomId) { LeaveGroupsJob *job = new LeaveGroupsJob(this); initializeRestApiJob(job); job->setRoomId(roomId); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::archiveChannel(const QString &roomId, bool archive) { ArchiveChannelJob *job = new ArchiveChannelJob(this); initializeRestApiJob(job); job->setRoomId(roomId); job->setArchive(archive); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::archiveGroups(const QString &roomId, bool archive) { ArchiveGroupsJob *job = new ArchiveGroupsJob(this); initializeRestApiJob(job); job->setRoomId(roomId); job->setArchive(archive); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::updateMessage(const QString &roomId, const QString &messageId, const QString &text) { UpdateMessageJob *job = new UpdateMessageJob(this); initializeRestApiJob(job); job->setRoomId(roomId); job->setMessageId(messageId); job->setUpdatedText(text); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::reactOnMessage(const QString &messageId, const QString &emoji, bool shouldReact) { ReactOnMessageJob *job = new ReactOnMessageJob(this); initializeRestApiJob(job); job->setMessageId(messageId); QString fixedEmoji = emoji; if (fixedEmoji.startsWith(QLatin1Char(':'))) { fixedEmoji.remove(0, 1); } if (fixedEmoji.endsWith(QLatin1Char(':'))) { fixedEmoji.chop(1); } job->setEmoji(fixedEmoji); job->setShouldReact(shouldReact); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::closeChannel(const QString &roomId, const QString &type) { ChannelCloseJob *job = new ChannelCloseJob(this); initializeRestApiJob(job); job->setRoomId(roomId); if (type == QLatin1String("d")) { job->setChannelType(ChannelCloseJob::Direct); } else if (type == QLatin1String("p")) { job->setChannelType(ChannelCloseJob::Groups); } else if (type == QLatin1String("c")) { job->setChannelType(ChannelCloseJob::Channel); } if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::historyChannel(const QString &roomId, const QString &type) { ChannelHistoryJob *job = new ChannelHistoryJob(this); initializeRestApiJob(job); job->setRoomId(roomId); if (type == QLatin1String("d")) { job->setChannelType(ChannelHistoryJob::Direct); } else if (type == QLatin1String("p")) { job->setChannelType(ChannelHistoryJob::Groups); } else if (type == QLatin1String("c")) { job->setChannelType(ChannelHistoryJob::Channel); } if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::createDirectMessage(const QString &userName) { CreateDmJob *job = new CreateDmJob(this); initializeRestApiJob(job); job->setUserName(userName); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::openDirectMessage(const QString &userId) { OpenDmJob *job = new OpenDmJob(this); initializeRestApiJob(job); job->setDirectUserId(userId); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::filesInRoom(const QString &roomId, const QString &type, int offset, int count) { ChannelFilesJob *job = new ChannelFilesJob(this); connect(job, &ChannelFilesJob::channelFilesDone, this, &RestApiRequest::channelFilesDone); initializeRestApiJob(job); job->setRoomId(roomId); QueryParameters parameters; parameters.setCount(count); parameters.setOffset(offset); job->setQueryParameters(parameters); if (type == QLatin1String("d")) { job->setChannelType(ChannelFilesJob::Direct); } else if (type == QLatin1String("p")) { job->setChannelType(ChannelFilesJob::Groups); } else if (type == QLatin1String("c")) { job->setChannelType(ChannelFilesJob::Channel); } if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } //FIXME void RestApiRequest::membersInRoom(const QString &roomId, const QString &type, int offset, int count) { ChannelMembersJob *job = new ChannelMembersJob(this); QueryParameters parameters; parameters.setCount(count); parameters.setOffset(offset); job->setQueryParameters(parameters); connect(job, &ChannelMembersJob::channelMembersDone, this, &RestApiRequest::channelMembersDone); initializeRestApiJob(job); job->setRoomId(roomId); if (type == QLatin1String("d")) { job->setChannelType(ChannelMembersJob::Direct); } else if (type == QLatin1String("p")) { job->setChannelType(ChannelMembersJob::Groups); } else if (type == QLatin1String("c")) { job->setChannelType(ChannelMembersJob::Channel); } if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::addUserInChannel(const QString &roomId, const QString &userId) { ChannelInviteJob *job = new ChannelInviteJob(this); initializeRestApiJob(job); job->setRoomId(roomId); job->setInviteUserId(userId); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::addUserInGroup(const QString &roomId, const QString &userId) { GroupsInviteJob *job = new GroupsInviteJob(this); initializeRestApiJob(job); job->setRoomId(roomId); job->setUserId(userId); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::listEmojiCustom() { LoadEmojiCustomJob *job = new LoadEmojiCustomJob(this); initializeRestApiJob(job); connect(job, &LoadEmojiCustomJob::loadEmojiCustomDone, this, &RestApiRequest::loadEmojiCustomDone); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::searchRoomUser(const QString &pattern) { SpotlightJob *job = new SpotlightJob(this); job->setSearchPattern(pattern); initializeRestApiJob(job); connect(job, &SpotlightJob::spotlightDone, this, &RestApiRequest::spotlightDone); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::searchMessages(const QString &roomId, const QString &pattern) { SearchMessageJob *job = new SearchMessageJob(this); job->setRoomId(roomId); job->setSearchText(pattern); initializeRestApiJob(job); connect(job, &SearchMessageJob::searchMessageDone, this, &RestApiRequest::searchMessageDone); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::markAsRead(const QString &roomId) { MarkRoomAsReadJob *job = new MarkRoomAsReadJob(this); job->setRoomId(roomId); initializeRestApiJob(job); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::markRoomAsUnRead(const QString &roomId) { MarkRoomAsUnReadJob *job = new MarkRoomAsUnReadJob(this); job->setObjectId(roomId); job->setUnReadObject(MarkRoomAsUnReadJob::Room); initializeRestApiJob(job); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::markMessageAsUnReadFrom(const QString &messageId) { MarkRoomAsUnReadJob *job = new MarkRoomAsUnReadJob(this); job->setObjectId(messageId); job->setUnReadObject(MarkRoomAsUnReadJob::FromMessage); initializeRestApiJob(job); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::getRooms() { GetRoomsJob *job = new GetRoomsJob(this); initializeRestApiJob(job); connect(job, &GetRoomsJob::getRoomsDone, this, &RestApiRequest::getRoomsDone); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::markAsFavorite(const QString &roomId, bool favorite) { RoomFavoriteJob *job = new RoomFavoriteJob(this); initializeRestApiJob(job); job->setFavorite(favorite); job->setRoomId(roomId); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::disableNotifications(const QString &roomId, bool value) { SaveNotificationJob *job = new SaveNotificationJob(this); initializeRestApiJob(job); job->setRoomId(roomId); job->setDisableNotifications(value); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::muteGroupMentions(const QString &roomId, bool value) { SaveNotificationJob *job = new SaveNotificationJob(this); initializeRestApiJob(job); job->setRoomId(roomId); job->setMuteGroupMentions(value); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::desktopDurationNotifications(const QString &roomId, int value) { SaveNotificationJob *job = new SaveNotificationJob(this); initializeRestApiJob(job); job->setRoomId(roomId); job->setDesktopNotificationDuration(value); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::desktopSoundNotifications(const QString &roomId, const QString &value) { SaveNotificationJob *job = new SaveNotificationJob(this); initializeRestApiJob(job); job->setRoomId(roomId); job->setAudioNotificationValue(value); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::changeGroupName(const QString &roomId, const QString &newName) { ChangeGroupsNameJob *job = new ChangeGroupsNameJob(this); initializeRestApiJob(job); job->setRoomId(roomId); job->setName(newName); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::changeChannelName(const QString &roomId, const QString &newName) { ChangeChannelNameJob *job = new ChangeChannelNameJob(this); initializeRestApiJob(job); job->setRoomId(roomId); job->setName(newName); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::channelInfo(const QString &roomId) { ChannelInfoJob *job = new ChannelInfoJob(this); initializeRestApiJob(job); job->setRoomId(roomId); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::groupInfo(const QString &roomId) { GroupsInfoJob *job = new GroupsInfoJob(this); initializeRestApiJob(job); job->setRoomId(roomId); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::hideUnreadStatus(const QString &roomId, bool value) { SaveNotificationJob *job = new SaveNotificationJob(this); initializeRestApiJob(job); job->setRoomId(roomId); job->setHideUnreadStatus(value); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::audioNotifications(const QString &roomId, const QString &value) { SaveNotificationJob *job = new SaveNotificationJob(this); initializeRestApiJob(job); job->setRoomId(roomId); job->setAudioNotifications(value); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::desktopNotifications(const QString &roomId, const QString &value) { SaveNotificationJob *job = new SaveNotificationJob(this); initializeRestApiJob(job); job->setRoomId(roomId); job->setDesktopNotifications(value); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::emailNotifications(const QString &roomId, const QString &value) { SaveNotificationJob *job = new SaveNotificationJob(this); initializeRestApiJob(job); job->setRoomId(roomId); job->setEmailNotifications(value); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::mobilePushNotifications(const QString &roomId, const QString &value) { SaveNotificationJob *job = new SaveNotificationJob(this); initializeRestApiJob(job); job->setRoomId(roomId); job->setMobilePushNotifications(value); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::unreadAlert(const QString &roomId, const QString &value) { SaveNotificationJob *job = new SaveNotificationJob(this); initializeRestApiJob(job); job->setRoomId(roomId); job->setUnreadAlert(value); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::setAvatar(const QString &avatarUrl) { SetAvatarJob *job = new SetAvatarJob(this); initializeRestApiJob(job); job->setAvatarUrl(avatarUrl); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::forgotPassword(const QString &email) { ForgotPasswordJob *job = new ForgotPasswordJob(this); initializeRestApiJob(job); job->setEmail(email); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::userInfo(const QString &identifier, bool userName) { UsersInfoJob *job = new UsersInfoJob(this); initializeRestApiJob(job); job->setIdentifier(identifier); job->setUseUserName(userName); connect(job, &UsersInfoJob::usersInfoDone, this, &RestApiRequest::usersInfoDone); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::ignoreUser(const QString &roomId, const QString &userId, bool ignore) { IgnoreUserJob *job = new IgnoreUserJob(this); initializeRestApiJob(job); job->setIgnoreUserId(userId); job->setRoomId(roomId); job->setIgnore(ignore); connect(job, &IgnoreUserJob::ignoreUserDone, this, &RestApiRequest::ignoreUserDone); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::userPresence(const QString &userId) { GetPresenceJob *job = new GetPresenceJob(this); initializeRestApiJob(job); job->setPresenceUserId(userId); connect(job, &GetPresenceJob::getPresenceDone, this, &RestApiRequest::getPresenceDone); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::reportMessage(const QString &messageId, const QString &message) { ReportMessageJob *job = new ReportMessageJob(this); initializeRestApiJob(job); job->setMessageId(messageId); job->setReportMessage(message); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::setGroupType(const QString &roomId, bool isPrivate) { SetGroupTypeJob *job = new SetGroupTypeJob(this); initializeRestApiJob(job); job->setRoomId(roomId); job->setType(isPrivate ? SetGroupTypeJob::Private : SetGroupTypeJob::Public); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::setChannelType(const QString &roomId, bool isPrivate) { SetChannelTypeJob *job = new SetChannelTypeJob(this); initializeRestApiJob(job); job->setRoomId(roomId); job->setType(isPrivate ? SetChannelTypeJob::Private : SetChannelTypeJob::Public); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } void RestApiRequest::getGroupRoles(const QString &roomId) { GetGroupRolesJob *job = new GetGroupRolesJob(this); initializeRestApiJob(job); job->setRoomId(roomId); connect(job, &GetGroupRolesJob::groupRolesDone, this, &RestApiRequest::channelRolesDone); if (!job->start()) { qCDebug(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start getGroupRoles job"; } } void RestApiRequest::getChannelRoles(const QString &roomId) { GetChannelRolesJob *job = new GetChannelRolesJob(this); initializeRestApiJob(job); job->setRoomId(roomId); connect(job, &GetChannelRolesJob::channelRolesDone, this, &RestApiRequest::channelRolesDone); if (!job->start()) { qCDebug(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start GetChannelRolesJob job"; } } void RestApiRequest::getUsernameSuggestion() { GetUsernameSuggestionJob *job = new GetUsernameSuggestionJob(this); initializeRestApiJob(job); connect(job, &GetUsernameSuggestionJob::getUsernameSuggestionDone, this, &RestApiRequest::getUsernameSuggestionDone); if (!job->start()) { qCDebug(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start getUsernameSuggestion job"; } } void RestApiRequest::listPermissions() { ListPermissionsJob *job = new ListPermissionsJob(this); initializeRestApiJob(job); connect(job, &ListPermissionsJob::listPermissionDone, this, &RestApiRequest::listPermissionDone); if (!job->start()) { qCDebug(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start ListPermissionsJob job"; } } void RestApiRequest::listCommands() { ListCommandsJob *job = new ListCommandsJob(this); initializeRestApiJob(job); connect(job, &ListCommandsJob::listCommandsDone, this, &RestApiRequest::listCommandsDone); if (!job->start()) { qCDebug(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start ListPermissionsJob job"; } } void RestApiRequest::fetchMyKeys() { FetchMyKeysJob *job = new FetchMyKeysJob(this); initializeRestApiJob(job); connect(job, &FetchMyKeysJob::fetchMyKeysDone, this, &RestApiRequest::fetchMyKeysDone); if (!job->start()) { qCDebug(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start fetchmykeys job"; } } void RestApiRequest::setJoinCodeChannel(const QString &roomId, const QString &joinCode) { SetJoinCodeChannelJob *job = new SetJoinCodeChannelJob(this); initializeRestApiJob(job); job->setJoinCode(joinCode); job->setRoomId(roomId); connect(job, &SetJoinCodeChannelJob::setJoinCodeDone, this, &RestApiRequest::setJoinCodeDone); if (!job->start()) { qCDebug(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start setjoincode"; } } void RestApiRequest::updatejitsiTimeOut(const QString &roomId) { VideoConfUpdateJitsiTimeOutJob *job = new VideoConfUpdateJitsiTimeOutJob(this); initializeRestApiJob(job); job->setRoomId(roomId); connect(job, &VideoConfUpdateJitsiTimeOutJob::updateJitsiTimeOutDone, this, &RestApiRequest::updateJitsiTimeOutDone); if (!job->start()) { qCDebug(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start VideoConfUpdateJitsiTimeOutJob"; } } void RestApiRequest::channelJoin(const QString &roomId, const QString &joinCode) { ChannelJoinJob *job = new ChannelJoinJob(this); initializeRestApiJob(job); job->setJoinCode(joinCode); job->setRoomId(roomId); connect(job, &ChannelJoinJob::setChannelJoinDone, this, &RestApiRequest::setChannelJoinDone); connect(job, &ChannelJoinJob::missingChannelPassword, this, &RestApiRequest::missingChannelPassword); connect(job, &ChannelJoinJob::openArchivedRoom, this, &RestApiRequest::openArchivedRoom); if (!job->start()) { qCDebug(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start setChannelJoin"; } } void RestApiRequest::channelGetAllUserMentions(const QString &roomId, int offset, int count) { ChannelGetAllUserMentionsJob *job = new ChannelGetAllUserMentionsJob(this); initializeRestApiJob(job); job->setRoomId(roomId); QueryParameters parameters; QMap map; map.insert(QStringLiteral("_updatedAt"), QueryParameters::SortOrder::Descendant); parameters.setSorting(map); parameters.setCount(count); parameters.setOffset(offset); job->setQueryParameters(parameters); connect(job, &ChannelGetAllUserMentionsJob::channelGetAllUserMentionsDone, this, &RestApiRequest::channelGetAllUserMentionsDone); if (!job->start()) { qCDebug(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start setChannelJoin"; } } void RestApiRequest::channelKick(const QString &roomId, const QString &userId) { ChannelKickJob *job = new ChannelKickJob(this); initializeRestApiJob(job); job->setKickUserId(userId); job->setRoomId(roomId); connect(job, &ChannelKickJob::kickUserDone, this, &RestApiRequest::channelKickUserDone); if (!job->start()) { qCDebug(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start channelKick"; } } void RestApiRequest::groupKick(const QString &roomId, const QString &userId) { GroupsKickJob *job = new GroupsKickJob(this); initializeRestApiJob(job); job->setKickUserId(userId); job->setRoomId(roomId); connect(job, &GroupsKickJob::kickUserDone, this, &RestApiRequest::groupKickUserDone); if (!job->start()) { qCDebug(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start channelKick"; } } void RestApiRequest::groupAddModerator(const QString &roomId, const QString &userId) { GroupAddModeratorJob *job = new GroupAddModeratorJob(this); initializeRestApiJob(job); job->setAddModeratorUserId(userId); job->setRoomId(roomId); connect(job, &GroupAddModeratorJob::addModeratorDone, this, &RestApiRequest::addModeratorDone); if (!job->start()) { qCDebug(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start groupAddModerator"; } } void RestApiRequest::groupRemoveModerator(const QString &roomId, const QString &userId) { GroupRemoveModeratorJob *job = new GroupRemoveModeratorJob(this); initializeRestApiJob(job); job->setRemoveUserId(userId); job->setRoomId(roomId); connect(job, &GroupRemoveModeratorJob::removeModeratorDone, this, &RestApiRequest::removeModeratorDone); if (!job->start()) { qCDebug(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start groupRemoveModerator"; } } void RestApiRequest::groupAddLeader(const QString &roomId, const QString &userId) { GroupAddLeaderJob *job = new GroupAddLeaderJob(this); initializeRestApiJob(job); job->setAddLeaderUserId(userId); job->setRoomId(roomId); connect(job, &GroupAddLeaderJob::addLeaderDone, this, &RestApiRequest::addLeaderDone); if (!job->start()) { qCDebug(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start groupAddLeader"; } } void RestApiRequest::groupRemoveLeader(const QString &roomId, const QString &userId) { GroupRemoveLeaderJob *job = new GroupRemoveLeaderJob(this); initializeRestApiJob(job); job->setRemoveUserId(userId); job->setRoomId(roomId); connect(job, &GroupRemoveLeaderJob::removeLeaderDone, this, &RestApiRequest::removeLeaderDone); if (!job->start()) { qCDebug(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start groupRemoveLeader"; } } void RestApiRequest::groupAddOwner(const QString &roomId, const QString &userId) { GroupAddOwnerJob *job = new GroupAddOwnerJob(this); initializeRestApiJob(job); job->setAddownerUserId(userId); job->setRoomId(roomId); connect(job, &GroupAddOwnerJob::addOwnerDone, this, &RestApiRequest::addOwnerDone); if (!job->start()) { qCDebug(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start groupAddOwner"; } } void RestApiRequest::groupRemoveOwner(const QString &roomId, const QString &userId) { GroupRemoveOwnerJob *job = new GroupRemoveOwnerJob(this); initializeRestApiJob(job); job->setRemoveUserId(userId); job->setRoomId(roomId); connect(job, &GroupRemoveOwnerJob::removeOwnerDone, this, &RestApiRequest::removeOwnerDone); if (!job->start()) { qCDebug(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start groupRemoveOwner"; } } void RestApiRequest::channelAddModerator(const QString &roomId, const QString &userId) { ChannelAddModeratorJob *job = new ChannelAddModeratorJob(this); initializeRestApiJob(job); job->setAddModeratorUserId(userId); job->setRoomId(roomId); connect(job, &ChannelAddModeratorJob::addModeratorDone, this, &RestApiRequest::addModeratorDone); if (!job->start()) { qCDebug(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start channelAddModerator"; } } void RestApiRequest::channelRemoveModerator(const QString &roomId, const QString &userId) { ChannelRemoveModeratorJob *job = new ChannelRemoveModeratorJob(this); initializeRestApiJob(job); job->setRemoveUserId(userId); job->setRoomId(roomId); connect(job, &ChannelRemoveModeratorJob::removeModeratorDone, this, &RestApiRequest::removeModeratorDone); if (!job->start()) { qCDebug(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start ChannelRemoveModeratorJob"; } } void RestApiRequest::channelAddLeader(const QString &roomId, const QString &userId) { ChannelAddLeaderJob *job = new ChannelAddLeaderJob(this); initializeRestApiJob(job); job->setAddLeaderUserId(userId); job->setRoomId(roomId); connect(job, &ChannelAddLeaderJob::addLeaderDone, this, &RestApiRequest::addLeaderDone); if (!job->start()) { qCDebug(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start channelAddLeader"; } } void RestApiRequest::channelRemoveLeader(const QString &roomId, const QString &userId) { ChannelRemoveLeaderJob *job = new ChannelRemoveLeaderJob(this); initializeRestApiJob(job); job->setRemoveUserId(userId); job->setRoomId(roomId); connect(job, &ChannelRemoveLeaderJob::removeLeaderDone, this, &RestApiRequest::removeLeaderDone); if (!job->start()) { qCDebug(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start channelRemoveLeader"; } } void RestApiRequest::channelAddOwner(const QString &roomId, const QString &userId) { ChannelAddOwnerJob *job = new ChannelAddOwnerJob(this); initializeRestApiJob(job); job->setAddownerUserId(userId); job->setRoomId(roomId); connect(job, &ChannelAddOwnerJob::addOwnerDone, this, &RestApiRequest::addOwnerDone); if (!job->start()) { qCDebug(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start ChannelAddOwnerJob"; } } void RestApiRequest::channelRemoveOwner(const QString &roomId, const QString &userId) { ChannelRemoveOwnerJob *job = new ChannelRemoveOwnerJob(this); initializeRestApiJob(job); job->setRemoveUserId(userId); job->setRoomId(roomId); connect(job, &ChannelRemoveOwnerJob::removeOwnerDone, this, &RestApiRequest::removeOwnerDone); if (!job->start()) { qCDebug(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start ChannelRemoveOwnerJob"; } } void RestApiRequest::channelDelete(const QString &roomId) { ChannelDeleteJob *job = new ChannelDeleteJob(this); initializeRestApiJob(job); job->setRoomId(roomId); connect(job, &ChannelDeleteJob::deletechannelDone, this, &RestApiRequest::deletechannelDone); if (!job->start()) { qCDebug(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start ChannelDeleteJob"; } } void RestApiRequest::groupDelete(const QString &roomId) { GroupsDeleteJob *job = new GroupsDeleteJob(this); initializeRestApiJob(job); job->setRoomId(roomId); connect(job, &GroupsDeleteJob::deleteGroupsDone, this, &RestApiRequest::deleteGroupsDone); if (!job->start()) { qCDebug(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start GroupsDeleteJob"; } } void RestApiRequest::pinMessage(const QString &messageId, bool pinned) { PinMessageJob *job = new PinMessageJob(this); initializeRestApiJob(job); job->setMessageId(messageId); job->setPinMessage(pinned); connect(job, &PinMessageJob::pinMessageDone, this, &RestApiRequest::pinMessageDone); if (!job->start()) { qCDebug(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start PinMessageJob"; } } void RestApiRequest::followMessage(const QString &messageId) { FollowMessageJob *job = new FollowMessageJob(this); initializeRestApiJob(job); job->setMessageId(messageId); connect(job, &FollowMessageJob::followMessageDone, this, &RestApiRequest::followMessageDone); if (!job->start()) { qCDebug(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start FollowMessageJob"; } } void RestApiRequest::unFollowMessage(const QString &messageId) { UnFollowMessageJob *job = new UnFollowMessageJob(this); initializeRestApiJob(job); job->setMessageId(messageId); connect(job, &UnFollowMessageJob::unFollowMessageDone, this, &RestApiRequest::unFollowMessageDone); if (!job->start()) { qCDebug(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start unFollowMessageDone"; } } //TODO add users arguments! void RestApiRequest::createDiscussion(const QString &parentRoomId, const QString &discussionName, const QString &replyMessage, const QString &parentMessageId) { RoomStartDiscussionJob *job = new RoomStartDiscussionJob(this); initializeRestApiJob(job); job->setParentRoomId(parentRoomId); job->setDiscussionName(discussionName); job->setParentMessageId(parentMessageId); job->setReplyMessage(replyMessage); connect(job, &RoomStartDiscussionJob::startDiscussionDone, this, &RestApiRequest::startDiscussionDone); if (!job->start()) { qCDebug(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start roomStartDiscussion"; } } void RestApiRequest::getDiscussions(const QString &roomId, int offset, int count) { GetDiscussionsJob *job = new GetDiscussionsJob(this); initializeRestApiJob(job); QueryParameters parameters; parameters.setCount(count); parameters.setOffset(offset); job->setQueryParameters(parameters); job->setRoomId(roomId); connect(job, &GetDiscussionsJob::getDiscussionsDone, this, &RestApiRequest::getDiscussionsDone); if (!job->start()) { qCDebug(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start getDiscussions"; } } void RestApiRequest::getThreadsList(const QString &roomId, int offset, int count) { GetThreadsJob *job = new GetThreadsJob(this); initializeRestApiJob(job); job->setRoomId(roomId); QueryParameters parameters; parameters.setCount(count); parameters.setOffset(offset); job->setQueryParameters(parameters); connect(job, &GetThreadsJob::getThreadsDone, this, &RestApiRequest::getThreadsDone); if (!job->start()) { qCDebug(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start getThreadsList"; } } void RestApiRequest::getThreadMessages(const QString &threadMessageId) { GetThreadMessagesJob *job = new GetThreadMessagesJob(this); initializeRestApiJob(job); job->setThreadMessageId(threadMessageId); connect(job, &GetThreadMessagesJob::getThreadMessagesDone, this, &RestApiRequest::getThreadMessagesDone); if (!job->start()) { qCDebug(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start getThreadMessages"; } } void RestApiRequest::sendMessage(const QString &roomId, const QString &text, const QString &messageId, const QString &threadMessageId) { SendMessageJob *job = new SendMessageJob(this); initializeRestApiJob(job); SendMessageJob::SendMessageArguments args; args.roomId = roomId; args.message = text; args.messageId = messageId; args.threadMessageId = threadMessageId; job->setSendMessageArguments(args); if (!job->start()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start job"; } } diff --git a/src/rocketchatrestapi-qt5/restapirequest.h b/src/rocketchatrestapi-qt5/restapirequest.h index c2af7f1b..d380c9dd 100644 --- a/src/rocketchatrestapi-qt5/restapirequest.h +++ b/src/rocketchatrestapi-qt5/restapirequest.h @@ -1,235 +1,235 @@ /* Copyright (c) 2017-2019 Montel Laurent This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License or ( at your option ) version 3 or, at the discretion of KDE e.V. ( which shall act as a proxy as in section 14 of the GPLv3 ), any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef RESTAPIREQUEST_H #define RESTAPIREQUEST_H #include #include #include #include "restapiutil.h" #include "librocketchatrestapi-qt5_export.h" class QNetworkAccessManager; class QNetworkReply; class QNetworkCookieJar; class RestApiMethod; namespace RocketChatRestApi { class RestApiAbstractJob; class AbstractLogger; class LIBROCKETCHATRESTAPI_QT5_EXPORT RestApiRequest : public QObject { Q_OBJECT public: explicit RestApiRequest(QObject *parent = nullptr); ~RestApiRequest(); void setRestApiLogger(RocketChatRestApi::AbstractLogger *logger); Q_REQUIRED_RESULT QString userId() const; Q_REQUIRED_RESULT QString authToken() const; void setUserId(const QString &userId); void setAuthToken(const QString &authToken); //Assign/get server url QString serverUrl() const; void setServerUrl(const QString &serverUrl); void setUserName(const QString &userName); void setPassword(const QString &password); void login(); void logout(); void channelList(); void getAvatar(const QString &userId); - void serverInfo(); + void serverInfo(bool useDeprecatedVersion); void getPrivateSettings(); void getOwnInfo(); void starMessage(const QString &messageId, bool starred); void uploadFile(const QString &roomId, const QString &description, const QString &text, const QUrl &filename); void downloadFile(const QUrl &url, const QString &mimeType = QStringLiteral("text/plain"), bool storeInCache = true, const QUrl &localFileUrl = QUrl()); void changeChannelTopic(const QString &roomId, const QString &topic); void changeGroupsTopic(const QString &roomId, const QString &topic); void changeChannelAnnouncement(const QString &roomId, const QString &announcement); void changeGroupsAnnouncement(const QString &roomId, const QString &announcement); void postMessage(const QString &roomId, const QString &text); void deleteMessage(const QString &roomId, const QString &messageId); void createChannels(const QString &channelName, bool readOnly, const QStringList &members, const QString &password); void createGroups(const QString &channelName, bool readOnly, const QStringList &members); void leaveChannel(const QString &roomId); void leaveGroups(const QString &roomId); void updateMessage(const QString &roomId, const QString &messageId, const QString &text); void reactOnMessage(const QString &messageId, const QString &emoji, bool shouldReact); void closeChannel(const QString &roomId, const QString &type); void createDirectMessage(const QString &userName); void historyChannel(const QString &roomId, const QString &type); void changeChannelDescription(const QString &roomId, const QString &description); void changeGroupsDescription(const QString &roomId, const QString &description); void archiveChannel(const QString &roomId, bool archive); void archiveGroups(const QString &roomId, bool archive); void filesInRoom(const QString &roomId, const QString &type, int offset = 0, int count = 50); void addUserInChannel(const QString &roomId, const QString &userId); void listEmojiCustom(); void searchRoomUser(const QString &pattern); void searchMessages(const QString &roomId, const QString &pattern); void markAsRead(const QString &roomId); void getRooms(); void markAsFavorite(const QString &roomId, bool favorite); void addUserInGroup(const QString &roomId, const QString &userId); void disableNotifications(const QString &roomId, bool value); void hideUnreadStatus(const QString &roomId, bool value); void audioNotifications(const QString &roomId, const QString &value); void desktopNotifications(const QString &roomId, const QString &value); void emailNotifications(const QString &roomId, const QString &value); void mobilePushNotifications(const QString &roomId, const QString &value); void unreadAlert(const QString &roomId, const QString &value); void setAvatar(const QString &avatarUrl); void markRoomAsUnRead(const QString &roomId); void markMessageAsUnReadFrom(const QString &messageId); void forgotPassword(const QString &email); void userInfo(const QString &identifier, bool userName = false); void ignoreUser(const QString &roomId, const QString &userId, bool ignore); void userPresence(const QString &userId); void reportMessage(const QString &messageId, const QString &message); void setGroupType(const QString &roomId, bool isPrivate); void setChannelType(const QString &roomId, bool isPrivate); void getGroupRoles(const QString &roomId); void getChannelRoles(const QString &roomId); void getUsernameSuggestion(); void listPermissions(); void listCommands(); void fetchMyKeys(); void setJoinCodeChannel(const QString &roomId, const QString &joinCode); void channelJoin(const QString &roomId, const QString &joinCode); void muteGroupMentions(const QString &roomId, bool value); void channelInfo(const QString &roomId); void changeChannelName(const QString &roomId, const QString &newName); void changeGroupName(const QString &roomId, const QString &newName); void groupInfo(const QString &roomId); void channelGetAllUserMentions(const QString &roomId, int offset = 0, int count = 50); void updatejitsiTimeOut(const QString &roomId); void openDirectMessage(const QString &userId); void channelKick(const QString &roomId, const QString &userId); void groupKick(const QString &roomId, const QString &userId); void groupAddModerator(const QString &roomId, const QString &userId); void groupRemoveModerator(const QString &roomId, const QString &userId); void groupAddLeader(const QString &roomId, const QString &userId); void groupRemoveLeader(const QString &roomId, const QString &userId); void groupAddOwner(const QString &roomId, const QString &userId); void groupRemoveOwner(const QString &roomId, const QString &userId); void channelAddModerator(const QString &roomId, const QString &userId); void channelRemoveModerator(const QString &roomId, const QString &userId); void channelAddOwner(const QString &roomId, const QString &userId); void channelRemoveOwner(const QString &roomId, const QString &userId); void channelDelete(const QString &roomId); void groupDelete(const QString &roomId); void membersInRoom(const QString &roomId, const QString &type, int offset = 0, int count = 50); void changeChannelReadOnly(const QString &roomId, bool b); void changeGroupsReadOnly(const QString &roomId, bool b); void channelAddLeader(const QString &roomId, const QString &userId); void channelRemoveLeader(const QString &roomId, const QString &userId); void changeChannelEncrypted(const QString &roomId, bool b); void changeGroupsEncrypted(const QString &roomId, bool b); void pinMessage(const QString &messageId, bool pinned); void desktopDurationNotifications(const QString &roomId, int value); void desktopSoundNotifications(const QString &roomId, const QString &value); void followMessage(const QString &messageId); void unFollowMessage(const QString &messageId); void createDiscussion(const QString &parentRoomId, const QString &discussionName, const QString &replyMessage, const QString &parentMessageId); void getDiscussions(const QString &roomId, int offset = 0, int count = 50); void getThreadsList(const QString &roomId, int offset = 0, int count = 50); void getThreadMessages(const QString &threadMessageId); void sendMessage(const QString &roomId, const QString &text, const QString &messageId = QString(), const QString &threadMessageId = QString()); Q_SIGNALS: void avatar(const QString &userId, const QString &url); void redownloadAvatar(); void logoutDone(); void loginDone(const QString &authToken, const QString &userId); void downloadFileDone(const QByteArray &data, const QUrl &url, bool useCache, const QUrl &localFileUrl); void getServerInfoDone(const QString &version); void getOwnInfoDone(const QJsonObject &data); void privateInfoDone(const QByteArray &data); void channelFilesDone(const QJsonObject &obj, const QString &roomId); void channelMembersDone(const QJsonObject &obj, const QString &roomId); void loadEmojiCustomDone(const QJsonObject &obj); void spotlightDone(const QJsonObject &obj); void channelListDone(const QJsonObject &obj); void searchMessageDone(const QJsonObject &obj); void getRoomsDone(const QJsonObject &obj); void usersInfoDone(const QJsonObject &obj); void channelRolesDone(const QJsonObject &obj, const QString &roomId); void getUsernameSuggestionDone(const QString &username); void getPresenceDone(const QString &presence); void listPermissionDone(const QJsonObject &obj); void listCommandsDone(const QJsonObject &obj); void fetchMyKeysDone(); void setJoinCodeDone(); void setChannelJoinDone(const QString &roomId); void missingChannelPassword(const QString &roomId); void openArchivedRoom(const QString &roomId); void channelGetAllUserMentionsDone(const QJsonObject &obj, const QString &roomId); void updateJitsiTimeOutDone(const QString &datetime); void channelKickUserDone(const QJsonObject &obj); void groupKickUserDone(const QJsonObject &obj); void addModeratorDone(); void removeModeratorDone(); void addLeaderDone(); void removeLeaderDone(); void addOwnerDone(); void removeOwnerDone(); void deletechannelDone(); void deleteGroupsDone(); void pinMessageDone(); void ignoreUserDone(const QJsonObject &obj, const QString &roomId); void followMessageDone(); void unFollowMessageDone(); void startDiscussionDone(); void getDiscussionsDone(const QJsonObject &obj, const QString &roomId); void getThreadsDone(const QJsonObject &obj, const QString &roomId); void getThreadMessagesDone(const QJsonObject &obj, const QString &threadMessageId); void failed(const QString &str); private: Q_DISABLE_COPY(RestApiRequest) void initializeCookies(); void slotResult(QNetworkReply *reply); void slotSslErrors(QNetworkReply *reply, const QList &error); void slotLogout(); void slotLogin(const QString &authToken, const QString &userId); void slotAddJoinCodeToChannel(const QString &channelId, const QString &password); void initializeRestApiJob(RocketChatRestApi::RestApiAbstractJob *job); QNetworkAccessManager *mNetworkAccessManager = nullptr; QNetworkCookieJar *mCookieJar = nullptr; RestApiMethod *mRestApiMethod = nullptr; RocketChatRestApi::AbstractLogger *mRuqolaLogger = nullptr; QString mUserId; QString mAuthToken; QString mUserName; QString mPassword; }; } #endif // RESTAPIREQUEST_H diff --git a/src/rocketchatrestapi-qt5/serverinfojob.cpp b/src/rocketchatrestapi-qt5/serverinfojob.cpp index 56ed63bd..c2168bf1 100644 --- a/src/rocketchatrestapi-qt5/serverinfojob.cpp +++ b/src/rocketchatrestapi-qt5/serverinfojob.cpp @@ -1,86 +1,107 @@ /* Copyright (c) 2018-2019 Montel Laurent This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License or ( at your option ) version 3 or, at the discretion of KDE e.V. ( which shall act as a proxy as in section 14 of the GPLv3 ), any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "serverinfojob.h" #include "rocketchatqtrestapi_debug.h" #include "restapimethod.h" #include #include #include using namespace RocketChatRestApi; ServerInfoJob::ServerInfoJob(QObject *parent) : RestApiAbstractJob(parent) { } ServerInfoJob::~ServerInfoJob() { } bool ServerInfoJob::start() { if (!canStart()) { qCWarning(ROCKETCHATQTRESTAPI_LOG) << "Impossible to start server info job"; deleteLater(); return false; } QNetworkReply *reply = mNetworkAccessManager->get(request()); addLoggerInfo("ServerInfoJob::start"); connect(reply, &QNetworkReply::finished, this, &ServerInfoJob::slotServerInfoFinished); return true; } +//Since 2.0.0 we don't use v1 path. Need to exclude it. QNetworkRequest ServerInfoJob::request() const { - const QUrl url = mRestApiMethod->generateUrl(RestApiUtil::RestApiUrlType::ServerInfo); + const QUrl url = mRestApiMethod->generateUrl(RestApiUtil::RestApiUrlType::ServerInfo, QString(), mUseDeprecatedVersion); QNetworkRequest request(url); request.setAttribute(QNetworkRequest::HttpPipeliningAllowedAttribute, true); request.setAttribute(QNetworkRequest::HTTP2AllowedAttribute, true); return request; } bool ServerInfoJob::requireHttpAuthentication() const { return false; } +bool ServerInfoJob::useDeprecatedVersion() const +{ + return mUseDeprecatedVersion; +} + void ServerInfoJob::slotServerInfoFinished() { QString versionStr; QNetworkReply *reply = qobject_cast(sender()); if (reply) { const QByteArray data = reply->readAll(); const QJsonDocument replyJson = QJsonDocument::fromJson(data); const QJsonObject replyObject = replyJson.object(); if (replyObject[QStringLiteral("success")].toBool()) { - const QJsonObject version = replyObject.value(QStringLiteral("info")).toObject(); - versionStr = version.value(QStringLiteral("version")).toString(); - addLoggerInfo(QByteArrayLiteral("ServerInfoJob: success: ") + replyJson.toJson(QJsonDocument::Indented)); - Q_EMIT serverInfoDone(versionStr); + if (mUseDeprecatedVersion) { + const QJsonObject version = replyObject.value(QStringLiteral("info")).toObject(); + versionStr = version.value(QStringLiteral("version")).toString(); + addLoggerInfo(QByteArrayLiteral("ServerInfoJob: success: ") + replyJson.toJson(QJsonDocument::Indented)); + Q_EMIT serverInfoDone(versionStr); + } else { + versionStr = replyObject.value(QStringLiteral("version")).toString(); + addLoggerInfo(QByteArrayLiteral("ServerInfoJob: success: ") + replyJson.toJson(QJsonDocument::Indented)); + Q_EMIT serverInfoDone(versionStr); + } } else { emitFailedMessage(replyObject); addLoggerWarning(QByteArrayLiteral("ServerInfoJob::slotServerInfoFinished: Problem: ") + replyJson.toJson(QJsonDocument::Indented)); + if (mUseDeprecatedVersion) { + //Emit a version otherwise it breaks login! + Q_EMIT serverInfoDone(QStringLiteral("1.0.0")); + } } reply->deleteLater(); } deleteLater(); } + +void ServerInfoJob::setUseDeprecatedVersion(bool useDeprecatedVersion) +{ + mUseDeprecatedVersion = useDeprecatedVersion; +} diff --git a/src/rocketchatrestapi-qt5/serverinfojob.h b/src/rocketchatrestapi-qt5/serverinfojob.h index 92291c0a..27284ff5 100644 --- a/src/rocketchatrestapi-qt5/serverinfojob.h +++ b/src/rocketchatrestapi-qt5/serverinfojob.h @@ -1,49 +1,54 @@ /* Copyright (c) 2018-2019 Montel Laurent This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License or ( at your option ) version 3 or, at the discretion of KDE e.V. ( which shall act as a proxy as in section 14 of the GPLv3 ), any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef SERVERINFOJOB_H #define SERVERINFOJOB_H #include "restapiabstractjob.h" #include "librestapi_private_export.h" class QNetworkRequest; namespace RocketChatRestApi { class LIBROCKETCHATRESTAPI_QT5_TESTS_EXPORT ServerInfoJob : public RestApiAbstractJob { Q_OBJECT public: explicit ServerInfoJob(QObject *parent = nullptr); ~ServerInfoJob() override; Q_REQUIRED_RESULT bool start() override; Q_REQUIRED_RESULT QNetworkRequest request() const override; Q_REQUIRED_RESULT bool requireHttpAuthentication() const override; + Q_REQUIRED_RESULT bool useDeprecatedVersion() const; + + void setUseDeprecatedVersion(bool useDeprecatedVersion); + Q_SIGNALS: void serverInfoDone(const QString &versionInfo); private: Q_DISABLE_COPY(ServerInfoJob) void slotServerInfoFinished(); + bool mUseDeprecatedVersion = true; }; } #endif // SERVERINFOJOB_H diff --git a/src/ruqolacore/rocketchatbackend.cpp b/src/ruqolacore/rocketchatbackend.cpp index 993c8d34..e59fdc7d 100644 --- a/src/ruqolacore/rocketchatbackend.cpp +++ b/src/ruqolacore/rocketchatbackend.cpp @@ -1,685 +1,685 @@ /* * Copyright 2016 Riccardo Iaconelli * Copyright 2018 Laurent Montel * * 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 2 of * the License or (at your option) version 3 or any later version * accepted by the membership of KDE e.V. (or its successor approved * by the membership of KDE e.V.), which shall act as a proxy * defined in Section 14 of version 3 of the license. * * 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 . * */ #include "rocketchataccount.h" #include "rocketchatbackend.h" #include "model/usercompletermodel.h" #include "ruqola_debug.h" #include "ruqola_message_debug.h" #include "ruqola_unknown_collectiontype_debug.h" #include "ddpapi/ddpclient.h" #include "restapirequest.h" #include "user.h" #include "model/usersmodel.h" #include "ruqolalogger.h" #include "model/messagemodel.h" #include "receivetypingnotificationmanager.h" #include "file.h" #include "user.h" #include #include void process_publicsettings(const QJsonObject &obj, RocketChatAccount *account) { account->parsePublicSettings(obj); //qCDebug(RUQOLA_LOG) << " configs"<ruqolaLogger()) { account->ruqolaLogger()->dataReceived(QByteArrayLiteral("Public Settings:") + QJsonDocument(obj).toJson()); } } void rooms_parsing(const QJsonObject &root, RocketChatAccount *account) { const QJsonObject obj = root.value(QLatin1String("result")).toObject(); RoomModel *model = account->roomModel(); //qDebug() << " doc " << doc; QJsonArray removed = obj.value(QLatin1String("remove")).toArray(); //qDebug() << " rooms_parsing: room removed *************************************************" << removed; const QJsonArray updated = obj.value(QLatin1String("update")).toArray(); //qDebug() << " rooms_parsing: updated *******************************************************: "<< updated; for (int i = 0; i < updated.size(); i++) { QJsonObject roomJson = updated.at(i).toObject(); const QString roomType = roomJson.value(QLatin1String("t")).toString(); if (account->ruqolaLogger()) { QJsonDocument d; d.setObject(roomJson); account->ruqolaLogger()->dataReceived(QByteArrayLiteral("Rooms:") + d.toJson()); } if (roomType == QLatin1String("c") //Chat || roomType == QLatin1String("p") /*Private chat*/) { // let's be extra safe around crashes if (account->loginStatus() == DDPClient::LoggedIn) { model->updateRoom(roomJson); } } } } void getsubscription_parsing(const QJsonObject &root, RocketChatAccount *account) { const QJsonObject obj = root.value(QLatin1String("result")).toObject(); RoomModel *model = account->roomModel(); //qDebug() << " doc " << doc; const QJsonArray removed = obj.value(QLatin1String("remove")).toArray(); qDebug() << " room removed " << removed; //TODO implement it. const QJsonArray updated = obj.value(QLatin1String("update")).toArray(); //qDebug() << " updated : "<< updated; for (int i = 0; i < updated.size(); i++) { QJsonObject room = updated.at(i).toObject(); const QString roomType = room.value(QLatin1String("t")).toString(); if (account->ruqolaLogger()) { QJsonDocument d; d.setObject(room); account->ruqolaLogger()->dataReceived(QByteArrayLiteral("Rooms subscriptions:") + d.toJson()); } if (roomType == QLatin1String("c") //Chat || roomType == QLatin1String("p") /*Private chat*/ || roomType == QLatin1String("d")) { //Direct chat) { // let's be extra safe around crashes if (account->loginStatus() == DDPClient::LoggedIn) { model->addRoom(room); } } else if (roomType == QLatin1String("l")) { //Live chat qCDebug(RUQOLA_LOG) << "Live Chat not implemented yet"; } } //We need to load all room after get subscription to update parameters QJsonObject params; params[QStringLiteral("$date")] = QJsonValue(0); // get ALL rooms we've ever seen account->ddp()->method(QStringLiteral("rooms/get"), QJsonDocument(params), rooms_parsing); //TODO ? account->listEmojiCustom(); //Force set online. account->ddp()->setDefaultStatus(User::PresenceStatus::PresenceOnline); } RocketChatBackend::RocketChatBackend(RocketChatAccount *account, QObject *parent) : QObject(parent) , mRocketChatAccount(account) { connect(mRocketChatAccount, &RocketChatAccount::loginStatusChanged, this, &RocketChatBackend::slotLoginStatusChanged); connect(mRocketChatAccount, &RocketChatAccount::userIDChanged, this, &RocketChatBackend::slotUserIDChanged); connect(mRocketChatAccount, &RocketChatAccount::changed, this, &RocketChatBackend::slotChanged); connect(mRocketChatAccount, &RocketChatAccount::added, this, &RocketChatBackend::slotAdded); connect(mRocketChatAccount, &RocketChatAccount::removed, this, &RocketChatBackend::slotRemoved); connect(mRocketChatAccount, &RocketChatAccount::connectedChanged, this, &RocketChatBackend::slotConnectedChanged); } RocketChatBackend::~RocketChatBackend() { } void RocketChatBackend::slotConnectedChanged() { - mRocketChatAccount->restApi()->serverInfo(); + mRocketChatAccount->restApi()->serverInfo(false); //TODO fix support for old server version... connect(mRocketChatAccount->restApi(), &RocketChatRestApi::RestApiRequest::getServerInfoDone, this, &RocketChatBackend::parseServerVersionDone, Qt::UniqueConnection); mRocketChatAccount->ddp()->method(QStringLiteral("public-settings/get"), QJsonDocument(), process_publicsettings); } void RocketChatBackend::processIncomingMessages(const QJsonArray &messages) { for (const QJsonValue &v : messages) { QJsonObject o = v.toObject(); if (mRocketChatAccount->ruqolaLogger()) { QJsonDocument d; d.setObject(o); mRocketChatAccount->ruqolaLogger()->dataReceived(QByteArrayLiteral("Message:") + d.toJson()); } else { qCDebug(RUQOLA_MESSAGE_LOG) <<" new message: " << o; } Message m(mRocketChatAccount->emojiManager()); m.parseMessage(o); //qDebug() << " roomId"<messageModelForRoom(m.roomId())) { // if (!m.threadMessageId().isEmpty()) { // qDebug() << " It's a thread message id ****************************" << m.threadMessageId(); // } messageModel->addMessage(m); } else { qCWarning(RUQOLA_MESSAGE_LOG) << " MessageModel is empty for :" << m.roomId() << " It's a bug for sure."; } } } void RocketChatBackend::parseOwnInfoDown(const QJsonObject &replyObject) { //Move code in rocketchataccount directly ? //qDebug() << "replyJson " << replyJson; User user; user.setUserId(replyObject.value(QLatin1String("_id")).toString()); user.setUserName(replyObject.value(QLatin1String("username")).toString()); user.setStatus(replyObject.value(QLatin1String("status")).toString()); if (user.isValid()) { mRocketChatAccount->usersModel()->addUser(user); } else { qCWarning(RUQOLA_LOG) << " Error during parsing user" << replyObject; } } void RocketChatBackend::slotLoginStatusChanged() { if (mRocketChatAccount->loginStatus() == DDPClient::LoggedIn) { connect(mRocketChatAccount->restApi(), &RocketChatRestApi::RestApiRequest::getOwnInfoDone, this, &RocketChatBackend::parseOwnInfoDown, Qt::UniqueConnection); QJsonObject params; params[QStringLiteral("$date")] = QJsonValue(0); // get ALL rooms we've ever seen std::function subscription_callback = [=](const QJsonObject &obj, RocketChatAccount *account) { getsubscription_parsing(obj, account); }; mRocketChatAccount->ddp()->method(QStringLiteral("subscriptions/get"), QJsonDocument(params), subscription_callback); mRocketChatAccount->restApi()->setAuthToken(mRocketChatAccount->settings()->authToken()); mRocketChatAccount->restApi()->setUserId(mRocketChatAccount->settings()->userId()); mRocketChatAccount->restApi()->getPrivateSettings(); mRocketChatAccount->restApi()->getOwnInfo(); } } void RocketChatBackend::parseServerVersionDone(const QString &version) { qCDebug(RUQOLA_LOG) << " void RocketChatBackend::parseServerVersionDone(const QString &version)******************" << version; mRocketChatAccount->setServerVersion(version); mRocketChatAccount->ddp()->login(); } QVector RocketChatBackend::files() const { return mFiles; } QVector RocketChatBackend::users() const { return mUsers; } void RocketChatBackend::slotRemoved(const QJsonObject &object) { const QString collection = object.value(QLatin1String("collection")).toString(); if (collection == QLatin1String("users")) { const QString id = object.value(QLatin1String("id")).toString(); mRocketChatAccount->usersModel()->removeUser(id); if (mRocketChatAccount->ruqolaLogger()) { QJsonDocument d; d.setObject(object); mRocketChatAccount->ruqolaLogger()->dataReceived(QByteArrayLiteral("users: Removed user:") + d.toJson()); } else { qDebug() << "USER REMOVED VALUE" << object; } } else if (collection == QLatin1String("stream-notify-logged")) { qDebug() << "removed stream-notify-logged " << object; } else { qCDebug(RUQOLA_UNKNOWN_COLLECTIONTYPE_LOG) << " Other collection type removed " << collection << " object "<settings()->userName()) { mRocketChatAccount->settings()->setUserId(object[QStringLiteral("id")].toString()); qCDebug(RUQOLA_LOG) << "User id set to " << mRocketChatAccount->settings()->userId(); } else { //TODO add current user ? me ? User user; user.parseUser(object); if (mRocketChatAccount->ruqolaLogger()) { QJsonDocument d; d.setObject(object); mRocketChatAccount->ruqolaLogger()->dataReceived(QByteArrayLiteral("users: Add User:") + d.toJson()); } else { qCDebug(RUQOLA_LOG) << "USER ADDED VALUE" << object; } mRocketChatAccount->usersModel()->addUser(user); } qCDebug(RUQOLA_LOG) << "NEW USER ADDED: " << username << fields; } else if (collection == QLatin1String("rooms")) { qCDebug(RUQOLA_LOG) << "NEW ROOMS ADDED: " << object; } else if (collection == QLatin1String("stream-notify-user")) { qDebug() << "stream-notify-user: " << object; } else if (collection == QLatin1String("stream-notify-all")) { qCDebug(RUQOLA_UNKNOWN_COLLECTIONTYPE_LOG) << "stream-notify-user: " << object; //TODO verify that all is ok ! } else if (collection == QLatin1String("autocompleteRecords")) { if (mRocketChatAccount->ruqolaLogger()) { QJsonDocument d; d.setObject(object); mRocketChatAccount->ruqolaLogger()->dataReceived(QByteArrayLiteral("autocompleteRecords: Add User:") + d.toJson()); } else { qCDebug(RUQOLA_LOG) << "AutoCompleteRecords VALUE" << object; } User user; user.parseUser(object); mUsers.append(user); } else if (collection == QLatin1String("room_files")) { if (mRocketChatAccount->ruqolaLogger()) { QJsonDocument d; d.setObject(object); mRocketChatAccount->ruqolaLogger()->dataReceived(QByteArrayLiteral("room_files: Add Files:") + d.toJson()); } else { qCDebug(RUQOLA_LOG) << "room_files VALUE" << object; } File file; file.parseFile(object); mFiles.append(file); } else if (collection == QLatin1String("stream-notify-room")) { //TODO qCDebug(RUQOLA_UNKNOWN_COLLECTIONTYPE_LOG) << "stream-notify-room not implemented: "<< object; } else if (collection == QLatin1String("stream-notify-logged")) { qCDebug(RUQOLA_UNKNOWN_COLLECTIONTYPE_LOG) << "stream-notify-logged not implemented: "<< object; } else { qCDebug(RUQOLA_UNKNOWN_COLLECTIONTYPE_LOG) << "Unknown added element: "<< object; } } void RocketChatBackend::slotChanged(const QJsonObject &object) { const QString collection = object[QStringLiteral("collection")].toString(); if (collection == QLatin1String("stream-room-messages")) { const QJsonObject fields = object.value(QLatin1String("fields")).toObject(); const QJsonArray contents = fields.value(QLatin1String("args")).toArray(); processIncomingMessages(contents); } else if (collection == QLatin1String("users")) { if (mRocketChatAccount->ruqolaLogger()) { QJsonDocument d; d.setObject(object); mRocketChatAccount->ruqolaLogger()->dataReceived(QByteArrayLiteral("users: User Changed:") + d.toJson()); } else { qCDebug(RUQOLA_LOG) << "USER CHANGED" << object; } mRocketChatAccount->updateUser(object); } else if (collection == QLatin1String("rooms")) { if (mRocketChatAccount->ruqolaLogger()) { QJsonDocument d; d.setObject(object); mRocketChatAccount->ruqolaLogger()->dataReceived(QByteArrayLiteral("rooms: Room Changed:") + d.toJson()); } else { qCDebug(RUQOLA_LOG) << "ROOMS CHANGED: " << object; } } else if (collection == QLatin1String("stream-notify-user")) { QJsonObject fields = object.value(QLatin1String("fields")).toObject(); const QString eventname = fields.value(QLatin1String("eventName")).toString(); const QJsonArray contents = fields.value(QLatin1String("args")).toArray(); qCDebug(RUQOLA_LOG) << " EVENT " << eventname << " contents " << contents << fields.value(QLatin1String("args")).toArray().toVariantList(); if (eventname.endsWith(QLatin1String("/subscriptions-changed"))) { RoomModel *model = mRocketChatAccount->roomModel(); model->updateSubscription(contents); if (mRocketChatAccount->ruqolaLogger()) { QJsonDocument d; d.setObject(fields); mRocketChatAccount->ruqolaLogger()->dataReceived(QByteArrayLiteral("stream-notify-user: subscriptions-changed:") + d.toJson()); } else { qCDebug(RUQOLA_LOG) << "stream-notify-user: subscriptions-changed " << object; } } else if (eventname.endsWith(QLatin1String("/rooms-changed"))) { RoomModel *model = mRocketChatAccount->roomModel(); //qDebug() << " EVENT " << eventname << " contents " << contents << fields.value(QLatin1String("args")).toArray().toVariantList(); const QJsonArray lst = fields.value(QLatin1String("args")).toArray(); const QString actionName = lst[0].toString(); if (actionName == QLatin1String("updated")) { qCDebug(RUQOLA_LOG) << " Update room " << lst; const QJsonObject roomData = lst[1].toObject(); model->updateRoom(roomData); } else if (actionName == QLatin1String("inserted")) { qCDebug(RUQOLA_LOG) << "****************************************** insert new Room !!!!!" << lst; const QJsonObject roomData = lst[1].toObject(); model->insertRoom(roomData); } else if (actionName == QLatin1String("removed")) { qCDebug(RUQOLA_LOG) << "Remove channel" << lst; const QJsonObject roomData = lst[1].toObject(); //TODO use rid model->removeRoom(QString()); } else { qWarning() << "rooms-changed invalid actionName " << actionName; } if (mRocketChatAccount->ruqolaLogger()) { QJsonDocument d; d.setObject(object); mRocketChatAccount->ruqolaLogger()->dataReceived(QByteArrayLiteral("stream-notify-user: Room Changed:") + d.toJson()); } } else if (eventname.endsWith(QLatin1String("/notification"))) { if (mRocketChatAccount->ruqolaLogger()) { QJsonDocument d; d.setObject(object); mRocketChatAccount->ruqolaLogger()->dataReceived(QByteArrayLiteral("stream-notify-user: notification:") + d.toJson()); } else { qCDebug(RUQOLA_UNKNOWN_COLLECTIONTYPE_LOG) << "NOTIFICATION: " << object; } mRocketChatAccount->sendNotification(contents); } else if (eventname.endsWith(QLatin1String("/webrtc"))) { if (mRocketChatAccount->ruqolaLogger()) { QJsonDocument d; d.setObject(object); mRocketChatAccount->ruqolaLogger()->dataReceived(QByteArrayLiteral("stream-notify-user: webrtc: ") + d.toJson()); } else { qCDebug(RUQOLA_LOG) << "WEBRTC CHANGED: " << object; } qCWarning(RUQOLA_LOG) << "stream-notify-user : WEBRTC ? " << eventname << " contents " << contents; } else if (eventname.endsWith(QLatin1String("/otr"))) { if (mRocketChatAccount->ruqolaLogger()) { QJsonDocument d; d.setObject(object); mRocketChatAccount->ruqolaLogger()->dataReceived(QByteArrayLiteral("stream-notify-user: otr: ") + d.toJson()); } else { qCDebug(RUQOLA_LOG) << "OTR CHANGED: " << object; } mRocketChatAccount->parseOtr(contents); qCDebug(RUQOLA_UNKNOWN_COLLECTIONTYPE_LOG) << "stream-notify-user : OTR ? " << eventname << " contents " << contents; } else if (eventname.endsWith(QLatin1String("/message"))) { if (mRocketChatAccount->ruqolaLogger()) { QJsonDocument d; d.setObject(object); mRocketChatAccount->ruqolaLogger()->dataReceived(QByteArrayLiteral("stream-notify-user: message: ") + d.toJson()); } else { qCDebug(RUQOLA_LOG) << "stream-notify-user : Message: " << object; } const QJsonArray lst = fields.value(QLatin1String("args")).toArray(); const QJsonObject roomData = lst[0].toObject(); QString roomId = roomData.value(QLatin1String("rid")).toString(); if (!roomId.isEmpty()) { MessageModel *messageModel = mRocketChatAccount->messageModelForRoom(roomId); Message m(mRocketChatAccount->emojiManager()); m.parseMessage(roomData); if (!m.threadMessageId().isEmpty()) { qDebug() << " It's a thread message id ****************************" << m.threadMessageId(); //TODO check if thread message is opened! } //m.setMessageType(Message::System); //TODO add special element!See roomData QJsonObject({"_id":"u9xnnzaBQoQithsxP","msg":"You have been muted and cannot speak in this room","rid":"Dic5wZD4Zu9ze5gk3","ts":{"$date":1534166745895}}) messageModel->addMessage(m); } else { qCWarning(RUQOLA_LOG) << "stream-notify-user : Message: ROOMID is empty "; } qCDebug(RUQOLA_LOG) << "stream-notify-user : Message " << eventname << " contents " << contents; } else { if (mRocketChatAccount->ruqolaLogger()) { QJsonDocument d; d.setObject(object); mRocketChatAccount->ruqolaLogger()->dataReceived(QByteArrayLiteral("stream-notify-user: Unknown event: ") + d.toJson()); } else { qCDebug(RUQOLA_UNKNOWN_COLLECTIONTYPE_LOG) << "Unknown change: " << object; } qCDebug(RUQOLA_LOG) << "stream-notify-user : message event " << eventname << " contents " << contents; } } else if (collection == QLatin1String("stream-notify-room")) { qCDebug(RUQOLA_LOG) << " stream-notify-room " << collection << " object "<ruqolaLogger()) { QJsonDocument d; d.setObject(object); mRocketChatAccount->ruqolaLogger()->dataReceived(QByteArrayLiteral("stream-notify-room: DeleteMessage:") + d.toJson()); } else { qCDebug(RUQOLA_LOG) << "Delete message" << object; } //Move code in rocketChatAccount ? QString roomId = eventname; roomId.remove(QStringLiteral("/deleteMessage")); MessageModel *messageModel = mRocketChatAccount->messageModelForRoom(roomId); if (messageModel) { messageModel->deleteMessage(contents.at(0).toObject()[QStringLiteral("_id")].toString()); } else { qCWarning(RUQOLA_MESSAGE_LOG) << " MessageModel is empty for :" << roomId << " It's a bug for sure."; } } else if (eventname.endsWith(QLatin1String("/typing"))) { if (mRocketChatAccount->ruqolaLogger()) { QJsonDocument d; d.setObject(object); mRocketChatAccount->ruqolaLogger()->dataReceived(QByteArrayLiteral("stream-notify-room: typing:") + d.toJson()); } else { qCDebug(RUQOLA_LOG) << "typing message" << object; } QString roomId = eventname; roomId.remove(QStringLiteral("/typing")); //TODO Perhaps not necessary to convert to variantlist. Need to investigate //qCWarning(RUQOLA_LOG) << "stream-notify-room: typing event ? " << eventname << " content " << contents.toVariantList(); const QString typingUserName = contents.toVariantList().at(0).toString(); if (typingUserName != mRocketChatAccount->settings()->userName()) { const bool status = contents.toVariantList().at(1).toBool(); mRocketChatAccount->receiveTypingNotificationManager()->insertTypingNotification(roomId, typingUserName, status); } } else { if (mRocketChatAccount->ruqolaLogger()) { QJsonDocument d; d.setObject(object); mRocketChatAccount->ruqolaLogger()->dataReceived(QByteArrayLiteral("stream-notify-room: Unknown event ?") + d.toJson()); } else { qCDebug(RUQOLA_UNKNOWN_COLLECTIONTYPE_LOG) << "stream-notify-room: Unknown event ? " << eventname; } } } else if (collection == QLatin1String("stream-notify-logged")) { QJsonObject fields = object.value(QLatin1String("fields")).toObject(); const QString eventname = fields.value(QLatin1String("eventName")).toString(); const QJsonArray contents = fields.value(QLatin1String("args")).toArray(); qCDebug(RUQOLA_LOG) << " EVENT " << eventname << " contents " << contents << fields.value(QLatin1String("args")).toArray().toVariantList(); if (eventname == QLatin1String("roles-change")) { mRocketChatAccount->rolesChanged(contents); } else if (eventname == QLatin1String("updateAvatar")) { //TODO update it. //Update list of avatar ! qCWarning(RUQOLA_LOG) << " updateAvatar :" << fields; } else if (eventname == QLatin1String("updateEmojiCustom")) { qCWarning(RUQOLA_LOG) << " updateEmojiCustom :" << fields; } else { qWarning() << "stream-notify-logged not supported " << fields; } } else { qCDebug(RUQOLA_UNKNOWN_COLLECTIONTYPE_LOG) << " Other collection type changed " << collection << " object "<settings()->userId() }; { //Subscribe notification. QJsonArray params; params.append(QJsonValue(QStringLiteral("%1/%2").arg(userId, QStringLiteral("notification")))); mRocketChatAccount->ddp()->subscribe(QStringLiteral("stream-notify-user"), params); } { //Subscribe room-changed. QJsonArray params; params.append(QJsonValue(QStringLiteral("%1/%2").arg(userId, QStringLiteral("rooms-changed")))); mRocketChatAccount->ddp()->subscribe(QStringLiteral("stream-notify-user"), params); } { //Subscribe subscriptions-changed QJsonArray params; params.append(QJsonValue(QStringLiteral("%1/%2").arg(userId, QStringLiteral("subscriptions-changed")))); mRocketChatAccount->ddp()->subscribe(QStringLiteral("stream-notify-user"), params); } { //Subscribe message QJsonArray params; params.append(QJsonValue(QStringLiteral("%1/%2").arg(userId, QStringLiteral("message")))); mRocketChatAccount->ddp()->subscribe(QStringLiteral("stream-notify-user"), params); } { //Subscribe message QJsonArray params; params.append(QJsonValue(QStringLiteral("%1/%2").arg(userId, QStringLiteral("otr")))); mRocketChatAccount->ddp()->subscribe(QStringLiteral("stream-notify-user"), params); } { //Subscribe message QJsonArray params; params.append(QJsonValue(QStringLiteral("%1/%2").arg(userId, QStringLiteral("webrtc")))); mRocketChatAccount->ddp()->subscribe(QStringLiteral("stream-notify-user"), params); } { //Subscribe activeUsers QJsonArray params; params.append(QJsonValue(params)); mRocketChatAccount->ddp()->subscribe(QStringLiteral("activeUsers"), params); } { //Subscribe users in room ? //TODO verify it. QJsonArray params; params.append(QJsonValue(QStringLiteral("%1/%2").arg(userId, QStringLiteral("webrtc")))); mRocketChatAccount->ddp()->subscribe(QStringLiteral("stream-notify-room-users"), params); } //stream-notify-all { const QJsonArray params{ QJsonValue(QStringLiteral("updateAvatar")), { true } }; mRocketChatAccount->ddp()->subscribe(QStringLiteral("stream-notify-all"), params); } { const QJsonArray params{ QJsonValue(QStringLiteral("roles-change")), { true } }; mRocketChatAccount->ddp()->subscribe(QStringLiteral("stream-notify-all"), params); } { const QJsonArray params{ QJsonValue(QStringLiteral("updateEmojiCustom")), { true } }; mRocketChatAccount->ddp()->subscribe(QStringLiteral("stream-notify-all"), params); } { const QJsonArray params{ QJsonValue(QStringLiteral("deleteEmojiCustom")), { true } }; mRocketChatAccount->ddp()->subscribe(QStringLiteral("stream-notify-all"), params); } { const QJsonArray params{ QJsonValue(QStringLiteral("public-settings-changed")), { true } }; mRocketChatAccount->ddp()->subscribe(QStringLiteral("stream-notify-all"), params); } { const QJsonArray params{ QJsonValue(QStringLiteral("permissions-changed")), { true } }; mRocketChatAccount->ddp()->subscribe(QStringLiteral("stream-notify-all"), params); } //stream-notify-logged { const QJsonArray params{ QJsonValue(QStringLiteral("updateEmojiCustom")), { true } }; mRocketChatAccount->ddp()->subscribe(QStringLiteral("stream-notify-logged"), params); } //stream-notify-logged { const QJsonArray params{ QJsonValue(QStringLiteral("deleteEmojiCustom")), { true } }; mRocketChatAccount->ddp()->subscribe(QStringLiteral("stream-notify-logged"), params); } //stream-notify-logged { const QJsonArray params{ QJsonValue(QStringLiteral("roles-change")), { true } }; mRocketChatAccount->ddp()->subscribe(QStringLiteral("stream-notify-logged"), params); } //stream-notify-logged { const QJsonArray params{ QJsonValue(QStringLiteral("updateAvatar")), { true } }; mRocketChatAccount->ddp()->subscribe(QStringLiteral("stream-notify-logged"), params); } //stream-notify-logged { const QJsonArray params{ QJsonValue(QStringLiteral("Users:NameChanged")), { true } }; mRocketChatAccount->ddp()->subscribe(QStringLiteral("stream-notify-logged"), params); } //stream-notify-logged { const QJsonArray params{ QJsonValue(QStringLiteral("Users:Deleted")), { true } }; mRocketChatAccount->ddp()->subscribe(QStringLiteral("stream-notify-logged"), params); } }