package net.citizensnpcs.util; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import com.google.common.io.CharStreams; import net.citizensnpcs.api.util.Messaging; public class MojangSkinGenerator { public static JSONObject generateFromPNG(final byte[] png, boolean slim) throws InterruptedException, ExecutionException { return EXECUTOR.submit(() -> { DataOutputStream out = null; InputStreamReader reader = null; try { URL target = new URL("https://api.mineskin.org/generate/upload" + (slim ? "?model=slim" : "")); HttpURLConnection con = (HttpURLConnection) target.openConnection(); con.setRequestMethod("POST"); con.setDoOutput(true); con.setRequestProperty("User-Agent", "Citizens/2.0"); con.setRequestProperty("Cache-Control", "no-cache"); con.setRequestProperty("Content-Type", "multipart/form-data;boundary=*****"); con.setConnectTimeout(1000); con.setReadTimeout(30000); out = new DataOutputStream(con.getOutputStream()); out.writeBytes("--*****\r\n"); out.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\"skin.png\"\r\n"); out.writeBytes("Content-Type: image/png\r\n\r\n"); out.write(png); out.writeBytes("\r\n"); out.writeBytes("--*****\r\n"); out.writeBytes("Content-Disposition: form-data; name=\"name\";\r\n\r\n\r\n"); if (slim) { out.writeBytes("--*****\r\n"); out.writeBytes("Content-Disposition: form-data; name=\"variant\";\r\n\r\n"); out.writeBytes("slim\r\n"); } out.writeBytes("--*****--\r\n"); out.flush(); out.close(); reader = new InputStreamReader(con.getInputStream()); String str = CharStreams.toString(reader); if (Messaging.isDebugging()) { Messaging.debug(str); } if (con.getResponseCode() != 200) return null; JSONObject output = (JSONObject) new JSONParser().parse(str); JSONObject data = (JSONObject) output.get("data"); con.disconnect(); return data; } finally { if (out != null) { try { out.close(); } catch (IOException e) { } } if (reader != null) { try { reader.close(); } catch (IOException e) { } } } }).get(); } public static JSONObject generateFromURL(final String url, boolean slim) throws InterruptedException, ExecutionException { return EXECUTOR.submit(() -> { DataOutputStream out = null; InputStreamReader reader = null; try { URL target = new URL("https://api.mineskin.org/generate/url"); HttpURLConnection con = (HttpURLConnection) target.openConnection(); con.setRequestMethod("POST"); con.setDoOutput(true); con.setRequestProperty("User-Agent", "Citizens/2.0"); con.setRequestProperty("Cache-Control", "no-cache"); con.setRequestProperty("Accept", "application/json"); con.setRequestProperty("Content-Type", "application/json"); con.setConnectTimeout(1000); con.setReadTimeout(30000); out = new DataOutputStream(con.getOutputStream()); JSONObject req = new JSONObject(); req.put("url", url); req.put("name", ""); if (slim) { req.put("variant", "slim"); } out.writeBytes(req.toJSONString().replace("\\", "")); out.close(); reader = new InputStreamReader(con.getInputStream()); String str = CharStreams.toString(reader); if (Messaging.isDebugging()) { Messaging.debug(str); } if (con.getResponseCode() != 200) return null; JSONObject output = (JSONObject) new JSONParser().parse(str); JSONObject data = (JSONObject) output.get("data"); con.disconnect(); return data; } finally { if (out != null) { try { out.close(); } catch (IOException e) { } } if (reader != null) { try { reader.close(); } catch (IOException e) { } } } }).get(); } private static final ExecutorService EXECUTOR = Executors.newSingleThreadExecutor(); }