Skip to content

Commit 6cfdeb9

Browse files
[feat] Session Token login option (#5998)
1 parent 90d52f4 commit 6cfdeb9

File tree

8 files changed

+144
-7
lines changed

8 files changed

+144
-7
lines changed

src/main/java/meteordevelopment/meteorclient/gui/screens/accounts/AccountInfoScreen.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import meteordevelopment.meteorclient.gui.widgets.containers.WHorizontalList;
1111
import meteordevelopment.meteorclient.gui.widgets.pressable.WButton;
1212
import meteordevelopment.meteorclient.systems.accounts.Account;
13+
import meteordevelopment.meteorclient.systems.accounts.AccountType;
1314
import meteordevelopment.meteorclient.systems.accounts.TokenAccount;
1415
import meteordevelopment.meteorclient.utils.render.color.Color;
1516

@@ -28,11 +29,14 @@ public void initWidgets() {
2829
TokenAccount e = (TokenAccount) account;
2930
WHorizontalList l = add(theme.horizontalList()).expandX().widget();
3031

32+
String tokenLabel = account.getType() + " token:";
33+
if (account.getType() == AccountType.Session) tokenLabel = "";
34+
3135
WButton copy = theme.button("Copy");
3236
copy.action = () -> mc.keyboard.setClipboard(e.getToken());
3337

34-
l.add(theme.label("TheAltening token:"));
35-
l.add(theme.label(e.getToken()).color(Color.GRAY)).pad(5);
38+
l.add(theme.label(tokenLabel));
39+
l.add(theme.label(account.getType() == AccountType.Session ? "Click to copy Token" : e.getToken()).color(Color.GRAY)).pad(5);
3640
l.add(copy);
3741
}
3842
}

src/main/java/meteordevelopment/meteorclient/gui/screens/accounts/AccountsScreen.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public void initWidgets() {
3737

3838
addButton(l, "Cracked", () -> mc.setScreen(new AddCrackedAccountScreen(theme, this)));
3939
addButton(l, "Altening", () -> mc.setScreen(new AddAlteningAccountScreen(theme, this)));
40+
addButton(l, "Session", () -> mc.setScreen(new AddSessionAccountScreen(theme, this)));
4041
addButton(l, "Microsoft", () -> mc.setScreen(new AddMicrosoftAccountScreen(theme, this)));
4142
}
4243

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client).
3+
* Copyright (c) Meteor Development.
4+
*/
5+
6+
package meteordevelopment.meteorclient.gui.screens.accounts;
7+
8+
import meteordevelopment.meteorclient.gui.GuiTheme;
9+
import meteordevelopment.meteorclient.gui.widgets.containers.WTable;
10+
import meteordevelopment.meteorclient.gui.widgets.input.WTextBox;
11+
import meteordevelopment.meteorclient.systems.accounts.types.SessionAccount;
12+
13+
public class AddSessionAccountScreen extends AddAccountScreen {
14+
public AddSessionAccountScreen(GuiTheme theme, AccountsScreen parent) {
15+
super(theme, "Add Session Account", parent);
16+
}
17+
18+
@Override
19+
public void initWidgets() {
20+
WTable t = add(theme.table()).widget();
21+
22+
// Access token
23+
t.add(theme.label("Access Token: "));
24+
WTextBox token = t.add(theme.textBox("")).minWidth(400).expandX().widget();
25+
token.setFocused(true);
26+
t.row();
27+
28+
// Add
29+
add = t.add(theme.button("Add")).expandX().widget();
30+
add.action = () -> {
31+
if (!token.get().isEmpty()) {
32+
SessionAccount account = new SessionAccount(token.get());
33+
AccountsScreen.addAccount(this, parent, account);
34+
}
35+
};
36+
37+
enterAction = add.action;
38+
}
39+
}

src/main/java/meteordevelopment/meteorclient/systems/accounts/AccountType.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@
88
public enum AccountType {
99
Cracked,
1010
Microsoft,
11-
TheAltening
11+
TheAltening,
12+
Session
1213
}

src/main/java/meteordevelopment/meteorclient/systems/accounts/Accounts.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import meteordevelopment.meteorclient.systems.Systems;
1010
import meteordevelopment.meteorclient.systems.accounts.types.CrackedAccount;
1111
import meteordevelopment.meteorclient.systems.accounts.types.MicrosoftAccount;
12+
import meteordevelopment.meteorclient.systems.accounts.types.SessionAccount;
1213
import meteordevelopment.meteorclient.systems.accounts.types.TheAlteningAccount;
1314
import meteordevelopment.meteorclient.utils.misc.NbtException;
1415
import meteordevelopment.meteorclient.utils.misc.NbtUtils;
@@ -77,6 +78,7 @@ public Accounts fromTag(NbtCompound tag) {
7778
case Cracked -> new CrackedAccount(null).fromTag(t);
7879
case Microsoft -> new MicrosoftAccount(null).fromTag(t);
7980
case TheAltening -> new TheAlteningAccount(null).fromTag(t);
81+
case Session -> new SessionAccount(null).fromTag(t);
8082
};
8183
} catch (NbtException e) {
8284
return null;

src/main/java/meteordevelopment/meteorclient/systems/accounts/types/CrackedAccount.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public boolean login() {
3434

3535
@Override
3636
public boolean equals(Object o) {
37-
if (!(o instanceof CrackedAccount)) return false;
38-
return ((CrackedAccount) o).getUsername().equals(this.getUsername());
37+
if (!(o instanceof CrackedAccount account)) return false;
38+
return account.getUsername().equals(this.getUsername());
3939
}
4040
}

src/main/java/meteordevelopment/meteorclient/systems/accounts/types/MicrosoftAccount.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public boolean login() {
5050

5151
@Override
5252
public boolean equals(Object o) {
53-
if (!(o instanceof MicrosoftAccount)) return false;
54-
return ((MicrosoftAccount) o).name.equals(this.name);
53+
if (!(o instanceof MicrosoftAccount account)) return false;
54+
return account.name.equals(this.name);
5555
}
5656
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
/*
2+
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client).
3+
* Copyright (c) Meteor Development.
4+
*/
5+
6+
package meteordevelopment.meteorclient.systems.accounts.types;
7+
8+
import com.mojang.util.UndashedUuid;
9+
import meteordevelopment.meteorclient.MeteorClient;
10+
import meteordevelopment.meteorclient.systems.accounts.Account;
11+
import meteordevelopment.meteorclient.systems.accounts.AccountType;
12+
import meteordevelopment.meteorclient.systems.accounts.TokenAccount;
13+
import meteordevelopment.meteorclient.utils.network.Http;
14+
import net.minecraft.client.session.Session;
15+
import net.minecraft.nbt.NbtCompound;
16+
17+
import java.util.Optional;
18+
19+
public class SessionAccount extends Account<SessionAccount> implements TokenAccount {
20+
private String accessToken;
21+
22+
public SessionAccount(String label) {
23+
super(AccountType.Session, label);
24+
accessToken = label;
25+
}
26+
27+
@Override
28+
public SessionAccount fromTag(NbtCompound tag) {
29+
super.fromTag(tag);
30+
31+
accessToken = tag.getString("token", "");
32+
return this;
33+
}
34+
35+
@Override
36+
public NbtCompound toTag() {
37+
NbtCompound tag = super.toTag();
38+
tag.putString("token", accessToken);
39+
return tag;
40+
}
41+
42+
@Override
43+
public boolean fetchInfo() {
44+
if (accessToken == null || accessToken.isBlank()) return false;
45+
46+
ProfileResponse profile;
47+
try {
48+
profile = Http.get("https://api.minecraftservices.com/minecraft/profile")
49+
.bearer(accessToken)
50+
.sendJson(ProfileResponse.class);
51+
} catch (IllegalArgumentException e) {
52+
MeteorClient.LOG.error("Invalid session account token", e);
53+
return false;
54+
}
55+
56+
if (profile == null || profile.id == null || profile.name == null) return false;
57+
58+
cache.username = profile.name;
59+
cache.uuid = profile.id;
60+
61+
return true;
62+
}
63+
64+
@Override
65+
public boolean login() {
66+
if (accessToken == null || accessToken.isBlank()) return false;
67+
68+
super.login();
69+
cache.loadHead();
70+
71+
setSession(new Session(cache.username, UndashedUuid.fromStringLenient(cache.uuid), accessToken, Optional.empty(), Optional.empty()));
72+
return true;
73+
}
74+
75+
@Override
76+
public String getToken() {
77+
return accessToken;
78+
}
79+
80+
@Override
81+
public boolean equals(Object o) {
82+
if (!(o instanceof SessionAccount account2)) return false;
83+
return account2.name.equals(this.name);
84+
}
85+
86+
private static class ProfileResponse {
87+
public String id;
88+
public String name;
89+
}
90+
}

0 commit comments

Comments
 (0)