aboutsummaryrefslogtreecommitdiff
path: root/launcher/minecraft/auth-msa/context.h
blob: f1ac99b87520e14bc019dd6c245d0089eab1c97f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#pragma once

#include <QObject>
#include <QList>
#include <QVector>
#include <QNetworkReply>
#include <QImage>

#include <katabasis/OAuth2.h>

struct Skin {
    QString id;
    QString url;
    QString variant;

    QByteArray data;
};

struct Cape {
    QString id;
    QString url;
    QString alias;

    QByteArray data;
};

struct MinecraftProfile  {
    QString id;
    QString name;
    Skin skin;
    int currentCape = -1;
    QVector<Cape> capes;
    Katabasis::Validity validity = Katabasis::Validity::None;
};

enum class AccountType {
    MSA,
    Mojang
};

struct AccountData {
    AccountType type = AccountType::MSA;

    Katabasis::Token msaToken;
    Katabasis::Token userToken;
    Katabasis::Token xboxApiToken;
    Katabasis::Token mojangservicesToken;
    Katabasis::Token minecraftToken;

    MinecraftProfile minecraftProfile;
    Katabasis::Validity validity_ = Katabasis::Validity::None;
};

class Context : public QObject
{
    Q_OBJECT

public:
    explicit Context(QObject *parent = 0);

    QByteArray saveState();
    bool resumeFromState(QByteArray data);

    bool isBusy() {
        return activity_ != Katabasis::Activity::Idle;
    };
    Katabasis::Validity validity() {
        return m_account.validity_;
    };

    bool signIn();
    bool silentSignIn();
    bool signOut();

    QString userName();
    QString userId();
    QString gameToken();
signals:
    void succeeded();
    void failed();
    void activityChanged(Katabasis::Activity activity);

private slots:
    void onLinkingSucceeded();
    void onLinkingFailed();
    void onOpenBrowser(const QUrl &url);
    void onCloseBrowser();
    void onOAuthActivityChanged(Katabasis::Activity activity);

private:
    void doUserAuth();
    Q_SLOT void onUserAuthDone(int, QNetworkReply::NetworkError, QByteArray, QList<QNetworkReply::RawHeaderPair>);

    void doSTSAuthMinecraft();
    Q_SLOT void onSTSAuthMinecraftDone(int, QNetworkReply::NetworkError, QByteArray, QList<QNetworkReply::RawHeaderPair>);
    void doMinecraftAuth();
    Q_SLOT void onMinecraftAuthDone(int, QNetworkReply::NetworkError, QByteArray, QList<QNetworkReply::RawHeaderPair>);

    void doSTSAuthGeneric();
    Q_SLOT void onSTSAuthGenericDone(int, QNetworkReply::NetworkError, QByteArray, QList<QNetworkReply::RawHeaderPair>);
    void doXBoxProfile();
    Q_SLOT void onXBoxProfileDone(int, QNetworkReply::NetworkError, QByteArray, QList<QNetworkReply::RawHeaderPair>);

    void doMinecraftProfile();
    Q_SLOT void onMinecraftProfileDone(int, QNetworkReply::NetworkError, QByteArray, QList<QNetworkReply::RawHeaderPair>);

    void doGetSkin();
    Q_SLOT void onSkinDone(int, QNetworkReply::NetworkError, QByteArray, QList<QNetworkReply::RawHeaderPair>);

    void checkResult();

private:
    void beginActivity(Katabasis::Activity activity);
    void finishActivity();
    void clearTokens();

private:
    Katabasis::OAuth2 *oauth2 = nullptr;

    int requestsDone = 0;
    bool xboxProfileSucceeded = false;
    bool mcAuthSucceeded = false;
    Katabasis::Activity activity_ = Katabasis::Activity::Idle;

    AccountData m_account;

    QNetworkAccessManager *mgr = nullptr;
};