1 /*
2 * Copyright (C) 2018 Damir Porobic <damir.porobic@gmx.com>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18 */
19
20 #include "ImgurUploader.h"
21
ImgurUploader()22 ImgurUploader::ImgurUploader() :
23 mConfig(KsnipConfigProvider::instance()),
24 mImgurWrapper(new ImgurWrapper(mConfig->imgurBaseUrl(), nullptr)),
25 mImgurResponseLogger(new ImgurResponseLogger)
26
27 {
28 connect(mImgurWrapper, &ImgurWrapper::uploadFinished, this, &ImgurUploader::imgurUploadFinished);
29 connect(mImgurWrapper, &ImgurWrapper::error, this, &ImgurUploader::imgurError);
30 connect(mImgurWrapper, &ImgurWrapper::tokenUpdated, this, &ImgurUploader::imgurTokenUpdated);
31 connect(mImgurWrapper, &ImgurWrapper::tokenRefreshRequired, this, &ImgurUploader::imgurTokenRefresh);
32 }
33
type() const34 UploaderType ImgurUploader::type() const
35 {
36 return UploaderType::Imgur;
37 }
38
~ImgurUploader()39 ImgurUploader::~ImgurUploader()
40 {
41 delete mImgurWrapper;
42 delete mImgurResponseLogger;
43 }
44
upload(const QImage & image)45 void ImgurUploader::upload(const QImage &image)
46 {
47 mImage = image;
48
49 if (!mConfig->imgurForceAnonymous() && !mConfig->imgurAccessToken().isEmpty()) {
50 mImgurWrapper->startUpload(mImage, mConfig->imgurAccessToken());
51 } else {
52 mImgurWrapper->startUpload(mImage);
53 }
54 }
55
imgurUploadFinished(const ImgurResponse & response)56 void ImgurUploader::imgurUploadFinished(const ImgurResponse &response)
57 {
58 qInfo("%s", qPrintable(tr("Upload to imgur.com finished!")));
59 mImgurResponseLogger->log(response);
60
61 auto url = formatResponseUrl(response);
62
63 emit finished(UploadResult(UploadStatus::NoError, type(), url));
64 }
65
formatResponseUrl(const ImgurResponse & response) const66 QString ImgurUploader::formatResponseUrl(const ImgurResponse &response) const
67 {
68 if (!mConfig->imgurLinkDirectlyToImage()) {
69 return response.link().remove(QLatin1String(".png"));
70 }
71 return response.link();
72 }
73
imgurError(const QString & message)74 void ImgurUploader::imgurError(const QString &message)
75 {
76 qCritical("MainWindow: Imgur uploader returned error: '%s'", qPrintable(message));
77 emit finished(UploadResult(UploadStatus::NoError, type(), message));
78 }
79
imgurTokenUpdated(const QString & accessToken,const QString & refreshToken,const QString & username)80 void ImgurUploader::imgurTokenUpdated(const QString &accessToken, const QString &refreshToken, const QString &username)
81 {
82 mConfig->setImgurAccessToken(accessToken.toUtf8());
83 mConfig->setImgurRefreshToken(refreshToken.toUtf8());
84 mConfig->setImgurUsername(username);
85
86 qInfo("%s", qPrintable(tr("Received new token, trying upload again…")));
87 upload(mImage);
88 }
89
imgurTokenRefresh()90 void ImgurUploader::imgurTokenRefresh()
91 {
92 mImgurWrapper->refreshToken(mConfig->imgurRefreshToken(), mConfig->imgurClientId(), mConfig->imgurClientSecret());
93 qInfo("%s", qPrintable(tr("Imgur token has expired, requesting new token…")));
94 }
95