From b1de49fb34556acae789577b812b76008d6e3c2b Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Thu, 22 Oct 2020 12:22:18 +0200 Subject: [PATCH] Initial support for synchronizing label assignments for TT-RSS #102. --- .../services/abstract/cacheforserviceroot.cpp | 4 ++ .../tt-rss/network/ttrssnetworkfactory.cpp | 45 +++++++++++++++++++ .../tt-rss/network/ttrssnetworkfactory.h | 2 + .../services/tt-rss/ttrssserviceroot.cpp | 13 ++++++ 4 files changed, 64 insertions(+) diff --git a/src/librssguard/services/abstract/cacheforserviceroot.cpp b/src/librssguard/services/abstract/cacheforserviceroot.cpp index eed3cbd70..2f9fb6d62 100644 --- a/src/librssguard/services/abstract/cacheforserviceroot.cpp +++ b/src/librssguard/services/abstract/cacheforserviceroot.cpp @@ -39,6 +39,10 @@ void CacheForServiceRoot::addLabelsAssignmentsToCache(const QList& ids_ } } } + + auto xx = m_cachedLabelAssignments.values(); + auto xxx = m_cachedLabelDeassignments.values(); + int a = 5; } void CacheForServiceRoot::addMessageStatesToCache(const QList& ids_of_messages, RootItem::Importance importance) { diff --git a/src/librssguard/services/tt-rss/network/ttrssnetworkfactory.cpp b/src/librssguard/services/tt-rss/network/ttrssnetworkfactory.cpp index 9bf98162e..e5a471996 100644 --- a/src/librssguard/services/tt-rss/network/ttrssnetworkfactory.cpp +++ b/src/librssguard/services/tt-rss/network/ttrssnetworkfactory.cpp @@ -286,6 +286,50 @@ TtRssGetHeadlinesResponse TtRssNetworkFactory::getHeadlines(int feed_id, int lim return result; } +TtRssResponse TtRssNetworkFactory::setArticleLabel(const QStringList& article_ids, const QString& label_custom_id, bool assign) { + QJsonObject json; + + json["op"] = QSL("setArticleLabel"); + json["sid"] = m_sessionId; + json["article_ids"] = article_ids.join(QSL(",")); + json["label_id"] = label_custom_id.toInt(); + json["assign"] = assign; + + const int timeout = qApp->settings()->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)).toInt(); + QByteArray result_raw; + QList> headers; + + headers << QPair(HTTP_HEADERS_CONTENT_TYPE, TTRSS_CONTENT_TYPE_JSON); + headers << NetworkFactory::generateBasicAuthHeader(m_authUsername, m_authPassword); + + NetworkResult network_reply = NetworkFactory::performNetworkOperation(m_fullUrl, timeout, + QJsonDocument(json).toJson(QJsonDocument::Compact), + result_raw, + QNetworkAccessManager::PostOperation, + headers); + TtRssResponse result(QString::fromUtf8(result_raw)); + + if (result.isNotLoggedIn()) { + // We are not logged in. + login(); + json["sid"] = m_sessionId; + network_reply = NetworkFactory::performNetworkOperation(m_fullUrl, timeout, QJsonDocument(json).toJson(QJsonDocument::Compact), + result_raw, + QNetworkAccessManager::PostOperation, + headers); + result = TtRssResponse(QString::fromUtf8(result_raw)); + } + + if (network_reply.first != QNetworkReply::NoError) { + qWarningNN << LOGSEC_TTRSS + << "setArticleLabel failed with error" + << QUOTE_W_SPACE_DOT(network_reply.first); + } + + m_lastError = network_reply.first; + return result; +} + TtRssUpdateArticleResponse TtRssNetworkFactory::updateArticles(const QStringList& ids, UpdateArticle::OperatingField field, UpdateArticle::Mode mode, bool async) { @@ -298,6 +342,7 @@ TtRssUpdateArticleResponse TtRssNetworkFactory::updateArticles(const QStringList json["article_ids"] = ids.join(QSL(",")); json["mode"] = (int) mode; json["field"] = (int) field; + const int timeout = qApp->settings()->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)).toInt(); QByteArray result_raw; QList> headers; diff --git a/src/librssguard/services/tt-rss/network/ttrssnetworkfactory.h b/src/librssguard/services/tt-rss/network/ttrssnetworkfactory.h index 40bf63732..8d8a4e88d 100644 --- a/src/librssguard/services/tt-rss/network/ttrssnetworkfactory.h +++ b/src/librssguard/services/tt-rss/network/ttrssnetworkfactory.h @@ -159,6 +159,8 @@ class TtRssNetworkFactory { bool show_content, bool include_attachments, bool sanitize, bool unread_only); + TtRssResponse setArticleLabel(const QStringList& article_ids, const QString& label_custom_id, bool assign); + TtRssUpdateArticleResponse updateArticles(const QStringList& ids, UpdateArticle::OperatingField field, UpdateArticle::Mode mode, bool async = true); diff --git a/src/librssguard/services/tt-rss/ttrssserviceroot.cpp b/src/librssguard/services/tt-rss/ttrssserviceroot.cpp index 4f8557f30..e4ae7a009 100644 --- a/src/librssguard/services/tt-rss/ttrssserviceroot.cpp +++ b/src/librssguard/services/tt-rss/ttrssserviceroot.cpp @@ -155,6 +155,19 @@ void TtRssServiceRoot::saveAllCachedData(bool async) { async); } } + + QMapIterator k(msg_cache.m_cachedLabelAssignments); + + // Assign label for these messages. + while (k.hasNext()) { + k.next(); + auto label_custom_id = k.key(); + QStringList messages = k.value(); + + if (!messages.isEmpty()) { + network()->setArticleLabel(messages, label_custom_id, true); + } + } } QString TtRssServiceRoot::additionalTooltip() const {