Java tutorial
/* * Visage * Copyright (c) 2015-2016, Aesen Vismea <aesen@unascribed.com> * * The MIT License * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package com.surgeplay.visage.util; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.Map.Entry; import java.util.UUID; import org.spacehq.mc.auth.GameProfile; import org.spacehq.mc.auth.properties.Property; import org.spacehq.mc.auth.serialize.UUIDSerializer; import org.spacehq.mc.auth.util.Base64; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; public class Profiles { private static Gson gson = new GsonBuilder().registerTypeAdapter(UUID.class, new UUIDSerializer()).create(); public static boolean isSlim(GameProfile profile) throws IOException { if (profile.getProperties().containsKey("textures")) { String texJson = new String(Base64 .decode(profile.getProperties().get("textures").getValue().getBytes(StandardCharsets.UTF_8))); JsonObject obj = gson.fromJson(texJson, JsonObject.class); JsonObject tex = obj.getAsJsonObject("textures"); if (tex.has("SKIN")) { JsonObject skin = tex.getAsJsonObject("SKIN"); if (skin.has("metadata")) { if ("slim".equals(skin.getAsJsonObject("metadata").get("model").getAsString())) return true; } return false; } } return UUIDs.isAlex(profile.getId()); } public static GameProfile readGameProfile(DataInputStream data) throws IOException { boolean present = data.readBoolean(); if (!present) return new GameProfile(new UUID(0, 0), "<unknown>"); UUID uuid = new UUID(data.readLong(), data.readLong()); String name = data.readUTF(); GameProfile profile = new GameProfile(uuid, name); int len = data.readUnsignedShort(); for (int i = 0; i < len; i++) { boolean signed = data.readBoolean(); Property prop; if (signed) { prop = new Property(data.readUTF(), data.readUTF(), data.readUTF()); } else { prop = new Property(data.readUTF(), data.readUTF()); } profile.getProperties().put(data.readUTF(), prop); } return profile; } public static void writeGameProfile(DataOutputStream data, GameProfile profile) throws IOException { if (profile == null) { data.writeBoolean(false); return; } data.writeBoolean(true); data.writeLong(profile.getId().getMostSignificantBits()); data.writeLong(profile.getId().getLeastSignificantBits()); data.writeUTF(profile.getName()); data.writeShort(profile.getProperties().size()); for (Entry<String, Property> en : profile.getProperties().entrySet()) { data.writeBoolean(en.getValue().hasSignature()); if (en.getValue().hasSignature()) { data.writeUTF(en.getValue().getName()); data.writeUTF(en.getValue().getValue()); data.writeUTF(en.getValue().getSignature()); } else { data.writeUTF(en.getValue().getName()); data.writeUTF(en.getValue().getValue()); } data.writeUTF(en.getKey()); } } }