Skip to content

Commit

Permalink
Hmm
Browse files Browse the repository at this point in the history
  • Loading branch information
enjarai committed Jan 9, 2024
1 parent ea56a73 commit eba4c25
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 32 deletions.
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
- Updated to 1.20.4
- Added an ingame error message when a folder.json file is malformed.
- Hopefully prevented the mod from overwriting malformed json files.
Original file line number Diff line number Diff line change
Expand Up @@ -167,8 +167,10 @@ private void onFiltersUpdated() {

// add a ".." entry when not in the root folder
if (notInRoot()) {
var folder = getParentFileSafe(currentFolder);
var meta = FolderMeta.loadMetaFile(roots, folder);
folders.add(new ResourcePackFolderEntry(client, customAvailablePacks,
this, getParentFileSafe(currentFolder), true));
this, folder, true, meta));
}

// create entries for all the folders that aren't packs
Expand All @@ -184,8 +186,9 @@ private void onFiltersUpdated() {
continue;
}

var meta = FolderMeta.loadMetaFile(roots, relative);
var entry = new ResourcePackFolderEntry(client, customAvailablePacks,
this, relative);
this, relative, false, meta);

if (((FolderPack) entry.pack).isVisible()) {
folders.add(entry);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import net.minecraft.client.gui.screen.pack.PackListWidget;
import net.minecraft.client.gui.screen.pack.PackListWidget.ResourcePackEntry;
import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
import net.minecraft.util.Identifier;
import nl.enjarai.recursiveresources.RecursiveResources;
import nl.enjarai.recursiveresources.pack.FolderMeta;
Expand All @@ -22,6 +23,8 @@ public class ResourcePackFolderEntry extends ResourcePackEntry {

private static final Text BACK_DESCRIPTION = Text.translatable("recursiveresources.folder.back");
private static final Text FOLDER_DESCRIPTION = Text.translatable("recursiveresources.folder.folder");
private static final Text ERRORED_NAME = Text.translatable("recursiveresources.folder.errored").formatted(Formatting.DARK_RED);
private static final Text ERRORED_DESCRIPTION = Text.translatable("recursiveresources.folder.errored_description").formatted(Formatting.RED);

private final FolderedResourcePackScreen ownerScreen;
public final Path folder;
Expand All @@ -46,32 +49,27 @@ private static Function<Path, Path> getIconFileResolver(List<Path> roots, Path f
};
}

public ResourcePackFolderEntry(MinecraftClient client, PackListWidget list, FolderedResourcePackScreen ownerScreen, Path folder, boolean isUp) {
public ResourcePackFolderEntry(MinecraftClient client, PackListWidget list, FolderedResourcePackScreen ownerScreen, Path folder, boolean isUp, FolderMeta meta) {
super(
client, list,
new FolderPack(
Text.of(isUp ? UP_TEXT : String.valueOf(folder.getFileName())),
isUp ? BACK_DESCRIPTION : FOLDER_DESCRIPTION,
meta.errored() ? ERRORED_NAME : Text.of(isUp ? UP_TEXT : String.valueOf(folder.getFileName())),
isUp ? BACK_DESCRIPTION : meta.errored() ? ERRORED_DESCRIPTION : FOLDER_DESCRIPTION,
getIconFileResolver(ownerScreen.roots, folder),
folder,
FolderMeta.loadMetaFile(ownerScreen.roots, folder)
folder, meta
)
);
this.ownerScreen = ownerScreen;
this.folder = folder;
this.isUp = isUp;
this.meta = ((FolderPack) pack).getMeta();
this.meta = meta;
this.children = isUp ? List.of() : resolveChildren();
}

public ResourcePackFolderEntry(MinecraftClient client, PackListWidget list, FolderedResourcePackScreen ownerScreen, Path folder) {
this(client, list, ownerScreen, folder, false);
}

@Override
public boolean mouseClicked(double mouseX, double mouseY, int button) {
double relativeMouseX = mouseX - (double) widget.getRowLeft();
if (getChildren().size() > 0 && relativeMouseX <= 32.0D) {
if (!getChildren().isEmpty() && relativeMouseX <= 32.0D) {
enableChildren();
return true;
}
Expand Down
47 changes: 29 additions & 18 deletions src/main/java/nl/enjarai/recursiveresources/pack/FolderMeta.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
import java.util.List;
import java.util.stream.Stream;

public record FolderMeta(Path icon, String description, List<Path> packs, boolean hidden) {
public record FolderMeta(Path icon, String description, List<Path> packs, boolean hidden, boolean errored) {
private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create();
private static final Path DUMMY_ROOT_PATH = Path.of("/");
private static final Path EMPTY_PATH = Path.of("");
Expand All @@ -32,8 +32,13 @@ public record FolderMeta(Path icon, String description, List<Path> packs, boolea
).apply(instance, FolderMeta::new));

public static final FolderMeta DEFAULT = new FolderMeta(Path.of("icon.png"), "", List.of(), false);
public static final FolderMeta ERRORED = new FolderMeta(Path.of("icon.png"), "", List.of(), false, true);
public static final String META_FILE_NAME = "folder.json";

public FolderMeta(Path icon, String description, List<Path> packs, boolean hidden) {
this(icon, description, packs, hidden, false);
}

public static FolderMeta loadMetaFile(List<Path> roots, Path folder) {
for (var root : roots) {
var rootedFolder = root.resolve(folder);
Expand All @@ -46,16 +51,18 @@ public static FolderMeta loadMetaFile(List<Path> roots, Path folder) {
meta = FolderMeta.load(metaFile);
}

try (Stream<Path> packs = Files.list(rootedFolder)) {
meta = meta.getRefreshed(packs
.filter(ResourcePackUtils::isPack)
.map(Path::normalize)
.map(rootedFolder::relativize)
.toList()
);
meta.save(metaFile);
} catch (Exception e) {
RecursiveResources.LOGGER.error("Failed to process meta file for folder " + folder, e);
if (!meta.errored()) {
try (Stream<Path> packs = Files.list(rootedFolder)) {
meta = meta.getRefreshed(packs
.filter(ResourcePackUtils::isPack)
.map(Path::normalize)
.map(rootedFolder::relativize)
.toList()
);
meta.save(metaFile);
} catch (Exception e) {
RecursiveResources.LOGGER.error("Failed to process meta file for folder " + folder, e);
}
}

return meta;
Expand All @@ -77,17 +84,21 @@ public static FolderMeta load(Path metaFile) {
return CODEC.parse(JsonOps.INSTANCE, json).getOrThrow(false, RecursiveResources.LOGGER::error);
} catch (Exception e) {
RecursiveResources.LOGGER.error("Failed to load folder meta file: " + metaFile, e);
return DEFAULT;
return ERRORED;
}
}

public void save(Path metaFile) {
try (var writer = Files.newBufferedWriter(metaFile)) {
var json = CODEC.encodeStart(JsonOps.INSTANCE, this).getOrThrow(false, RecursiveResources.LOGGER::error);
if (!errored) {
try (var writer = Files.newBufferedWriter(metaFile)) {
var json = CODEC.encodeStart(JsonOps.INSTANCE, this).getOrThrow(false, RecursiveResources.LOGGER::error);

writer.write(GSON.toJson(json));
} catch (Exception e) {
RecursiveResources.LOGGER.error("Failed to save folder meta file: " + metaFile, e);
writer.write(GSON.toJson(json));
} catch (Exception e) {
RecursiveResources.LOGGER.error("Failed to save folder meta file: " + metaFile, e);
}
} else {
RecursiveResources.LOGGER.warn("Skipped overwriting meta file due to previous error: " + metaFile);
}
}

Expand All @@ -100,7 +111,7 @@ public FolderMeta getRefreshed(List<Path> packsInFolder) {
}
}

return new FolderMeta(icon, description, Collections.unmodifiableList(packs), hidden);
return new FolderMeta(icon, description, Collections.unmodifiableList(packs), hidden, errored);
}

public int sortEntry(PackListWidget.ResourcePackEntry entry, Path folder) {
Expand Down
2 changes: 2 additions & 0 deletions src/main/resources/assets/recursiveresources/lang/en_us.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,7 @@ recursiveresources:
folder:
back: (Back)
folder: (Folder)
errored: Error loading folder.json
errored_description: Please make sure your json structure is correct
availablepacks.title.hover: Enable all
selectedpacks.title.hover: Disable all

0 comments on commit eba4c25

Please sign in to comment.