File indexing completed on 2024-04-28 04:42:42

0001 /*
0002  * SPDX-FileCopyrightText: 2020-2021 Han Young <hanyoung@protonmail.com>
0003  * SPDX-FileCopyrightText: 2020 Devin Lin <espidev@gmail.com>
0004  *
0005  * SPDX-License-Identifier: LGPL-2.0-or-later
0006  */
0007 
0008 #include "geotimezone.h"
0009 #include "reply_p.h"
0010 
0011 #include <QJsonDocument>
0012 #include <QNetworkAccessManager>
0013 #include <QNetworkReply>
0014 #include <QNetworkRequest>
0015 #include <QUrlQuery>
0016 
0017 namespace KWeatherCore
0018 {
0019 class GeoTimezonePrivate : public ReplyPrivate
0020 {
0021 public:
0022     QString m_timezone;
0023 };
0024 
0025 GeoTimezone::GeoTimezone(QNetworkAccessManager *nam, double lat, double lon, QObject *parent)
0026     : Reply(new GeoTimezonePrivate, parent)
0027 {
0028     Q_D(GeoTimezone);
0029     QUrl url(QStringLiteral("http://api.geonames.org/timezoneJSON"));
0030     QUrlQuery query;
0031     query.addQueryItem(QStringLiteral("lat"), QString::number(lat));
0032     query.addQueryItem(QStringLiteral("lng"), QString::number(lon));
0033     query.addQueryItem(QStringLiteral("username"), QStringLiteral("kweatherdev"));
0034     url.setQuery(query);
0035 
0036     QNetworkRequest req(url);
0037     auto reply = nam->get(req);
0038     connect(reply, &QNetworkReply::finished, this, [reply, this]() {
0039         Q_D(GeoTimezone);
0040         reply->deleteLater();
0041         if (reply->error() != QNetworkReply::NoError) {
0042             d->setError(Reply::NetworkError, reply->errorString());
0043         } else {
0044             const QJsonDocument doc = QJsonDocument::fromJson(reply->readAll());
0045             // if our api calls reached daily limit
0046             if (doc[QLatin1String("status")][QLatin1String("value")].toInt() == 18) {
0047                 d->setError(Reply::RateLimitExceeded);
0048                 qWarning() << "api calls reached daily limit";
0049             } else {
0050                 d->m_timezone = doc[QLatin1String("timezoneId")].toString();
0051             }
0052         }
0053         Q_EMIT finished();
0054     });
0055 }
0056 
0057 QString GeoTimezone::timezone() const
0058 {
0059     Q_D(const GeoTimezone);
0060     return d->m_timezone;
0061 }
0062 }
0063 
0064 #include "moc_geotimezone.cpp"