diff --git a/pom.xml b/pom.xml index 61a8507..2cebede 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ net.mctechnic BlueMapFloodgate - 1.3-BETA + 1.3.2-BETA jar BlueMapFloodgate diff --git a/src/main/java/net/mctechnic/bluemapfloodgate/main.java b/src/main/java/net/mctechnic/bluemapfloodgate/main.java index b0dcc3c..71834fb 100644 --- a/src/main/java/net/mctechnic/bluemapfloodgate/main.java +++ b/src/main/java/net/mctechnic/bluemapfloodgate/main.java @@ -23,7 +23,13 @@ import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.Calendar; +import java.util.UUID; + +import static java.nio.file.StandardCopyOption.REPLACE_EXISTING; public final class main extends JavaPlugin implements Listener { @@ -33,7 +39,8 @@ public final class main extends JavaPlugin implements Listener { long cacheHours = 3 * 24; //three days by default FloodgateApi floodgateApi; - String playerheadsDirectory = "bluemap/web/assets/playerheads/"; + String blueMapPlayerheadsDirectory; + File ownPlayerheadsDirectory; @Override public void onEnable() { @@ -51,7 +58,15 @@ public void onEnable() { getLogger().info("floodgate API ready!"); } - BlueMapAPI.onEnable(blueMapAPI -> getLogger().info("BlueMap API ready!")); + BlueMapAPI.onEnable(blueMapAPI -> { + getLogger().info("BlueMap API ready!"); + blueMapPlayerheadsDirectory = "bluemap/web/assets/playerheads/"; //TODO: webroot + }); + + ownPlayerheadsDirectory = new File(getDataFolder() + "/playerheads"); + if(ownPlayerheadsDirectory.mkdir()){ + verboseLog(ownPlayerheadsDirectory.toString() + " directory made"); + } getServer().getPluginManager().registerEvents(this, this); } @@ -61,8 +76,8 @@ public void onDisable() { // Plugin shutdown logic } - void verboseLog(String message) { - if(verboseUpdateMessages) getLogger().info(message); + private void verboseLog(String message) { + if (verboseUpdateMessages) getLogger().info(message); } @EventHandler @@ -70,54 +85,62 @@ public void onJoin(PlayerJoinEvent e) { Bukkit.getScheduler().runTaskAsynchronously(this, () -> { Player p = e.getPlayer(); if (floodgateApi.isFloodgatePlayer(p.getUniqueId())) { - File cacheFile = new File(playerheadsDirectory + p.getUniqueId() + ".cache"); - if (cacheFile.exists()) { - long lastModified = cacheFile.lastModified(); //long value representing the time the file was last modified, measured in milliseconds since the epoch (00:00:00 GMT, January 1, 1970) - Calendar currentDate = Calendar.getInstance(); - long dateNow = currentDate.getTimeInMillis(); - if (dateNow < lastModified + 1000 * 60 * 60 * cacheHours) { //three days - verboseLog("Head for " + p.getUniqueId() + " already cached"); - return; - } else { - verboseLog("Cache file for " + p.getUniqueId() + " outdated"); - } - } + floodgateJoin(p); + } + }); + } - getLogger().info("Grabbing head for " + p.getUniqueId()); - FloodgatePlayer floodgatePlayer = floodgateApi.getPlayer(p.getUniqueId()); - String xuid = floodgatePlayer.getXuid(); - String textureID = getTextureID(xuid); - BufferedImage skin = getSkinFromID(textureID); - if (skin != null) { - BufferedImage head = skin.getSubimage(8, 8, 8, 8); - try { - ImageIO.write(head, "png", new File(playerheadsDirectory + p.getUniqueId() + ".png")); //TODO: webroot - - try { - if (cacheFile.createNewFile()) { - verboseLog("Cache file created: " + cacheFile.getName()); - } else { - verboseLog("Cache file already exists (It's probably outdated)"); - Calendar currentDate = Calendar.getInstance(); - long dateNow = currentDate.getTimeInMillis(); - if (cacheFile.setLastModified(dateNow)) { - verboseLog("Cache file updated"); - } else { - getLogger().warning("Cache file wasn't updated. This should never happen"); - } - } - } catch (IOException ioException) { - ioException.printStackTrace(); - } - } catch (IOException ioException) { - ioException.printStackTrace(); - } + private void getHeadToOwnFolder(UUID uuid, File f) { + FloodgatePlayer floodgatePlayer = floodgateApi.getPlayer(uuid); + String xuid = floodgatePlayer.getXuid(); + String textureID = getTextureID(xuid); + BufferedImage skin = getSkinFromID(textureID); + if (skin != null) { + BufferedImage head = skin.getSubimage(8, 8, 8, 8); + try { + ImageIO.write(head, "png", f); + verboseLog(f + " saved"); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + private void floodgateJoin(Player p) { + File ownHeadFile = new File(ownPlayerheadsDirectory + "/" + p.getUniqueId() + ".png"); + if (ownHeadFile.exists()) { + long lastModified = ownHeadFile.lastModified(); //long value representing the time the file was last modified, measured in milliseconds since the epoch (00:00:00 GMT, January 1, 1970) + Calendar currentDate = Calendar.getInstance(); + long dateNow = currentDate.getTimeInMillis(); + if (dateNow > lastModified + 1000 * 60 * 60 * cacheHours) { + verboseLog("Cache for " + p.getUniqueId() + " outdated"); + getHeadToOwnFolder(p.getUniqueId(), ownHeadFile); + + if (ownHeadFile.setLastModified(dateNow)) { + verboseLog(" Cache updated"); + } else { + getLogger().warning(" Cache wasn't updated. This should never happen"); } + + } else { + verboseLog("Head for " + p.getUniqueId() + " already cached"); } - }); + } else { + getHeadToOwnFolder(p.getUniqueId(), ownHeadFile); + } + + verboseLog("Overwriting BlueMap's head with floodgate head"); + + Path destination = Paths.get(blueMapPlayerheadsDirectory, ownHeadFile.getName()); + try { + Files.copy(ownHeadFile.toPath(), destination, REPLACE_EXISTING); +// verboseLog("BlueMap file overwritten!"); + } catch (IOException e) { + e.printStackTrace(); + } } - String getTextureID(String xuid) { + private String getTextureID(String xuid) { URL url; try { url = new URL("https://api.geysermc.org/v1/skin/" + xuid); @@ -140,7 +163,7 @@ String getTextureID(String xuid) { return null; } - BufferedImage getSkinFromID(String textureID) { + private BufferedImage getSkinFromID(String textureID) { BufferedImage result; try { URL imageUrl = new URL("http://textures.minecraft.net/texture/" + textureID);