From 210ad834f6dc3eba49c21f5f03117e6d247db924 Mon Sep 17 00:00:00 2001 From: altrisi Date: Sun, 29 Nov 2020 15:44:51 +0100 Subject: [PATCH] Allow loading apps from a global path --- .../carpet/script/CarpetScriptServer.java | 69 ++++++++++++------- .../carpet/script/bundled/FileModule.java | 9 +-- 2 files changed, 50 insertions(+), 28 deletions(-) diff --git a/src/main/java/carpet/script/CarpetScriptServer.java b/src/main/java/carpet/script/CarpetScriptServer.java index 69fd0327..4bab3309 100644 --- a/src/main/java/carpet/script/CarpetScriptServer.java +++ b/src/main/java/carpet/script/CarpetScriptServer.java @@ -16,19 +16,24 @@ import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.tree.CommandNode; + +import net.fabricmc.loader.api.FabricLoader; import net.minecraft.server.MinecraftServer; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.util.WorldSavePath; import net.minecraft.util.math.BlockPos; -import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; @@ -127,20 +132,30 @@ public class CarpetScriptServer public Module getModule(String name, boolean allowLibraries) { - File folder = server.getSavePath(WorldSavePath.ROOT).resolve("scripts").toFile(); - File[] listOfFiles = folder.listFiles(); - if (listOfFiles != null) - for (File script : listOfFiles) - { - if (script.getName().equalsIgnoreCase(name+".sc")) - { - return new FileModule(script); - } - if (allowLibraries && script.getName().equalsIgnoreCase(name+".scl")) - { - return new FileModule(script); - } - } + try { + Path folder = server.getSavePath(WorldSavePath.ROOT).resolve("scripts"); + Files.createDirectories(folder); + Optional + scriptPath = Files.walk(folder) + .filter(script -> + script.getFileName().toString().equalsIgnoreCase(name+".sc") || + (allowLibraries && script.getFileName().toString().equalsIgnoreCase(name+".scl")) + ).findFirst(); + if (scriptPath.isPresent()) + return new FileModule(scriptPath.get()); + + Path globalFolder = FabricLoader.getInstance().getConfigDir().resolve("carpet/scripts"); + Files.createDirectories(globalFolder); + scriptPath = Files.walk(globalFolder) + .filter(script -> + script.getFileName().toString().equalsIgnoreCase(name+".sc") || + (allowLibraries && script.getFileName().toString().equalsIgnoreCase(name+".scl")) + ).findFirst(); + if (scriptPath.isPresent()) + return new FileModule(scriptPath.get()); + } catch (IOException e) { + CarpetSettings.LOG.error("Exception while loading the app: ", e); + } for (Module moduleData : bundledModuleData) { if (moduleData.getName().equalsIgnoreCase(name) && (allowLibraries || !moduleData.isLibrary())) @@ -173,17 +188,23 @@ public class CarpetScriptServer if (!mi.isLibrary() && !mi.getName().endsWith("_beta")) moduleNames.add(mi.getName()); } } - File folder = server.getSavePath(WorldSavePath.ROOT).resolve("scripts").toFile(); - File[] listOfFiles = folder.listFiles(); - if (listOfFiles == null) - return moduleNames; - for (File script : listOfFiles) - { - if (script.getName().endsWith(".sc")) + try { + Path worldScripts = server.getSavePath(WorldSavePath.ROOT).resolve("scripts"); + Files.createDirectories(worldScripts); + Files.walk(worldScripts) + .filter(f -> f.toString().endsWith(".sc")) + .forEach(f -> moduleNames.add(f.getFileName().toString().replaceFirst("\\.sc","").toLowerCase(Locale.ROOT))); + + if (includeBuiltIns) { - String name = script.getName().replaceFirst("\\.sc","").toLowerCase(Locale.ROOT); - moduleNames.add(name); + Path globalScripts = FabricLoader.getInstance().getConfigDir().resolve("carpet/scripts"); + Files.createDirectories(globalScripts); + Files.walk(globalScripts) + .filter(f -> f.toString().endsWith(".sc")) + .forEach(f -> moduleNames.add(f.getFileName().toString().replaceFirst("\\.sc","").toLowerCase(Locale.ROOT))); } + } catch (IOException e) { + CarpetSettings.LOG.error("Exception while searching for apps: ", e); } return moduleNames; } diff --git a/src/main/java/carpet/script/bundled/FileModule.java b/src/main/java/carpet/script/bundled/FileModule.java index 031c862c..cacc2e12 100644 --- a/src/main/java/carpet/script/bundled/FileModule.java +++ b/src/main/java/carpet/script/bundled/FileModule.java @@ -16,6 +16,7 @@ import java.io.OutputStream; import java.io.OutputStreamWriter; import java.nio.charset.StandardCharsets; import java.nio.file.Files; +import java.nio.file.Path; import java.nio.file.StandardOpenOption; import java.util.ArrayList; import java.util.List; @@ -26,13 +27,13 @@ public class FileModule extends Module private String name; private String code; private boolean library; - public FileModule(File sourceFile) + public FileModule(Path sourcePath) { - library = sourceFile.getName().endsWith(".scl"); + library = sourcePath.getFileName().toString().endsWith(".scl"); try { - name = sourceFile.getName().replaceFirst("\\.scl?","").toLowerCase(Locale.ROOT); - code = new String(Files.readAllBytes(sourceFile.toPath()), StandardCharsets.UTF_8); + name = sourcePath.getFileName().toString().replaceFirst("\\.scl?","").toLowerCase(Locale.ROOT); + code = new String(Files.readAllBytes(sourcePath), StandardCharsets.UTF_8); } catch ( IOException e) {