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"