package com.mojang.realmsclient.client; import org.apache.logging.log4j.LogManager; import com.mojang.realmsclient.exception.RealmsHttpException; import com.mojang.realmsclient.exception.RetryCallException; import net.minecraft.SharedConstants; import java.net.URISyntaxException; import java.net.URI; import javax.annotation.Nullable; import com.mojang.realmsclient.dto.PingResult; import com.mojang.realmsclient.dto.RealmsNews; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.mojang.realmsclient.dto.UploadInfo; import com.mojang.realmsclient.dto.WorldDownload; import com.mojang.realmsclient.dto.PendingInvitesList; import com.mojang.realmsclient.dto.Subscription; import com.mojang.realmsclient.dto.RealmsWorldResetDto; import com.mojang.realmsclient.dto.Ops; import com.mojang.realmsclient.dto.WorldTemplatePaginatedList; import com.mojang.realmsclient.dto.RealmsWorldOptions; import com.mojang.realmsclient.dto.BackupList; import com.mojang.realmsclient.dto.PlayerInfo; import com.mojang.realmsclient.dto.ReflectionBasedSerialization; import com.mojang.realmsclient.dto.RealmsDescriptionDto; import com.mojang.realmsclient.dto.RealmsServerAddress; import com.mojang.realmsclient.dto.RealmsServerPlayerLists; import com.mojang.realmsclient.dto.RealmsServer; import com.mojang.realmsclient.exception.RealmsServiceException; import com.mojang.realmsclient.dto.RealmsServerList; import java.net.Proxy; import net.minecraft.client.Minecraft; import com.mojang.realmsclient.dto.GuardedSerializer; import org.apache.logging.log4j.Logger; public class RealmsClient { public static Environment currentEnvironment; private static boolean initialized; private static final Logger LOGGER; private final String sessionId; private final String username; private static final GuardedSerializer GSON; public static RealmsClient create() { final Minecraft dlx1 = Minecraft.getInstance(); final String string2 = dlx1.getUser().getName(); final String string3 = dlx1.getUser().getSessionId(); if (!RealmsClient.initialized) { RealmsClient.initialized = true; String string4 = System.getenv("realms.environment"); if (string4 == null) { string4 = System.getProperty("realms.environment"); } if (string4 != null) { if ("LOCAL".equals(string4)) { switchToLocal(); } else if ("STAGE".equals(string4)) { switchToStage(); } } } return new RealmsClient(string3, string2, dlx1.getProxy()); } public static void switchToStage() { RealmsClient.currentEnvironment = Environment.STAGE; } public static void switchToProd() { RealmsClient.currentEnvironment = Environment.PRODUCTION; } public static void switchToLocal() { RealmsClient.currentEnvironment = Environment.LOCAL; } public RealmsClient(final String string1, final String string2, final Proxy proxy) { this.sessionId = string1; this.username = string2; RealmsClientConfig.setProxy(proxy); } public RealmsServerList listWorlds() throws RealmsServiceException { final String string2 = this.url("worlds"); final String string3 = this.execute(Request.get(string2)); return RealmsServerList.parse(string3); } public RealmsServer getOwnWorld(final long long1) throws RealmsServiceException { final String string4 = this.url("worlds" + "/$ID".replace("$ID", String.valueOf(long1))); final String string5 = this.execute(Request.get(string4)); return RealmsServer.parse(string5); } public RealmsServerPlayerLists getLiveStats() throws RealmsServiceException { final String string2 = this.url("activities/liveplayerlist"); final String string3 = this.execute(Request.get(string2)); return RealmsServerPlayerLists.parse(string3); } public RealmsServerAddress join(final long long1) throws RealmsServiceException { final String string4 = this.url("worlds" + "/v1/$ID/join/pc".replace("$ID", "" + long1)); final String string5 = this.execute(Request.get(string4, 5000, 30000)); return RealmsServerAddress.parse(string5); } public void initializeWorld(final long long1, final String string2, final String string3) throws RealmsServiceException { final RealmsDescriptionDto din6 = new RealmsDescriptionDto(string2, string3); final String string4 = this.url("worlds" + "/$WORLD_ID/initialize".replace("$WORLD_ID", String.valueOf(long1))); final String string5 = RealmsClient.GSON.toJson(din6); this.execute(Request.post(string4, string5, 5000, 10000)); } public Boolean mcoEnabled() throws RealmsServiceException { final String string2 = this.url("mco/available"); final String string3 = this.execute(Request.get(string2)); return Boolean.valueOf(string3); } public Boolean stageAvailable() throws RealmsServiceException { final String string2 = this.url("mco/stageAvailable"); final String string3 = this.execute(Request.get(string2)); return Boolean.valueOf(string3); } public CompatibleVersionResponse clientCompatible() throws RealmsServiceException { final String string2 = this.url("mco/client/compatible"); final String string3 = this.execute(Request.get(string2)); CompatibleVersionResponse a4; try { a4 = CompatibleVersionResponse.valueOf(string3); } catch (IllegalArgumentException illegalArgumentException5) { throw new RealmsServiceException(500, "Could not check compatible version, got response: " + string3, -1, ""); } return a4; } public void uninvite(final long long1, final String string) throws RealmsServiceException { final String string2 = this.url("invites" + "/$WORLD_ID/invite/$UUID".replace("$WORLD_ID", String.valueOf(long1)).replace("$UUID", string)); this.execute(Request.delete(string2)); } public void uninviteMyselfFrom(final long long1) throws RealmsServiceException { final String string4 = this.url("invites" + "/$WORLD_ID".replace("$WORLD_ID", String.valueOf(long1))); this.execute(Request.delete(string4)); } public RealmsServer invite(final long long1, final String string) throws RealmsServiceException { final PlayerInfo dim5 = new PlayerInfo(); dim5.setName(string); final String string2 = this.url("invites" + "/$WORLD_ID".replace("$WORLD_ID", String.valueOf(long1))); final String string3 = this.execute(Request.post(string2, RealmsClient.GSON.toJson(dim5))); return RealmsServer.parse(string3); } public BackupList backupsFor(final long long1) throws RealmsServiceException { final String string4 = this.url("worlds" + "/$WORLD_ID/backups".replace("$WORLD_ID", String.valueOf(long1))); final String string5 = this.execute(Request.get(string4)); return BackupList.parse(string5); } public void update(final long long1, final String string2, final String string3) throws RealmsServiceException { final RealmsDescriptionDto din6 = new RealmsDescriptionDto(string2, string3); final String string4 = this.url("worlds" + "/$WORLD_ID".replace("$WORLD_ID", String.valueOf(long1))); this.execute(Request.post(string4, RealmsClient.GSON.toJson(din6))); } public void updateSlot(final long long1, final int integer, final RealmsWorldOptions div) throws RealmsServiceException { final String string6 = this.url("worlds" + "/$WORLD_ID/slot/$SLOT_ID".replace("$WORLD_ID", String.valueOf(long1)).replace("$SLOT_ID", String.valueOf(integer))); final String string7 = div.toJson(); this.execute(Request.post(string6, string7)); } public boolean switchSlot(final long long1, final int integer) throws RealmsServiceException { final String string5 = this.url("worlds" + "/$WORLD_ID/slot/$SLOT_ID".replace("$WORLD_ID", String.valueOf(long1)).replace("$SLOT_ID", String.valueOf(integer))); final String string6 = this.execute(Request.put(string5, "")); return Boolean.valueOf(string6); } public void restoreWorld(final long long1, final String string) throws RealmsServiceException { final String string2 = this.url("worlds" + "/$WORLD_ID/backups".replace("$WORLD_ID", String.valueOf(long1)), "backupId=" + string); this.execute(Request.put(string2, "", 40000, 600000)); } public WorldTemplatePaginatedList fetchWorldTemplates(final int integer1, final int integer2, final RealmsServer.WorldType c) throws RealmsServiceException { final String string5 = this.url("worlds" + "/templates/$WORLD_TYPE".replace("$WORLD_TYPE", c.toString()), String.format("page=%d&pageSize=%d", integer1, integer2)); final String string6 = this.execute(Request.get(string5)); return WorldTemplatePaginatedList.parse(string6); } public Boolean putIntoMinigameMode(final long long1, final String string) throws RealmsServiceException { final String string2 = "/minigames/$MINIGAME_ID/$WORLD_ID".replace("$MINIGAME_ID", string).replace("$WORLD_ID", String.valueOf(long1)); final String string3 = this.url("worlds" + string2); return Boolean.valueOf(this.execute(Request.put(string3, ""))); } public Ops op(final long long1, final String string) throws RealmsServiceException { final String string2 = "/$WORLD_ID/$PROFILE_UUID".replace("$WORLD_ID", String.valueOf(long1)).replace("$PROFILE_UUID", string); final String string3 = this.url("ops" + string2); return Ops.parse(this.execute(Request.post(string3, ""))); } public Ops deop(final long long1, final String string) throws RealmsServiceException { final String string2 = "/$WORLD_ID/$PROFILE_UUID".replace("$WORLD_ID", String.valueOf(long1)).replace("$PROFILE_UUID", string); final String string3 = this.url("ops" + string2); return Ops.parse(this.execute(Request.delete(string3))); } public Boolean open(final long long1) throws RealmsServiceException { final String string4 = this.url("worlds" + "/$WORLD_ID/open".replace("$WORLD_ID", String.valueOf(long1))); final String string5 = this.execute(Request.put(string4, "")); return Boolean.valueOf(string5); } public Boolean close(final long long1) throws RealmsServiceException { final String string4 = this.url("worlds" + "/$WORLD_ID/close".replace("$WORLD_ID", String.valueOf(long1))); final String string5 = this.execute(Request.put(string4, "")); return Boolean.valueOf(string5); } public Boolean resetWorldWithSeed(final long long1, final String string, final Integer integer, final boolean boolean4) throws RealmsServiceException { final RealmsWorldResetDto diw7 = new RealmsWorldResetDto(string, -1L, integer, boolean4); final String string2 = this.url("worlds" + "/$WORLD_ID/reset".replace("$WORLD_ID", String.valueOf(long1))); final String string3 = this.execute(Request.post(string2, RealmsClient.GSON.toJson(diw7), 30000, 80000)); return Boolean.valueOf(string3); } public Boolean resetWorldWithTemplate(final long long1, final String string) throws RealmsServiceException { final RealmsWorldResetDto diw5 = new RealmsWorldResetDto(null, Long.valueOf(string), -1, false); final String string2 = this.url("worlds" + "/$WORLD_ID/reset".replace("$WORLD_ID", String.valueOf(long1))); final String string3 = this.execute(Request.post(string2, RealmsClient.GSON.toJson(diw5), 30000, 80000)); return Boolean.valueOf(string3); } public Subscription subscriptionFor(final long long1) throws RealmsServiceException { final String string4 = this.url("subscriptions" + "/$WORLD_ID".replace("$WORLD_ID", String.valueOf(long1))); final String string5 = this.execute(Request.get(string4)); return Subscription.parse(string5); } public int pendingInvitesCount() throws RealmsServiceException { final String string2 = this.url("invites/count/pending"); final String string3 = this.execute(Request.get(string2)); return Integer.parseInt(string3); } public PendingInvitesList pendingInvites() throws RealmsServiceException { final String string2 = this.url("invites/pending"); final String string3 = this.execute(Request.get(string2)); return PendingInvitesList.parse(string3); } public void acceptInvitation(final String string) throws RealmsServiceException { final String string2 = this.url("invites" + "/accept/$INVITATION_ID".replace("$INVITATION_ID", string)); this.execute(Request.put(string2, "")); } public WorldDownload download(final long long1, final int integer) throws RealmsServiceException { final String string5 = this.url("worlds" + "/$WORLD_ID/slot/$SLOT_ID/download".replace("$WORLD_ID", String.valueOf(long1)).replace("$SLOT_ID", String.valueOf(integer))); final String string6 = this.execute(Request.get(string5)); return WorldDownload.parse(string6); } public UploadInfo upload(final long long1, final String string) throws RealmsServiceException { final String string2 = this.url("worlds" + "/$WORLD_ID/backups/upload".replace("$WORLD_ID", String.valueOf(long1))); final UploadInfo dja6 = new UploadInfo(); if (string != null) { dja6.setToken(string); } final GsonBuilder gsonBuilder7 = new GsonBuilder(); gsonBuilder7.excludeFieldsWithoutExposeAnnotation(); final Gson gson8 = gsonBuilder7.create(); final String string3 = gson8.toJson(dja6); return UploadInfo.parse(this.execute(Request.put(string2, string3))); } public void rejectInvitation(final String string) throws RealmsServiceException { final String string2 = this.url("invites" + "/reject/$INVITATION_ID".replace("$INVITATION_ID", string)); this.execute(Request.put(string2, "")); } public void agreeToTos() throws RealmsServiceException { final String string2 = this.url("mco/tos/agreed"); this.execute(Request.post(string2, "")); } public RealmsNews getNews() throws RealmsServiceException { final String string2 = this.url("mco/v1/news"); final String string3 = this.execute(Request.get(string2, 5000, 10000)); return RealmsNews.parse(string3); } public void sendPingResults(final PingResult dil) throws RealmsServiceException { final String string3 = this.url("regions/ping/stat"); this.execute(Request.post(string3, RealmsClient.GSON.toJson(dil))); } public Boolean trialAvailable() throws RealmsServiceException { final String string2 = this.url("trial"); final String string3 = this.execute(Request.get(string2)); return Boolean.valueOf(string3); } public void deleteWorld(final long long1) throws RealmsServiceException { final String string4 = this.url("worlds" + "/$WORLD_ID".replace("$WORLD_ID", String.valueOf(long1))); this.execute(Request.delete(string4)); } @Nullable private String url(final String string) { return this.url(string, null); } @Nullable private String url(final String string1, @Nullable final String string2) { try { return new URI(RealmsClient.currentEnvironment.protocol, RealmsClient.currentEnvironment.baseUrl, "/" + string1, string2, null).toASCIIString(); } catch (URISyntaxException uRISyntaxException4) { uRISyntaxException4.printStackTrace(); return null; } } private String execute(final Request did) throws RealmsServiceException { did.cookie("sid", this.sessionId); did.cookie("user", this.username); did.cookie("version", SharedConstants.getCurrentVersion().getName()); try { final int integer3 = did.responseCode(); if (integer3 == 503) { final int integer4 = did.getRetryAfterHeader(); throw new RetryCallException(integer4); } final String string4 = did.text(); if (integer3 >= 200 && integer3 < 300) { return string4; } if (integer3 == 401) { final String string5 = did.getHeader("WWW-Authenticate"); RealmsClient.LOGGER.info("Could not authorize you against Realms server: " + string5); throw new RealmsServiceException(integer3, string5, -1, string5); } if (string4 == null || string4.length() == 0) { RealmsClient.LOGGER.error("Realms error code: " + integer3 + " message: " + string4); throw new RealmsServiceException(integer3, string4, integer3, ""); } final RealmsError dic5 = RealmsError.create(string4); RealmsClient.LOGGER.error("Realms http code: " + integer3 + " - error code: " + dic5.getErrorCode() + " - message: " + dic5.getErrorMessage() + " - raw body: " + string4); throw new RealmsServiceException(integer3, string4, dic5); } catch (RealmsHttpException djg3) { throw new RealmsServiceException(500, "Could not connect to Realms: " + djg3.getMessage(), -1, ""); } } static { RealmsClient.currentEnvironment = Environment.PRODUCTION; LOGGER = LogManager.getLogger(); GSON = new GuardedSerializer(); } public enum Environment { PRODUCTION("pc.realms.minecraft.net", "https"), STAGE("pc-stage.realms.minecraft.net", "https"), LOCAL("localhost:8080", "http"); public String baseUrl; public String protocol; private Environment(final String string3, final String string4) { this.baseUrl = string3; this.protocol = string4; } } public enum CompatibleVersionResponse { COMPATIBLE, OUTDATED, OTHER; } }