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