Skip to content

Commit

Permalink
Adds ItemStackReaderMiddleman
Browse files Browse the repository at this point in the history
Adds ItemStackReader for 1.20.5 but still supports old ItemStackReader (will only be used if running 1.20.5 or newer)
  • Loading branch information
anjoismysign committed Apr 25, 2024
1 parent 3f6b278 commit 6ccdc09
Show file tree
Hide file tree
Showing 12 changed files with 214 additions and 10 deletions.
5 changes: 5 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,11 @@
<artifactId>zip4j</artifactId>
<version>2.11.5</version>
</dependency>
<dependency>
<groupId>me.anjoismysign</groupId>
<artifactId>BlobLib_1_20_5</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
<distributionManagement>
<repository>
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/us/mytheria/bloblib/BlobLib.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import us.mytheria.bloblib.managers.*;
import us.mytheria.bloblib.managers.fillermanager.FillerManager;
import us.mytheria.bloblib.placeholderapi.TranslatablePH;
import us.mytheria.bloblib.utilities.MinecraftVersion;
import us.mytheria.bloblib.utilities.SerializationLib;
import us.mytheria.bloblib.vault.VaultManager;

Expand Down Expand Up @@ -54,6 +55,8 @@ public class BlobLib extends JavaPlugin {
private LocalizableDataAssetManager<TranslatableItem> translatableItemManager;
private DataAssetManager<TagSet> tagSetManager;

private MinecraftVersion running;

private static BlobLib instance;

/**
Expand All @@ -80,6 +83,7 @@ public static BlobPluginLogger getAnjoLogger() {
@Override
public void onEnable() {
instance = this;
running = MinecraftVersion.getRunning();
api = BlobLibAPI.getInstance(this);
bloblibupdater = new BlobLibUpdater(this);
serializationLib = SerializationLib.getInstance(this);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.Nullable;
import us.mytheria.bloblib.BlobLib;
import us.mytheria.bloblib.itemstack.ItemStackBuilder;
import us.mytheria.bloblib.itemstack.ItemStackReader;
import us.mytheria.bloblib.utilities.SerializationLib;
import us.mytheria.bloblib.utilities.TextColor;
Expand All @@ -31,9 +30,7 @@ public record DisplayPetRecord(@Nullable ItemStack itemStack,
public static DisplayPetRecord read(ConfigurationSection section) {
ItemStack itemStack = null;
if (section.isConfigurationSection("ItemStack")) {
ItemStackBuilder builder = ItemStackReader
.READ_OR_FAIL_FAST(section.getConfigurationSection("ItemStack"));
itemStack = builder.build();
itemStack = ItemStackReader.getInstance().readOrFailFast(section.getConfigurationSection("ItemStack"));
}
BlockData blockData = null;
if (section.isString("BlockData")) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -319,7 +319,7 @@ public static Currency fromFile(File file, ManagerDirector director) {
if (!shape.isDouble("Denomination"))
throw new ConfigurationFieldException("'" + a + ".Denomination' is missing or not valid (DECIMAL NUMBER)");
BigDecimal denomination = BigDecimal.valueOf(shape.getDouble("Denomination"));
ItemStack builder = ItemStackReader.READ_OR_FAIL_FAST(itemSection).build();
ItemStack builder = ItemStackReader.getInstance().readOrFailFast(itemSection);
ItemMeta itemMeta = builder.getItemMeta();
PersistentDataContainer pdc = itemMeta.getPersistentDataContainer();
pdc.set(director.getNamespacedKey("tangibleCurrencyKey"), PersistentDataType.STRING, key);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ public static BlobMultiSlotable read(ConfigurationSection section, String key,
Bukkit.getLogger().severe("ItemStack section is null for " + key);
return null;
}
ItemStack itemStack = ItemStackReader.READ_OR_FAIL_FAST(itemStackSection).build();
ItemStack itemStack = ItemStackReader.getInstance().readOrFailFast(itemStackSection);
String read = section.getString("Slot", "-1");
Set<Integer> list = IntegerRange.getInstance().parse(read);
String permission = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ public static MetaBlobMultiSlotable read(ConfigurationSection section, String ke
Bukkit.getLogger().severe("ItemStack section is null for " + key);
return null;
}
ItemStack itemStack = ItemStackReader.READ_OR_FAIL_FAST(itemStackSection).build();
ItemStack itemStack = ItemStackReader.getInstance().readOrFailFast(itemStackSection);
String read = section.getString("Slot", "-1");
Set<Integer> set = IntegerRange.getInstance().parse(read);
String meta = section.getString("Meta", "NONE");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public static TranslatableItem ITEM(@NotNull ConfigurationSection section,
Objects.requireNonNull(key, "Key cannot be null");
if (!section.isConfigurationSection("ItemStack"))
throw new ConfigurationFieldException("'ItemStack' is missing or not set");
ItemStack itemStack = ItemStackReader.READ_OR_FAIL_FAST(section.getConfigurationSection("ItemStack")).build();
ItemStack itemStack = ItemStackReader.getInstance().readOrFailFast(section.getConfigurationSection("ItemStack"));
return BlobTranslatableItem.of(key, locale, itemStack);
}

Expand Down
64 changes: 63 additions & 1 deletion src/main/java/us/mytheria/bloblib/itemstack/ItemStackReader.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,38 @@
import org.bukkit.attribute.AttributeModifier;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import us.mytheria.bloblib.SkullCreator;
import us.mytheria.bloblib.exception.ConfigurationFieldException;
import us.mytheria.bloblib.utilities.MinecraftVersion;
import us.mytheria.bloblib.utilities.TextColor;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

public class ItemStackReader {
public class ItemStackReader implements ItemStackReaderMiddleman {
private static ItemStackReaderMiddleman instance;

public static ItemStackReaderMiddleman getInstance() {
if (instance == null) {
MinecraftVersion supported = MinecraftVersion.of("1.20.5");
MinecraftVersion running = MinecraftVersion.getRunning();
if (running.compareTo(supported) >= 0)
instance = new Reader1_20_5();
else
instance = new ItemStackReader();
}
return instance;
}

/**
* @deprecated Use {@link #readOrFailFast(ConfigurationSection)}
*/
@Deprecated
public static ItemStackBuilder READ_OR_FAIL_FAST(ConfigurationSection section) {
if (!section.isString("Material"))
throw new ConfigurationFieldException("'Material' field is missing or not a String");
Expand Down Expand Up @@ -93,6 +113,24 @@ public static ItemStackBuilder READ_OR_FAIL_FAST(ConfigurationSection section) {
return builder;
}

@Override
public @NotNull ItemStack readOrFailFast(@NotNull ConfigurationSection section) {
return READ_OR_FAIL_FAST(section).build();
}

@Override
public @Nullable ItemStack attempRead(@NotNull ConfigurationSection section) {
try {
return readOrFailFast(section);
} catch (Throwable e) {
return null;
}
}

/**
* @deprecated Use {@link #attempRead(ConfigurationSection)}
*/
@Deprecated
@NotNull
public static ItemStackBuilder read(ConfigurationSection section) {
ItemStackBuilder builder;
Expand All @@ -105,23 +143,43 @@ public static ItemStackBuilder read(ConfigurationSection section) {
}
}

/**
* @deprecated Use {@link #readOrFailFast(ConfigurationSection)} (ConfigurationSection)}
*/
@Deprecated
public static ItemStackBuilder read(File file, String path) {
YamlConfiguration config = YamlConfiguration.loadConfiguration(file);
return READ_OR_FAIL_FAST(Objects.requireNonNull(config.getConfigurationSection(path)));
}

/**
* @deprecated Use {@link #readOrFailFast(ConfigurationSection)}
*/
@Deprecated
public static ItemStackBuilder read(File file) {
return read(file, "ItemStack");
}

/**
* @deprecated Use {@link #readOrFailFast(ConfigurationSection)}
*/
@Deprecated
public static ItemStackBuilder read(YamlConfiguration config, String path) {
return READ_OR_FAIL_FAST(Objects.requireNonNull(config.getConfigurationSection(path)));
}

/**
* @deprecated Use {@link #readOrFailFast(ConfigurationSection)}
*/
@Deprecated
public static ItemStackBuilder read(YamlConfiguration config) {
return read(config, "ItemStack");
}

/**
* @deprecated will be inside singleton
*/
@Deprecated
public static Color parseColor(String color) {
String[] input = color.split(",");
if (input.length != 3) {
Expand All @@ -137,6 +195,10 @@ public static Color parseColor(String color) {
}
}

/**
* @deprecated marked for removal
*/
@Deprecated
public static String parse(Color color) {
return color.getRed() + "," + color.getGreen() + "," + color.getBlue();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package us.mytheria.bloblib.itemstack;

import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

public interface ItemStackReaderMiddleman {
@NotNull
ItemStack readOrFailFast(@NotNull ConfigurationSection section);

@Nullable
ItemStack attempRead(@NotNull ConfigurationSection section);
}
32 changes: 32 additions & 0 deletions src/main/java/us/mytheria/bloblib/itemstack/Reader1_20_5.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package us.mytheria.bloblib.itemstack;

import me.anjoismysign.itemstack.ItemStackReader;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

public class Reader1_20_5 implements ItemStackReaderMiddleman {
private static Reader1_20_5 instance;

public static Reader1_20_5 getInstance() {
if (instance == null) {
instance = new Reader1_20_5();
}
return instance;
}

@Override
public @NotNull ItemStack readOrFailFast(@NotNull ConfigurationSection section) {
return ItemStackReader.READ_OR_FAIL_FAST(section).build();
}

@Override
public @Nullable ItemStack attempRead(@NotNull ConfigurationSection section) {
try {
return readOrFailFast(section);
} catch (Throwable e) {
return null;
}
}
}
63 changes: 63 additions & 0 deletions src/main/java/us/mytheria/bloblib/utilities/MinecraftVersion.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package us.mytheria.bloblib.utilities;

import org.bukkit.Bukkit;
import org.jetbrains.annotations.NotNull;

import java.util.Objects;

public record MinecraftVersion(int getMajor, int getMinor) implements Comparable<MinecraftVersion> {
private static MinecraftVersion running;

public static MinecraftVersion getRunning() {
if (running == null) {
String version = Bukkit.getVersion();
String[] split = version.split("MC: ");
if (split.length == 1)
throw new IllegalStateException("Failed to get Minecraft version");
else {
version = split[1].substring(0, split[1].length() - 1);
running = MinecraftVersion.of(version);
}
}
return running;
}

public static MinecraftVersion of(@NotNull String input) {
Objects.requireNonNull(input, "'input' cannot be null");
String[] split = input.split("\\.");
if (split.length < 2)
throw new IllegalArgumentException("Invalid version format: " + input);
String major;
String minor;
try {
if (split.length > 2) {
major = split[1];
minor = split[2];
int x = Integer.parseInt(major);
int y = Integer.parseInt(minor);
return new MinecraftVersion(x, y);
}
major = split[1];
minor = "0";
int x = Integer.parseInt(major);
int y = Integer.parseInt(minor);
return new MinecraftVersion(x, y);
} catch (NumberFormatException exception) {
throw exception;
}
}

@Override
public int compareTo(@NotNull MinecraftVersion other) {
Objects.requireNonNull(other, "'other' cannot be null");
if (this.getMajor == other.getMajor && this.getMinor == other.getMinor)
return 0;
if (this.getMajor > other.getMajor)
return 1;
if (this.getMajor < other.getMajor)
return -1;
if (this.getMinor > other.getMinor)
return 1;
return -1;
}
}
29 changes: 28 additions & 1 deletion src/main/java/us/mytheria/bloblib/utilities/ResourceUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,15 @@
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.Plugin;
import org.jetbrains.annotations.NotNull;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;

public class ResourceUtil {
Expand Down Expand Up @@ -43,6 +46,7 @@ public static void moveResource(File file, InputStream inputStream) {
public static void writeNewValues(File existingFile, YamlConfiguration updateYamlConfiguration) {
FileConfiguration existingYamlConfig = YamlConfiguration.loadConfiguration(existingFile);
Set<String> keys = updateYamlConfiguration.getConfigurationSection("").getKeys(true);
Set<String> existing = new HashSet<>();
keys.forEach(key -> {
if (!updateYamlConfiguration.isConfigurationSection(key)) {
try {
Expand All @@ -57,7 +61,15 @@ public static void writeNewValues(File existingFile, YamlConfiguration updateYam
// if it's not a section, it's a value
if (existingYamlConfig.contains(key)) return;
}
if (existingYamlConfig.isConfigurationSection(key)) return; //if it exists, skip
if (existingYamlConfig.contains(key)) {
existing.add(key);
return; //if it exists, skip
}
String parent = getParent(key);
List<String> match = existing.stream()
.filter(s -> s.startsWith(parent))
.toList();
if (!match.isEmpty()) return; // if the parent exists, skip
existingYamlConfig.set(key, updateYamlConfiguration.get(key)); // write
});
try {
Expand Down Expand Up @@ -107,4 +119,19 @@ public static void updateYml(File path, String tempFileName, String fileName, Fi
tempYamlConfiguration); // attempts to write new values to existing file if they don't exist
tempFile.delete();
}

@NotNull
private static String getParent(@NotNull String key) {
Objects.requireNonNull(key, "'key' cannot be null");
String[] split = key.split("\\.");
if (split.length == 1)
return key;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < split.length - 1; i++) {
sb.append(split[i]);
if (i != split.length - 2)
sb.append(".");
}
return sb.toString();
}
}

0 comments on commit 6ccdc09

Please sign in to comment.