diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java index 1eeefc72a..f8a5e1a93 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java @@ -20,7 +20,6 @@ import net.momirealms.craftengine.core.item.behavior.ItemBehaviors; import net.momirealms.craftengine.core.item.modifier.CustomModelDataModifier; import net.momirealms.craftengine.core.item.modifier.IdModifier; import net.momirealms.craftengine.core.item.modifier.ItemModelModifier; -import net.momirealms.craftengine.core.pack.model.LegacyOverridesModel; import net.momirealms.craftengine.core.pack.LoadingSequence; import net.momirealms.craftengine.core.pack.Pack; import net.momirealms.craftengine.core.pack.ResourceLocation; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/pack/BukkitPackManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/pack/BukkitPackManager.java index a1adc36d1..896db1452 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/pack/BukkitPackManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/pack/BukkitPackManager.java @@ -1,32 +1,18 @@ package net.momirealms.craftengine.bukkit.pack; -import net.kyori.adventure.text.Component; import net.momirealms.craftengine.bukkit.api.event.AsyncResourcePackGenerateEvent; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; -import net.momirealms.craftengine.bukkit.plugin.command.feature.ReloadCommand; -import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; -import net.momirealms.craftengine.bukkit.util.ComponentUtils; import net.momirealms.craftengine.bukkit.util.EventUtils; -import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.core.pack.AbstractPackManager; import net.momirealms.craftengine.core.plugin.config.Config; -import net.momirealms.craftengine.core.plugin.network.ConnectionState; -import net.momirealms.craftengine.core.plugin.network.NetWorkUser; import net.momirealms.craftengine.core.util.VersionHelper; import org.bukkit.Bukkit; -import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerResourcePackStatusEvent; -import org.jetbrains.annotations.Nullable; - -import java.nio.file.Files; -import java.util.List; -import java.util.Optional; -import java.util.UUID; public class BukkitPackManager extends AbstractPackManager implements Listener { private final BukkitCraftEngine plugin; diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java index 6e286da07..5bb33e20b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java @@ -2,9 +2,9 @@ package net.momirealms.craftengine.core.item; import net.momirealms.craftengine.core.item.behavior.ItemBehavior; import net.momirealms.craftengine.core.item.modifier.*; -import net.momirealms.craftengine.core.pack.model.LegacyOverridesModel; import net.momirealms.craftengine.core.pack.misc.EquipmentGeneration; import net.momirealms.craftengine.core.pack.model.ItemModel; +import net.momirealms.craftengine.core.pack.model.LegacyOverridesModel; import net.momirealms.craftengine.core.pack.model.generation.AbstractModelGenerator; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.registry.Holder; diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java index 2a9e464e4..02cc0aade 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java @@ -2,9 +2,9 @@ package net.momirealms.craftengine.core.item; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.item.behavior.ItemBehavior; -import net.momirealms.craftengine.core.pack.model.LegacyOverridesModel; import net.momirealms.craftengine.core.pack.misc.EquipmentGeneration; import net.momirealms.craftengine.core.pack.model.ItemModel; +import net.momirealms.craftengine.core.pack.model.LegacyOverridesModel; import net.momirealms.craftengine.core.pack.model.generation.ModelGenerator; import net.momirealms.craftengine.core.plugin.Manageable; import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java index 1d5b4f01b..b223f2e11 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java @@ -33,8 +33,6 @@ import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; import java.util.*; import java.util.function.BiConsumer; import java.util.function.Consumer; @@ -66,10 +64,7 @@ public abstract class AbstractPackManager implements PackManager { private final Map loadedPacks = new HashMap<>(); private final Map sectionParsers = new HashMap<>(); private final TreeMap> cachedConfigs = new TreeMap<>(); - protected BiConsumer zipGenerator; - protected String packHash; - protected UUID packUUID; public AbstractPackManager(CraftEngine plugin, BiConsumer eventDispatcher) { this.plugin = plugin; @@ -519,22 +514,6 @@ public abstract class AbstractPackManager implements PackManager { this.plugin.logger().info("Finished generating resource pack in " + (end - start) + "ms"); this.eventDispatcher.accept(generatedPackPath, zipFile); - this.calculateHash(); - } - - private void calculateHash() { - Path zipFile = selfHostPackPath(); - if (Files.exists(zipFile)) { - try { - this.packHash = computeSHA1(zipFile); - this.packUUID = UUID.nameUUIDFromBytes(this.packHash.getBytes(StandardCharsets.UTF_8)); - } catch (IOException | NoSuchAlgorithmException e) { - this.plugin.logger().severe("Error calculating resource pack hash", e); - } - } else { - this.packHash = ""; - this.packUUID = UUID.nameUUIDFromBytes("EMPTY".getBytes(StandardCharsets.UTF_8)); - } } private void generateParticle(Path generatedPackPath) { @@ -1128,23 +1107,6 @@ public abstract class AbstractPackManager implements PackManager { } } - protected String computeSHA1(Path path) throws IOException, NoSuchAlgorithmException { - InputStream file = Files.newInputStream(path); - MessageDigest digest = MessageDigest.getInstance("SHA-1"); - byte[] buffer = new byte[8192]; - int bytesRead; - while ((bytesRead = file.read(buffer)) != -1) { - digest.update(buffer, 0, bytesRead); - } - file.close(); - - StringBuilder hexString = new StringBuilder(40); - for (byte b : digest.digest()) { - hexString.append(String.format("%02x", b)); - } - return hexString.toString(); - } - private List>> mergeFolder(Collection sourceFolders, Path targetFolder) throws IOException { Map> conflictChecker = new HashMap<>(); for (Path sourceFolder : sourceFolders) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHost.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHost.java index 13beaf412..709381e51 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHost.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHost.java @@ -1,5 +1,6 @@ package net.momirealms.craftengine.core.pack.host; +import java.nio.file.Path; import java.util.UUID; import java.util.concurrent.CompletableFuture; @@ -8,4 +9,6 @@ public interface ResourcePackHost { CompletableFuture requestResourcePackDownloadLink(UUID player); ResourcePackDownloadData getResourcePackDownloadLink(UUID player); + + CompletableFuture upload(Path resourcePackPath); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHost.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHost.java index aabe7a017..5b8880e02 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHost.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHost.java @@ -3,6 +3,7 @@ package net.momirealms.craftengine.core.pack.host.impl; import net.momirealms.craftengine.core.pack.host.ResourcePackDownloadData; import net.momirealms.craftengine.core.pack.host.ResourcePackHost; +import java.nio.file.Path; import java.util.UUID; import java.util.concurrent.CompletableFuture; @@ -17,4 +18,9 @@ public class SelfHost implements ResourcePackHost { public ResourcePackDownloadData getResourcePackDownloadLink(UUID player) { return null; } + + @Override + public CompletableFuture upload(Path resourcePackPath) { + return null; + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHostHttpServer.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHostHttpServer.java index 4722a0d2a..2c05ed049 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHostHttpServer.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/impl/SelfHostHttpServer.java @@ -1,5 +1,7 @@ package net.momirealms.craftengine.core.pack.host.impl; +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer; @@ -7,45 +9,74 @@ import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.config.Config; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; import java.net.InetSocketAddress; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class SelfHostHttpServer { private static SelfHostHttpServer instance; + private Cache oneTimePackUrls = Caffeine.newBuilder() + .expireAfterAccess(1, TimeUnit.MINUTES) + .build(); private HttpServer server; - private String ip; - private int port; - private Path resourcePackPath; private final ConcurrentHashMap ipAccessMap = new ConcurrentHashMap<>(); private int rateLimit = 1; private long rateLimitInterval = 1000; + private String ip = "localhost"; + private int port = -1; + private Path resourcePackPath; + private String packHash; + private UUID packUUID; + + public String generateOneTimeUrl(UUID player) { + + } public String url() { return Config.hostProtocol() + "://" + ip + ":" + port + "/"; } - public void enable(String ip, int port, Path resourcePackPath) { - if (isAlive() && ip.equals(this.ip) && port == this.port && resourcePackPath.equals(this.resourcePackPath)) { + public void setResourcePackPath(Path resourcePackPath) { + this.resourcePackPath = resourcePackPath; + } + + private void calculateHash() { + if (Files.exists(this.resourcePackPath)) { + try { + this.packHash = computeSHA1(this.resourcePackPath); + this.packUUID = UUID.nameUUIDFromBytes(this.packHash.getBytes(StandardCharsets.UTF_8)); + } catch (IOException | NoSuchAlgorithmException e) { + CraftEngine.instance().logger().severe("Error calculating resource pack hash", e); + } + } else { + this.packHash = ""; + this.packUUID = UUID.nameUUIDFromBytes("EMPTY".getBytes(StandardCharsets.UTF_8)); + } + } + + public void updatePort(int port) { + if (port == this.port) { return; } if (server != null) { disable(); } - this.ip = ip; this.port = port; - this.resourcePackPath = resourcePackPath; - try { server = HttpServer.create(new InetSocketAddress("::", port), 0); server.createContext("/", new ResourcePackHandler()); server.setExecutor(Executors.newCachedThreadPool()); server.start(); - CraftEngine.instance().logger().info("HTTP resource pack server running on " + ip + ":" + port); + CraftEngine.instance().logger().info("HTTP resource pack server running on port: " + port); } catch (IOException e) { CraftEngine.instance().logger().warn("Failed to start HTTP server", e); } @@ -74,6 +105,27 @@ public class SelfHostHttpServer { this.rateLimitInterval = timeUnit.toMillis(rateLimitInterval); } + public void setIp(String ip) { + this.ip = ip; + } + + private String computeSHA1(Path path) throws IOException, NoSuchAlgorithmException { + InputStream file = Files.newInputStream(path); + MessageDigest digest = MessageDigest.getInstance("SHA-1"); + byte[] buffer = new byte[8192]; + int bytesRead; + while ((bytesRead = file.read(buffer)) != -1) { + digest.update(buffer, 0, bytesRead); + } + file.close(); + + StringBuilder hexString = new StringBuilder(40); + for (byte b : digest.digest()) { + hexString.append(String.format("%02x", b)); + } + return hexString.toString(); + } + private class ResourcePackHandler implements HttpHandler { @Override public void handle(HttpExchange exchange) throws IOException { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java index b85fcb74d..52120eaef 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java @@ -32,7 +32,10 @@ import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; -import java.util.*; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; import java.util.stream.Collectors; public class Config { diff --git a/server-mod/v1_20_1/src/main/java/net/momirealms/craftengine/mod/CraftEnginePlugin.java b/server-mod/v1_20_1/src/main/java/net/momirealms/craftengine/mod/CraftEnginePlugin.java index 99848d288..6cb356a90 100644 --- a/server-mod/v1_20_1/src/main/java/net/momirealms/craftengine/mod/CraftEnginePlugin.java +++ b/server-mod/v1_20_1/src/main/java/net/momirealms/craftengine/mod/CraftEnginePlugin.java @@ -1,8 +1,5 @@ package net.momirealms.craftengine.mod; -import io.netty.buffer.Unpooled; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.objectweb.asm.tree.ClassNode; @@ -11,7 +8,6 @@ import org.spongepowered.asm.mixin.extensibility.IMixinInfo; import java.net.URISyntaxException; import java.net.URL; -import java.nio.Buffer; import java.nio.file.Path; import java.nio.file.Paths; import java.security.CodeSource;