File indexing completed on 2024-05-19 04:03:04

0001 /*
0002     SPDX-FileCopyrightText: 2018 Nicolas Fella <nicolas.fella@gmx.de>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-or-later
0005 */
0006 
0007 #include "debug.h"
0008 #include <KConfigGroup>
0009 #include <KDesktopFile>
0010 #include <KIO/ApplicationLauncherJob>
0011 #include <KLocalizedString>
0012 #include <KPluginFactory>
0013 #include <KShell>
0014 #include <QDebug>
0015 #include <QJsonArray>
0016 #include <QProcess>
0017 #include <QStandardPaths>
0018 #include <QTimer>
0019 #include <QUrl>
0020 #include <purpose/pluginbase.h>
0021 
0022 Q_LOGGING_CATEGORY(PLUGIN_TELEGRAM, "kf.purpose.plugins.telegram")
0023 
0024 class TelegramJob : public Purpose::Job
0025 {
0026     Q_OBJECT
0027 public:
0028     TelegramJob(QObject *parent)
0029         : Purpose::Job(parent)
0030     {
0031     }
0032 
0033     QList<QUrl> arrayToList(const QJsonArray &array)
0034     {
0035         QList<QUrl> ret;
0036         for (const QJsonValue &val : array) {
0037             QUrl url(val.toString());
0038             ret << url;
0039         }
0040         return ret;
0041     }
0042 
0043     void start() override
0044     {
0045         KService::Ptr service = KService::serviceByDesktopName(QStringLiteral("org.telegram.desktop"));
0046 
0047         if (!service) {
0048             service = KService::serviceByDesktopName(QStringLiteral("telegramdesktop"));
0049         }
0050 
0051         if (!service) {
0052             service = KService::serviceByDesktopName(QStringLiteral("telegram-desktop"));
0053         }
0054 
0055         if (!service) {
0056             // Failed to find the application
0057             QTimer::singleShot(0, this, [this]() {
0058                 setError(KJob::UserDefinedError + 1);
0059                 setErrorText(i18n("Could not find telegram"));
0060                 setOutput({{QStringLiteral("url"), QString()}});
0061                 emitResult();
0062             });
0063             return;
0064         }
0065 
0066         QString exec = service->exec();
0067         exec.replace(QLatin1String("%u"), QLatin1String("%f"));
0068         exec.replace(QLatin1String("@@u"), QLatin1String("@@"));
0069         exec.replace(QLatin1String(" -- "), QLatin1String(" -sendpath "));
0070         service->setExec(exec);
0071 
0072         auto *job = new KIO::ApplicationLauncherJob(service);
0073         job->setUrls(arrayToList(data().value(QLatin1String("urls")).toArray()));
0074         connect(job, &KIO::ApplicationLauncherJob::result, this, [this](KJob *job) {
0075             if (job->error()) {
0076                 qWarning() << "telegram share error:" << job->error() << job->errorString();
0077                 setError(job->error());
0078                 setErrorText(job->errorString());
0079             } else {
0080                 setOutput({{QStringLiteral("url"), QString()}});
0081             }
0082 
0083             emitResult();
0084         });
0085         job->start();
0086     }
0087 };
0088 
0089 class TelegramPlugin : public Purpose::PluginBase
0090 {
0091     Q_OBJECT
0092 public:
0093     using PluginBase::PluginBase;
0094     Purpose::Job *createJob() const override
0095     {
0096         return new TelegramJob(nullptr);
0097     }
0098 };
0099 
0100 K_PLUGIN_CLASS_WITH_JSON(TelegramPlugin, "telegramplugin.json")
0101 
0102 #include "telegramplugin.moc"