File indexing completed on 2024-05-12 16:25:04

0001 // SPDX-FileCopyrightText: 2022 James Graham <james.h.graham@protonmail.com>
0002 // SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0003 
0004 #include "keywordnotificationrulemodel.h"
0005 #include "controller.h"
0006 #include "notificationsmanager.h"
0007 
0008 #include <QDebug>
0009 #include <Quotient/connection.h>
0010 #include <Quotient/converters.h>
0011 #include <Quotient/csapi/definitions/push_ruleset.h>
0012 #include <Quotient/csapi/pushrules.h>
0013 #include <Quotient/jobs/basejob.h>
0014 
0015 KeywordNotificationRuleModel::KeywordNotificationRuleModel(QObject *parent)
0016     : QAbstractListModel(parent)
0017 {
0018     if (Controller::instance().activeConnection()) {
0019         controllerConnectionChanged();
0020     }
0021     connect(&Controller::instance(), &Controller::activeConnectionChanged, this, &KeywordNotificationRuleModel::controllerConnectionChanged);
0022 }
0023 
0024 void KeywordNotificationRuleModel::controllerConnectionChanged()
0025 {
0026     connect(Controller::instance().activeConnection(), &Quotient::Connection::accountDataChanged, this, &KeywordNotificationRuleModel::updateNotificationRules);
0027     updateNotificationRules("m.push_rules");
0028 }
0029 
0030 void KeywordNotificationRuleModel::updateNotificationRules(const QString &type)
0031 {
0032     if (type != "m.push_rules") {
0033         return;
0034     }
0035 
0036     const QJsonObject ruleDataJson = Controller::instance().activeConnection()->accountDataJson("m.push_rules");
0037     const Quotient::PushRuleset ruleData = Quotient::fromJson<Quotient::PushRuleset>(ruleDataJson["global"].toObject());
0038     const QVector<Quotient::PushRule> contentRules = ruleData.content;
0039 
0040     beginResetModel();
0041     m_notificationRules.clear();
0042     for (const auto &i : contentRules) {
0043         if (!m_notificationRules.contains(i.ruleId) && i.ruleId[0] != '.') {
0044             m_notificationRules.append(i.ruleId);
0045         }
0046     }
0047     endResetModel();
0048 }
0049 
0050 QVariant KeywordNotificationRuleModel::data(const QModelIndex &index, int role) const
0051 {
0052     if (!index.isValid()) {
0053         return {};
0054     }
0055 
0056     if (index.row() >= m_notificationRules.count()) {
0057         qDebug() << "KeywordNotificationRuleModel, something's wrong: index.row() >= m_notificationRules.count()";
0058         return {};
0059     }
0060 
0061     if (role == NameRole) {
0062         return m_notificationRules.at(index.row());
0063     }
0064 
0065     return {};
0066 }
0067 
0068 int KeywordNotificationRuleModel::rowCount(const QModelIndex &parent) const
0069 {
0070     Q_UNUSED(parent)
0071 
0072     return m_notificationRules.count();
0073 }
0074 
0075 void KeywordNotificationRuleModel::addKeyword(const QString &keyword)
0076 {
0077     if (m_notificationRules.count() == 0) {
0078         NotificationsManager::instance().initializeKeywordNotificationAction();
0079     }
0080 
0081     const QVector<QVariant> actions = NotificationsManager::instance().getKeywordNotificationActions();
0082 
0083     auto job = Controller::instance()
0084                    .activeConnection()
0085                    ->callApi<Quotient::SetPushRuleJob>("global", "content", keyword, actions, "", "", QVector<Quotient::PushCondition>(), keyword);
0086     connect(job, &Quotient::BaseJob::success, this, [this, keyword]() {
0087         beginInsertRows(QModelIndex(), m_notificationRules.count(), m_notificationRules.count());
0088         m_notificationRules.append(keyword);
0089         endInsertRows();
0090     });
0091 }
0092 
0093 void KeywordNotificationRuleModel::removeKeywordAtIndex(int index)
0094 {
0095     auto job = Controller::instance().activeConnection()->callApi<Quotient::DeletePushRuleJob>("global", "content", m_notificationRules[index]);
0096     connect(job, &Quotient::BaseJob::success, this, [this, index]() {
0097         beginRemoveRows(QModelIndex(), index, index);
0098         m_notificationRules.removeAt(index);
0099         endRemoveRows();
0100 
0101         if (m_notificationRules.count() == 0) {
0102             NotificationsManager::instance().deactivateKeywordNotificationAction();
0103         }
0104     });
0105 }
0106 
0107 QHash<int, QByteArray> KeywordNotificationRuleModel::roleNames() const
0108 {
0109     return {{NameRole, QByteArrayLiteral("name")}};
0110 }
0111 
0112 #include "moc_keywordnotificationrulemodel.cpp"