File indexing completed on 2024-04-28 05:26:03

0001 // SPDX-FileCopyrightText: 2021 Michael Lang <criticaltemp@protonmail.com>
0002 //
0003 // SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0004 
0005 #pragma once
0006 
0007 #include <QObject>
0008 
0009 #include <optional>
0010 
0011 #include "ecurl.h"
0012 #include "modemcontroller.h"
0013 #include <database.h>
0014 #include <mms.h>
0015 
0016 #include "qcorotask.h"
0017 
0018 constexpr std::array<QStringView, 6> TAPBACK_KEYS = {u"♥️", u"👍", u"👎", u"😂", u"‼️", u"❓"};
0019 constexpr std::array<QStringView, 6> TAPBACK_REMOVED = {u"Removed a heart from “",
0020                                                         u"Removed a like from “",
0021                                                         u"Removed a dislike from “",
0022                                                         u"Removed a laugh from “",
0023                                                         u"Removed an exclamation from “",
0024                                                         u"Removed a question mark from “"};
0025 
0026 constexpr std::array<QStringView, 6> TAPBACK_ADDED = {u"Loved “", u"Liked “", u"Disliked “", u"Laughed at “", u"Emphasized “", u"Questioned “"};
0027 
0028 class ChannelLogger : public QObject
0029 {
0030     Q_OBJECT
0031     Q_CLASSINFO("D-Bus Interface", "org.kde.spacebar.Daemon")
0032 
0033 public:
0034     explicit ChannelLogger(std::optional<QString> &modemPath, QObject *parent = nullptr);
0035 
0036     // QString argument since this needs to be called from DBus
0037     Q_SCRIPTABLE void disableNotificationsForNumber(const QString &numbers);
0038     Q_SCRIPTABLE void manualDownload(const QString &id, const QString &url, const QDateTime &expires);
0039     Q_SCRIPTABLE void sendMessage(const QString &numbers, const QString &id, const QString &text, const QStringList &files, const qint64 &totalSize);
0040     Q_SCRIPTABLE void sendTapback(const QString &numbers, const QString &id, const QString &tapback, const bool &isRemoved);
0041     Q_SCRIPTABLE void syncSettings();
0042     Q_SCRIPTABLE QString ownNumber();
0043     Q_SCRIPTABLE QString countryCode();
0044 
0045 private:
0046     void checkMessages();
0047     void handleIncomingMessage(ModemManager::Sms::Ptr msg);
0048     void createDownloadNotification(const MmsMessage &mmsMessage);
0049     QCoro::Task<void> addMessage(const Message &message);
0050     void updateMessage(const Message &message);
0051     QCoro::Task<void> saveMessage(const PhoneNumberList &phoneNumberList,
0052                                   const QDateTime &datetime,
0053                                   const QString &text = QString(),
0054                                   const QString &attachments = QString(),
0055                                   const QString &smil = QString(),
0056                                   const QString &fromNumber = QString(),
0057                                   const QString &messageId = QString(),
0058                                   const bool pendingDownload = false,
0059                                   const QString &contentLocation = QString(),
0060                                   const QDateTime &expires = QDateTime(),
0061                                   const int size = 0);
0062     QCoro::Task<QString> sendMessageSMS(const PhoneNumber &phoneNumber, const QString &id, const QString &text);
0063     QCoro::Task<QString>
0064     sendMessageMMS(const PhoneNumberList &phoneNumberList, const QString &id, const QString &text, const QStringList &files, const qint64 totalSize);
0065     QCoro::Task<void> sendCancelResponse(const QString &transactionId);
0066     QCoro::Task<void> sendDeliveryAcknowledgement(const QString &transactionId);
0067     QCoro::Task<void> sendNotifyResponse(const QString &transactionId, const QString &status);
0068     QCoro::Task<void> sendReadReport(const QString &messageId);
0069     QCoro::Task<QByteArray> uploadMessage(const QByteArray &data);
0070     QCoro::Task<void> downloadMessage(const MmsMessage message);
0071     void handleDownloadedMessage(const QByteArray &response, const QString &url, const QDateTime &expires);
0072     void createNotification(Message &message);
0073     QCoro::Task<bool> handleTapbackReaction(Message &message, const QString &reactNumber);
0074     QCoro::Task<bool> saveTapback(Message &message,
0075                                   const QString &reactNumber,
0076                                   const QStringView &tapback,
0077                                   std::span<const QStringView> list,
0078                                   const bool &isAdd,
0079                                   const bool &isImage);
0080     QCoro::Task<void> sendTapbackHandler(const QString &numbers, const QString &id, const QString &tapback, const bool &isRemoved);
0081 
0082     Database m_database;
0083 
0084     Mms m_mms;
0085 
0086     ECurl m_curl;
0087 
0088     PhoneNumberList m_disabledNotificationNumber;
0089 
0090     PhoneNumber m_ownNumber;
0091 
0092     bool m_dataConnected;
0093 
0094     QStringList m_deferredIndicators;
0095 
0096 Q_SIGNALS:
0097     Q_SCRIPTABLE void messageAdded(const QString &phoneNumber, const QString &id);
0098     Q_SCRIPTABLE void messageUpdated(const QString &phoneNumber, const QString &id);
0099     Q_SCRIPTABLE void manualDownloadFinished(const QString &id, const bool isEmpty);
0100 };