diff options
Diffstat (limited to 'launcher/minecraft/services')
-rw-r--r-- | launcher/minecraft/services/SkinDelete.cpp | 42 | ||||
-rw-r--r-- | launcher/minecraft/services/SkinDelete.h | 29 | ||||
-rw-r--r-- | launcher/minecraft/services/SkinUpload.cpp | 66 | ||||
-rw-r--r-- | launcher/minecraft/services/SkinUpload.h | 38 |
4 files changed, 175 insertions, 0 deletions
diff --git a/launcher/minecraft/services/SkinDelete.cpp b/launcher/minecraft/services/SkinDelete.cpp new file mode 100644 index 00000000..34977257 --- /dev/null +++ b/launcher/minecraft/services/SkinDelete.cpp @@ -0,0 +1,42 @@ +#include "SkinDelete.h" +#include <QNetworkRequest> +#include <QHttpMultiPart> +#include <Env.h> + +SkinDelete::SkinDelete(QObject *parent, AuthSessionPtr session) + : Task(parent), m_session(session) +{ +} + +void SkinDelete::executeTask() +{ + QNetworkRequest request(QUrl("https://api.minecraftservices.com/minecraft/profile/skins/active")); + request.setRawHeader("Authorization", QString("Bearer %1").arg(m_session->access_token).toLocal8Bit()); + QNetworkReply *rep = ENV.qnam().deleteResource(request); + m_reply = std::shared_ptr<QNetworkReply>(rep); + + setStatus(tr("Deleting skin")); + connect(rep, &QNetworkReply::uploadProgress, this, &Task::setProgress); + connect(rep, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(downloadError(QNetworkReply::NetworkError))); + connect(rep, SIGNAL(finished()), this, SLOT(downloadFinished())); +} + +void SkinDelete::downloadError(QNetworkReply::NetworkError error) +{ + // error happened during download. + qCritical() << "Network error: " << error; + emitFailed(m_reply->errorString()); +} + +void SkinDelete::downloadFinished() +{ + // if the download failed + if (m_reply->error() != QNetworkReply::NetworkError::NoError) + { + emitFailed(QString("Network error: %1").arg(m_reply->errorString())); + m_reply.reset(); + return; + } + emitSucceeded(); +} + diff --git a/launcher/minecraft/services/SkinDelete.h b/launcher/minecraft/services/SkinDelete.h new file mode 100644 index 00000000..839bf9bc --- /dev/null +++ b/launcher/minecraft/services/SkinDelete.h @@ -0,0 +1,29 @@ +#pragma once + +#include <QFile> +#include <QtNetwork/QtNetwork> +#include <memory> +#include <minecraft/auth/AuthSession.h> +#include "tasks/Task.h" + +typedef std::shared_ptr<class SkinDelete> SkinDeletePtr; + +class SkinDelete : public Task +{ + Q_OBJECT +public: + SkinDelete(QObject *parent, AuthSessionPtr session); + virtual ~SkinDelete() = default; + +private: + AuthSessionPtr m_session; + std::shared_ptr<QNetworkReply> m_reply; + +protected: + virtual void executeTask(); + +public slots: + void downloadError(QNetworkReply::NetworkError); + void downloadFinished(); +}; + diff --git a/launcher/minecraft/services/SkinUpload.cpp b/launcher/minecraft/services/SkinUpload.cpp new file mode 100644 index 00000000..4e5a1698 --- /dev/null +++ b/launcher/minecraft/services/SkinUpload.cpp @@ -0,0 +1,66 @@ +#include "SkinUpload.h" +#include <QNetworkRequest> +#include <QHttpMultiPart> +#include <Env.h> + +QByteArray getVariant(SkinUpload::Model model) { + switch (model) { + default: + qDebug() << "Unknown skin type!"; + case SkinUpload::STEVE: + return "CLASSIC"; + case SkinUpload::ALEX: + return "SLIM"; + } +} + +SkinUpload::SkinUpload(QObject *parent, AuthSessionPtr session, QByteArray skin, SkinUpload::Model model) + : Task(parent), m_model(model), m_skin(skin), m_session(session) +{ +} + +void SkinUpload::executeTask() +{ + QNetworkRequest request(QUrl("https://api.minecraftservices.com/minecraft/profile/skins")); + request.setRawHeader("Authorization", QString("Bearer %1").arg(m_session->access_token).toLocal8Bit()); + QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); + + QHttpPart skin; + skin.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/png")); + skin.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"file\"; filename=\"skin.png\"")); + skin.setBody(m_skin); + + QHttpPart model; + model.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"variant\"")); + model.setBody(getVariant(m_model)); + + multiPart->append(skin); + multiPart->append(model); + + QNetworkReply *rep = ENV.qnam().post(request, multiPart); + m_reply = std::shared_ptr<QNetworkReply>(rep); + + setStatus(tr("Uploading skin")); + connect(rep, &QNetworkReply::uploadProgress, this, &Task::setProgress); + connect(rep, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(downloadError(QNetworkReply::NetworkError))); + connect(rep, SIGNAL(finished()), this, SLOT(downloadFinished())); +} + +void SkinUpload::downloadError(QNetworkReply::NetworkError error) +{ + // error happened during download. + qCritical() << "Network error: " << error; + emitFailed(m_reply->errorString()); +} + +void SkinUpload::downloadFinished() +{ + // if the download failed + if (m_reply->error() != QNetworkReply::NetworkError::NoError) + { + emitFailed(QString("Network error: %1").arg(m_reply->errorString())); + m_reply.reset(); + return; + } + emitSucceeded(); +} diff --git a/launcher/minecraft/services/SkinUpload.h b/launcher/minecraft/services/SkinUpload.h new file mode 100644 index 00000000..ec859699 --- /dev/null +++ b/launcher/minecraft/services/SkinUpload.h @@ -0,0 +1,38 @@ +#pragma once + +#include <QFile> +#include <QtNetwork/QtNetwork> +#include <memory> +#include <minecraft/auth/AuthSession.h> +#include "tasks/Task.h" + +typedef std::shared_ptr<class SkinUpload> SkinUploadPtr; + +class SkinUpload : public Task +{ + Q_OBJECT +public: + enum Model + { + STEVE, + ALEX + }; + + // Note this class takes ownership of the file. + SkinUpload(QObject *parent, AuthSessionPtr session, QByteArray skin, Model model = STEVE); + virtual ~SkinUpload() {} + +private: + Model m_model; + QByteArray m_skin; + AuthSessionPtr m_session; + std::shared_ptr<QNetworkReply> m_reply; +protected: + virtual void executeTask(); + +public slots: + + void downloadError(QNetworkReply::NetworkError); + + void downloadFinished(); +}; |