diff --git a/README.md b/README.md index b909482..f1c107c 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ BukkitLibraryManager bukkitLibraryManager = new BukkitLibraryManager(plugin); // Create a library manager for a Bungee plugin BungeeLibraryManager bungeeLibraryManager = new BungeeLibraryManager(plugin); -// Also Nukkit, Sponge, Paper, and Velocity are supported +// Also Nukkit, Sponge, Paper, Velocity and Fabric are supported ``` Create a Library instance with the library builder diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts new file mode 100644 index 0000000..42ce50b --- /dev/null +++ b/fabric/build.gradle.kts @@ -0,0 +1,15 @@ +/* + * This file was generated by the Gradle 'init' task. + */ + +plugins { + id("net.byteflux.java-conventions") +} + +dependencies { + api(project(":libby-core")) + compileOnly("net.fabricmc:fabric-loader:0.16.14") + compileOnly("org.slf4j:slf4j-api:2.0.9") +} + +description = "libby-fabric" diff --git a/fabric/src/main/java/net/byteflux/libby/FabricLibraryManager.java b/fabric/src/main/java/net/byteflux/libby/FabricLibraryManager.java new file mode 100644 index 0000000..3dabffb --- /dev/null +++ b/fabric/src/main/java/net/byteflux/libby/FabricLibraryManager.java @@ -0,0 +1,72 @@ +package net.byteflux.libby; + +import net.byteflux.libby.logging.adapters.FabricLogAdapter; +import net.fabricmc.loader.api.ModContainer; +import net.fabricmc.loader.impl.launch.FabricLauncherBase; +import org.slf4j.Logger; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; + +import static java.util.Objects.requireNonNull; + +/** + * A runtime dependency manager for Fabric mods. + */ +public class FabricLibraryManager extends LibraryManager { + private final ModContainer modContainer; + + /** + * Creates a new Fabric library manager. + * + * @param logger the mod logger + * @param dataDirectory mod's data directory + * @param modContainer the mod container to manage + * @param directoryName download directory name + */ + public FabricLibraryManager(Logger logger, + Path dataDirectory, + ModContainer modContainer, + String directoryName) { + super(new FabricLogAdapter(logger), dataDirectory, directoryName); + this.modContainer = requireNonNull(modContainer, "modContainer"); + } + + /** + * Creates a new Fabric library manager. + * + * @param logger the mod logger + * @param dataDirectory mod's data directory + * @param modContainer the mod container to manage + */ + public FabricLibraryManager(Logger logger, + Path dataDirectory, + ModContainer modContainer) { + this(logger, dataDirectory, modContainer, "lib"); + } + + /** + * Adds a file to the Fabric mod's classpath. + * + * @param file the file to add + */ + @Override + protected void addToClasspath(Path file) { + FabricLauncherBase.getLauncher().addToClassPath(file); + } + + @Override + protected InputStream getPluginResourceAsInputStream(String path) { + return modContainer.findPath(path) + .map(p -> { + try { + return Files.newInputStream(p); + } catch (IOException e) { + throw new RuntimeException("Could not open resource: " + path, e); + } + }) + .orElse(null); + } +} diff --git a/fabric/src/main/java/net/byteflux/libby/logging/adapters/FabricLogAdapter.java b/fabric/src/main/java/net/byteflux/libby/logging/adapters/FabricLogAdapter.java new file mode 100644 index 0000000..a8a3a13 --- /dev/null +++ b/fabric/src/main/java/net/byteflux/libby/logging/adapters/FabricLogAdapter.java @@ -0,0 +1,75 @@ +package net.byteflux.libby.logging.adapters; + +import net.byteflux.libby.logging.LogLevel; +import org.slf4j.Logger; + +import static java.util.Objects.requireNonNull; + +/** + * Logging adapter that logs to a Fabric mod logger. + */ +public class FabricLogAdapter implements LogAdapter { + /** + * Fabric mod logger + */ + private final Logger logger; + + /** + * Creates a new Fabric log adapter that logs to a {@link Logger}. + * + * @param logger the mod logger to wrap + */ + public FabricLogAdapter(Logger logger) { + this.logger = requireNonNull(logger, "logger"); + } + + /** + * Logs a message with the provided level to the Fabric mod logger. + * + * @param level message severity level + * @param message the message to log + */ + @Override + public void log(LogLevel level, String message) { + switch (requireNonNull(level, "level")) { + case DEBUG: + logger.debug(message); + break; + case INFO: + logger.info(message); + break; + case WARN: + logger.warn(message); + break; + case ERROR: + logger.error(message); + break; + } + } + + /** + * Logs a message and stack trace with the provided level to the Fabric + * mod logger. + * + * @param level message severity level + * @param message the message to log + * @param throwable the throwable to print + */ + @Override + public void log(LogLevel level, String message, Throwable throwable) { + switch (requireNonNull(level, "level")) { + case DEBUG: + logger.debug(message, throwable); + break; + case INFO: + logger.info(message, throwable); + break; + case WARN: + logger.warn(message, throwable); + break; + case ERROR: + logger.error(message, throwable); + break; + } + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 7cf0142..4f1b0c3 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -10,6 +10,7 @@ include(":libby-core") include(":libby-sponge") include(":libby-bungee") include(":libby-velocity") +include(":libby-fabric") project(":libby-bukkit").projectDir = file("bukkit") project(":libby-paper").projectDir = file("paper") project(":libby-nukkit").projectDir = file("nukkit") @@ -17,3 +18,4 @@ project(":libby-core").projectDir = file("core") project(":libby-sponge").projectDir = file("sponge") project(":libby-bungee").projectDir = file("bungee") project(":libby-velocity").projectDir = file("velocity") +project(":libby-fabric").projectDir = file("fabric")