From 338d2cb8895ecb48948400bf797b25ed757bacaf Mon Sep 17 00:00:00 2001 From: turt2live Date: Sun, 31 Aug 2014 17:06:10 -0600 Subject: [PATCH 1/2] Add converting framework as well as the converter for Backpack Adds command /pvconvert Adds permission playervaults.convert Adds Converter interface for future converters Adds BackpackConverter - A converter for Backpack (http://dev.bukkit.org/bukkit-plugins/backpack/) --- .../drtshock/playervaults/PlayerVaults.java | 3 +- .../playervaults/commands/ConvertCommand.java | 57 +++++++++++ .../converters/BackpackConverter.java | 95 +++++++++++++++++++ .../playervaults/converters/Converter.java | 34 +++++++ .../com/drtshock/playervaults/util/Lang.java | 6 +- src/main/resources/lang.yml | 5 +- src/main/resources/plugin.yml | 5 +- 7 files changed, 200 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/drtshock/playervaults/commands/ConvertCommand.java create mode 100644 src/main/java/com/drtshock/playervaults/converters/BackpackConverter.java create mode 100644 src/main/java/com/drtshock/playervaults/converters/Converter.java diff --git a/src/main/java/com/drtshock/playervaults/PlayerVaults.java b/src/main/java/com/drtshock/playervaults/PlayerVaults.java index 6147ba8..79c9f7f 100644 --- a/src/main/java/com/drtshock/playervaults/PlayerVaults.java +++ b/src/main/java/com/drtshock/playervaults/PlayerVaults.java @@ -1,4 +1,4 @@ -/* +/* * Copyright (C) 2013 drtshock * * This program is free software: you can redistribute it and/or modify @@ -77,6 +77,7 @@ public class PlayerVaults extends JavaPlugin { getCommand("pvdel").setExecutor(new DeleteCommand()); getCommand("pvsign").setExecutor(new SignCommand()); getCommand("workbench").setExecutor(new WorkbenchCommand()); + getCommand("pvconvert").setExecutor(new ConvertCommand()); useVault = setupEconomy(); startMetrics(); diff --git a/src/main/java/com/drtshock/playervaults/commands/ConvertCommand.java b/src/main/java/com/drtshock/playervaults/commands/ConvertCommand.java new file mode 100644 index 0000000..b129157 --- /dev/null +++ b/src/main/java/com/drtshock/playervaults/commands/ConvertCommand.java @@ -0,0 +1,57 @@ +package com.drtshock.playervaults.commands; + +import com.drtshock.playervaults.converters.BackpackConverter; +import com.drtshock.playervaults.converters.Converter; +import com.drtshock.playervaults.util.Lang; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; + +import java.util.ArrayList; +import java.util.List; + +public class ConvertCommand implements CommandExecutor { + + private List converters = new ArrayList<>(); + + public ConvertCommand() { + converters.add(new BackpackConverter()); + } + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + if (!sender.hasPermission("playervaults.convert")) { + sender.sendMessage(Lang.TITLE.toString() + Lang.NO_PERMS); + } else { + if (args.length == 0) { + sender.sendMessage(Lang.TITLE + "/pvconvert "); + } else { + String name = args[0]; + List applicableConverters = new ArrayList<>(); + if (name.equalsIgnoreCase("all")) { + applicableConverters.addAll(converters); + } else { + for (Converter converter : converters) { + if (converter.getName().equalsIgnoreCase(name)) { + applicableConverters.add(converter); + } + } + } + + if (applicableConverters.size() <= 0) { + sender.sendMessage(Lang.TITLE.toString() + Lang.CONVERT_PLUGIN_NOT_FOUND); + } else { + int converted = 0; + for (Converter converter : applicableConverters) { + if (converter.canConvert()) { + converted += converter.doConvert(); + } + } + sender.sendMessage(Lang.TITLE + Lang.CONVERT_COMPLETE.toString().replace("%converted", converted + "")); + } + } + } + + return true; + } +} \ No newline at end of file diff --git a/src/main/java/com/drtshock/playervaults/converters/BackpackConverter.java b/src/main/java/com/drtshock/playervaults/converters/BackpackConverter.java new file mode 100644 index 0000000..68d068d --- /dev/null +++ b/src/main/java/com/drtshock/playervaults/converters/BackpackConverter.java @@ -0,0 +1,95 @@ +package com.drtshock.playervaults.converters; + +import com.drtshock.playervaults.PlayerVaults; +import com.drtshock.playervaults.vaultmanagement.UUIDVaultManager; +import org.bukkit.OfflinePlayer; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import java.io.File; +import java.io.IOException; +import java.util.UUID; + +/** + * Simple converter for Backpack (http://dev.bukkit.org/bukkit-plugins/backpack/) + * + * @author turt2live + */ +public class BackpackConverter implements Converter { + + @Override + public int doConvert() { + PlayerVaults plugin = PlayerVaults.getInstance(); + File destination = new File(plugin.getDataFolder().getParentFile(), "Backpack" + File.separator + "backpacks"); + if (!destination.exists()) return -1; + + int converted = 0; + + File[] worldDirs = destination.listFiles(); + int vaultNum = 1; + for (File file : worldDirs != null ? worldDirs : new File[0]) { + if (file.isDirectory()) { + converted += convert(file, vaultNum); + vaultNum++; + } + } + + return converted; + } + + private int convert(File worldFolder, int intoVaultNum) { + PlayerVaults plugin = PlayerVaults.getInstance(); + UUIDVaultManager vaults = UUIDVaultManager.getInstance(); + int converted = 0; + File[] files = worldFolder.listFiles(); + for (File file : files != null ? files : new File[0]) { + if (file.isFile() && file.getName().toLowerCase().endsWith(".yml")) { + OfflinePlayer player = plugin.getServer().getOfflinePlayer(file.getName().substring(0, file.getName().lastIndexOf('.'))); + if (player == null || player.getUniqueId() == null) { + plugin.getLogger().warning("Unable to convert Backpack for player: " + (player != null ? player.getName() : file.getName())); + } else { + UUID uuid = player.getUniqueId(); + FileConfiguration yaml = YamlConfiguration.loadConfiguration(file); + ConfigurationSection section = yaml.getConfigurationSection("backpack"); + if (section.getKeys(false).size() <= 0) continue; // No slots + + Inventory vault = vaults.getVault(uuid, intoVaultNum); + if (vault == null) vault = plugin.getServer().createInventory(null, section.getKeys(false).size()); + for (String key : section.getKeys(false)) { + ConfigurationSection slotSection = section.getConfigurationSection(key); + ItemStack item = slotSection.getItemStack("ItemStack"); + if (item == null) continue; + + // Overwrite + vault.setItem(Integer.parseInt(key.split(" ")[1]), item); + } + try { + vaults.saveVault(vault, uuid, intoVaultNum); + converted++; + } catch (IOException e) { + plugin.getLogger().severe("Error converting Backpack: " + file.getName()); + e.printStackTrace(); + } + } + } + } + return converted; + } + + @Override + public boolean canConvert() { + PlayerVaults plugin = PlayerVaults.getInstance(); + File expectedFolder = new File(plugin.getDataFolder().getParentFile(), "Backpack"); + if (!expectedFolder.exists()) return false; + File backpackDir = new File(expectedFolder, "backpacks"); + return backpackDir.exists(); + } + + @Override + public String getName() { + return "Backpack"; + } +} diff --git a/src/main/java/com/drtshock/playervaults/converters/Converter.java b/src/main/java/com/drtshock/playervaults/converters/Converter.java new file mode 100644 index 0000000..ecfcf36 --- /dev/null +++ b/src/main/java/com/drtshock/playervaults/converters/Converter.java @@ -0,0 +1,34 @@ +package com.drtshock.playervaults.converters; + +/** + * Represents a simple converter for converting another plugin's content + * to PlayerVaults. + * + * @author turt2live + */ +public interface Converter { + + /** + * Converts the other plugin's data. + * + * @return the number of vaults converted. Returns 0 on none converted + * or -1 if no vaults were converted. + */ + public int doConvert(); + + /** + * Determines if this converter is applicable for converting to PlayerVaults. + * This may check for the existance of a plugin, plugin folder, or otherwise. + * + * @return true if this converter can convert, false otherwise + */ + public boolean canConvert(); + + /** + * Gets the name of this converter + * + * @return the converter name + */ + public String getName(); + +} diff --git a/src/main/java/com/drtshock/playervaults/util/Lang.java b/src/main/java/com/drtshock/playervaults/util/Lang.java index 4cef941..6e58fd3 100644 --- a/src/main/java/com/drtshock/playervaults/util/Lang.java +++ b/src/main/java/com/drtshock/playervaults/util/Lang.java @@ -1,4 +1,4 @@ -/* +/* * Copyright (C) 2013 drtshock * * This program is free software: you can redistribute it and/or modify @@ -45,7 +45,9 @@ public enum Lang { EXISTING_VAULTS("existing-vaults", "&f%p has vaults: &a%v"), VAULT_TITLE("vault-title", "&4Vault #%number"), OPEN_WITH_SIGN("open-with-sign", "&fOpening vault &a%v &fof &a%p"), - NO_PLAYER_FOUND("no-player-found", "&cCannot find player &a%p"); + NO_PLAYER_FOUND("no-player-found", "&cCannot find player &a%p"), + CONVERT_PLUGIN_NOT_FOUND("plugin-not-found", "&cNo converter found for that plugin"), + CONVERT_COMPLETE("conversion-complete", "&aConverted %converted players to PlayerVaults"); private String path; private String def; diff --git a/src/main/resources/lang.yml b/src/main/resources/lang.yml index ee2dea5..ed50040 100644 --- a/src/main/resources/lang.yml +++ b/src/main/resources/lang.yml @@ -3,6 +3,7 @@ # %v is where the vault number will get inserted. # %price is the price. # %number is the vault number +# %converted is the number of vaults converted (where applicable) # Made with love :) title-name: "&4[&fPlayerVaults&4]:" open-vault: "&fOpening vault &a%v" @@ -20,4 +21,6 @@ cost-to-create: "&fYou were charged &c%price &ffor creating that vault." cost-to-open: "&fYou were charged &c%price &ffor opening that vault." vault-number: "&4Vault #%number" existing-vaults: "&f%p has vaults: &a%v" -no-player-found: "&cCannot find player &a%p" \ No newline at end of file +no-player-found: "&cCannot find player &a%p" +plugin-not-found: "&cNo converter found for that plugin" +conversion-complete: "&aConverted %converted players to PlayerVaults" \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 0537017..924f4e1 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -16,4 +16,7 @@ commands: aliases: [vaultsign] workbench: description: Opens a workbench. - aliases: [wb] \ No newline at end of file + aliases: [wb] + pvconvert: + description: Convert other plugins to PlayerVaults + aliases: [vaultconvert] \ No newline at end of file From 645ab84f0b1ae0de3b103b92961e93c7f0cb369b Mon Sep 17 00:00:00 2001 From: turt2live Date: Sun, 31 Aug 2014 17:12:53 -0600 Subject: [PATCH 2/2] Make @evilmidget38 happy --- .../java/com/drtshock/playervaults/commands/ConvertCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/drtshock/playervaults/commands/ConvertCommand.java b/src/main/java/com/drtshock/playervaults/commands/ConvertCommand.java index b129157..c5ccf4c 100644 --- a/src/main/java/com/drtshock/playervaults/commands/ConvertCommand.java +++ b/src/main/java/com/drtshock/playervaults/commands/ConvertCommand.java @@ -54,4 +54,4 @@ public class ConvertCommand implements CommandExecutor { return true; } -} \ No newline at end of file +}