This commit is contained in:
parent
a060d5d027
commit
2e171b2cfd
@ -4,6 +4,7 @@ import cc.fascinated.player.PlayerManagerService;
|
|||||||
import cc.fascinated.player.impl.Player;
|
import cc.fascinated.player.impl.Player;
|
||||||
import cc.fascinated.player.impl.Skin;
|
import cc.fascinated.player.impl.Skin;
|
||||||
import cc.fascinated.player.impl.SkinPart;
|
import cc.fascinated.player.impl.SkinPart;
|
||||||
|
import lombok.NonNull;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.http.CacheControl;
|
import org.springframework.http.CacheControl;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
@ -12,12 +13,14 @@ import org.springframework.http.ResponseEntity;
|
|||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping(value = "/")
|
@RequestMapping(value = "/")
|
||||||
public class PlayerController {
|
public class PlayerController {
|
||||||
|
|
||||||
|
@NonNull private final SkinPart defaultHead = Objects.requireNonNull(Skin.getDefaultHead(), "Default head is null");
|
||||||
private final PlayerManagerService playerManagerService;
|
private final PlayerManagerService playerManagerService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
@ -37,15 +40,17 @@ public class PlayerController {
|
|||||||
@GetMapping(value = "/avatar/{id}")
|
@GetMapping(value = "/avatar/{id}")
|
||||||
public ResponseEntity<byte[]> getPlayerHead(@PathVariable String id) {
|
public ResponseEntity<byte[]> getPlayerHead(@PathVariable String id) {
|
||||||
Player player = playerManagerService.getPlayer(id);
|
Player player = playerManagerService.getPlayer(id);
|
||||||
|
byte[] headBytes;
|
||||||
if (player == null) {
|
if (player == null) {
|
||||||
return null;
|
headBytes = defaultHead.getPartData();
|
||||||
|
} else {
|
||||||
|
Skin skin = player.getSkin();
|
||||||
|
SkinPart head = skin.getHead();
|
||||||
|
headBytes = head.getPartData();
|
||||||
}
|
}
|
||||||
|
|
||||||
Skin skin = player.getSkin();
|
|
||||||
SkinPart head = skin.getHead();
|
|
||||||
return ResponseEntity.ok()
|
return ResponseEntity.ok()
|
||||||
.cacheControl(CacheControl.maxAge(1, TimeUnit.HOURS).cachePublic())
|
.cacheControl(CacheControl.maxAge(1, TimeUnit.HOURS).cachePublic())
|
||||||
.contentType(MediaType.IMAGE_PNG)
|
.contentType(MediaType.IMAGE_PNG)
|
||||||
.body(head.getPartData());
|
.body(headBytes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -67,5 +67,4 @@ public class Player {
|
|||||||
this.skin = new Skin(skinJson.get("url").getAsString(), SkinType.fromString(metadataJson.get("model").getAsString()));
|
this.skin = new Skin(skinJson.get("url").getAsString(), SkinType.fromString(metadataJson.get("model").getAsString()));
|
||||||
this.cape = new Cape(capeJson.get("url").getAsString());
|
this.cape = new Cape(capeJson.get("url").getAsString());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -4,12 +4,15 @@ import cc.fascinated.Main;
|
|||||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
|
import lombok.extern.log4j.Log4j2;
|
||||||
|
import org.apache.tomcat.util.http.fileupload.IOUtils;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.net.http.HttpRequest;
|
import java.net.http.HttpRequest;
|
||||||
import java.net.http.HttpResponse;
|
import java.net.http.HttpResponse;
|
||||||
|
|
||||||
@Getter
|
@Getter @Log4j2
|
||||||
public class Skin {
|
public class Skin {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -40,7 +43,7 @@ public class Skin {
|
|||||||
this.skinBytes = this.getSkinData();
|
this.skinBytes = this.getSkinData();
|
||||||
|
|
||||||
// The skin parts
|
// The skin parts
|
||||||
this.head = new SkinPart(this.skinBytes, 8, 8, 8, 8, 20);
|
this.head = new SkinPart(this.skinBytes, SkinPartEnum.HEAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -57,4 +60,22 @@ public class Skin {
|
|||||||
|
|
||||||
return Main.getCLIENT().send(request, HttpResponse.BodyHandlers.ofByteArray()).body();
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -47,13 +47,13 @@ public class SkinPart {
|
|||||||
*/
|
*/
|
||||||
private byte[] partBytes;
|
private byte[] partBytes;
|
||||||
|
|
||||||
public SkinPart(byte[] data, int x, int y, int width, int height, int scale) {
|
public SkinPart(byte[] data, SkinPartEnum skinPartEnum) {
|
||||||
this.data = data;
|
this.data = data;
|
||||||
this.x = x;
|
this.x = skinPartEnum.getX();
|
||||||
this.y = y;
|
this.y = skinPartEnum.getY();
|
||||||
this.width = width;
|
this.width = skinPartEnum.getWidth();
|
||||||
this.height = height;
|
this.height = skinPartEnum.getHeight();
|
||||||
this.scale = scale;
|
this.scale = skinPartEnum.getScale();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
16
src/main/java/cc/fascinated/player/impl/SkinPartEnum.java
Normal file
16
src/main/java/cc/fascinated/player/impl/SkinPartEnum.java
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
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;
|
||||||
|
}
|
BIN
src/main/resources/images/default_head.png
Normal file
BIN
src/main/resources/images/default_head.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.2 KiB |
Loading…
Reference in New Issue
Block a user