diff --git a/src/main/java/net/knarcraft/bookswithoutborders/command/CommandBooksWithoutBorders.java b/src/main/java/net/knarcraft/bookswithoutborders/command/CommandBooksWithoutBorders.java index 10aad8b..9304834 100644 --- a/src/main/java/net/knarcraft/bookswithoutborders/command/CommandBooksWithoutBorders.java +++ b/src/main/java/net/knarcraft/bookswithoutborders/command/CommandBooksWithoutBorders.java @@ -145,7 +145,7 @@ public class CommandBooksWithoutBorders implements TabExecutor { PluginCommand pluginCommand = BooksWithoutBorders.getInstance().getCommand(bwBCommand.toString()); if (pluginCommand == null) { BooksWithoutBorders.log(Level.SEVERE, StringFormatter.replacePlaceholder( - StaticMessage.COMMAND_NOT_REGISTERED.toString(), "{command}", bwBCommand.toString())); + StaticMessage.EXCEPTION_COMMAND_NOT_REGISTERED.toString(), "{command}", bwBCommand.toString())); return ""; } diff --git a/src/main/java/net/knarcraft/bookswithoutborders/command/CommandSetLore.java b/src/main/java/net/knarcraft/bookswithoutborders/command/CommandSetLore.java index 515f679..af85088 100644 --- a/src/main/java/net/knarcraft/bookswithoutborders/command/CommandSetLore.java +++ b/src/main/java/net/knarcraft/bookswithoutborders/command/CommandSetLore.java @@ -40,7 +40,7 @@ public class CommandSetLore implements TabExecutor { ItemStack heldItem = InventoryHelper.getHeldItem(player, true); if (heldItem.getType() == Material.AIR) { - stringFormatter.displayErrorMessage(player, Translatable.ERROR_LORE_NO_ITEM); + stringFormatter.displayErrorMessage(player, Translatable.ERROR_NO_ITEM); return false; } diff --git a/src/main/java/net/knarcraft/bookswithoutborders/command/CommandSetTitle.java b/src/main/java/net/knarcraft/bookswithoutborders/command/CommandSetTitle.java index 23b5300..96ea871 100644 --- a/src/main/java/net/knarcraft/bookswithoutborders/command/CommandSetTitle.java +++ b/src/main/java/net/knarcraft/bookswithoutborders/command/CommandSetTitle.java @@ -40,7 +40,7 @@ public class CommandSetTitle implements TabExecutor { ItemStack heldItem = InventoryHelper.getHeldItem(player, true); if (heldItem.getType() == Material.AIR) { - BooksWithoutBorders.sendErrorMessage(sender, "You must be holding an item to set title!"); + stringFormatter.displayErrorMessage(sender, Translatable.ERROR_NO_ITEM); return false; } @@ -49,7 +49,7 @@ public class CommandSetTitle implements TabExecutor { ItemMeta itemMetadata = heldItem.getItemMeta(); if (itemMetadata == null) { - BooksWithoutBorders.sendErrorMessage(sender, "Unable to get metadata for your held item!"); + stringFormatter.displayErrorMessage(sender, Translatable.ERROR_METADATA_MISSING); return false; } @@ -57,7 +57,7 @@ public class CommandSetTitle implements TabExecutor { ItemMeta newMetaData; if (heldItem.getType() == Material.WRITTEN_BOOK) { if (title.length() > 32) { - BooksWithoutBorders.sendErrorMessage(sender, "Book titles are capped at 32 characters!"); + stringFormatter.displayErrorMessage(sender, Translatable.ERROR_TITLE_LENGTH); return false; } BookMeta bookMetadata = (BookMeta) itemMetadata; @@ -70,7 +70,8 @@ public class CommandSetTitle implements TabExecutor { //Set the new metadata heldItem.setItemMeta(newMetaData); - BooksWithoutBorders.sendSuccessMessage(sender, "Title set to " + title + "!"); + stringFormatter.displaySuccessMessage(sender, + stringFormatter.replacePlaceholder(Translatable.SUCCESS_TITLE_SET, "{title}", title)); return true; } diff --git a/src/main/java/net/knarcraft/bookswithoutborders/command/CommandUnSign.java b/src/main/java/net/knarcraft/bookswithoutborders/command/CommandUnSign.java index 4223310..60d75b8 100644 --- a/src/main/java/net/knarcraft/bookswithoutborders/command/CommandUnSign.java +++ b/src/main/java/net/knarcraft/bookswithoutborders/command/CommandUnSign.java @@ -1,9 +1,12 @@ package net.knarcraft.bookswithoutborders.command; import net.knarcraft.bookswithoutborders.BooksWithoutBorders; +import net.knarcraft.bookswithoutborders.config.Permission; +import net.knarcraft.bookswithoutborders.config.translation.Translatable; import net.knarcraft.bookswithoutborders.state.ItemSlot; import net.knarcraft.bookswithoutborders.utility.BookHelper; import net.knarcraft.bookswithoutborders.utility.InventoryHelper; +import net.knarcraft.knarlib.formatting.StringFormatter; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.TabExecutor; @@ -24,13 +27,17 @@ public class CommandUnSign implements TabExecutor { @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] arguments) { + StringFormatter stringFormatter = BooksWithoutBorders.getStringFormatter(); if (!(sender instanceof Player player)) { - BooksWithoutBorders.sendErrorMessage(sender, "This command can only be used by a player!"); + stringFormatter.displayErrorMessage(sender, Translatable.ERROR_PLAYER_ONLY); return false; } - if (InventoryHelper.notHoldingOneWrittenBookCheck(player, "You must be holding a signed book to unsign it!", - "You cannot unsign two books at once. Please un-equip one of the books you're holding!")) { + if (InventoryHelper.notHoldingOneWrittenBookCheck(player, + stringFormatter.replacePlaceholder(Translatable.ERROR_NOT_HOLDING_WRITTEN_BOOK, "{action}", + stringFormatter.getUnFormattedColoredMessage(Translatable.ACTION_UNSIGN)), + stringFormatter.replacePlaceholder(Translatable.ERROR_ONLY_ONE_BOOK, "{action}", + stringFormatter.getUnFormattedColoredMessage(Translatable.ACTION_UNSIGN)))) { return false; } @@ -50,14 +57,14 @@ public class CommandUnSign implements TabExecutor { //Get the old book BookMeta oldMetadata = InventoryHelper.getHeldBookMetadata(player, mainHand); if (oldMetadata == null) { - BooksWithoutBorders.sendErrorMessage(player, "Unable to get metadata from the held book!"); + BooksWithoutBorders.getStringFormatter().displayErrorMessage(player, Translatable.ERROR_METADATA_MISSING); return; } ItemStack heldBook = InventoryHelper.getHeldBook(player, mainHand); //Only allow the owner to un-sign the book if (BooksWithoutBorders.getConfiguration().getAuthorOnlyUnsign() && - !player.hasPermission("bookswithoutborders.bypassAuthorOnlyUnsign")) { + !player.hasPermission(Permission.AUTHOR_ONLY_UNSIGN.toString())) { if (BookHelper.isNotAuthor(player, Objects.requireNonNull(oldMetadata))) { return; } diff --git a/src/main/java/net/knarcraft/bookswithoutborders/config/Permission.java b/src/main/java/net/knarcraft/bookswithoutborders/config/Permission.java index 26daacd..b56860d 100644 --- a/src/main/java/net/knarcraft/bookswithoutborders/config/Permission.java +++ b/src/main/java/net/knarcraft/bookswithoutborders/config/Permission.java @@ -37,6 +37,10 @@ public enum Permission { */ BYPASS_AUTHOR_ONLY_SAVE("bypassAuthorOnlySave"), + /** + * The permission for bypassing author only un-signing + */ + AUTHOR_ONLY_UNSIGN("bypassAuthorOnlyUnsign"), ; private final @NotNull String node; diff --git a/src/main/java/net/knarcraft/bookswithoutborders/config/StaticMessage.java b/src/main/java/net/knarcraft/bookswithoutborders/config/StaticMessage.java index ceb0645..7e06c4b 100644 --- a/src/main/java/net/knarcraft/bookswithoutborders/config/StaticMessage.java +++ b/src/main/java/net/knarcraft/bookswithoutborders/config/StaticMessage.java @@ -9,7 +9,7 @@ public enum StaticMessage { BOOK_SAVING_FAILED("Saving failed! Aborting..."), BOOK_FOLDER_CREATE_FAILED("Unable to create necessary folders"), - COMMAND_NOT_REGISTERED("Command {command} has not been registered!"), + EXCEPTION_COMMAND_NOT_REGISTERED("Command {command} has not been registered!"), EXCEPTION_VAULT_NOT_AVAILABLE("Vault is unavailable, but book price is set to economy. Unsetting book cost!"), EXCEPTION_VAULT_PRICE_NOT_CHANGED("BooksWithoutBorders failed to hook into Vault! Book price not set!"), EXCEPTION_ENCRYPTED_FILE_DELETE_FAILED("Book encryption data failed to delete upon decryption!\nFile location: {path}"), @@ -17,6 +17,14 @@ public enum StaticMessage { EXCEPTION_SAVE_BOOK_FAILED("Unable to save book"), EXCEPTION_BOOKSHELF_SAVING_FAILED("Unable to save bookshelves!"), NOTICE_NO_BOOKSHELVES("BooksWithoutBorders found no bookshelves to load"), + EXCEPTION_BOOKSHELF_NAME_EMPTY("Bookshelves cannot have empty titles!"), + DEBUG_AES_INVALID_KEY("Invalid AES key given!"), + DEBUG_AES_INVALID_PARAMETERS("Invalid AES parameters given!"), + DEBUG_AES_INVALID_BLOCK_SIZE("Invalid AES block size during finalization"), + DEBUG_AES_INVALID_PADDING_FINALIZATION("Invalid AES padding during finalization"), + DEBUG_AES_INVALID_ALGORITHM("Invalid AES algorithm"), + DEBUG_AES_INVALID_PADDING_CIPHER("Invalid AES padding during Cipher generation"), + DEBUG_AES_INVALID_KEY_SPECIFICATION("Invalid AES key specification"), ; private final @NotNull String messageString; diff --git a/src/main/java/net/knarcraft/bookswithoutborders/config/translation/BookshelfMessage.java b/src/main/java/net/knarcraft/bookswithoutborders/config/translation/BookshelfMessage.java index dca1a0f..d71b57d 100644 --- a/src/main/java/net/knarcraft/bookswithoutborders/config/translation/BookshelfMessage.java +++ b/src/main/java/net/knarcraft/bookswithoutborders/config/translation/BookshelfMessage.java @@ -41,7 +41,7 @@ public enum BookshelfMessage implements TranslatableMessage { @Override public @NotNull TranslatableMessage[] getAllMessages() { - return Translatable.values(); + return BookshelfMessage.values(); } } diff --git a/src/main/java/net/knarcraft/bookswithoutborders/config/translation/CostMessage.java b/src/main/java/net/knarcraft/bookswithoutborders/config/translation/CostMessage.java index 3e7878c..fe8644f 100644 --- a/src/main/java/net/knarcraft/bookswithoutborders/config/translation/CostMessage.java +++ b/src/main/java/net/knarcraft/bookswithoutborders/config/translation/CostMessage.java @@ -51,7 +51,7 @@ public enum CostMessage implements TranslatableMessage { @Override public @NotNull TranslatableMessage[] getAllMessages() { - return Translatable.values(); + return CostMessage.values(); } } diff --git a/src/main/java/net/knarcraft/bookswithoutborders/config/translation/Formatting.java b/src/main/java/net/knarcraft/bookswithoutborders/config/translation/Formatting.java index 63c82c3..877c13c 100644 --- a/src/main/java/net/knarcraft/bookswithoutborders/config/translation/Formatting.java +++ b/src/main/java/net/knarcraft/bookswithoutborders/config/translation/Formatting.java @@ -67,11 +67,91 @@ public enum Formatting implements TranslatableMessage { * The format used when formatting text on a title page */ NEUTRAL_TITLE_PAGE_TEXT_FORMAT, + + /** + * The format used when showing the header for public books by a specific author + */ + NEUTRAL_AUTHOR_PUBLIC_BOOKS_HEADER, + + /** + * The format used when showing the header for player books by a specific author + */ + NEUTRAL_AUTHOR_PLAYER_BOOKS_HEADER, + + /** + * The format used when showing the hover action for selecting a book by its path + */ + NEUTRAL_AUTHOR_BOOKS_PATH, + + /** + * The format used when displaying an empty author books page + */ + NEUTRAL_AUTHOR_BOOKS_INVALID_PAGE, + + /** + * The format used when showing current ant total pages in the book list + */ + NEUTRAL_BOOK_LIST_TOTAL_PAGES, + + /** + * The format used when showing the previous button in the book list + */ + NEUTRAL_BOOK_LIST_PREVIOUS_PAGE, + + /** + * The format used when showing the next button in the book list + */ + NEUTRAL_BOOK_LIST_NEXT_PAGE, + + /** + * The separator between book and author in the book list + */ + NEUTRAL_BOOK_LIST_AUTHOR_SEPARATOR, + + /** + * The format used when showing the page a link goes to in the book list + */ + NEUTRAL_BOOK_LIST_TO_PAGE, + + /** + * The format used when showing the hover hint on the book index + */ + NEUTRAL_BOOK_LIST_INDEX_HOVER, + + /** + * The format used when showing the header of the public book list + */ + NEUTRAL_BOOK_LIST_PUBLIC_BOOKS_HEADER, + + /** + * The format used when showing the header of the player book list + */ + NEUTRAL_BOOK_LIST_PLAYER_BOOKS_HEADER, + + /** + * The format used when showing the books by hover text + */ + NEUTRAL_BOOK_LIST_AUTHOR_HOVER, + + /** + * The format used when showing the book path hover text + */ + NEUTRAL_BOOK_LIST_PATH_HOVER, + + /** + * The format used when showing the book list select by index hover text + */ + NEUTRAL_BOOK_LIST_BOOK_INDEX_HOVER, + + /** + * The format used when showing book int index in the book list + */ + NEUTRAL_BOOK_LIST_BOOK_INDEX_NUMBER, ; @Override public @NotNull TranslatableMessage[] getAllMessages() { - return Translatable.values(); + return Formatting.values(); } } diff --git a/src/main/java/net/knarcraft/bookswithoutborders/config/translation/GiveMessage.java b/src/main/java/net/knarcraft/bookswithoutborders/config/translation/GiveMessage.java index 61e39e5..e49ca41 100644 --- a/src/main/java/net/knarcraft/bookswithoutborders/config/translation/GiveMessage.java +++ b/src/main/java/net/knarcraft/bookswithoutborders/config/translation/GiveMessage.java @@ -41,7 +41,7 @@ public enum GiveMessage implements TranslatableMessage { @Override public @NotNull TranslatableMessage[] getAllMessages() { - return Translatable.values(); + return GiveMessage.values(); } } diff --git a/src/main/java/net/knarcraft/bookswithoutborders/config/translation/SaveMessage.java b/src/main/java/net/knarcraft/bookswithoutborders/config/translation/SaveMessage.java index de72ca9..dc704e0 100644 --- a/src/main/java/net/knarcraft/bookswithoutborders/config/translation/SaveMessage.java +++ b/src/main/java/net/knarcraft/bookswithoutborders/config/translation/SaveMessage.java @@ -41,7 +41,7 @@ public enum SaveMessage implements TranslatableMessage { @Override public @NotNull TranslatableMessage[] getAllMessages() { - return Translatable.values(); + return SaveMessage.values(); } } diff --git a/src/main/java/net/knarcraft/bookswithoutborders/config/translation/Translatable.java b/src/main/java/net/knarcraft/bookswithoutborders/config/translation/Translatable.java index 34300a2..91d5178 100644 --- a/src/main/java/net/knarcraft/bookswithoutborders/config/translation/Translatable.java +++ b/src/main/java/net/knarcraft/bookswithoutborders/config/translation/Translatable.java @@ -78,6 +78,11 @@ public enum Translatable implements TranslatableMessage { */ SUCCESS_LORE_SET, + /** + * The success message displayed when an item's title is successfully set + */ + SUCCESS_TITLE_SET, + /** * The error to display when the console attempts to run a player-only command */ @@ -128,6 +133,11 @@ public enum Translatable implements TranslatableMessage { */ ACTION_CHANGE_GENERATION, + /** + * The translation of the unsign action + */ + ACTION_UNSIGN, + /** * The error displayed when running a relevant command while holding one book in each hand */ @@ -291,12 +301,17 @@ public enum Translatable implements TranslatableMessage { /** * The error displayed when attempting to change the lore of an item without holding an item */ - ERROR_LORE_NO_ITEM, + ERROR_NO_ITEM, /** * The error displayed when attempting to change an item's title/display name without specifying the new title/display name */ ERROR_TITLE_EMPTY, + + /** + * The error displayed when attempting to change a book's title with a title that's too long + */ + ERROR_TITLE_LENGTH, ; @Override diff --git a/src/main/java/net/knarcraft/bookswithoutborders/container/Bookshelf.java b/src/main/java/net/knarcraft/bookswithoutborders/container/Bookshelf.java index 9d43e30..d854313 100644 --- a/src/main/java/net/knarcraft/bookswithoutborders/container/Bookshelf.java +++ b/src/main/java/net/knarcraft/bookswithoutborders/container/Bookshelf.java @@ -1,5 +1,6 @@ package net.knarcraft.bookswithoutborders.container; +import net.knarcraft.bookswithoutborders.config.StaticMessage; import org.bukkit.Location; import org.jetbrains.annotations.NotNull; @@ -64,7 +65,7 @@ public class Bookshelf { */ public void setTitle(@NotNull String title) { if (title.isBlank()) { - throw new IllegalArgumentException("Bookshelves cannot have empty titles!"); + throw new IllegalArgumentException(StaticMessage.EXCEPTION_BOOKSHELF_NAME_EMPTY.toString()); } this.title = title; } diff --git a/src/main/java/net/knarcraft/bookswithoutborders/encryption/AES.java b/src/main/java/net/knarcraft/bookswithoutborders/encryption/AES.java index de8b29a..fad687e 100644 --- a/src/main/java/net/knarcraft/bookswithoutborders/encryption/AES.java +++ b/src/main/java/net/knarcraft/bookswithoutborders/encryption/AES.java @@ -1,6 +1,7 @@ package net.knarcraft.bookswithoutborders.encryption; import net.knarcraft.bookswithoutborders.BooksWithoutBorders; +import net.knarcraft.bookswithoutborders.config.StaticMessage; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -97,8 +98,11 @@ public class AES implements Encryptor { //Initialize cipher try { aes.init(mode, secretKeySpec, ivParameterSpec); - } catch (InvalidKeyException | InvalidAlgorithmParameterException exception) { - BooksWithoutBorders.log(Level.SEVERE, "Invalid AES input given!"); + } catch (InvalidKeyException exception) { + BooksWithoutBorders.log(Level.FINE, StaticMessage.DEBUG_AES_INVALID_KEY.toString()); + return null; + } catch (InvalidAlgorithmParameterException exception) { + BooksWithoutBorders.log(Level.FINE, StaticMessage.DEBUG_AES_INVALID_PARAMETERS.toString()); return null; } //Perform encryption/decryption and output result @@ -106,10 +110,10 @@ public class AES implements Encryptor { byte[] output = aes.doFinal(getInputBytes(input, encrypt)); return createResult(output, encrypt); } catch (IllegalBlockSizeException exception) { - BooksWithoutBorders.log(Level.SEVERE, "Invalid AES block size during finalization"); + BooksWithoutBorders.log(Level.FINE, StaticMessage.DEBUG_AES_INVALID_BLOCK_SIZE.toString()); return null; } catch (BadPaddingException exception) { - BooksWithoutBorders.log(Level.SEVERE, "Invalid AES padding during finalization"); + BooksWithoutBorders.log(Level.FINE, StaticMessage.DEBUG_AES_INVALID_PADDING_FINALIZATION.toString()); return null; } } @@ -156,10 +160,10 @@ public class AES implements Encryptor { try { aes = Cipher.getInstance("AES/CBC/PKCS5Padding"); } catch (NoSuchAlgorithmException exception) { - BooksWithoutBorders.log(Level.SEVERE, "Invalid AES algorithm during Cipher generation"); + BooksWithoutBorders.log(Level.SEVERE, StaticMessage.DEBUG_AES_INVALID_ALGORITHM.toString()); return null; } catch (NoSuchPaddingException exception) { - BooksWithoutBorders.log(Level.SEVERE, "Invalid AES padding during Cipher generation"); + BooksWithoutBorders.log(Level.SEVERE, StaticMessage.DEBUG_AES_INVALID_PADDING_CIPHER.toString()); return null; } return aes; @@ -178,14 +182,14 @@ public class AES implements Encryptor { try { keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256"); } catch (NoSuchAlgorithmException exception) { - BooksWithoutBorders.log(Level.SEVERE, "Invalid AES algorithm"); + BooksWithoutBorders.log(Level.SEVERE, StaticMessage.DEBUG_AES_INVALID_ALGORITHM.toString()); return null; } SecretKey tmp; try { tmp = keyFactory.generateSecret(spec); } catch (InvalidKeySpecException exception) { - BooksWithoutBorders.log(Level.SEVERE, "Invalid AES key specification"); + BooksWithoutBorders.log(Level.SEVERE, StaticMessage.DEBUG_AES_INVALID_KEY_SPECIFICATION.toString()); return null; } return new SecretKeySpec(tmp.getEncoded(), "AES"); diff --git a/src/main/java/net/knarcraft/bookswithoutborders/encryption/GenenCrypt.java b/src/main/java/net/knarcraft/bookswithoutborders/encryption/GenenCrypt.java index f605cbc..ae1423f 100644 --- a/src/main/java/net/knarcraft/bookswithoutborders/encryption/GenenCrypt.java +++ b/src/main/java/net/knarcraft/bookswithoutborders/encryption/GenenCrypt.java @@ -12,6 +12,8 @@ import java.util.Random; * *
Not sure where this was gotten from, but it does exist at * Stack Exchange.
+ * + * @author AkiraAkiba */ public class GenenCrypt implements Encryptor { @@ -58,11 +60,12 @@ public class GenenCrypt implements Encryptor { originalCodonList.remove(index); } - // define the characters that can be encoded, 64 in total - // 26 capital letters - // 10 digits - // space, newline, and tab - // the symbols . , ? " ! @ # $ % ^ & * ( ) - + = / _ \ : ; < > + /* define the characters that can be encoded, 64 in total + 26 capital letters + 10 digits + space, newline, and tab + the symbols . , ? " ! @ # $ % ^ & * ( ) - + = / _ \ : ; < > + */ availableCharacters = new String[]{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", " ", "\t", "\n", ".", ",", "?", "\"", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "-", "+", "=", "/", diff --git a/src/main/java/net/knarcraft/bookswithoutborders/encryption/Magic.java b/src/main/java/net/knarcraft/bookswithoutborders/encryption/Magic.java index 613d606..350c1a1 100644 --- a/src/main/java/net/knarcraft/bookswithoutborders/encryption/Magic.java +++ b/src/main/java/net/knarcraft/bookswithoutborders/encryption/Magic.java @@ -5,6 +5,8 @@ import org.jetbrains.annotations.Nullable; /** * So-called "Magic" encryption which simply makes the contents unreadable + * + * @author AkiraAkiba */ public class Magic implements Encryptor { diff --git a/src/main/java/net/knarcraft/bookswithoutborders/encryption/OneTimePad.java b/src/main/java/net/knarcraft/bookswithoutborders/encryption/OneTimePad.java index ad7a362..b7ab334 100644 --- a/src/main/java/net/knarcraft/bookswithoutborders/encryption/OneTimePad.java +++ b/src/main/java/net/knarcraft/bookswithoutborders/encryption/OneTimePad.java @@ -10,6 +10,8 @@ import java.util.Base64; /** * A one-time pad implementation + * + * @author AkiraAkiba */ public class OneTimePad implements Encryptor { diff --git a/src/main/java/net/knarcraft/bookswithoutborders/encryption/SubstitutionCipher.java b/src/main/java/net/knarcraft/bookswithoutborders/encryption/SubstitutionCipher.java index 965148d..053d5cb 100644 --- a/src/main/java/net/knarcraft/bookswithoutborders/encryption/SubstitutionCipher.java +++ b/src/main/java/net/knarcraft/bookswithoutborders/encryption/SubstitutionCipher.java @@ -8,6 +8,8 @@ import java.util.StringTokenizer; /** * A simple substitution cipher + * + * @author AkiraAkiba */ public class SubstitutionCipher implements Encryptor { diff --git a/src/main/java/net/knarcraft/bookswithoutborders/gui/AuthorBookIndex.java b/src/main/java/net/knarcraft/bookswithoutborders/gui/AuthorBookIndex.java index 744d128..cbe0086 100644 --- a/src/main/java/net/knarcraft/bookswithoutborders/gui/AuthorBookIndex.java +++ b/src/main/java/net/knarcraft/bookswithoutborders/gui/AuthorBookIndex.java @@ -1,8 +1,10 @@ package net.knarcraft.bookswithoutborders.gui; import net.knarcraft.bookswithoutborders.BooksWithoutBorders; +import net.knarcraft.bookswithoutborders.config.translation.Formatting; import net.knarcraft.bookswithoutborders.utility.BookFileHelper; import net.knarcraft.bookswithoutborders.utility.BookFormatter; +import net.knarcraft.knarlib.formatting.TranslatableMessage; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.ClickEvent; import net.md_5.bungee.api.chat.ComponentBuilder; @@ -33,9 +35,9 @@ public class AuthorBookIndex extends BookIndex { int totalPages = (int) Math.ceil((double) availableBooks.size() / booksPerPage); if (page > totalPages) { - sender.sendMessage(ChatColor.GRAY + "No such page"); + BooksWithoutBorders.getStringFormatter().displayErrorMessage(sender, Formatting.NEUTRAL_AUTHOR_BOOKS_INVALID_PAGE); } else { - showAuthorBooks(sender, command, page, totalPages, availableBooks, authorName); + showAuthorBooks(sender, command, page, totalPages, availableBooks, authorName, listPublic); } } @@ -48,19 +50,16 @@ public class AuthorBookIndex extends BookIndex { * @param totalPagesThe total amount of pages
* @param availableBooksAll books available to the sender
* @param authorNameThe name of the author currently shown
+ * @param listPublicWhether to display public books
*/ private static void showAuthorBooks(@NotNull CommandSender sender, @NotNull String command, int page, - int totalPages, @NotNull ListThe current page
* @param totalPagesThe total amount of pages
*/ - protected static void displayTotalPages(@NotNull ComponentBuilder componentBuilder, @NotNull String command, int page, int totalPages) { - componentBuilder.append("Page " + page + " of " + totalPages, + protected static void displayTotalPages(@NotNull ComponentBuilder componentBuilder, @NotNull String command, + int page, int totalPages) { + String pageDisplay = color(Formatting.NEUTRAL_BOOK_LIST_TOTAL_PAGES, List.of("{current}", "{total}"), + List.of(String.valueOf(page), String.valueOf(totalPages))); + componentBuilder.append(pageDisplay, ComponentBuilder.FormatRetention.NONE).color(interactColor).event(new HoverEvent( HoverEvent.Action.SHOW_TEXT, new Text("/" + command + " page" + page))).event( new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/" + command + " page" + page)); @@ -101,10 +111,12 @@ public abstract class BookIndex { char character = (char) ('a' + characterIndex); if (firstInstances.containsKey(character)) { int pageIndex = (firstInstances.get(character) / booksPerPage) + 1; - componentBuilder.append(character + "").color(interactColor).event( - new ClickEvent(ClickEvent.Action.RUN_COMMAND, - "/" + command + " page" + pageIndex)).event(new HoverEvent( - HoverEvent.Action.SHOW_TEXT, new Text("Books starting with " + character))); + HoverEvent hoverEvent = new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text( + color(Formatting.NEUTRAL_BOOK_LIST_INDEX_HOVER, "{character}", "" + character))); + ClickEvent clickEvent = new ClickEvent(ClickEvent.Action.RUN_COMMAND, + "/" + command + " page" + pageIndex); + + componentBuilder.append(character + "").color(interactColor).event(clickEvent).event(hoverEvent); } else { componentBuilder.append(character + "", ComponentBuilder.FormatRetention.NONE).color(inactiveColor); } @@ -121,14 +133,16 @@ public abstract class BookIndex { */ protected static void displayPreviousButton(@NotNull ComponentBuilder componentBuilder, @NotNull String command, int page) { + String previousPage = color(Formatting.NEUTRAL_BOOK_LIST_PREVIOUS_PAGE); if (page > 1) { String fullCommand = "/" + command + " page" + (page - 1); - HoverEvent prevPagePreview = new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text("To page " + (page - 1))); + HoverEvent prevPagePreview = new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text( + color(Formatting.NEUTRAL_BOOK_LIST_TO_PAGE, "{page}", String.valueOf(page - 1)))); ClickEvent prevPageClick = new ClickEvent(ClickEvent.Action.RUN_COMMAND, fullCommand); - componentBuilder.append("[<] Previous", ComponentBuilder.FormatRetention.NONE).color(interactColor) - .event(prevPagePreview).event(prevPageClick); + componentBuilder.append(previousPage, ComponentBuilder.FormatRetention.NONE).color(interactColor). + event(prevPagePreview).event(prevPageClick); } else { - componentBuilder.append("[<] Previous", ComponentBuilder.FormatRetention.NONE).color(inactiveColor); + componentBuilder.append(previousPage, ComponentBuilder.FormatRetention.NONE).color(inactiveColor); } } @@ -142,29 +156,73 @@ public abstract class BookIndex { */ protected static void displayNextButton(@NotNull ComponentBuilder componentBuilder, @NotNull String command, int page, int totalPages) { + String nextPage = color(Formatting.NEUTRAL_BOOK_LIST_NEXT_PAGE); if (page < totalPages) { String fullCommand = "/" + command + " page" + (page + 1); - HoverEvent nextPagePreview = new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text("To page " + (page + 1))); + HoverEvent nextPagePreview = new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text( + color(Formatting.NEUTRAL_BOOK_LIST_TO_PAGE, "{page}", String.valueOf(page + 1)))); ClickEvent nextPageClick = new ClickEvent(ClickEvent.Action.RUN_COMMAND, fullCommand); - componentBuilder.append("Next [>]", ComponentBuilder.FormatRetention.NONE).color(interactColor) + componentBuilder.append(nextPage, ComponentBuilder.FormatRetention.NONE).color(interactColor) .event(nextPagePreview).event(nextPageClick); } else { - componentBuilder.append("Next [>]", ComponentBuilder.FormatRetention.NONE).color(inactiveColor); + componentBuilder.append(nextPage, ComponentBuilder.FormatRetention.NONE).color(inactiveColor); } } /** - * Gets a nice name from a book's path + * Colors a translatable message * - * @param bookPathThe path of a book
- * @returnThe prettified book name
+ * @param translatableMessageThe message to color
+ * @returnThe colored message
*/ @NotNull - protected static String getNiceName(@NotNull String bookPath) { - String title = BookFileHelper.getBookTitleFromPath(bookPath); - String author = BookFileHelper.getBookAuthorFromPath(bookPath); - return ChatColor.translateAlternateColorCodes('&', - title + ChatColor.RESET + " by " + author + ChatColor.RESET); + protected static String color(@NotNull TranslatableMessage translatableMessage) { + return color(translatableMessage, (ListThe message to color
+ * @param placeholderPlaceholder to replace
+ * @param replacementReplacement value
+ * @returnThe colored message
+ */ + @NotNull + protected static String color(@NotNull TranslatableMessage translatableMessage, @NotNull String placeholder, + @NotNull String replacement) { + return color(translatableMessage, List.of(placeholder), List.of(replacement)); + } + + /** + * Colors a translatable message + * + * @param translatableMessageThe message to color
+ * @param placeholdersPlaceholders to replace
+ * @param replacementsReplacement values
+ * @returnThe colored message
+ */ + @NotNull + protected static String color(@NotNull TranslatableMessage translatableMessage, @Nullable ListThe message to color
+ * @returnThe colored message
+ */ + @NotNull + protected static String color(@NotNull String input) { + return ColorHelper.translateColorCodes(input, ColorConversion.RGB); } } diff --git a/src/main/java/net/knarcraft/bookswithoutborders/gui/PagedBookIndex.java b/src/main/java/net/knarcraft/bookswithoutborders/gui/PagedBookIndex.java index 16e2fbf..7b8d941 100644 --- a/src/main/java/net/knarcraft/bookswithoutborders/gui/PagedBookIndex.java +++ b/src/main/java/net/knarcraft/bookswithoutborders/gui/PagedBookIndex.java @@ -1,7 +1,10 @@ package net.knarcraft.bookswithoutborders.gui; import net.knarcraft.bookswithoutborders.BooksWithoutBorders; +import net.knarcraft.bookswithoutborders.config.translation.Formatting; +import net.knarcraft.bookswithoutborders.utility.BookFileHelper; import net.knarcraft.bookswithoutborders.utility.BookFormatter; +import net.knarcraft.knarlib.formatting.TranslatableMessage; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.ClickEvent; import net.md_5.bungee.api.chat.ComponentBuilder; @@ -42,9 +45,9 @@ public class PagedBookIndex extends BookIndex { int totalPages = (int) Math.ceil((double) availableBooks.size() / booksPerPage); if (page > totalPages) { - sender.sendMessage(ChatColor.GRAY + "No such page"); + BooksWithoutBorders.getStringFormatter().displayErrorMessage(sender, Formatting.NEUTRAL_AUTHOR_BOOKS_INVALID_PAGE); } else { - showBookMenu(sender, command, page, totalPages, availableBooks, firstInstances); + showBookMenu(sender, command, page, totalPages, availableBooks, firstInstances, listPublic); } } @@ -57,19 +60,15 @@ public class PagedBookIndex extends BookIndex { * @param totalPagesThe total amount of pages
* @param availableBooksAll books available to the sender
* @param firstInstancesThe map between a character, and the index of the first instance of that character in the book list
+ * @param listPublicWhether to display public books
*/ private static void showBookMenu(@NotNull CommandSender sender, @NotNull String command, int page, int totalPages, @NotNull List