Allow usage of :slim to get the slim version of a skin

This commit is contained in:
libraryaddict 2020-04-10 13:05:10 +12:00
parent 1fcc0bbea9
commit 64641c5390
No known key found for this signature in database
GPG Key ID: 052E4FBCD257AEA4
2 changed files with 61 additions and 32 deletions

@ -25,12 +25,18 @@ public class SkinUtils {
void onSuccess(WrappedGameProfile profile); void onSuccess(WrappedGameProfile profile);
} }
public static void handleFile(File file, SkinCallback callback) { public enum ModelType {
SLIM,
NORMAL
}
public static void handleFile(File file, ModelType modelType, SkinCallback callback) {
new BukkitRunnable() { new BukkitRunnable() {
@Override @Override
public void run() { public void run() {
try { try {
MineSkinResponse response = DisguiseUtilities.getMineSkinAPI().generateFromFile(callback, file); MineSkinResponse response = DisguiseUtilities.getMineSkinAPI()
.generateFromFile(callback, file, modelType);
new BukkitRunnable() { new BukkitRunnable() {
@Override @Override
@ -42,7 +48,7 @@ public class SkinUtils {
return; return;
} }
handleProfile(response.getGameProfile(), callback); handleProfile(response.getGameProfile(), modelType, callback);
} }
}.runTask(LibsDisguises.getInstance()); }.runTask(LibsDisguises.getInstance());
} }
@ -58,11 +64,12 @@ public class SkinUtils {
}.runTaskAsynchronously(LibsDisguises.getInstance()); }.runTaskAsynchronously(LibsDisguises.getInstance());
} }
public static void handleUrl(String url, SkinCallback callback) { public static void handleUrl(String url, ModelType modelType, SkinCallback callback) {
new BukkitRunnable() { new BukkitRunnable() {
@Override @Override
public void run() { public void run() {
MineSkinResponse response = DisguiseUtilities.getMineSkinAPI().generateFromUrl(callback, url); MineSkinResponse response = DisguiseUtilities.getMineSkinAPI()
.generateFromUrl(callback, url, modelType);
new BukkitRunnable() { new BukkitRunnable() {
@Override @Override
@ -73,14 +80,14 @@ public class SkinUtils {
callback.onError(LibsMsg.SKIN_API_FAIL); callback.onError(LibsMsg.SKIN_API_FAIL);
} }
handleProfile(response.getGameProfile(), callback); handleProfile(response.getGameProfile(), modelType, callback);
} }
}.runTask(LibsDisguises.getInstance()); }.runTask(LibsDisguises.getInstance());
} }
}.runTaskAsynchronously(LibsDisguises.getInstance()); }.runTaskAsynchronously(LibsDisguises.getInstance());
} }
public static void handleName(String playerName, SkinCallback callback) { public static void handleName(String playerName, ModelType modelType, SkinCallback callback) {
WrappedGameProfile gameProfile = DisguiseUtilities.getProfileFromMojang(playerName, new LibsProfileLookup() { WrappedGameProfile gameProfile = DisguiseUtilities.getProfileFromMojang(playerName, new LibsProfileLookup() {
@Override @Override
public void onLookup(WrappedGameProfile gameProfile) { public void onLookup(WrappedGameProfile gameProfile) {
@ -94,7 +101,7 @@ public class SkinUtils {
return; return;
} }
handleProfile(gameProfile, callback); handleProfile(gameProfile, modelType, callback);
} }
}); });
@ -108,18 +115,18 @@ public class SkinUtils {
return; return;
} }
handleProfile(gameProfile, callback); handleProfile(gameProfile, modelType, callback);
} }
public static void handleProfile(GameProfile profile, SkinCallback callback) { public static void handleProfile(GameProfile profile, ModelType modelType, SkinCallback callback) {
handleProfile(WrappedGameProfile.fromHandle(profile), callback); handleProfile(WrappedGameProfile.fromHandle(profile), modelType, callback);
} }
public static void handleProfile(WrappedGameProfile profile, SkinCallback callback) { public static void handleProfile(WrappedGameProfile profile, ModelType modelType, SkinCallback callback) {
callback.onSuccess(profile); callback.onSuccess(profile);
} }
public static void handleUUID(UUID uuid, SkinCallback callback) { public static void handleUUID(UUID uuid, ModelType modelType, SkinCallback callback) {
new BukkitRunnable() { new BukkitRunnable() {
@Override @Override
public void run() { public void run() {
@ -134,7 +141,7 @@ public class SkinUtils {
return; return;
} }
handleProfile(profile, callback); handleProfile(profile, modelType, callback);
} }
}.runTask(LibsDisguises.getInstance()); }.runTask(LibsDisguises.getInstance());
} }
@ -158,10 +165,17 @@ public class SkinUtils {
} }
public static void grabSkin(String param, SkinCallback callback) { public static void grabSkin(String param, SkinCallback callback) {
ModelType modelType = param.toLowerCase().endsWith(":slim") ? ModelType.SLIM : ModelType.NORMAL;
if (modelType == ModelType.SLIM) {
param = param.substring(0, param.length() - ":slim".length());
}
if (param.matches("https?:\\/\\/.+")) { if (param.matches("https?:\\/\\/.+")) {
// Its an url // Its an url
callback.onInfo(LibsMsg.SKIN_API_USING_URL); callback.onInfo(LibsMsg.SKIN_API_USING_URL);
handleUrl(param, callback);
handleUrl(param, modelType, callback);
} else { } else {
// Check if it contains legal file characters // Check if it contains legal file characters
if (!param.matches("[a-zA-Z0-9 -_]+(\\.png)?")) { if (!param.matches("[a-zA-Z0-9 -_]+(\\.png)?")) {
@ -183,7 +197,7 @@ public class SkinUtils {
if (file != null) { if (file != null) {
callback.onInfo(LibsMsg.SKIN_API_USING_FILE); callback.onInfo(LibsMsg.SKIN_API_USING_FILE);
handleFile(file, callback); handleFile(file, modelType, callback);
// We're using a file! // We're using a file!
} else { } else {
// We're using a player name or UUID! // We're using a player name or UUID!
@ -192,7 +206,7 @@ public class SkinUtils {
UUID uuid = UUID.fromString(param); UUID uuid = UUID.fromString(param);
callback.onInfo(LibsMsg.SKIN_API_USING_UUID); callback.onInfo(LibsMsg.SKIN_API_USING_UUID);
handleUUID(uuid, callback); handleUUID(uuid, modelType, callback);
return; return;
} }
catch (Exception ignored) { catch (Exception ignored) {
@ -200,7 +214,7 @@ public class SkinUtils {
} }
callback.onInfo(LibsMsg.SKIN_API_USING_NAME); callback.onInfo(LibsMsg.SKIN_API_USING_NAME);
handleName(param, callback); handleName(param, modelType, callback);
} }
} }
} }

@ -52,11 +52,13 @@ public class MineSkinAPI {
* *
* @param url * @param url
*/ */
public MineSkinResponse generateFromUrl(SkinUtils.SkinCallback callback, String url) { public MineSkinResponse generateFromUrl(SkinUtils.SkinCallback callback, String url,
return doPost(callback, "/generate/url", url, null); SkinUtils.ModelType modelType) {
return doPost(callback, "/generate/url", url, null, modelType);
} }
private MineSkinResponse doPost(SkinUtils.SkinCallback callback, String path, String skinUrl, File file) { private MineSkinResponse doPost(SkinUtils.SkinCallback callback, String path, String skinUrl, File file,
SkinUtils.ModelType modelType) {
lock.lock(); lock.lock();
HttpURLConnection connection = null; HttpURLConnection connection = null;
@ -102,12 +104,19 @@ public class MineSkinAPI {
writer.append(CRLF).append(skinUrl).append(CRLF).flush(); writer.append(CRLF).append(skinUrl).append(CRLF).flush();
} }
if (modelType == SkinUtils.ModelType.SLIM) {
writer.append("--").append(boundary).append(CRLF);
writer.append("Content-Disposition: form-data; name=\"model\"").append(CRLF);
writer.append(CRLF).append("slim").append(CRLF).flush();
}
// End of multipart/form-data. // End of multipart/form-data.
writer.append("--").append(boundary).append("--").append(CRLF).flush(); writer.append("--").append(boundary).append("--").append(CRLF).flush();
} }
if (connection.getResponseCode() == 500) { if (connection.getResponseCode() == 500) {
APIError error = new Gson().fromJson(new BufferedReader(new InputStreamReader(connection.getErrorStream(), StandardCharsets.UTF_8)) APIError error = new Gson().fromJson(
new BufferedReader(new InputStreamReader(connection.getErrorStream(), StandardCharsets.UTF_8))
.lines().collect(Collectors.joining("\n")), APIError.class); .lines().collect(Collectors.joining("\n")), APIError.class);
if (error.code == 403) { if (error.code == 403) {
@ -137,8 +146,8 @@ public class MineSkinAPI {
// Get the input stream, what we receive // Get the input stream, what we receive
try (InputStream input = connection.getInputStream()) { try (InputStream input = connection.getInputStream()) {
// Read it to string // Read it to string
String response = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8)) String response = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8)).lines()
.lines().collect(Collectors.joining("\n")); .collect(Collectors.joining("\n"));
MineSkinResponse skinResponse = new Gson().fromJson(response, MineSkinResponse.class); MineSkinResponse skinResponse = new Gson().fromJson(response, MineSkinResponse.class);
@ -176,22 +185,27 @@ public class MineSkinAPI {
return null; return null;
} }
public MineSkinResponse generateFromUUID(UUID uuid) throws IllegalArgumentException { public MineSkinResponse generateFromUUID(UUID uuid, SkinUtils.ModelType modelType) throws IllegalArgumentException {
lock.lock(); lock.lock();
try { try {
URL url = new URL("https://api.mineskin.org/generate/user/:" + uuid.toString()); String siteUrl = "https://api.mineskin.org/generate/user/:" + uuid.toString();
if (modelType == SkinUtils.ModelType.SLIM) {
siteUrl += "?model=slim";
}
URL url = new URL(siteUrl);
// Creating a connection // Creating a connection
HttpURLConnection con = (HttpURLConnection) url.openConnection(); HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestProperty("User-Agent", "LibsDisguises"); con.setRequestProperty("User-Agent", "LibsDisguises");
// We're writing a body that contains the API access key (Not required and obsolete, but!)
con.setDoOutput(true); con.setDoOutput(true);
// Get the input stream, what we receive // Get the input stream, what we receive
try (InputStream input = con.getInputStream()) { try (InputStream input = con.getInputStream()) {
// Read it to string // Read it to string
String response = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8)) String response = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8)).lines()
.lines().collect(Collectors.joining("\n")); .collect(Collectors.joining("\n"));
MineSkinResponse skinResponse = new Gson().fromJson(response, MineSkinResponse.class); MineSkinResponse skinResponse = new Gson().fromJson(response, MineSkinResponse.class);
@ -223,7 +237,8 @@ public class MineSkinAPI {
* *
* @param file * @param file
*/ */
public MineSkinResponse generateFromFile(SkinUtils.SkinCallback callback, File file) { public MineSkinResponse generateFromFile(SkinUtils.SkinCallback callback, File file,
return doPost(callback, "/generate/upload", null, file); SkinUtils.ModelType modelType) {
return doPost(callback, "/generate/upload", null, file, modelType);
} }
} }