diff --git a/src/librssguard/database/databasedriver.cpp b/src/librssguard/database/databasedriver.cpp index 34279957b..a570830e9 100644 --- a/src/librssguard/database/databasedriver.cpp +++ b/src/librssguard/database/databasedriver.cpp @@ -7,7 +7,6 @@ #include "miscellaneous/iofactory.h" #include -#include #include #include #include diff --git a/src/librssguard/database/databasequeries.cpp b/src/librssguard/database/databasequeries.cpp index aa9bb6107..6721f9f09 100644 --- a/src/librssguard/database/databasequeries.cpp +++ b/src/librssguard/database/databasequeries.cpp @@ -1654,13 +1654,6 @@ UpdatedArticles DatabaseQueries::updateMessages(const QSqlDatabase& db, continue; } - if (!msg->m_isRead) { - updated_messages.m_unread.append(*msg); - } - - updated_messages.m_all.append(*msg); - msg->m_insertedUpdated = true; - vals.append(QSL("\n(':feed', ':title', :is_read, :is_important, :is_deleted, " "':url', ':author', :score, :date_created, ':contents', ':enclosures', " "':custom_id', ':custom_hash', :account_id)") @@ -1705,7 +1698,21 @@ UpdatedArticles DatabaseQueries::updateMessages(const QSqlDatabase& db, for (int l = i, c = 1; l < (i + batch_length); l++, c++) { Message* msg = msgs_to_insert[l]; + if (msg->m_title.isEmpty()) { + // This article was not for sure inserted. Tweak + // next ID calculation. + c--; + continue; + } + + msg->m_insertedUpdated = true; msg->m_id = last_msg_id - batch_length + c; + + if (!msg->m_isRead) { + updated_messages.m_unread.append(*msg); + } + + updated_messages.m_all.append(*msg); } } } diff --git a/src/librssguard/gui/notifications/articlelistnotification.cpp b/src/librssguard/gui/notifications/articlelistnotification.cpp index 8ce9f64a2..423b0521a 100644 --- a/src/librssguard/gui/notifications/articlelistnotification.cpp +++ b/src/librssguard/gui/notifications/articlelistnotification.cpp @@ -3,6 +3,7 @@ #include "gui/notifications/articlelistnotification.h" #include "core/articlelistnotificationmodel.h" +#include "database/databasequeries.h" #include "miscellaneous/iconfactory.h" #include "network-web/webfactory.h" @@ -100,12 +101,44 @@ void ArticleListNotification::onMessageSelected(const QModelIndex& current, cons } void ArticleListNotification::showFeed(int index) { - m_model->setArticles(m_newMessages.value(m_ui.m_cmbFeeds->itemData(index).value())); + m_model->setArticles(m_newMessages.value(selectedFeed())); onMessageSelected({}, {}); } void ArticleListNotification::openArticleInWebBrowser() { - qApp->web()->openUrlInExternalBrowser(selectedMessage().m_url); + Feed* fd = selectedFeed(); + Message msg = selectedMessage(); + + markAsRead(fd, {msg}); + qApp->web()->openUrlInExternalBrowser(msg.m_url); +} + +void ArticleListNotification::markAsRead(Feed* feed, const QList& articles) { + ServiceRoot* acc = feed->getParentServiceRoot(); + QStringList message_ids; + message_ids.reserve(articles.size()); + + // Obtain IDs of all desired messages. + for (const Message& message : articles) { + message_ids.append(QString::number(message.m_id)); + } + + if (acc->onBeforeSetMessagesRead(feed, articles, RootItem::ReadStatus::Read)) { + auto db = qApp->database()->driver()->connection(metaObject()->className()); + + if (DatabaseQueries::markMessagesReadUnread(db, message_ids, RootItem::ReadStatus::Read)) { + acc->onAfterSetMessagesRead(feed, articles, RootItem::ReadStatus::Read); + } + } +} + +Feed* ArticleListNotification::selectedFeed(int index) const { + if (index < 0) { + return m_ui.m_cmbFeeds->currentData().value(); + } + else { + return m_ui.m_cmbFeeds->itemData(index).value(); + } } Message ArticleListNotification::selectedMessage() const { diff --git a/src/librssguard/gui/notifications/articlelistnotification.h b/src/librssguard/gui/notifications/articlelistnotification.h index cbbeed9a7..bcb52f7fc 100644 --- a/src/librssguard/gui/notifications/articlelistnotification.h +++ b/src/librssguard/gui/notifications/articlelistnotification.h @@ -30,6 +30,9 @@ class ArticleListNotification : public BaseToastNotification { void openArticleInWebBrowser(); private: + void markAsRead(Feed* feed, const QList& articles); + + Feed* selectedFeed(int index = -1) const; Message selectedMessage() const; private: diff --git a/src/librssguard/gui/notifications/articlelistnotification.ui b/src/librssguard/gui/notifications/articlelistnotification.ui index cee497ca8..1ad424142 100644 --- a/src/librssguard/gui/notifications/articlelistnotification.ui +++ b/src/librssguard/gui/notifications/articlelistnotification.ui @@ -128,6 +128,20 @@ + + + + Qt::Vertical + + + + + + + Open article in article list + + + @@ -147,6 +161,7 @@ m_btnNextPage m_btnOpenArticleList m_btnOpenWebBrowser + m_btnMarkAllRead diff --git a/src/librssguard/miscellaneous/nodejs.h b/src/librssguard/miscellaneous/nodejs.h index e5280547f..abfbc90a1 100644 --- a/src/librssguard/miscellaneous/nodejs.h +++ b/src/librssguard/miscellaneous/nodejs.h @@ -9,12 +9,11 @@ class Settings; class QProcess; class NodeJs : public QObject { - Q_OBJECT + Q_OBJECT public: struct PackageMetadata { public: - // Name of package. QString m_name; diff --git a/src/librssguard/network-web/adblock/adblockmanager.h b/src/librssguard/network-web/adblock/adblockmanager.h index b68228e9d..2488a1933 100644 --- a/src/librssguard/network-web/adblock/adblockmanager.h +++ b/src/librssguard/network-web/adblock/adblockmanager.h @@ -11,7 +11,7 @@ #include #define CLIQZ_ADBLOCKED_PACKAGE "@cliqz/adblocker" -#define CLIQZ_ADBLOCKED_VERSION "1.23.5" +#define CLIQZ_ADBLOCKED_VERSION "1.26.7" class QUrl; class AdblockRequestInfo; diff --git a/src/librssguard/network-web/readability.cpp b/src/librssguard/network-web/readability.cpp index 11c8898b9..5f7525795 100644 --- a/src/librssguard/network-web/readability.cpp +++ b/src/librssguard/network-web/readability.cpp @@ -9,10 +9,10 @@ #include #define READABILITY_PACKAGE "@mozilla/readability" -#define READABILITY_VERSION "0.4.2" +#define READABILITY_VERSION "0.4.4" #define JSDOM_PACKAGE "jsdom" -#define JSDOM_VERSION "19.0.0" +#define JSDOM_VERSION "22.1.0" Readability::Readability(QObject* parent) : QObject{parent}, m_modulesInstalling(false), m_modulesInstalled(false) { connect(qApp->nodejs(), &NodeJs::packageInstalledUpdated, this, &Readability::onPackageReady); @@ -83,8 +83,8 @@ void Readability::makeHtmlReadable(const QString& html, const QString& base_url) .arg(QSL(APP_NAME)), QSystemTrayIcon::MessageIcon::Warning}, {true, true, false}); - qApp->nodejs()->installPackages({{QSL(READABILITY_PACKAGE), QSL(READABILITY_VERSION)}, - {QSL(JSDOM_PACKAGE), QSL(JSDOM_VERSION)}}); + qApp->nodejs()->installUpdatePackages({{QSL(READABILITY_PACKAGE), QSL(READABILITY_VERSION)}, + {QSL(JSDOM_PACKAGE), QSL(JSDOM_VERSION)}}); } return; diff --git a/src/rssguard/main.cpp b/src/rssguard/main.cpp index 285ab9264..093880b4a 100644 --- a/src/rssguard/main.cpp +++ b/src/rssguard/main.cpp @@ -16,8 +16,8 @@ #endif #endif -#include #include +#include int main(int argc, char* argv[]) { qSetMessagePattern(QSL("time=\"%{time process}\" type=\"%{type}\" -> %{message}")); @@ -57,6 +57,8 @@ int main(int argc, char* argv[]) { char** const av = argv; QStringList raw_cli_args; + raw_cli_args.reserve(argc); + for (int a = 0; a < argc; a++) { raw_cli_args << QString::fromLocal8Bit(av[a]); } @@ -70,10 +72,13 @@ int main(int argc, char* argv[]) { QCoreApplication::setApplicationVersion(QSL(APP_VERSION)); QCoreApplication::setOrganizationDomain(QSL(APP_URL)); + qDebugNN << LOGSEC_CORE << "Starting" << NONQUOTE_W_SPACE_DOT(APP_LONG_NAME); + qDebugNN << LOGSEC_CORE << "Current UTC date/time is" + << NONQUOTE_W_SPACE_DOT(QDateTime::currentDateTimeUtc().toString(Qt::DateFormat::ISODate)); + // Instantiate base application object. Application application(QSL(APP_LOW_NAME), argc, argv, raw_cli_args); - qDebugNN << LOGSEC_CORE << "Starting" << NONQUOTE_W_SPACE_DOT(APP_LONG_NAME); qDebugNN << LOGSEC_CORE << "Instantiated class " << QUOTE_W_SPACE_DOT(application.metaObject()->className()); // Check if another instance is running.