File indexing completed on 2024-05-12 04:57:43

0001 /*
0002     This file is part of Choqok, the KDE micro-blogging client
0003 
0004     SPDX-FileCopyrightText: 2010-2012 Andrey Esin <gmlastik@gmail.com>
0005 
0006     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0007 */
0008 
0009 #include "bit_ly.h"
0010 
0011 #include <KIO/StoredTransferJob>
0012 #include <KLocalizedString>
0013 #include <KPluginFactory>
0014 
0015 #include "notifymanager.h"
0016 #include "passwordmanager.h"
0017 
0018 #include "bit_ly_settings.h"
0019 
0020 K_PLUGIN_CLASS_WITH_JSON(Bit_ly, "choqok_bit_ly.json")
0021 
0022 Bit_ly::Bit_ly(QObject *parent, const QVariantList &)
0023     : Choqok::Shortener(QLatin1String("choqok_bit_ly"), parent)
0024 {
0025 }
0026 
0027 Bit_ly::~Bit_ly()
0028 {
0029 }
0030 
0031 QString Bit_ly::shorten(const QString &url)
0032 {
0033     QString login = QCoreApplication::applicationName();
0034     QString apiKey = QLatin1String("R_bdd1ae8b6191dd36e13fc77ca1d4f27f");
0035     QUrl reqUrl(QLatin1String("http://api.bit.ly/v3/shorten"));
0036     QUrlQuery reqQuery;
0037     Bit_ly_Settings::self()->load();
0038     QString userApiKey = Choqok::PasswordManager::self()->readPassword(QStringLiteral("bitly_%1")
0039                          .arg(Bit_ly_Settings::login()));
0040     if (!Bit_ly_Settings::login().isEmpty() && !userApiKey.isEmpty()) {
0041         reqQuery.addQueryItem(QLatin1String("x_login"), Bit_ly_Settings::login());
0042         reqQuery.addQueryItem(QLatin1String("x_apiKey"), userApiKey);
0043     }
0044 
0045     if (Bit_ly_Settings::domain() == QLatin1String("j.mp")) { //bit.ly is default domain
0046         reqQuery.addQueryItem(QLatin1String("domain"), QLatin1String("j.mp"));
0047     }
0048 
0049     reqQuery.addQueryItem(QLatin1String("login"), QLatin1String(login.toUtf8()));
0050     reqQuery.addQueryItem(QLatin1String("apiKey"), QLatin1String(apiKey.toUtf8()));
0051     reqQuery.addQueryItem(QLatin1String("longUrl"), QUrl(url).url());
0052     reqQuery.addQueryItem(QLatin1String("format"), QLatin1String("txt"));
0053     reqUrl.setQuery(reqQuery);
0054 
0055     KIO::StoredTransferJob *job = KIO::storedGet(reqUrl, KIO::Reload, KIO::HideProgressInfo);
0056     job->exec();
0057 
0058     if (!job->error()) {
0059         const QByteArray data = job->data();
0060         QString output = QLatin1String(data);
0061         QRegExp rx(QLatin1String("(http://((.*)+)/([a-zA-Z0-9])+)"));
0062         rx.indexIn(output);
0063         QString bitlyUrl = rx.cap(0);
0064         if (!bitlyUrl.isEmpty()) {
0065             return bitlyUrl;
0066         }
0067 
0068         QString err = QLatin1String(data);
0069         if (output.startsWith(QLatin1String("INVALID_X_APIKEY"))) {
0070             err = i18n("API key is invalid");
0071         }
0072         if (output.startsWith(QLatin1String("INVALID_X_LOGIN"))) {
0073             err = i18n("Login is invalid");
0074         }
0075         if (output.startsWith(QLatin1String("RATE_LIMIT_EXCEEDED"))) {
0076             err = i18n("Rate limit exceeded. Try another shortener.");
0077         }
0078 
0079         Choqok::NotifyManager::error(i18n("Malformed response"), i18n("Bit.ly error"));
0080     } else {
0081         Choqok::NotifyManager::error(i18n("Cannot create a short URL.\n%1", job->errorString()),
0082                                      i18n("Bit.ly error"));
0083     }
0084     return url;
0085 }
0086 
0087 #include "bit_ly.moc"
0088 #include "moc_bit_ly.cpp"