hibiscus/src/main/java/site/hackery/unknit/MixinMinecraftMain.java

93 lines
3.5 KiB
Java

package site.hackery.unknit;
import com.mojang.authlib.Agent;
import com.mojang.authlib.GameProfile;
import com.mojang.authlib.exceptions.AuthenticationException;
import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService;
import com.mojang.authlib.yggdrasil.YggdrasilUserAuthentication;
import com.mojang.util.UUIDTypeAdapter;
import net.minecraft.client.main.Main;
import net.minecraft.client.util.Session;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyVariable;
import java.io.IOException;
import java.net.Proxy;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
@Mixin(Main.class)
public abstract class MixinMinecraftMain {
private static void replace(List<String> arguments, String tag, String value) {
int index = arguments.indexOf(tag);
if (index != -1) {
arguments.set(index + 1, value);
}
}
private static void replaceVersion(List<String> arguments) {
replace(arguments, "--version", "1.18.1");
replace(arguments, "--versionType", "release");
}
private static void replaceSession(List<String> arguments, Session session) {
replace(arguments, "--accessToken", session.getAccessToken());
arguments.add("--username");
arguments.add(session.getUsername());
arguments.add("--uuid");
arguments.add(session.getUuid());
}
@ModifyVariable(method = "main", at = @At("HEAD"), argsOnly = true, remap = false)
private static String[] setArgs(String[] args) {
List<String> arguments = new ArrayList<>(Arrays.asList(args));
replaceVersion(arguments);
try {
String authFile = System.getenv("LOGIN_FILE");
authFile = authFile == null ? "lastlogin.txt" : authFile;
List<String> loginDetails = Files.readAllLines(Paths.get(authFile));
if (loginDetails.size() >= 2) {
Session session = getAuthenticatedSession(loginDetails.get(0), loginDetails.get(1));
replaceSession(arguments, session);
}
} catch (AuthenticationException | IOException ignored) {
}
return arguments.toArray(new String[0]);
}
private static Session getAuthenticatedSession(String username, String password) throws AuthenticationException {
YggdrasilUserAuthentication yggdrasilUserAuthentication = constructUserAuthentication(username, password);
yggdrasilUserAuthentication.logIn();
GameProfile selectedProfile = yggdrasilUserAuthentication.getSelectedProfile();
return new Session(
selectedProfile.getName(),
UUIDTypeAdapter.fromUUID(selectedProfile.getId()),
yggdrasilUserAuthentication.getAuthenticatedToken(),
Optional.empty(),
Optional.empty(),
Session.AccountType.LEGACY // Why legacy?
);
}
private static YggdrasilUserAuthentication constructUserAuthentication(String username, String password) {
YggdrasilUserAuthentication yggdrasilUserAuthentication = (YggdrasilUserAuthentication) new YggdrasilAuthenticationService(Proxy.NO_PROXY, "my epic client token").createUserAuthentication(Agent.MINECRAFT);
yggdrasilUserAuthentication.setUsername(username);
yggdrasilUserAuthentication.setPassword(password);
return yggdrasilUserAuthentication;
}
}