Gets the books without borders instance without sending it in the constuctor

This commit is contained in:
Kristian Knarvik 2021-09-02 01:10:21 +02:00
parent dff10a7403
commit 7bfa60aeee
15 changed files with 237 additions and 258 deletions

View File

@ -32,6 +32,7 @@ import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender; import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.command.PluginCommand; import org.bukkit.command.PluginCommand;
import org.bukkit.command.TabCompleter; import org.bukkit.command.TabCompleter;
import org.bukkit.configuration.Configuration;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemFactory; import org.bukkit.inventory.ItemFactory;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@ -49,28 +50,25 @@ import java.io.FileWriter;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import static net.knarcraft.bookswithoutborders.BooksWithoutBordersSettings.getBookFolder; import static net.knarcraft.bookswithoutborders.BooksWithoutBordersSettings.getBookFolder;
import static net.knarcraft.bookswithoutborders.BooksWithoutBordersSettings.getCommandColor;
import static net.knarcraft.bookswithoutborders.BooksWithoutBordersSettings.getErrorColor; import static net.knarcraft.bookswithoutborders.BooksWithoutBordersSettings.getErrorColor;
import static net.knarcraft.bookswithoutborders.BooksWithoutBordersSettings.getSlash; import static net.knarcraft.bookswithoutborders.BooksWithoutBordersSettings.getSlash;
import static net.knarcraft.bookswithoutborders.BooksWithoutBordersSettings.getSuccessColor; import static net.knarcraft.bookswithoutborders.BooksWithoutBordersSettings.getSuccessColor;
import static net.knarcraft.bookswithoutborders.utility.InputCleaningHelper.cleanString; import static net.knarcraft.bookswithoutborders.utility.InputCleaningHelper.cleanString;
import static net.knarcraft.bookswithoutborders.utility.InputCleaningHelper.fixName;
public class BooksWithoutBorders extends JavaPlugin { public class BooksWithoutBorders extends JavaPlugin {
private static int bookDuplicateLimit; public static int bookDuplicateLimit;
//The separating string between the book title and the book author //The separating string between the book title and the book author
public static String titleAuthorSeparator; public static String titleAuthorSeparator;
public static String loreSeparator; public static String loreSeparator;
public static List<String> firstBooks; public static List<String> firstBooks;
public static String welcomeMessage; public static String welcomeMessage;
private static List<String> existingPlayers; public static List<String> existingPlayers;
public static Economy eco; public static Economy eco;
public static Material bookPriceType = null; public static Material bookPriceType = null;
public static double bookPriceQuantity; public static double bookPriceQuantity;
@ -102,29 +100,33 @@ public class BooksWithoutBorders extends JavaPlugin {
registerCommands(); registerCommands();
} }
public static BooksWithoutBorders getInstance() {
return booksWithoutBorders;
}
/** /**
* Registers all commands used by this plugin * Registers all commands used by this plugin
*/ */
private void registerCommands() { private void registerCommands() {
registerCommand("give", new CommandGive(this), new GiveTabCompleter(this)); registerCommand("give", new CommandGive(), new GiveTabCompleter());
registerCommand("decrypt", new CommandDecrypt(), null); registerCommand("decrypt", new CommandDecrypt(), null);
registerCommand("groupEncrypt", new CommandGroupEncrypt(), null); registerCommand("groupEncrypt", new CommandGroupEncrypt(), null);
registerCommand("delete", new CommandDelete(this), null); registerCommand("delete", new CommandDelete(), null);
registerCommand("deletePublic", new CommandDeletePublic(this), null); registerCommand("deletePublic", new CommandDeletePublic(), null);
registerCommand("copy", new CommandCopy(this), null); registerCommand("copy", new CommandCopy(), null);
registerCommand("unSign", new CommandUnSign(), null); registerCommand("unSign", new CommandUnSign(), null);
registerCommand("encrypt", new CommandEncrypt(), null); registerCommand("encrypt", new CommandEncrypt(), null);
registerCommand("setBookPrice", new CommandSetBookPrice(this), null); registerCommand("setBookPrice", new CommandSetBookPrice(), null);
registerCommand("setLore", new CommandSetLore(), null); registerCommand("setLore", new CommandSetLore(), null);
registerCommand("savePublic", new CommandSavePublic(this), null); registerCommand("savePublic", new CommandSavePublic(), null);
registerCommand("save", new CommandSave(this), null); registerCommand("save", new CommandSave(), null);
registerCommand("setAuthor", new CommandSetAuthor(), null); registerCommand("setAuthor", new CommandSetAuthor(), null);
registerCommand("setTitle", new CommandSetTitle(), null); registerCommand("setTitle", new CommandSetTitle(), null);
registerCommand("load", new CommandLoad(this), null); registerCommand("load", new CommandLoad(), null);
registerCommand("loadPublic", new CommandLoadPublic(this), null); registerCommand("loadPublic", new CommandLoadPublic(), null);
registerCommand("booksWithoutBorders", new CommandBooksWithoutBorders(this), null); registerCommand("booksWithoutBorders", new CommandBooksWithoutBorders(), null);
registerCommand("reload", new CommandReload(this), null); registerCommand("reload", new CommandReload(), null);
registerCommand("givePublic", new CommandGivePublic(this), null); registerCommand("givePublic", new CommandGivePublic(), null);
} }
/** /**
@ -161,95 +163,110 @@ public class BooksWithoutBorders extends JavaPlugin {
return false; return false;
} }
this.getConfig().set("Options.Save_Books_in_Yaml_Format", useYml); //Save config with loaded values to fix invalid config values
this.getConfig().set("Options.Max_Number_of_Duplicates", bookDuplicateLimit); saveConfigValues();
this.getConfig().set("Options.Title-Author_Separator", titleAuthorSeparator);
this.getConfig().set("Options.Lore_line_separator", loreSeparator);
this.getConfig().set("Options.Books_for_new_players", firstBooks);
this.getConfig().set("Options.Message_for_new_players", welcomeMessage);
if (bookPriceType != null) {
if (bookPriceType != Material.AIR) {
this.getConfig().set("Options.Price_to_create_book.Item_type", bookPriceType.toString());
} else {
this.getConfig().set("Options.Price_to_create_book.Item_type", "Economy");
}
} else {
this.getConfig().set("Options.Price_to_create_book.Item_type", "Item type name");
}
this.getConfig().set("Options.Price_to_create_book.Required_quantity", bookPriceQuantity);
this.getConfig().set("Options.Admin_Auto_Decrypt", adminDecrypt);
this.getConfig().set("Options.Author_Only_Copy", authorOnlyCopy);
//Handles old book and quill settings if (!testFileSaving()) {
if (this.getConfig().contains("Options.Require_book_and_quill_to_create_book")) { return false;
sendSuccessMessage(consoleSender, "[BooksWithoutBorders] Found old config setting \"Require_book_and_quill_to_create_book\"");
sendSuccessMessage(consoleSender, "Updating to \"Price_to_create_book\" settings");
if (this.getConfig().getBoolean("Options.Require_book_and_quill_to_create_book")) {
bookPriceType = Material.WRITABLE_BOOK;
bookPriceQuantity = 1;
this.getConfig().set("Options.Price_to_create_book.Item_type", bookPriceType.toString());
this.getConfig().set("Options.Price_to_create_book.Required_quantity", bookPriceQuantity);
}
this.getConfig().set("Options.Require_book_and_quill_to_create_book", null);
}
this.saveConfig();
File fTest = new File(getBookFolder());
File efTest = new File(getBookFolder() + "Encrypted" + getSlash());
if (!fTest.exists()) {
try {
if (!fTest.mkdir()) {
sendErrorMessage(consoleSender, "Saving failed! Aborting...");
return false;
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
if (!efTest.exists()) {
try {
if (!efTest.mkdir()) {
sendErrorMessage(consoleSender, "Saving failed! Aborting...");
return false;
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
} }
return loadExistingPlayers(); return loadExistingPlayers();
} }
private boolean testFileSaving() {
File fileTest = new File(getBookFolder());
File encryptedFileTest = new File(getBookFolder() + "Encrypted" + getSlash());
if (!fileTest.exists()) {
try {
if (!fileTest.mkdir()) {
sendErrorMessage(consoleSender, "Saving failed! Aborting...");
return false;
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
if (!encryptedFileTest.exists()) {
try {
if (!encryptedFileTest.mkdir()) {
sendErrorMessage(consoleSender, "Saving failed! Aborting...");
return false;
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
return true;
}
public void saveConfigValues() {
Configuration config = this.getConfig();
config.set("Options.Save_Books_in_Yaml_Format", useYml);
config.set("Options.Max_Number_of_Duplicates", bookDuplicateLimit);
config.set("Options.Title-Author_Separator", titleAuthorSeparator);
config.set("Options.Lore_line_separator", loreSeparator);
config.set("Options.Books_for_new_players", firstBooks);
config.set("Options.Message_for_new_players", welcomeMessage);
if (bookPriceType != null) {
if (bookPriceType != Material.AIR) {
config.set("Options.Price_to_create_book.Item_type", bookPriceType.toString());
} else {
config.set("Options.Price_to_create_book.Item_type", "Economy");
}
} else {
config.set("Options.Price_to_create_book.Item_type", "Item type name");
}
config.set("Options.Price_to_create_book.Required_quantity", bookPriceQuantity);
config.set("Options.Admin_Auto_Decrypt", adminDecrypt);
config.set("Options.Author_Only_Copy", authorOnlyCopy);
//Handles old book and quill settings
if (config.contains("Options.Require_book_and_quill_to_create_book")) {
sendSuccessMessage(consoleSender, "[BooksWithoutBorders] Found old config setting \"Require_book_and_quill_to_create_book\"");
sendSuccessMessage(consoleSender, "Updating to \"Price_to_create_book\" settings");
if (config.getBoolean("Options.Require_book_and_quill_to_create_book")) {
bookPriceType = Material.WRITABLE_BOOK;
bookPriceQuantity = 1;
config.set("Options.Price_to_create_book.Item_type", bookPriceType.toString());
config.set("Options.Price_to_create_book.Required_quantity", bookPriceQuantity);
}
config.set("Options.Require_book_and_quill_to_create_book", null);
}
this.saveConfig();
}
public boolean loadConfig() { public boolean loadConfig() {
this.reloadConfig(); this.reloadConfig();
Configuration config = this.getConfig();
try { try {
useYml = this.getConfig().getBoolean("Options.Save_Books_in_Yaml_Format", true); useYml = config.getBoolean("Options.Save_Books_in_Yaml_Format", true);
bookDuplicateLimit = this.getConfig().getInt("Options.Max_Number_of_Duplicates", 5); bookDuplicateLimit = config.getInt("Options.Max_Number_of_Duplicates", 5);
titleAuthorSeparator = this.getConfig().getString("Options.Title-Author_Separator", ","); titleAuthorSeparator = config.getString("Options.Title-Author_Separator", ",");
loreSeparator = this.getConfig().getString("Options.Lore_line_separator", "~"); loreSeparator = config.getString("Options.Lore_line_separator", "~");
adminDecrypt = this.getConfig().getBoolean("Options.Admin_Auto_Decrypt", false); adminDecrypt = config.getBoolean("Options.Admin_Auto_Decrypt", false);
authorOnlyCopy = this.getConfig().getBoolean("Options.Author_Only_Copy", false); authorOnlyCopy = config.getBoolean("Options.Author_Only_Copy", false);
firstBooks = this.getConfig().getStringList("Options.Books_for_new_players"); //Set books to give new players
if (this.getConfig().contains("Options.Book_for_new_players")) firstBooks = config.getStringList("Options.Books_for_new_players");
firstBooks.add(this.getConfig().getString("Options.Book_for_new_players")); if (config.contains("Options.Book_for_new_players")) {
if (firstBooks.isEmpty()) firstBooks.add(config.getString("Options.Book_for_new_players"));
}
if (firstBooks.isEmpty()) {
firstBooks.add(" "); firstBooks.add(" ");
}
welcomeMessage = this.getConfig().getString("Options.Message_for_new_players", " "); welcomeMessage = config.getString("Options.Message_for_new_players", " ");
//Converts string into material //Converts string into material
String sMaterial = this.getConfig().getString("Options.Price_to_create_book.Item_type", " "); String sMaterial = config.getString("Options.Price_to_create_book.Item_type", " ");
if (sMaterial.equalsIgnoreCase("Economy")) { if (sMaterial.equalsIgnoreCase("Economy")) {
if (setupEconomy()) if (setupEconomy()) {
bookPriceType = Material.AIR; bookPriceType = Material.AIR;
else { } else {
sendErrorMessage(consoleSender, "BooksWithoutBorders failed to hook into Vault! Book price not set!"); sendErrorMessage(consoleSender, "BooksWithoutBorders failed to hook into Vault! Book price not set!");
bookPriceType = null; bookPriceType = null;
} }
@ -259,7 +276,7 @@ public class BooksWithoutBorders extends JavaPlugin {
bookPriceType = m; bookPriceType = m;
} }
} }
bookPriceQuantity = this.getConfig().getDouble("Options.Price_to_create_book.Required_quantity", 0); bookPriceQuantity = config.getDouble("Options.Price_to_create_book.Required_quantity", 0);
//makes sure titleAuthorSeparator is a valid value //makes sure titleAuthorSeparator is a valid value
titleAuthorSeparator = cleanString(titleAuthorSeparator); titleAuthorSeparator = cleanString(titleAuthorSeparator);
@ -267,7 +284,7 @@ public class BooksWithoutBorders extends JavaPlugin {
sendErrorMessage(consoleSender, "Title-Author_Separator is set to an invalid value!"); sendErrorMessage(consoleSender, "Title-Author_Separator is set to an invalid value!");
sendErrorMessage(consoleSender, "Reverting to default value of \",\""); sendErrorMessage(consoleSender, "Reverting to default value of \",\"");
titleAuthorSeparator = ","; titleAuthorSeparator = ",";
this.getConfig().set("Options.Title-Author_Separator", titleAuthorSeparator); config.set("Options.Title-Author_Separator", titleAuthorSeparator);
} }
} catch (Exception e) { } catch (Exception e) {
sendErrorMessage(consoleSender, "Warning! Config.yml failed to load!"); sendErrorMessage(consoleSender, "Warning! Config.yml failed to load!");
@ -334,7 +351,7 @@ public class BooksWithoutBorders extends JavaPlugin {
return true; return true;
} }
private void addExistingPlayer(String playerName) { public void addExistingPlayer(String playerName) {
existingPlayers.add(playerName); existingPlayers.add(playerName);
try { try {
@ -346,103 +363,6 @@ public class BooksWithoutBorders extends JavaPlugin {
} }
} }
public boolean hasPlayedBefore(String playerName) {
if (!existingPlayers.contains(playerName)) {
addExistingPlayer(playerName);
return false;
}
return true;
}
/**
* Saves a book to a file
*
* @param player <p>The player holding the book</p>
* @param heldBook <p>The book held</p>
* @param overwrite <p>Whether to overwrite any existing books</p>
* @param saveToPublicFolder <p>Whether to save the book to the public folder instead of the player folder</p>
*/
public void saveBook(Player player, ItemStack heldBook, boolean overwrite, boolean saveToPublicFolder) {
BookMeta book = (BookMeta) heldBook.getItemMeta();
if (book == null) {
sendErrorMessage(player, "Unable to get metadata for your held book!");
return;
}
String savePath;
if (saveToPublicFolder) {
savePath = getBookFolder();
} else {
savePath = getBookFolder() + cleanString(player.getName()) + getSlash();
}
//Generate book filename
String fileName;
if (!book.hasTitle()) {
fileName = "Untitled," + player.getName();
} else {
fileName = book.getTitle() + titleAuthorSeparator + book.getAuthor();
}
fileName = cleanString(fileName);
fileName = fixName(fileName, false);
//Make sure the used folders exist
File file = new File(savePath);
if (!file.exists() && !file.mkdir()) {
sendErrorMessage(player, "Saving Failed! If this continues to happen, consult server admin!");
return;
}
File[] foundFiles = file.listFiles();
if (foundFiles == null) {
sendErrorMessage(player, "Saving Failed! If this continues to happen, consult server admin!");
return;
}
sendErrorMessage(player, String.valueOf(overwrite));
sendErrorMessage(player, fileName);
sendErrorMessage(player, Arrays.toString(foundFiles));
//Find any duplicates of the book
int foundDuplicates = FileHelper.findDuplicates(foundFiles, fileName);
//Deal with duplicates
if (foundDuplicates > 0) {
//TODO: Decide if this makes sense or needs to be changed
//Skip duplicate book
if (!fileName.contains("Untitled") && !overwrite) {
sendErrorMessage(player, "Book is already saved!");
sendErrorMessage(player, "Use " + getCommandColor() + "/bwb Save true " + getErrorColor() + "to overwrite!");
return;
}
//Skip if duplicate limit is reached
if (foundDuplicates > bookDuplicateLimit) {
sendErrorMessage(player, "Maximum amount of " + fileName + " duplicates reached!");
sendErrorMessage(player, "Use " + getCommandColor() + "/bwb Save true " + getErrorColor() + "to overwrite!");
return;
}
//Alter duplicated filename
if (fileName.contains("Untitled") && !overwrite) {
fileName = "(" + foundDuplicates + ")" + fileName;
}
}
try {
if (useYml) {
BookToFromTextHelper.bookToYml(savePath, fileName, book);
} else {
BookToFromTextHelper.bookToTXT(savePath, fileName, book);
}
sendSuccessMessage(player, "Book Saved as \"" + fileName + "\"");
} catch (IOException e) {
e.printStackTrace();
}
}
public ItemStack loadBook(CommandSender sender, String fileName, String isSigned, String dir) { public ItemStack loadBook(CommandSender sender, String fileName, String isSigned, String dir) {
return loadBook(sender, fileName, isSigned, dir, 1); return loadBook(sender, fileName, isSigned, dir, 1);
} }

View File

@ -19,11 +19,7 @@ import static net.knarcraft.bookswithoutborders.BooksWithoutBordersSettings.getS
*/ */
public class CommandBooksWithoutBorders implements CommandExecutor { public class CommandBooksWithoutBorders implements CommandExecutor {
private final BooksWithoutBorders booksWithoutBorders; private final BooksWithoutBorders booksWithoutBorders = BooksWithoutBorders.getInstance();
public CommandBooksWithoutBorders(BooksWithoutBorders booksWithoutBorders) {
this.booksWithoutBorders = booksWithoutBorders;
}
@Override @Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {

View File

@ -17,11 +17,7 @@ import java.util.Objects;
*/ */
public class CommandCopy implements CommandExecutor { public class CommandCopy implements CommandExecutor {
private final BooksWithoutBorders booksWithoutBorders; private final BooksWithoutBorders booksWithoutBorders = BooksWithoutBorders.getInstance();
public CommandCopy(BooksWithoutBorders booksWithoutBorders) {
this.booksWithoutBorders = booksWithoutBorders;
}
@Override @Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {

View File

@ -18,11 +18,7 @@ import static net.knarcraft.bookswithoutborders.BooksWithoutBordersSettings.getS
*/ */
public class CommandDelete implements CommandExecutor { public class CommandDelete implements CommandExecutor {
private final BooksWithoutBorders booksWithoutBorders; private final BooksWithoutBorders booksWithoutBorders = BooksWithoutBorders.getInstance();
public CommandDelete(BooksWithoutBorders booksWithoutBorders) {
this.booksWithoutBorders = booksWithoutBorders;
}
@Override @Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {

View File

@ -1,6 +1,5 @@
package net.knarcraft.bookswithoutborders.command; package net.knarcraft.bookswithoutborders.command;
import net.knarcraft.bookswithoutborders.BooksWithoutBorders;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -10,10 +9,6 @@ import org.bukkit.command.CommandSender;
*/ */
public class CommandDeletePublic extends CommandDelete implements CommandExecutor { public class CommandDeletePublic extends CommandDelete implements CommandExecutor {
public CommandDeletePublic(BooksWithoutBorders booksWithoutBorders) {
super(booksWithoutBorders);
}
@Override @Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
return deleteBook(sender, args, true); return deleteBook(sender, args, true);

View File

@ -13,11 +13,7 @@ import org.bukkit.inventory.ItemStack;
*/ */
public class CommandGive implements CommandExecutor { public class CommandGive implements CommandExecutor {
private final BooksWithoutBorders booksWithoutBorders; private final BooksWithoutBorders booksWithoutBorders = BooksWithoutBorders.getInstance();
public CommandGive(BooksWithoutBorders booksWithoutBorders) {
this.booksWithoutBorders = booksWithoutBorders;
}
@Override @Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {

View File

@ -1,6 +1,5 @@
package net.knarcraft.bookswithoutborders.command; package net.knarcraft.bookswithoutborders.command;
import net.knarcraft.bookswithoutborders.BooksWithoutBorders;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -10,10 +9,6 @@ import org.bukkit.command.CommandSender;
*/ */
public class CommandGivePublic extends CommandGive implements CommandExecutor { public class CommandGivePublic extends CommandGive implements CommandExecutor {
public CommandGivePublic(BooksWithoutBorders booksWithoutBorders) {
super(booksWithoutBorders);
}
@Override @Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
return giveBook(sender, args, true, "public"); return giveBook(sender, args, true, "public");

View File

@ -13,11 +13,7 @@ import org.bukkit.inventory.ItemStack;
*/ */
public class CommandLoad implements CommandExecutor { public class CommandLoad implements CommandExecutor {
private final BooksWithoutBorders booksWithoutBorders; private final BooksWithoutBorders booksWithoutBorders = BooksWithoutBorders.getInstance();
public CommandLoad(BooksWithoutBorders booksWithoutBorders) {
this.booksWithoutBorders = booksWithoutBorders;
}
@Override @Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {

View File

@ -1,6 +1,5 @@
package net.knarcraft.bookswithoutborders.command; package net.knarcraft.bookswithoutborders.command;
import net.knarcraft.bookswithoutborders.BooksWithoutBorders;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -10,10 +9,6 @@ import org.bukkit.command.CommandSender;
*/ */
public class CommandLoadPublic extends CommandLoad implements CommandExecutor { public class CommandLoadPublic extends CommandLoad implements CommandExecutor {
public CommandLoadPublic(BooksWithoutBorders booksWithoutBorders) {
super(booksWithoutBorders);
}
@Override @Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
return loadBook(sender, args, "public", true); return loadBook(sender, args, "public", true);

View File

@ -10,11 +10,7 @@ import org.bukkit.command.CommandSender;
*/ */
public class CommandReload implements CommandExecutor { public class CommandReload implements CommandExecutor {
private final BooksWithoutBorders booksWithoutBorders; private final BooksWithoutBorders booksWithoutBorders = BooksWithoutBorders.getInstance();
public CommandReload(BooksWithoutBorders booksWithoutBorders) {
this.booksWithoutBorders = booksWithoutBorders;
}
@Override @Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {

View File

@ -2,24 +2,33 @@ package net.knarcraft.bookswithoutborders.command;
import net.knarcraft.bookswithoutborders.BooksWithoutBorders; import net.knarcraft.bookswithoutborders.BooksWithoutBorders;
import net.knarcraft.bookswithoutborders.state.ItemSlot; import net.knarcraft.bookswithoutborders.state.ItemSlot;
import net.knarcraft.bookswithoutborders.utility.BookToFromTextHelper;
import net.knarcraft.bookswithoutborders.utility.FileHelper;
import net.knarcraft.bookswithoutborders.utility.InventoryHelper; import net.knarcraft.bookswithoutborders.utility.InventoryHelper;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.BookMeta;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import static net.knarcraft.bookswithoutborders.BooksWithoutBorders.titleAuthorSeparator;
import static net.knarcraft.bookswithoutborders.BooksWithoutBordersSettings.getBookFolder;
import static net.knarcraft.bookswithoutborders.BooksWithoutBordersSettings.getCommandColor;
import static net.knarcraft.bookswithoutborders.BooksWithoutBordersSettings.getErrorColor;
import static net.knarcraft.bookswithoutborders.BooksWithoutBordersSettings.getSlash;
import static net.knarcraft.bookswithoutborders.utility.InputCleaningHelper.cleanString;
import static net.knarcraft.bookswithoutborders.utility.InputCleaningHelper.fixName;
/** /**
* Command executor for the save command * Command executor for the save command
*/ */
public class CommandSave implements CommandExecutor { public class CommandSave implements CommandExecutor {
private final BooksWithoutBorders booksWithoutBorders;
public CommandSave(BooksWithoutBorders booksWithoutBorders) {
this.booksWithoutBorders = booksWithoutBorders;
}
@Override @Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
return saveHeldBook(sender, args, false); return saveHeldBook(sender, args, false);
@ -43,11 +52,99 @@ public class CommandSave implements CommandExecutor {
if (holdingSlot != ItemSlot.NONE) { if (holdingSlot != ItemSlot.NONE) {
ItemStack holdingItem = InventoryHelper.getHeldItem(player, holdingSlot == ItemSlot.MAIN_HAND); ItemStack holdingItem = InventoryHelper.getHeldItem(player, holdingSlot == ItemSlot.MAIN_HAND);
boolean duplicate = args.length == 1 && Boolean.parseBoolean(args[0]); boolean duplicate = args.length == 1 && Boolean.parseBoolean(args[0]);
booksWithoutBorders.saveBook(player, holdingItem, duplicate, savePublic); saveBook(player, holdingItem, duplicate, savePublic);
return true; return true;
} else { } else {
BooksWithoutBorders.sendErrorMessage(sender, "You must be holding a written book or book and quill to save it!"); BooksWithoutBorders.sendErrorMessage(sender, "You must be holding a written book or book and quill to save it!");
return false; return false;
} }
} }
/**
* Saves a book to a file
*
* @param player <p>The player holding the book</p>
* @param heldBook <p>The book held</p>
* @param overwrite <p>Whether to overwrite any existing books</p>
* @param saveToPublicFolder <p>Whether to save the book to the public folder instead of the player folder</p>
*/
public void saveBook(Player player, ItemStack heldBook, boolean overwrite, boolean saveToPublicFolder) {
BookMeta book = (BookMeta) heldBook.getItemMeta();
if (book == null) {
BooksWithoutBorders.sendErrorMessage(player, "Unable to get metadata for your held book!");
return;
}
String savePath;
if (saveToPublicFolder) {
savePath = getBookFolder();
} else {
savePath = getBookFolder() + cleanString(player.getName()) + getSlash();
}
//Generate book filename
String fileName;
if (!book.hasTitle()) {
fileName = "Untitled," + player.getName();
} else {
fileName = book.getTitle() + titleAuthorSeparator + book.getAuthor();
}
fileName = cleanString(fileName);
fileName = fixName(fileName, false);
//Make sure the used folders exist
File file = new File(savePath);
if (!file.exists() && !file.mkdir()) {
BooksWithoutBorders.sendErrorMessage(player, "Saving Failed! If this continues to happen, consult server admin!");
return;
}
File[] foundFiles = file.listFiles();
if (foundFiles == null) {
BooksWithoutBorders.sendErrorMessage(player, "Saving Failed! If this continues to happen, consult server admin!");
return;
}
BooksWithoutBorders.sendErrorMessage(player, String.valueOf(overwrite));
BooksWithoutBorders.sendErrorMessage(player, fileName);
BooksWithoutBorders.sendErrorMessage(player, Arrays.toString(foundFiles));
//Find any duplicates of the book
int foundDuplicates = FileHelper.findDuplicates(foundFiles, fileName);
//Deal with duplicates
if (foundDuplicates > 0) {
//TODO: Decide if this makes sense or needs to be changed
//Skip duplicate book
if (!fileName.contains("Untitled") && !overwrite) {
BooksWithoutBorders.sendErrorMessage(player, "Book is already saved!");
BooksWithoutBorders.sendErrorMessage(player, "Use " + getCommandColor() + "/bwb Save true " + getErrorColor() + "to overwrite!");
return;
}
//Skip if duplicate limit is reached
if (foundDuplicates > BooksWithoutBorders.bookDuplicateLimit) {
BooksWithoutBorders.sendErrorMessage(player, "Maximum amount of " + fileName + " duplicates reached!");
BooksWithoutBorders.sendErrorMessage(player, "Use " + getCommandColor() + "/bwb Save true " + getErrorColor() + "to overwrite!");
return;
}
//Alter duplicated filename
if (fileName.contains("Untitled") && !overwrite) {
fileName = "(" + foundDuplicates + ")" + fileName;
}
}
try {
if (BooksWithoutBorders.useYml) {
BookToFromTextHelper.bookToYml(savePath, fileName, book);
} else {
BookToFromTextHelper.bookToTXT(savePath, fileName, book);
}
BooksWithoutBorders.sendSuccessMessage(player, "Book Saved as \"" + fileName + "\"");
} catch (IOException e) {
e.printStackTrace();
}
}
} }

View File

@ -1,6 +1,5 @@
package net.knarcraft.bookswithoutborders.command; package net.knarcraft.bookswithoutborders.command;
import net.knarcraft.bookswithoutborders.BooksWithoutBorders;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -10,10 +9,6 @@ import org.bukkit.command.CommandSender;
*/ */
public class CommandSavePublic extends CommandSave implements CommandExecutor { public class CommandSavePublic extends CommandSave implements CommandExecutor {
public CommandSavePublic(BooksWithoutBorders booksWithoutBorders) {
super(booksWithoutBorders);
}
@Override @Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
return saveHeldBook(sender, args, true); return saveHeldBook(sender, args, true);

View File

@ -14,11 +14,7 @@ import org.bukkit.inventory.ItemStack;
*/ */
public class CommandSetBookPrice implements CommandExecutor { public class CommandSetBookPrice implements CommandExecutor {
private final BooksWithoutBorders booksWithoutBorders; private final BooksWithoutBorders booksWithoutBorders = BooksWithoutBorders.getInstance();
public CommandSetBookPrice(BooksWithoutBorders booksWithoutBorders) {
this.booksWithoutBorders = booksWithoutBorders;
}
@Override @Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {

View File

@ -16,11 +16,7 @@ import java.util.List;
*/ */
public class GiveTabCompleter implements TabCompleter { public class GiveTabCompleter implements TabCompleter {
final BooksWithoutBorders booksWithoutBorders; private final BooksWithoutBorders booksWithoutBorders = BooksWithoutBorders.getInstance();
public GiveTabCompleter(BooksWithoutBorders booksWithoutBorders) {
this.booksWithoutBorders = booksWithoutBorders;
}
@Override @Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) { public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {

View File

@ -55,7 +55,7 @@ public class PlayerEventListener implements Listener {
Player player = event.getPlayer(); Player player = event.getPlayer();
//Handle new players //Handle new players
if (!BooksWithoutBorders.booksWithoutBorders.hasPlayedBefore(player.getName())) { if (!hasPlayedBefore(player.getName())) {
boolean sendMessage = true; boolean sendMessage = true;
//Gives new players necessary books //Gives new players necessary books
@ -173,4 +173,18 @@ public class PlayerEventListener implements Listener {
return null; return null;
} }
/**
* Checks whether a given player has played on the server before
* @param playerName <p>The player to check</p>
* @return <p>True if the player has played before</p>
*/
private boolean hasPlayedBefore(String playerName) {
if (!BooksWithoutBorders.existingPlayers.contains(playerName)) {
BooksWithoutBorders.booksWithoutBorders.addExistingPlayer(playerName);
return false;
}
return true;
}
} }