1/*
2 SPDX-FileCopyrightText: 2018 Nicolas Fella <nicolas.fella@gmx.de>
3
4 SPDX-License-Identifier: LGPL-2.1-or-later
5*/
6
7#include "debug.h"
8#include <KConfigGroup>
9#include <KDesktopFile>
10#include <KIO/ApplicationLauncherJob>
11#include <KLocalizedString>
12#include <KPluginFactory>
13#include <KShell>
14#include <QDebug>
15#include <QJsonArray>
16#include <QProcess>
17#include <QStandardPaths>
18#include <QTimer>
19#include <QUrl>
20#include <purpose/pluginbase.h>
21
22Q_LOGGING_CATEGORY(PLUGIN_TELEGRAM, "kf.purpose.plugins.telegram")
23
24class TelegramJob : public Purpose::Job
25{
26 Q_OBJECT
27public:
28 TelegramJob(QObject *parent)
29 : Purpose::Job(parent)
30 {
31 }
32
33 QList<QUrl> arrayToList(const QJsonArray &array)
34 {
35 QList<QUrl> ret;
36 for (const QJsonValue &val : array) {
37 QUrl url(val.toString());
38 ret << url;
39 }
40 return ret;
41 }
42
43 void start() override
44 {
45 KService::Ptr service = KService::serviceByDesktopName(QStringLiteral("org.telegram.desktop"));
46
47 if (!service) {
48 service = KService::serviceByDesktopName(QStringLiteral("telegramdesktop"));
49 }
50
51 if (!service) {
52 service = KService::serviceByDesktopName(QStringLiteral("telegram-desktop"));
53 }
54
55 if (!service) {
56 // Failed to find the application
57 QTimer::singleShot(interval: 0, receiver: this, slot: [this]() {
58 setError(KJob::UserDefinedError + 1);
59 setErrorText(i18n(text: "Could not find telegram"));
60 setOutput({{QStringLiteral("url"), QString()}});
61 emitResult();
62 });
63 return;
64 }
65
66 QString exec = service->exec();
67 exec.replace(before: QLatin1String("%u"), after: QLatin1String("%f"));
68 exec.replace(before: QLatin1String("@@u"), after: QLatin1String("@@"));
69 exec.replace(before: QLatin1String(" -- "), after: QLatin1String(" -sendpath "));
70 service->setExec(exec);
71
72 auto *job = new KIO::ApplicationLauncherJob(service);
73 job->setUrls(arrayToList(array: data().value(key: QLatin1String("urls")).toArray()));
74 connect(sender: job, signal: &KIO::ApplicationLauncherJob::result, context: this, slot: [this](KJob *job) {
75 if (job->error()) {
76 qWarning() << "telegram share error:" << job->error() << job->errorString();
77 setError(job->error());
78 setErrorText(job->errorString());
79 } else {
80 setOutput({{QStringLiteral("url"), QString()}});
81 }
82
83 emitResult();
84 });
85 job->start();
86 }
87};
88
89class TelegramPlugin : public Purpose::PluginBase
90{
91 Q_OBJECT
92public:
93 using PluginBase::PluginBase;
94 Purpose::Job *createJob() const override
95 {
96 return new TelegramJob(nullptr);
97 }
98};
99
100K_PLUGIN_CLASS_WITH_JSON(TelegramPlugin, "telegramplugin.json")
101
102#include "telegramplugin.moc"
103

source code of purpose/src/plugins/telegram/telegramplugin.cpp