From 2dd055d156f40901ce1d626ddf1a25b6d998bfd3 Mon Sep 17 00:00:00 2001 From: Liam Date: Mon, 8 Apr 2024 04:51:17 +0100 Subject: [PATCH] cleanup --- src/main/java/cc/fascinated/Consts.java | 17 ---- .../fascinated/api/model/ErrorResponse.java | 40 -------- .../java/cc/fascinated/config/Config.java | 20 ++++ .../{api => }/controller/HomeController.java | 8 +- .../controller/PlayerController.java | 31 +++--- .../ExceptionControllerAdvice.java | 4 +- .../fascinated/mojang/MojangAPIService.java | 38 ------- .../mojang/types/MojangApiProfile.java | 22 ---- .../types/MojangSessionServerProfile.java | 42 -------- .../MojangSessionServerProfileProperties.java | 12 --- .../player/PlayerManagerService.java | 79 --------------- .../java/cc/fascinated/player/impl/Cape.java | 13 --- .../cc/fascinated/player/impl/Player.java | 70 ------------- .../java/cc/fascinated/player/impl/Skin.java | 80 --------------- .../cc/fascinated/player/impl/SkinPart.java | 95 ------------------ .../fascinated/player/impl/SkinPartEnum.java | 16 --- .../cc/fascinated/player/impl/SkinType.java | 22 ---- src/main/resources/application.yml | 2 +- src/main/resources/public/favicon.ico | Bin 0 -> 67646 bytes src/main/resources/templates/error.html | 10 +- src/main/resources/templates/index.html | 6 +- 21 files changed, 58 insertions(+), 569 deletions(-) delete mode 100644 src/main/java/cc/fascinated/Consts.java delete mode 100644 src/main/java/cc/fascinated/api/model/ErrorResponse.java create mode 100644 src/main/java/cc/fascinated/config/Config.java rename src/main/java/cc/fascinated/{api => }/controller/HomeController.java (63%) rename src/main/java/cc/fascinated/{api => }/controller/PlayerController.java (69%) rename src/main/java/cc/fascinated/{api/controller => exception}/ExceptionControllerAdvice.java (93%) delete mode 100644 src/main/java/cc/fascinated/mojang/MojangAPIService.java delete mode 100644 src/main/java/cc/fascinated/mojang/types/MojangApiProfile.java delete mode 100644 src/main/java/cc/fascinated/mojang/types/MojangSessionServerProfile.java delete mode 100644 src/main/java/cc/fascinated/mojang/types/MojangSessionServerProfileProperties.java delete mode 100644 src/main/java/cc/fascinated/player/PlayerManagerService.java delete mode 100644 src/main/java/cc/fascinated/player/impl/Cape.java delete mode 100644 src/main/java/cc/fascinated/player/impl/Player.java delete mode 100644 src/main/java/cc/fascinated/player/impl/Skin.java delete mode 100644 src/main/java/cc/fascinated/player/impl/SkinPart.java delete mode 100644 src/main/java/cc/fascinated/player/impl/SkinPartEnum.java delete mode 100644 src/main/java/cc/fascinated/player/impl/SkinType.java create mode 100644 src/main/resources/public/favicon.ico diff --git a/src/main/java/cc/fascinated/Consts.java b/src/main/java/cc/fascinated/Consts.java deleted file mode 100644 index aefb8b0..0000000 --- a/src/main/java/cc/fascinated/Consts.java +++ /dev/null @@ -1,17 +0,0 @@ -package cc.fascinated; - -import lombok.Getter; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -@Component -public class Consts { - - @Getter - private static String SITE_URL; - - @Value("${site-url}") - public void setSiteUrl(String name) { - SITE_URL = name; - } -} diff --git a/src/main/java/cc/fascinated/api/model/ErrorResponse.java b/src/main/java/cc/fascinated/api/model/ErrorResponse.java deleted file mode 100644 index b806e2c..0000000 --- a/src/main/java/cc/fascinated/api/model/ErrorResponse.java +++ /dev/null @@ -1,40 +0,0 @@ -package cc.fascinated.api.model; - -import com.fasterxml.jackson.annotation.JsonFormat; -import io.micrometer.common.lang.NonNull; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.ToString; -import org.springframework.http.HttpStatus; - -import java.util.Date; - -@NoArgsConstructor -@Setter -@Getter -@ToString -public final class ErrorResponse { - /** - * The status code of this error. - */ - @NonNull - private HttpStatus status; - - /** - * The message of this error. - */ - @NonNull private String message; - - /** - * The timestamp this error occurred. - */ - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy hh:mm:ss") - private Date timestamp; - - public ErrorResponse(@NonNull HttpStatus status, @NonNull String message) { - this.status = status; - this.message = message; - timestamp = new Date(); - } -} \ No newline at end of file diff --git a/src/main/java/cc/fascinated/config/Config.java b/src/main/java/cc/fascinated/config/Config.java new file mode 100644 index 0000000..2aac78f --- /dev/null +++ b/src/main/java/cc/fascinated/config/Config.java @@ -0,0 +1,20 @@ +package cc.fascinated.config; + +import jakarta.annotation.PostConstruct; +import lombok.Getter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +@Configuration +@Getter +public class Config { + public static Config INSTANCE; + + @Value("${public-url}") + private String webPublicUrl; + + @PostConstruct + public void onInitialize() { + INSTANCE = this; + } +} \ No newline at end of file diff --git a/src/main/java/cc/fascinated/api/controller/HomeController.java b/src/main/java/cc/fascinated/controller/HomeController.java similarity index 63% rename from src/main/java/cc/fascinated/api/controller/HomeController.java rename to src/main/java/cc/fascinated/controller/HomeController.java index 17c02bc..783c4de 100644 --- a/src/main/java/cc/fascinated/api/controller/HomeController.java +++ b/src/main/java/cc/fascinated/controller/HomeController.java @@ -1,6 +1,6 @@ -package cc.fascinated.api.controller; +package cc.fascinated.controller; -import cc.fascinated.Consts; +import cc.fascinated.config.Config; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @@ -17,8 +17,8 @@ public class HomeController { @RequestMapping(value = "/") public String home(Model model) { - model.addAttribute("url", Consts.getSITE_URL() + "/player/" + exampleUuid); - model.addAttribute("avatar_url", Consts.getSITE_URL() + "/player/avatar/" + exampleUuid); + model.addAttribute("url", Config.INSTANCE.getWebPublicUrl() + "/player/" + exampleUuid); + model.addAttribute("avatar_url", Config.INSTANCE.getWebPublicUrl() + "/player/avatar/" + exampleUuid); return "index"; } } diff --git a/src/main/java/cc/fascinated/api/controller/PlayerController.java b/src/main/java/cc/fascinated/controller/PlayerController.java similarity index 69% rename from src/main/java/cc/fascinated/api/controller/PlayerController.java rename to src/main/java/cc/fascinated/controller/PlayerController.java index 87d217a..ad67ed3 100644 --- a/src/main/java/cc/fascinated/api/controller/PlayerController.java +++ b/src/main/java/cc/fascinated/controller/PlayerController.java @@ -1,6 +1,6 @@ -package cc.fascinated.api.controller; +package cc.fascinated.controller; -import cc.fascinated.player.PlayerManagerService; +import cc.fascinated.player.PlayerService; import cc.fascinated.player.impl.Player; import cc.fascinated.player.impl.Skin; import cc.fascinated.player.impl.SkinPart; @@ -22,10 +22,10 @@ public class PlayerController { private final CacheControl cacheControl = CacheControl.maxAge(1, TimeUnit.HOURS).cachePublic(); @NonNull private final SkinPart defaultHead = Objects.requireNonNull(Skin.getDefaultHead(), "Default head is null"); - private final PlayerManagerService playerManagerService; + private final PlayerService playerManagerService; @Autowired - public PlayerController(PlayerManagerService playerManagerService) { + public PlayerController(PlayerService playerManagerService) { this.playerManagerService = playerManagerService; } @@ -41,17 +41,24 @@ public class PlayerController { } - @GetMapping(value = "/avatar/{id}") - public ResponseEntity getPlayerHead(@PathVariable String id) { + @GetMapping(value = "/{part}/{id}") + public ResponseEntity getPlayerHead(@PathVariable String part, + @PathVariable String id, + @RequestParam(required = false, defaultValue = "250") int size) { Player player = playerManagerService.getPlayer(id); - byte[] headBytes; - if (player == null) { - headBytes = defaultHead.getPartData(); - } else { + byte[] headBytes = new byte[0]; + if (player != null) { Skin skin = player.getSkin(); - SkinPart head = skin.getHead(); - headBytes = head.getPartData(); + SkinPart skinPart = skin.getPart(part); + if (skinPart != null) { + headBytes = skinPart.getPartData(size); + } } + + if (headBytes == null) { + headBytes = defaultHead.getPartData(size); + } + return ResponseEntity.ok() .cacheControl(cacheControl) .contentType(MediaType.IMAGE_PNG) diff --git a/src/main/java/cc/fascinated/api/controller/ExceptionControllerAdvice.java b/src/main/java/cc/fascinated/exception/ExceptionControllerAdvice.java similarity index 93% rename from src/main/java/cc/fascinated/api/controller/ExceptionControllerAdvice.java rename to src/main/java/cc/fascinated/exception/ExceptionControllerAdvice.java index 9c68098..eb74f1a 100644 --- a/src/main/java/cc/fascinated/api/controller/ExceptionControllerAdvice.java +++ b/src/main/java/cc/fascinated/exception/ExceptionControllerAdvice.java @@ -1,6 +1,6 @@ -package cc.fascinated.api.controller; +package cc.fascinated.exception; -import cc.fascinated.api.model.ErrorResponse; +import cc.fascinated.model.ErrorResponse; import io.micrometer.common.lang.NonNull; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/cc/fascinated/mojang/MojangAPIService.java b/src/main/java/cc/fascinated/mojang/MojangAPIService.java deleted file mode 100644 index 50da6b7..0000000 --- a/src/main/java/cc/fascinated/mojang/MojangAPIService.java +++ /dev/null @@ -1,38 +0,0 @@ -package cc.fascinated.mojang; - -import cc.fascinated.mojang.types.MojangApiProfile; -import cc.fascinated.mojang.types.MojangSessionServerProfile; -import cc.fascinated.util.WebRequest; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -@Service @Log4j2 -public class MojangAPIService { - - @Value("${mojang.session-server}") - private String mojangSessionServerUrl; - - @Value("${mojang.api}") - private String mojangApiUrl; - - /** - * Gets the Session Server profile of the player with the given UUID. - * - * @param id the uuid or name of the player - * @return the profile - */ - public MojangSessionServerProfile getSessionServerProfile(String id) { - return WebRequest.get(mojangSessionServerUrl + "/session/minecraft/profile/" + id, MojangSessionServerProfile.class); - } - - /** - * Gets the Mojang API profile of the player with the given UUID. - * - * @param id the name of the player - * @return the profile - */ - public MojangApiProfile getApiProfile(String id) { - return WebRequest.get(mojangApiUrl + "/users/profiles/minecraft/" + id, MojangApiProfile.class); - } -} diff --git a/src/main/java/cc/fascinated/mojang/types/MojangApiProfile.java b/src/main/java/cc/fascinated/mojang/types/MojangApiProfile.java deleted file mode 100644 index 89656f0..0000000 --- a/src/main/java/cc/fascinated/mojang/types/MojangApiProfile.java +++ /dev/null @@ -1,22 +0,0 @@ -package cc.fascinated.mojang.types; - -import lombok.Getter; -import lombok.ToString; - -@Getter @ToString -public class MojangApiProfile { - - private String id; - private String name; - - public MojangApiProfile() {} - - /** - * Check if the profile is valid. - * - * @return if the profile is valid - */ - public boolean isValid() { - return id != null && name != null; - } -} diff --git a/src/main/java/cc/fascinated/mojang/types/MojangSessionServerProfile.java b/src/main/java/cc/fascinated/mojang/types/MojangSessionServerProfile.java deleted file mode 100644 index a153813..0000000 --- a/src/main/java/cc/fascinated/mojang/types/MojangSessionServerProfile.java +++ /dev/null @@ -1,42 +0,0 @@ -package cc.fascinated.mojang.types; - -import lombok.Getter; -import lombok.ToString; - -import java.util.ArrayList; -import java.util.List; - -@Getter @ToString -public class MojangSessionServerProfile { - - /** - * The UUID of the player. - */ - private String id; - - /** - * The name of the player. - */ - private String name; - - /** - * The properties for the player. - */ - private final List properties = new ArrayList<>(); - - public MojangSessionServerProfile() {} - - /** - * Get the texture property for the player. - * - * @return the texture property - */ - public MojangSessionServerProfileProperties getTextureProperty() { - for (MojangSessionServerProfileProperties property : properties) { - if (property.getName().equals("textures")) { - return property; - } - } - return null; - } -} diff --git a/src/main/java/cc/fascinated/mojang/types/MojangSessionServerProfileProperties.java b/src/main/java/cc/fascinated/mojang/types/MojangSessionServerProfileProperties.java deleted file mode 100644 index 6df0197..0000000 --- a/src/main/java/cc/fascinated/mojang/types/MojangSessionServerProfileProperties.java +++ /dev/null @@ -1,12 +0,0 @@ -package cc.fascinated.mojang.types; - -import lombok.Getter; -import lombok.ToString; - -@Getter @ToString -public class MojangSessionServerProfileProperties { - private String name; - private String value; - - public MojangSessionServerProfileProperties() {} -} diff --git a/src/main/java/cc/fascinated/player/PlayerManagerService.java b/src/main/java/cc/fascinated/player/PlayerManagerService.java deleted file mode 100644 index 4aa02c6..0000000 --- a/src/main/java/cc/fascinated/player/PlayerManagerService.java +++ /dev/null @@ -1,79 +0,0 @@ -package cc.fascinated.player; - -import cc.fascinated.mojang.MojangAPIService; -import cc.fascinated.mojang.types.MojangApiProfile; -import cc.fascinated.mojang.types.MojangSessionServerProfile; -import cc.fascinated.player.impl.Player; -import cc.fascinated.util.UUIDUtils; -import lombok.extern.log4j.Log4j2; -import net.jodah.expiringmap.ExpirationPolicy; -import net.jodah.expiringmap.ExpiringMap; -import org.springframework.stereotype.Service; - -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.TimeUnit; - -@Service @Log4j2 -public class PlayerManagerService { - - /** - * The cache of players. - */ - private final Map players = ExpiringMap.builder() - .expiration(1, TimeUnit.HOURS) - .expirationPolicy(ExpirationPolicy.CREATED) - .build(); - - /** - * The cache of player names to UUIDs. - */ - private final Map playerNameToUUIDCache = ExpiringMap.builder() - .expiration(1, TimeUnit.DAYS) - .expirationPolicy(ExpirationPolicy.CREATED) - .build(); - - private final MojangAPIService mojangAPIService; - - public PlayerManagerService(MojangAPIService mojangAPIService) { - this.mojangAPIService = mojangAPIService; - } - - /** - * Gets a player by their UUID. - * - * @param id the uuid or name of the player - * @return the player or null if the player does not exist - */ - public Player getPlayer(String id) { - UUID uuid = null; - if (id.length() == 32 || id.length() == 36) { - try { - uuid = UUID.fromString(id.length() == 32 ? UUIDUtils.addUUIDDashes(id) : id); - } catch (Exception ignored) {} - } else { - uuid = playerNameToUUIDCache.get(id.toUpperCase()); - } - - if (uuid != null && players.containsKey(uuid)) { - return players.get(uuid); - } - - MojangSessionServerProfile profile = uuid == null ? null : mojangAPIService.getSessionServerProfile(uuid.toString()); - if (profile == null) { - MojangApiProfile apiProfile = mojangAPIService.getApiProfile(id); - if (apiProfile == null || !apiProfile.isValid()) { - return null; - } - profile = mojangAPIService.getSessionServerProfile(apiProfile.getId().length() == 32 ? UUIDUtils.addUUIDDashes(apiProfile.getId()) : apiProfile.getId()); - } - if (profile == null) { // The player cannot be found using their name or UUID - log.info("Player with id {} could not be found", id); - return null; - } - Player player = new Player(profile); - players.put(player.getUuid(), player); - playerNameToUUIDCache.put(player.getName().toUpperCase(), player.getUuid()); - return player; - } -} diff --git a/src/main/java/cc/fascinated/player/impl/Cape.java b/src/main/java/cc/fascinated/player/impl/Cape.java deleted file mode 100644 index 92eed7c..0000000 --- a/src/main/java/cc/fascinated/player/impl/Cape.java +++ /dev/null @@ -1,13 +0,0 @@ -package cc.fascinated.player.impl; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter @AllArgsConstructor -public class Cape { - - /** - * The URL of the cape - */ - private final String url; -} diff --git a/src/main/java/cc/fascinated/player/impl/Player.java b/src/main/java/cc/fascinated/player/impl/Player.java deleted file mode 100644 index 54bbb37..0000000 --- a/src/main/java/cc/fascinated/player/impl/Player.java +++ /dev/null @@ -1,70 +0,0 @@ -package cc.fascinated.player.impl; - -import cc.fascinated.Consts; -import cc.fascinated.Main; -import cc.fascinated.mojang.types.MojangSessionServerProfile; -import cc.fascinated.mojang.types.MojangSessionServerProfileProperties; -import cc.fascinated.util.UUIDUtils; -import com.google.gson.JsonObject; -import lombok.Getter; - -import java.util.UUID; - -@Getter -public class Player { - - /** - * The UUID of the player - */ - private final UUID uuid; - - /** - * The name of the player - */ - private final String name; - - /** - * The avatar URL of the player - */ - private final String avatarUrl; - - /** - * The skin of the player - *

- * This will be null if the player does not have a skin. - *

- */ - private Skin skin; - - /** - * The cape of the player - *

- * This will be null if the player does not have a cape. - *

- */ - private Cape cape; - - public Player(MojangSessionServerProfile profile) { - this.uuid = UUID.fromString(UUIDUtils.addUUIDDashes(profile.getId())); - this.name = profile.getName(); - this.avatarUrl = Consts.getSITE_URL() + "/avatar/" + this.uuid; - - MojangSessionServerProfileProperties textureProperty = profile.getTextureProperty(); - if (textureProperty == null) { - return; - } - - // Decode the texture property - String decoded = new String(java.util.Base64.getDecoder().decode(textureProperty.getValue())); - - // Parse the decoded JSON - JsonObject json = Main.getGSON().fromJson(decoded, JsonObject.class); - JsonObject texturesJson = json.getAsJsonObject("textures"); - JsonObject skinJson = texturesJson.getAsJsonObject("SKIN"); - JsonObject capeJson = texturesJson.getAsJsonObject("CAPE"); - JsonObject metadataJson = skinJson.get("metadata").getAsJsonObject(); - - this.skin = new Skin(skinJson.get("url").getAsString(), SkinType.fromString(metadataJson.get("model").getAsString())); - this.cape = new Cape(capeJson.get("url").getAsString()); - } -} diff --git a/src/main/java/cc/fascinated/player/impl/Skin.java b/src/main/java/cc/fascinated/player/impl/Skin.java deleted file mode 100644 index eb227bf..0000000 --- a/src/main/java/cc/fascinated/player/impl/Skin.java +++ /dev/null @@ -1,80 +0,0 @@ -package cc.fascinated.player.impl; - -import cc.fascinated.Main; -import com.fasterxml.jackson.annotation.JsonIgnore; -import lombok.Getter; -import lombok.SneakyThrows; -import lombok.extern.log4j.Log4j2; - -import java.io.InputStream; -import java.net.URI; -import java.net.http.HttpRequest; -import java.net.http.HttpResponse; - -@Getter @Log4j2 -public class Skin { - - /** - * The URL of the skin - */ - private final String url; - - /** - * The model of the skin - */ - private final SkinType model; - - /** - * The bytes of the skin - */ - @JsonIgnore - private final byte[] skinBytes; - - /** - * The head of the skin - */ - @JsonIgnore - private final SkinPart head; - - public Skin(String url, SkinType model) { - this.url = url; - this.model = model; - this.skinBytes = this.getSkinData(); - - // The skin parts - this.head = new SkinPart(this.skinBytes, SkinPartEnum.HEAD); - } - - /** - * Gets the skin data from the URL. - * - * @return the skin data - */ - @SneakyThrows @JsonIgnore - public byte[] getSkinData() { - HttpRequest request = HttpRequest.newBuilder() - .uri(new URI(this.url)) - .GET() - .build(); - - return Main.getCLIENT().send(request, HttpResponse.BodyHandlers.ofByteArray()).body(); - } - - /** - * Gets the default/fallback head. - * - * @return the default head - */ - public static SkinPart getDefaultHead() { - try (InputStream stream = Main.class.getClassLoader().getResourceAsStream("images/default_head.png")) { - if (stream == null) { - return null; - } - byte[] bytes = stream.readAllBytes(); - return new SkinPart(bytes, SkinPartEnum.HEAD); - } catch (Exception ex) { - log.warn("Failed to load default head", ex); - return null; - } - } -} diff --git a/src/main/java/cc/fascinated/player/impl/SkinPart.java b/src/main/java/cc/fascinated/player/impl/SkinPart.java deleted file mode 100644 index 5fc26d2..0000000 --- a/src/main/java/cc/fascinated/player/impl/SkinPart.java +++ /dev/null @@ -1,95 +0,0 @@ -package cc.fascinated.player.impl; - -import lombok.Getter; -import lombok.extern.log4j.Log4j2; - -import javax.imageio.ImageIO; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; - -@Getter @Log4j2 -public class SkinPart { - - /** - * The whole skin data. - */ - private final byte[] data; - - /** - * The X coordinate of the part. - */ - private final int x; - - /** - * The Y coordinate of the part. - */ - private final int y; - - /** - * The width of the part. - */ - private final int width; - - /** - * The height of the part. - */ - private final int height; - - /** - * The scale of the part output. - */ - private final int scale; - - /** - * The part data from the skin. - */ - private byte[] partBytes; - - public SkinPart(byte[] data, SkinPartEnum skinPartEnum) { - this.data = data; - this.x = skinPartEnum.getX(); - this.y = skinPartEnum.getY(); - this.width = skinPartEnum.getWidth(); - this.height = skinPartEnum.getHeight(); - this.scale = skinPartEnum.getScale(); - } - - /** - * Gets the part data from the skin. - * - * @return the part data - */ - public byte[] getPartData() { - if (this.partBytes != null) { - return this.partBytes; - } - - try { - BufferedImage image = ImageIO.read(new ByteArrayInputStream(this.data)); - if (image == null) { - return null; - } - // Get the part of the image (e.g. the head) - BufferedImage partImage = image.getSubimage(this.x, this.y, this.width, this.height); - - // Scale the image - int width = partImage.getWidth() * this.scale; - int height = partImage.getHeight() * this.scale; - BufferedImage scaledImage = new BufferedImage(width, height, partImage.getType()); - Graphics2D graphics2D = scaledImage.createGraphics(); - graphics2D.drawImage(partImage, 0, 0, width, height, null); - graphics2D.dispose(); - partImage = scaledImage; - - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - ImageIO.write(partImage, "png", byteArrayOutputStream); - this.partBytes = byteArrayOutputStream.toByteArray(); - return this.partBytes; - } catch (Exception ex) { - log.error("Failed to read image from skin data.", ex); - return null; - } - } -} diff --git a/src/main/java/cc/fascinated/player/impl/SkinPartEnum.java b/src/main/java/cc/fascinated/player/impl/SkinPartEnum.java deleted file mode 100644 index 9165f52..0000000 --- a/src/main/java/cc/fascinated/player/impl/SkinPartEnum.java +++ /dev/null @@ -1,16 +0,0 @@ -package cc.fascinated.player.impl; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter @AllArgsConstructor -public enum SkinPartEnum { - - HEAD(8, 8, 8, 8, 20); - - private final int x; - private final int y; - private final int width; - private final int height; - private final int scale; -} diff --git a/src/main/java/cc/fascinated/player/impl/SkinType.java b/src/main/java/cc/fascinated/player/impl/SkinType.java deleted file mode 100644 index 334057d..0000000 --- a/src/main/java/cc/fascinated/player/impl/SkinType.java +++ /dev/null @@ -1,22 +0,0 @@ -package cc.fascinated.player.impl; - -public enum SkinType { - - DEFAULT, - SLIM; - - /** - * Get the skin type from a string - * - * @param string the string - * @return the skin type - */ - public static SkinType fromString(String string) { - for (SkinType type : values()) { - if (type.name().equalsIgnoreCase(string)) { - return type; - } - } - return null; - } -} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 9bdd3f1..e52f767 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -5,7 +5,7 @@ server: whitelabel: enabled: false -site-url: http://localhost:80 +public-url: http://localhost:80 mojang: session-server: https://sessionserver.mojang.com diff --git a/src/main/resources/public/favicon.ico b/src/main/resources/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..daa4531ab24116340ef9987f1943b41d87be6a12 GIT binary patch literal 67646 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/templates/error.html b/src/main/resources/templates/error.html index c1d4ba2..7263d08 100644 --- a/src/main/resources/templates/error.html +++ b/src/main/resources/templates/error.html @@ -1,19 +1,23 @@ - + - Minecraft Helper + Minecraft Utilities + + + +

Oh, no!

You have encountered an error.

- Error Gif + Error Gif \ No newline at end of file diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html index 4cb70d4..c338ca2 100644 --- a/src/main/resources/templates/index.html +++ b/src/main/resources/templates/index.html @@ -1,13 +1,17 @@ - Minecraft Helper + Minecraft Utilities + + + +