diff --git a/.github/workflows/publish-release.yml b/.github/workflows/publish-release.yml index c4048a1f..c54fc815 100644 --- a/.github/workflows/publish-release.yml +++ b/.github/workflows/publish-release.yml @@ -157,40 +157,15 @@ jobs: distribution: 'temurin' java-version: 17 cache: 'gradle' - - name: Replace fabric.mod.json - run: | - cd src/main/resources - rm fabric.mod.json - echo ' - { - "schemaVersion": 1, - "id": "carpet", - "version": "1.4.36", - "entrypoints": { - "server": [ "carpet.utils.CarpetRulePrinter" ], - "preLaunch": [ "carpet.utils.CarpetRulePrinter" ] - } - }' > fabric.mod.json - cd ../../../ - - name: Run solution - run: | - chmod +x gradlew - ./gradlew runServer > settings-toProccess.txt - name: Checkout wiki uses: actions/checkout@v2 with: repository: ${{github.repository}}.wiki path: wiki - - name: Proccess Gradle log into a pretty wiki page + - name: Run rule printer into the wiki page run: | - from1="# Carpet"; - File=settings-toProccess.txt - if grep -q "Deprecated Gradle features" "$File"; then # Happens after update to Gradle 6 - to2="Deprecated Gradle features"; - else - to2="BUILD SUCCESSFUL" - fi - a="$(cat settings-toProccess.txt)"; a="$(echo "${a#*"$from1"}")"; echo "$from1${a%%"$to2"*}" > wiki/Current-Available-Settings.md + chmod +x gradlew + ./gradlew runServer --args="-- -carpetDumpRules -dumpPath ../wiki/Current-Available-Settings.md" - name: Commit updated wiki page continue-on-error: true run: | diff --git a/build.gradle b/build.gradle index 287abab2..83c4f837 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'fabric-loom' version '0.11-SNAPSHOT' - id 'io.github.juuxel.loom-quiltflower' version '1.7.1' + id 'fabric-loom' version '0.12-SNAPSHOT' + id 'io.github.juuxel.loom-quiltflower' version '1.7.3' id 'maven-publish' } diff --git a/src/main/java/carpet/utils/CarpetRulePrinter.java b/src/main/java/carpet/utils/CarpetRulePrinter.java index 4c243e94..ea060a61 100644 --- a/src/main/java/carpet/utils/CarpetRulePrinter.java +++ b/src/main/java/carpet/utils/CarpetRulePrinter.java @@ -1,33 +1,63 @@ package carpet.utils; import carpet.CarpetServer; +import joptsimple.OptionParser; +import joptsimple.OptionSet; +import joptsimple.OptionSpec; import net.fabricmc.api.DedicatedServerModInitializer; -import net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint; +import net.fabricmc.loader.api.FabricLoader; +import java.io.IOException; import java.io.PrintStream; import java.lang.System; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Arrays; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** - * Runs only from GitHub Actions to generate the wiki - * page with all Carpet rules on it. - * It is here so it can be managed by the IDE + * Provides a command line interface to generate a dump with all rules + * in a pretty markdown format to a specified file, with an optional + * category filter * */ -public class CarpetRulePrinter implements DedicatedServerModInitializer, PreLaunchEntrypoint { - public static final PrintStream OLD_OUT = System.out; - +public class CarpetRulePrinter implements DedicatedServerModInitializer { @Override public void onInitializeServer() { - // Minecraft (or whatever) changes the System.out to have prefixes, - // our simple parser doesn't like that. So we change it back - System.setOut(OLD_OUT); - CarpetServer.onGameStarted(); - CarpetServer.settingsManager.printAllRulesToLog(null); + // When launching, we use the "--" separator to prevent the game rejecting to launch because of unknown options + // Clear it in case it's present given else our option parser would also ignore them! + String[] args = Arrays.stream(FabricLoader.getInstance().getLaunchArguments(true)).filter(opt -> !opt.equals("--")).toArray(String[]::new); + + // Prepare an OptionParser for our parameters + OptionParser parser = new OptionParser(); + OptionSpec shouldDump = parser.accepts("carpetDumpRules"); + OptionSpec pathSpec = parser.accepts("dumpPath").withRequiredArg(); + OptionSpec filterSpec = parser.accepts("dumpFilter").withRequiredArg(); + parser.allowsUnrecognizedOptions(); // minecraft may need more stuff later that we don't want to special-case + OptionSet options = parser.parse(args); + // If our flag isn't set, continue regular launch + if (!options.has(shouldDump)) return; + + + Logger logger = LoggerFactory.getLogger("Carpet Rule Printer"); + logger.info("Starting in rule dump mode..."); + // at this point, onGameStarted() already ran given it as an entrypoint runs before + PrintStream outputStream; + try { + Path path = Path.of(options.valueOf(pathSpec)).toAbsolutePath(); + logger.info("Printing rules to: " + path); + Files.createDirectories(path.getParent()); + outputStream = new PrintStream(Files.newOutputStream(path)); + } catch (IOException e) { + throw new IllegalArgumentException("Invalid path passed, or something went very wrong", e); + } + String filter = options.valueOf(filterSpec); + if (filter != null) logger.info("Applying category filter: " + filter); + CarpetServer.settingsManager.dumpAllRulesToStream(outputStream, filter); + outputStream.close(); + logger.info("Rules have been printed"); System.exit(0); } - - @Override - public void onPreLaunch() { - // Just initializes our OLD_OUT by nooping the class - } } diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index ae0ed3d3..3a32771a 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -23,7 +23,8 @@ "carpet.CarpetServer::onGameStarted" ], "server": [ - "carpet.CarpetServer::onGameStarted" + "carpet.CarpetServer::onGameStarted", + "carpet.utils.CarpetRulePrinter" ] }, "mixins": [