Moves some settings into the BooksWithoutBordersSettings class

This commit is contained in:
2021-09-02 00:17:04 +02:00
parent 72e080f1c9
commit 996cb5da5c
19 changed files with 241 additions and 127 deletions

View File

@ -24,7 +24,6 @@ import net.knarcraft.bookswithoutborders.listener.BooksWithoutBordersListener;
import net.knarcraft.bookswithoutborders.utility.BookToFromTextHelper;
import net.knarcraft.bookswithoutborders.utility.FileHelper;
import net.milkbowl.vault.economy.Economy;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandExecutor;
@ -54,6 +53,11 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
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.BooksWithoutBordersSettings.getSuccessColor;
import static net.knarcraft.bookswithoutborders.utility.InputCleaningHelper.cleanString;
import static net.knarcraft.bookswithoutborders.utility.InputCleaningHelper.fixName;
@ -62,7 +66,6 @@ public class BooksWithoutBorders extends JavaPlugin {
//The separating string between the book title and the book author
public static String titleAuthorSeparator;
public static String loreSeparator;
public static final String SLASH = System.getProperty("file.separator");
public static List<String> firstBooks;
public static String welcomeMessage;
protected static List<String> existingPlayers;
@ -77,21 +80,17 @@ public class BooksWithoutBorders extends JavaPlugin {
public static BooksWithoutBorders bwb;
protected static BooksWithoutBordersListener bL;
public static ConsoleCommandSender consoleSender;
public static String bookFolder;
public static final ChatColor errorColor = ChatColor.RED;
public static final ChatColor successColor = ChatColor.GREEN;
public static final ChatColor commandColor = ChatColor.YELLOW;
@Override
public void onEnable() {
bwb = this;
consoleSender = this.getServer().getConsoleSender();
bookFolder = this.getDataFolder().getAbsolutePath() + SLASH + "Books" + SLASH;
bL = new BooksWithoutBordersListener();
loadList = new HashMap<>();
firstBooks = new ArrayList<>();
BooksWithoutBordersSettings.initialize(this);
if (SLASH != null && init()) {
if (getSlash() != null && init()) {
this.getServer().getPluginManager().registerEvents(bL, this);
} else {
this.getPluginLoader().disablePlugin(this);
@ -188,8 +187,8 @@ public class BooksWithoutBorders extends JavaPlugin {
this.saveConfig();
File fTest = new File(bookFolder);
File efTest = new File(bookFolder + "Encrypted" + SLASH);
File fTest = new File(getBookFolder());
File efTest = new File(getBookFolder() + "Encrypted" + getSlash());
if (!fTest.exists()) {
try {
@ -283,7 +282,7 @@ public class BooksWithoutBorders extends JavaPlugin {
}
public boolean loadExistingPlayers() {
File fTest = new File(this.getDataFolder().getAbsolutePath() + SLASH + "Existing Players.txt");
File fTest = new File(this.getDataFolder().getAbsolutePath() + getSlash() + "Existing Players.txt");
existingPlayers = new ArrayList<>();
if (!fTest.exists()) {
@ -329,7 +328,7 @@ public class BooksWithoutBorders extends JavaPlugin {
existingPlayers.add(playerName);
try {
PrintWriter pw = new PrintWriter(new FileWriter(this.getDataFolder().getAbsolutePath() + SLASH + "Existing Players.txt", true));
PrintWriter pw = new PrintWriter(new FileWriter(this.getDataFolder().getAbsolutePath() + getSlash() + "Existing Players.txt", true));
pw.println(playerName);
pw.close();
} catch (IOException e) {
@ -363,9 +362,9 @@ public class BooksWithoutBorders extends JavaPlugin {
String savePath;
if (saveToPublicFolder) {
savePath = bookFolder;
savePath = getBookFolder();
} else {
savePath = bookFolder + cleanString(player.getName()) + SLASH;
savePath = getBookFolder() + cleanString(player.getName()) + getSlash();
}
//Generate book filename
@ -403,14 +402,14 @@ public class BooksWithoutBorders extends JavaPlugin {
//Skip duplicate book
if (!fileName.contains("Untitled") && !overwrite) {
sendErrorMessage(player, "Book is already saved!");
sendErrorMessage(player, "Use " + commandColor + "/bwb Save true " + errorColor + "to overwrite!");
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 " + commandColor + "/bwb Save true " + errorColor + "to overwrite!");
sendErrorMessage(player, "Use " + getCommandColor() + "/bwb Save true " + getErrorColor() + "to overwrite!");
return;
}
@ -453,11 +452,11 @@ public class BooksWithoutBorders extends JavaPlugin {
File file;
if (dir.equalsIgnoreCase("public")) {
file = FileHelper.getBookFile(bookFolder + fileName);
file = FileHelper.getBookFile(getBookFolder() + fileName);
} else if (dir.equalsIgnoreCase("player")) {
file = FileHelper.getBookFile(bookFolder + cleanString(sender.getName()) + SLASH + fileName);
file = FileHelper.getBookFile(getBookFolder() + cleanString(sender.getName()) + getSlash() + fileName);
} else if (dir.trim().isEmpty()) {
file = FileHelper.getBookFile(bookFolder + "Encrypted" + SLASH + dir + SLASH + fileName);
file = FileHelper.getBookFile(getBookFolder() + "Encrypted" + getSlash() + dir + getSlash() + fileName);
} else {
file = null;
}
@ -586,9 +585,9 @@ public class BooksWithoutBorders extends JavaPlugin {
public List<String> listFiles(CommandSender sender, Boolean listPublic, boolean silent) {
File file;
if (listPublic) {
file = new File(bookFolder);
file = new File(getBookFolder());
} else {
file = new File(bookFolder + cleanString(sender.getName()) + SLASH);
file = new File(getBookFolder() + cleanString(sender.getName()) + getSlash());
}
return FileHelper.listFiles(sender, file, silent);
}
@ -600,7 +599,7 @@ public class BooksWithoutBorders extends JavaPlugin {
* @param message <p>The message to send</p>
*/
public static void sendSuccessMessage(CommandSender sender, String message) {
sender.sendMessage(successColor + message);
sender.sendMessage(getSuccessColor() + message);
}
/**
@ -610,7 +609,7 @@ public class BooksWithoutBorders extends JavaPlugin {
* @param message <p>The message to send</p>
*/
public static void sendErrorMessage(CommandSender sender, String message) {
sender.sendMessage(errorColor + message);
sender.sendMessage(getErrorColor() + message);
}
/**

View File

@ -0,0 +1,77 @@
package net.knarcraft.bookswithoutborders;
import org.bukkit.ChatColor;
/**
* Class for getting various settings
*/
public class BooksWithoutBordersSettings {
//Static settings
private static final ChatColor errorColor = ChatColor.RED;
private static final ChatColor successColor = ChatColor.GREEN;
private static final ChatColor commandColor = ChatColor.YELLOW;
private static final String SLASH = System.getProperty("file.separator");
private static boolean isInitialized;
public static String bookFolder;
/**
* Initializes the books without borders settings class
*
* @param booksWithoutBorders <p>The books without borders object used for getting required data</p>
*/
public static void initialize(BooksWithoutBorders booksWithoutBorders) {
if (isInitialized) {
throw new IllegalArgumentException("Settings class initialized twice. This should not happen!");
}
isInitialized = true;
bookFolder = booksWithoutBorders.getDataFolder().getAbsolutePath() + getSlash() + "Books" + getSlash();
}
/**
* Gets the folder used for storing books
*
* @return <p>The folder used for storing books</p>
*/
public static String getBookFolder() {
return bookFolder;
}
/**
* Gets the color to use for error messages
*
* @return <p>The color to use for error messages</p>
*/
public static ChatColor getErrorColor() {
return errorColor;
}
/**
* Gets the color to use for success messages
*
* @return <p>The color to use for success messages</p>
*/
public static ChatColor getSuccessColor() {
return successColor;
}
/**
* Gets the color used to color commands
*
* @return <p>The color used to color commands</p>
*/
public static ChatColor getCommandColor() {
return commandColor;
}
/**
* Gets the correct slash to use for the used OS
*
* @return <p>The slash to use for file separators</p>
*/
public static String getSlash() {
return SLASH;
}
}

View File

@ -1,8 +1,8 @@
package net.knarcraft.bookswithoutborders;
import java.util.Random;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Random;
/**
* Case-insensitive gene-based encryption
@ -23,6 +23,7 @@ public class GenenCrypt {
/**
* Instantiates a new GenenCrypt
*
* @param key <p>The key used to generate the codon table</p>
*/
public GenenCrypt(String key) {
@ -126,6 +127,7 @@ public class GenenCrypt {
/**
* Encrypts some input
*
* @param input <p>The input to encrypt</p>
* @return <p>The encrypted input</p>
*/
@ -158,6 +160,7 @@ public class GenenCrypt {
/**
* Decrypts some input
*
* @param input <p>The input to decrypt</p>
* @return <p>The decrypted input</p>
*/

View File

@ -9,10 +9,10 @@ import org.bukkit.entity.Player;
import static net.knarcraft.bookswithoutborders.BooksWithoutBorders.bookPriceQuantity;
import static net.knarcraft.bookswithoutborders.BooksWithoutBorders.bookPriceType;
import static net.knarcraft.bookswithoutborders.BooksWithoutBorders.commandColor;
import static net.knarcraft.bookswithoutborders.BooksWithoutBorders.sendErrorMessage;
import static net.knarcraft.bookswithoutborders.BooksWithoutBorders.sendSuccessMessage;
import static net.knarcraft.bookswithoutborders.BooksWithoutBorders.successColor;
import static net.knarcraft.bookswithoutborders.BooksWithoutBordersSettings.getCommandColor;
import static net.knarcraft.bookswithoutborders.BooksWithoutBordersSettings.getSuccessColor;
/**
* Command executor for the books without borders (bwb) command
@ -37,29 +37,31 @@ public class CommandBooksWithoutBorders implements CommandExecutor {
/**
* Shows all commands available to the console
*
* @param sender <p>The console which sent the command</p>
*/
private void showConsoleCommands(CommandSender sender) {
sender.sendMessage(commandColor + "Use: /bwb [Command]");
sender.sendMessage(commandColor + "[] denote parameters");
sender.sendMessage(commandColor + "Commands:");
sender.sendMessage(commandColor + "\nReload:" + successColor + " Reloads BwB's config file");
sender.sendMessage(commandColor + "givePublic [file name or number] [player name] [true/false]: " + successColor);
sender.sendMessage(getCommandColor() + "Use: /bwb [Command]");
sender.sendMessage(getCommandColor() + "[] denote parameters");
sender.sendMessage(getCommandColor() + "Commands:");
sender.sendMessage(getCommandColor() + "\nReload:" + getSuccessColor() + " Reloads BwB's config file");
sender.sendMessage(getCommandColor() + "givePublic [file name or number] [player name] [true/false]: " + getSuccessColor());
sendSuccessMessage(sender, "Gives the selected player a book from the public directory");
sendSuccessMessage(sender, "If no file is specified, a list of available files is returned");
sender.sendMessage(commandColor + "deletePublic [file name or number]: " + successColor + "Deletes the specified");
sender.sendMessage(getCommandColor() + "deletePublic [file name or number]: " + getSuccessColor() + "Deletes the specified");
sendSuccessMessage(sender, "file in the public directory");
sendSuccessMessage(sender, "If no file is specified, a list of available files is returned");
}
/**
* Shows all commands available to the sending player
*
* @param sender <p>The player which sent the command</p>
*/
private void showPlayerCommands(CommandSender sender) {
//Lists all commands
sender.sendMessage(commandColor + "Use: /bwb [Command]");
sender.sendMessage(commandColor + "[] denote parameters");
sender.sendMessage(getCommandColor() + "Use: /bwb [Command]");
sender.sendMessage(getCommandColor() + "[] denote parameters");
if (booksWithoutBorders.booksHavePrice()) {
if (bookPriceType != Material.AIR) {
@ -68,80 +70,80 @@ public class CommandBooksWithoutBorders implements CommandExecutor {
sendErrorMessage(sender, "[" + BooksWithoutBorders.eco.format(bookPriceQuantity) + " is required to create a book]");
}
}
sender.sendMessage(commandColor + "Commands:");
sender.sendMessage(getCommandColor() + "Commands:");
if (sender.hasPermission("bookswithoutborders.load")) {
sender.sendMessage(commandColor + "\nLoad [file name or number] [# of copies] [true/false]:");
sender.sendMessage(getCommandColor() + "\nLoad [file name or number] [# of copies] [true/false]:");
sendSuccessMessage(sender, "Creates a book from the specified file and gives it to the player");
sendSuccessMessage(sender, "If no file is specified, a list of available files is returned");
sendSuccessMessage(sender, "If true is specified the book will be signed, if false it will be");
sendSuccessMessage(sender, "unsigned");
}
if (sender.hasPermission("bookswithoutborders.loadPublic")) {
sender.sendMessage(commandColor + "loadPublic [file name or number] [# of copies] [true/false]:");
sender.sendMessage(getCommandColor() + "loadPublic [file name or number] [# of copies] [true/false]:");
sendSuccessMessage(sender, "Same as Load, but views files in the public directory");
}
if (sender.hasPermission("bookswithoutborders.save")) {
sender.sendMessage("\n" + commandColor + "Save [true/false]: " + successColor + "Saves the book the player is");
sender.sendMessage("\n" + getCommandColor() + "Save [true/false]: " + getSuccessColor() + "Saves the book the player is");
sendSuccessMessage(sender, "holding to a text file in a private directory");
sendSuccessMessage(sender, "If true is specified, a book of the same name by the same");
sendSuccessMessage(sender, "author will be overwritten by the new book");
}
if (sender.hasPermission("bookswithoutborders.savePublic")) {
sender.sendMessage(commandColor + "savePublic [true/false]: " + successColor + "Same as Save,");
sender.sendMessage(getCommandColor() + "savePublic [true/false]: " + getSuccessColor() + "Same as Save,");
sendSuccessMessage(sender, "but saves files in the public directory");
}
if (sender.hasPermission("bookswithoutborders.give")) {
sender.sendMessage("\n" + commandColor + "Give [file name or number] [player name] [# of copies] [true/false]:");
sender.sendMessage("\n" + getCommandColor() + "Give [file name or number] [player name] [# of copies] [true/false]:");
sendSuccessMessage(sender, "Gives the selected player a book from your personal directory");
}
if (sender.hasPermission("bookswithoutborders.givePublic")) {
sender.sendMessage(commandColor + "givePublic [file name or number] [player name] [# of copies] [true/false]:");
sender.sendMessage(getCommandColor() + "givePublic [file name or number] [player name] [# of copies] [true/false]:");
sendSuccessMessage(sender, "Same as give, but uses books from the public directory");
}
if (sender.hasPermission("bookswithoutborders.delete")) {
sender.sendMessage(commandColor + "\nDelete [file name or number]: " + successColor + "Deletes the specified");
sender.sendMessage(getCommandColor() + "\nDelete [file name or number]: " + getSuccessColor() + "Deletes the specified");
sendSuccessMessage(sender, "file in the player's directory");
sendSuccessMessage(sender, "If no file is specified, a list of available files is returned");
}
if (sender.hasPermission("bookswithoutborders.admin")) {
sender.sendMessage(commandColor + "deletePublic [file name or number]: " + successColor + "Same as Delete,");
sender.sendMessage(getCommandColor() + "deletePublic [file name or number]: " + getSuccessColor() + "Same as Delete,");
sendSuccessMessage(sender, "but deletes files in the public directory");
sender.sendMessage(commandColor + "\nReload:" + successColor + " Reloads BwB's configuration file");
sender.sendMessage(getCommandColor() + "\nReload:" + getSuccessColor() + " Reloads BwB's configuration file");
}
if (sender.hasPermission("bookswithoutborders.unsign")) {
sender.sendMessage("\n" + commandColor + "Unsign: " + successColor + "Un-signs the book the player is holding");
sender.sendMessage("\n" + getCommandColor() + "Unsign: " + getSuccessColor() + "Un-signs the book the player is holding");
}
if (sender.hasPermission("bookswithoutborders.copy")) {
sender.sendMessage("\n" + commandColor + "Copy [number of copies]: " + successColor + "Copies the book the player is holding");
sender.sendMessage("\n" + getCommandColor() + "Copy [number of copies]: " + getSuccessColor() + "Copies the book the player is holding");
}
if (sender.hasPermission("bookswithoutborders.encrypt")) {
sender.sendMessage("\n" + commandColor + "Encrypt [key] [style]: " + successColor + "Encrypts the book the player is holding");
sender.sendMessage(commandColor + "[key]" + successColor + " is required and can be any phrase or number excluding spaces");
sender.sendMessage(commandColor + "[style]" + successColor + " is not required. Possible values are \"DNA\" or \"Magic\"");
sender.sendMessage("\n" + getCommandColor() + "Encrypt [key] [style]: " + getSuccessColor() + "Encrypts the book the player is holding");
sender.sendMessage(getCommandColor() + "[key]" + getSuccessColor() + " is required and can be any phrase or number excluding spaces");
sender.sendMessage(getCommandColor() + "[style]" + getSuccessColor() + " is not required. Possible values are \"DNA\" or \"Magic\"");
}
if (sender.hasPermission("bookswithoutborders.groupEncrypt")) {
sender.sendMessage("\n" + commandColor + "groupEncrypt [group name] [key] [style]: " + successColor + "Encrypts book so that only players with the" +
"\n bookswithoutborders.decrypt." + commandColor + "[group name]" + successColor + " permission may decrypt the book by holding and left clicking the book");
sender.sendMessage("\n" + getCommandColor() + "groupEncrypt [group name] [key] [style]: " + getSuccessColor() + "Encrypts book so that only players with the" +
"\n bookswithoutborders.decrypt." + getCommandColor() + "[group name]" + getSuccessColor() + " permission may decrypt the book by holding and left clicking the book");
}
if (sender.hasPermission("bookswithoutborders.decrypt")) {
sender.sendMessage("\n" + commandColor + "Decrypt [key]: " + successColor + "Decrypts the book the player is holding");
sender.sendMessage(commandColor + "[key]" + successColor + " is required and MUST be IDENTICAL to the key used to encrypt held book");
sender.sendMessage("\n" + getCommandColor() + "Decrypt [key]: " + getSuccessColor() + "Decrypts the book the player is holding");
sender.sendMessage(getCommandColor() + "[key]" + getSuccessColor() + " is required and MUST be IDENTICAL to the key used to encrypt held book");
}
if (sender.hasPermission("bookswithoutborders.setTitle")) {
sender.sendMessage("\n" + commandColor + "setTitle [title]: " + successColor + "Sets the title of the book/item the player is holding");
sender.sendMessage("\n" + getCommandColor() + "setTitle [title]: " + getSuccessColor() + "Sets the title of the book/item the player is holding");
}
if (sender.hasPermission("bookswithoutborders.setAuthor")) {
sender.sendMessage("\n" + commandColor + "setAuthor [author]: " + successColor + "Sets the author of the book the player is holding");
sender.sendMessage("\n" + getCommandColor() + "setAuthor [author]: " + getSuccessColor() + "Sets the author of the book the player is holding");
}
if (sender.hasPermission("bookswithoutborders.setLore")) {
sender.sendMessage("\n" + commandColor + "setLore [lore]: " + successColor + "Sets the lore of the item the player is holding");
sender.sendMessage("\n" + getCommandColor() + "setLore [lore]: " + getSuccessColor() + "Sets the lore of the item the player is holding");
sendSuccessMessage(sender, "Insert the lore_line_separator character to force a new line\n[\"~\" by default]");
}
if (sender.hasPermission("bookswithoutborders.setBookPrice")) {
sender.sendMessage("\n" + commandColor + "setBookPrice [Item/Eco] [quantity]: " + successColor + "Sets the per-book-price to create a book via commands." +
sender.sendMessage("\n" + getCommandColor() + "setBookPrice [Item/Eco] [quantity]: " + getSuccessColor() + "Sets the per-book-price to create a book via commands." +
"\nIf [Item], the item in the player's hand in the amount of [quantity] will be the price.\nIf [Eco], a Vault based economy will be used for price." +
"\nIf neither [Item/Eco] or [quantity] are specified the current price to create books will be removed.");
}

View File

@ -12,6 +12,9 @@ import org.bukkit.inventory.meta.BookMeta;
import java.io.File;
import static net.knarcraft.bookswithoutborders.BooksWithoutBordersSettings.getBookFolder;
import static net.knarcraft.bookswithoutborders.BooksWithoutBordersSettings.getSlash;
/**
* Command executor for the decrypt command
*/
@ -39,7 +42,7 @@ public class CommandDecrypt implements CommandExecutor {
//Warning: admin decrypt only allows decrypting files created by the same player. Not sure if intended
if (args.length == 0 && BooksWithoutBorders.adminDecrypt && player.hasPermission("bookswithoutborders.admin")) {
String path = BooksWithoutBorders.bookFolder + "Encrypted" + BooksWithoutBorders.SLASH;
String path = getBookFolder() + "Encrypted" + getSlash();
String fileName;
if (bookMetadata.hasTitle()) {
fileName = bookMetadata.getTitle() + BooksWithoutBorders.titleAuthorSeparator + bookMetadata.getAuthor();

View File

@ -10,6 +10,9 @@ import org.bukkit.entity.Player;
import java.io.File;
import static net.knarcraft.bookswithoutborders.BooksWithoutBordersSettings.getBookFolder;
import static net.knarcraft.bookswithoutborders.BooksWithoutBordersSettings.getSlash;
/**
* Command executor for the delete command
*/
@ -33,8 +36,9 @@ public class CommandDelete implements CommandExecutor {
/**
* Deletes a book
* @param sender <p>The sender trying to delete the book</p>
* @param args <p>The arguments given</p>
*
* @param sender <p>The sender trying to delete the book</p>
* @param args <p>The arguments given</p>
* @param deletePublic <p>Whether to delete a public book</p>
* @return <p>True if the book was deleted successfully</p>
*/
@ -84,10 +88,10 @@ public class CommandDelete implements CommandExecutor {
//Get the file to be deleted
File file;
if (isPublic) {
file = FileHelper.getBookFile(BooksWithoutBorders.bookFolder + fileName);
file = FileHelper.getBookFile(getBookFolder() + fileName);
} else {
file = FileHelper.getBookFile(BooksWithoutBorders.bookFolder +
InputCleaningHelper.cleanString(sender.getName()) + BooksWithoutBorders.SLASH + fileName);
file = FileHelper.getBookFile(getBookFolder() +
InputCleaningHelper.cleanString(sender.getName()) + getSlash() + fileName);
}
//Send message if no such file could be found

View File

@ -28,9 +28,10 @@ public class CommandEncrypt implements CommandExecutor {
/**
* Performs necessary pre-checks before going through with the encryption
* @param sender <p>The sender trying to encrypt a book</p>
* @param args <p>The arguments given</p>
* @param necessaryArguments <p>How many arguments is the minimum requirement</p>
*
* @param sender <p>The sender trying to encrypt a book</p>
* @param args <p>The arguments given</p>
* @param necessaryArguments <p>How many arguments is the minimum requirement</p>
* @param missingArgumentsError <p>The error to show if a required argument is missing</p>
* @return <p>The metadata of the book to encrypt, or null if any checks fail</p>
*/
@ -71,10 +72,11 @@ public class CommandEncrypt implements CommandExecutor {
/**
* Encrypts the given book
*
* @param encryptionStyle <p>The encryption style to use</p>
* @param player <p>The player encrypting the book</p>
* @param key <p>The encryption key to use</p>
* @param group <p>The group to encrypt for</p>
* @param player <p>The player encrypting the book</p>
* @param key <p>The encryption key to use</p>
* @param group <p>The group to encrypt for</p>
* @return <p>True if the book was encrypted successfully</p>
*/
boolean encryptBook(EncryptionStyle encryptionStyle, Player player, String key, String group) {

View File

@ -60,7 +60,8 @@ public class CommandGive implements CommandExecutor {
try {
Integer.parseInt(bookIdentifier);
BooksWithoutBorders.loadList.put(sender.getName(), booksWithoutBorders.listFiles(sender, givePublic, true));
} catch (NumberFormatException ignored) {}
} catch (NumberFormatException ignored) {
}
Player receivingPlayer = booksWithoutBorders.getServer().getPlayer(receivingPlayerName);
if (receivingPlayer == null) {

View File

@ -26,9 +26,10 @@ public class CommandLoad implements CommandExecutor {
/**
* Loads a stored book
* @param sender <p>The sender asking to load the book</p>
* @param args <p>The arguments given</p>
* @param directory <p>The directory to load from (public/player)</p>
*
* @param sender <p>The sender asking to load the book</p>
* @param args <p>The arguments given</p>
* @param directory <p>The directory to load from (public/player)</p>
* @param loadPublic <p>Whether to list public files as loadable</p>
* @return <p>True if the book was loaded successfully</p>
*/
@ -70,7 +71,8 @@ public class CommandLoad implements CommandExecutor {
try {
Integer.parseInt(bookIdentifier);
BooksWithoutBorders.loadList.put(player.getName(), booksWithoutBorders.listFiles(player, loadPublic, true));
} catch (NumberFormatException ignored) {}
} catch (NumberFormatException ignored) {
}
String bookToLoad = InputCleaningHelper.cleanString(bookIdentifier);
try {

View File

@ -27,8 +27,9 @@ public class CommandSave implements CommandExecutor {
/**
* Saves the player's held book if it exists
* @param sender <p>The sender of the command</p>
* @param args <p>The arguments given</p>
*
* @param sender <p>The sender of the command</p>
* @param args <p>The arguments given</p>
* @param savePublic <p>Whether to save the book in the public directory or the player directory</p>
* @return <p>True if a book was saved successfully</p>
*/

View File

@ -36,7 +36,7 @@ public class CommandSetBookPrice implements CommandExecutor {
//Warn about invalid argument
if (!args[0].equalsIgnoreCase("Item") && !args[0].equalsIgnoreCase("Eco")) {
BooksWithoutBorders. sendErrorMessage(sender, "Price type must be \"Item\" or \"Eco\"!");
BooksWithoutBorders.sendErrorMessage(sender, "Price type must be \"Item\" or \"Eco\"!");
return false;
}
@ -60,6 +60,7 @@ public class CommandSetBookPrice implements CommandExecutor {
/**
* Removes the book price
*
* @param sender <p>The sender of the command</p>
*/
private void clearItemPrice(CommandSender sender) {
@ -74,8 +75,9 @@ public class CommandSetBookPrice implements CommandExecutor {
/**
* Sets the book price to use items, and updates book price
*
* @param sender <p>The sender of the command</p>
* @param price <p>The new price</p>
* @param price <p>The new price</p>
* @return <p>True if the price was changed successfully</p>
*/
private boolean setItemPrice(CommandSender sender, double price) {
@ -105,8 +107,9 @@ public class CommandSetBookPrice implements CommandExecutor {
/**
* Sets the book price to use economy, and updates book price
*
* @param sender <p>The sender of the command</p>
* @param price <p>The new price</p>
* @param price <p>The new price</p>
* @return <p>True if the price was changed successfully</p>
*/
private boolean setEconomyPrice(CommandSender sender, double price) {

View File

@ -1,9 +1,5 @@
package net.knarcraft.bookswithoutborders.listener;
import java.io.File;
import java.util.List;
import java.util.Objects;
import net.knarcraft.bookswithoutborders.BooksWithoutBorders;
import net.knarcraft.bookswithoutborders.state.EncryptionStyle;
import net.knarcraft.bookswithoutborders.utility.EncryptionHelper;
@ -28,14 +24,19 @@ import org.bukkit.inventory.PlayerInventory;
import org.bukkit.inventory.meta.BookMeta;
import org.bukkit.inventory.meta.ItemMeta;
import java.io.File;
import java.util.List;
import java.util.Objects;
import static net.knarcraft.bookswithoutborders.BooksWithoutBordersSettings.getBookFolder;
import static net.knarcraft.bookswithoutborders.BooksWithoutBordersSettings.getSlash;
/**
* A listener for relevant events
*/
public class BooksWithoutBordersListener implements Listener {
private final String slash = BooksWithoutBorders.SLASH;
private final String bookFolderPath = BooksWithoutBorders.bwb.getDataFolder().getAbsolutePath() + slash + "Books";
private final String bookFolder = bookFolderPath + slash;
private final String slash = getSlash();
/**
* Updates old books to a newer format
@ -63,10 +64,10 @@ public class BooksWithoutBordersListener implements Listener {
String cleanPlayerName = InputCleaningHelper.cleanString(player.getName());
String[] possiblePaths = new String[]{
bookFolder + fileName + ".yml",
bookFolder + fileName + ".txt",
bookFolder + cleanPlayerName + slash + fileName + ".yml",
bookFolder + cleanPlayerName + slash + fileName + ".txt"
getBookFolder() + fileName + ".yml",
getBookFolder() + fileName + ".txt",
getBookFolder() + cleanPlayerName + slash + fileName + ".yml",
getBookFolder() + cleanPlayerName + slash + fileName + ".txt"
};
for (String path : possiblePaths) {
@ -231,7 +232,7 @@ public class BooksWithoutBordersListener implements Listener {
}
//Tests if a full file name has been supplied and points to an actual file
String signFile = bookFolder + lines[2] + lines[3];
String signFile = getBookFolder() + lines[2] + lines[3];
if (FileHelper.bookFileExists(signFile)) {
markGiveSignValidity(event, true);
} else {
@ -252,7 +253,7 @@ public class BooksWithoutBordersListener implements Listener {
* @return <p>True if the number is a book index</p>
*/
private boolean isBookListIndex(String possibleIndex) {
File bookDirectory = new File(bookFolderPath);
File bookDirectory = new File(getBookFolder().replaceAll("[\\\\/]$", ""));
try {
//Tests if a load list number has been supplied
@ -363,9 +364,9 @@ public class BooksWithoutBordersListener implements Listener {
String encryptionFile = InputCleaningHelper.cleanString(groupName) + slash + fileName + ".yml";
File file = new File(bookFolder + "Encrypted" + slash + encryptionFile);
File file = new File(getBookFolder() + "Encrypted" + slash + encryptionFile);
if (!file.isFile()) {
file = new File(bookFolder + fileName + ".txt");
file = new File(getBookFolder() + fileName + ".txt");
if (!file.isFile()) {
return;
}

View File

@ -15,6 +15,7 @@ public enum EncryptionStyle {
/**
* Gets an encryption style given its name
*
* @param name <p>The name of the encryption style</p>
* @return <p>An encryption style or null if no match is found</p>
*/

View File

@ -37,7 +37,8 @@ public class BookFormatter {
/**
* Splits the last page if it overflows
* @param rawPages <p>The raw pages to format</p>
*
* @param rawPages <p>The raw pages to format</p>
* @param maxPageText <p>The max number of characters which fit on a page</p>
* @param fitsNewline <p>The max number of characters on a page which still fits a newline character</p>
*/
@ -65,7 +66,8 @@ public class BookFormatter {
/**
* Combines the two last pages if they can fit on the same page
* @param rawPages <p>The raw pages to format</p>
*
* @param rawPages <p>The raw pages to format</p>
* @param maxPageText <p>The max number of characters which fit on a page</p>
*/
public static void formatLastPageCombinePages(List<String> rawPages, int maxPageText) {
@ -79,7 +81,8 @@ public class BookFormatter {
/**
* Adds newline if the contents of the last page does not exceed page limit and is non-empty
* @param rawPages <p>The raw pages to format</p>
*
* @param rawPages <p>The raw pages to format</p>
* @param fitsNewline <p>The max number of characters on a page which still fits a newline character</p>
*/
public static void formatLastPageAddNewline(List<String> rawPages, int fitsNewline) {

View File

@ -21,12 +21,14 @@ import static net.knarcraft.bookswithoutborders.utility.InputCleaningHelper.fixN
*/
public final class BookToFromTextHelper {
private BookToFromTextHelper() {}
private BookToFromTextHelper() {
}
/**
* Saves a book's contents to a .yml file
* @param path <p>The path of the folder to save to. Must end with a slash</p>
* @param fileName <p>The name of the file to load to</p>
*
* @param path <p>The path of the folder to save to. Must end with a slash</p>
* @param fileName <p>The name of the file to load to</p>
* @param bookMetadata <p>Metadata about the book to save</p>
* @throws IOException <p>If unable to save the book</p>
*/
@ -51,7 +53,8 @@ public final class BookToFromTextHelper {
/**
* Loads a book from a .yml file
* @param file <p>The path of the file to load</p>
*
* @param file <p>The path of the file to load</p>
* @param bookMetadata <p>Metadata which will be altered with the book's contents</p>
* @return <p>Metadata for the loaded book</p>
*/
@ -77,8 +80,9 @@ public final class BookToFromTextHelper {
/**
* Saves a book's contents to a text file
* @param folderPath <p>The folder path to save to. Must end with a slash</p>
* @param fileName <p>The name of the file to save to</p>
*
* @param folderPath <p>The folder path to save to. Must end with a slash</p>
* @param fileName <p>The name of the file to save to</p>
* @param bookMetadata <p>Metadata about the book to save</p>
* @throws IOException <p>If unable to save the book</p>
*/
@ -96,8 +100,9 @@ public final class BookToFromTextHelper {
/**
* Loads a book from a text file
* @param fileName <p>The name of the file to load. Used to create author and title</p>
* @param file <p>The file to load</p>
*
* @param fileName <p>The name of the file to load. Used to create author and title</p>
* @param file <p>The file to load</p>
* @param bookMetadata <p>Metadata which will be altered with the book's contents</p>
* @return <p>Metadata for the loaded book</p>
*/

View File

@ -1,9 +1,9 @@
package net.knarcraft.bookswithoutborders.utility;
import net.knarcraft.bookswithoutborders.BooksWithoutBorders;
import net.knarcraft.bookswithoutborders.state.EncryptionStyle;
import net.knarcraft.bookswithoutborders.GenenCrypt;
import net.knarcraft.bookswithoutborders.SubstitutionCipher;
import net.knarcraft.bookswithoutborders.state.EncryptionStyle;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
@ -15,6 +15,8 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import static net.knarcraft.bookswithoutborders.BooksWithoutBordersSettings.getBookFolder;
import static net.knarcraft.bookswithoutborders.BooksWithoutBordersSettings.getSlash;
import static net.knarcraft.bookswithoutborders.utility.InputCleaningHelper.cleanString;
import static net.knarcraft.bookswithoutborders.utility.InputCleaningHelper.fixName;
@ -22,6 +24,7 @@ public class EncryptionHelper {
/**
* Transforms a string key/password into its numerical values
*
* @param key <p>The key to transform</p>
* @return <p>The numbers representing the key's characters</p>
*/
@ -35,10 +38,11 @@ public class EncryptionHelper {
/**
* Encrypts the pages of a book
* @param book <p>The book to encrypt</p>
* @param style <p>The encryption style to use</p>
*
* @param book <p>The book to encrypt</p>
* @param style <p>The encryption style to use</p>
* @param integerKey <p>The encryption key to use</p>
* @param player <p>The player trying to encrypt a book</p>
* @param player <p>The player trying to encrypt a book</p>
* @return <p>The pages of the book in encrypted form</p>
*/
public static List<String> encryptBookPages(BookMeta book, EncryptionStyle style, String integerKey, Player player) {
@ -180,7 +184,7 @@ public class EncryptionHelper {
public static ItemStack loadEncryptedBook(Player player, String key, boolean deleteEncryptedFile) {
ItemStack heldBook = InventoryHelper.getHeldBook(player, true);
BookMeta bookMetadata = (BookMeta) heldBook.getItemMeta();
String path = BooksWithoutBorders.bookFolder + "Encrypted" + BooksWithoutBorders.SLASH;
String path = getBookFolder() + "Encrypted" + getSlash();
if (bookMetadata == null) {
return null;
@ -236,7 +240,7 @@ public class EncryptionHelper {
* @return <p>The new encrypted metadata for the book, or null if encryption failed</p>
*/
protected static BookMeta saveEncryptedBookForGroup(Player player, BookMeta bookMetadata, String groupName) {
String path = BooksWithoutBorders.bookFolder + "Encrypted" + BooksWithoutBorders.SLASH + cleanString(groupName) + BooksWithoutBorders.SLASH;
String path = getBookFolder() + "Encrypted" + getSlash() + cleanString(groupName) + getSlash();
File dirTest = new File(path);
//Creates group dir
if (!dirTest.exists()) {
@ -291,7 +295,7 @@ public class EncryptionHelper {
* @return <p>The new encrypted metadata for the book, or null if encryption failed</p>
*/
protected static Boolean saveEncryptedBook(Player player, BookMeta bookMetaData, String key) {
String path = BooksWithoutBorders.bookFolder + "Encrypted" + BooksWithoutBorders.SLASH;
String path = getBookFolder() + "Encrypted" + getSlash();
String fileName = (!bookMetaData.hasTitle()) ? "Untitled," + player.getName() :
bookMetaData.getTitle() + BooksWithoutBorders.titleAuthorSeparator + bookMetaData.getAuthor();

View File

@ -1,7 +1,7 @@
package net.knarcraft.bookswithoutborders.utility;
import net.knarcraft.bookswithoutborders.state.BookHoldingState;
import net.knarcraft.bookswithoutborders.BooksWithoutBorders;
import net.knarcraft.bookswithoutborders.state.BookHoldingState;
import net.knarcraft.bookswithoutborders.state.ItemSlot;
import org.bukkit.Material;
import org.bukkit.entity.Player;
@ -50,6 +50,7 @@ public class InventoryHelper {
/**
* Performs checks to validate that a player contains exactly one written book
*
* @param player <p>The player to validate</p>
* @param noBookMessage <p>The message to display if the player is not holding a book</p>
* @param twoBooksMessage <p>The message to display if the player is holding one book in each hand</p>
@ -74,15 +75,16 @@ public class InventoryHelper {
/**
* Gets the slot of the player's held book
* @param player <p>The player holding the book</p>
*
* @param player <p>The player holding the book</p>
* @param handMatters <p>Whether the differentiation between the main hand and the off hand is relevant</p>
* @param mainHand <p>Whether to search the player's main hand or off hand, if it's relevant</p>
* @param mainHand <p>Whether to search the player's main hand or off hand, if it's relevant</p>
* @param typeMatters <p>Whether the differentiation between signed and unsigned books is relevant</p>
* @param writtenBook <p>Whether to search for written or unwritten books, if it's relevant</p>
* @return <p>The slot of the player's held book</p>
*/
public static ItemSlot getHeldSlotBook(Player player, boolean handMatters, boolean mainHand,
boolean typeMatters, boolean writtenBook) {
boolean typeMatters, boolean writtenBook) {
BookHoldingState state = getBookHoldingState(player);
ItemStack mainHandItem = getHeldItem(player, true);
ItemStack offHandItem = getHeldItem(player, false);
@ -118,7 +120,7 @@ public class InventoryHelper {
return ItemSlot.MAIN_HAND;
} else if ((writtenBook && (state == BookHoldingState.SIGNED_OFF_HAND ||
state == BookHoldingState.UNSIGNED_MAIN_HAND_SIGNED_OFF_HAND)) || (!writtenBook && (
state == BookHoldingState.UNSIGNED_OFF_HAND) ||
state == BookHoldingState.UNSIGNED_OFF_HAND) ||
state == BookHoldingState.SIGNED_MAIN_HAND_UNSIGNED_OFF_HAND)) {
return ItemSlot.OFF_HAND;
}
@ -134,6 +136,7 @@ public class InventoryHelper {
/**
* Gets the state of the player's book holding from all possible states
*
* @param player <p>The player to check</p>
* @return <p>The state of the player's book holding</p>
*/