package com.nicewuerfel.blockown; import com.google.common.annotations.VisibleForTesting; import com.nicewuerfel.blockown.output.Output; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.text.MessageFormat; import java.util.logging.Level; public class Message { public static final String COLOR_ERROR = "error"; public static final String COLOR_WARNING = "warning"; public static final String COLOR_INFO = "info"; public static final String COLOR_SUCCESS = "success"; public static final Message // General strings ON = new Message("General.onString", COLOR_SUCCESS), OFF = new Message("General.offString", COLOR_ERROR), PROTECTION_CAUSE_PROTECTED = new Message("Protection.Cause.protected", COLOR_INFO), PROTECTION_CAUSE_LOCKED = new Message("Protection.Cause.locked", COLOR_INFO), PROTECTION_CAUSE_AUTO = new Message("Protection.Cause.auto", COLOR_INFO), BLOCK = new Message("General.block", COLOR_INFO), ENTITY = new Message("General.entity", COLOR_INFO), // Updater messages UPDATER_RESTART = new Message("Updater.restart", COLOR_WARNING), UPDATER_DOWNLOADING = new Message("Updater.downloading", COLOR_INFO), UPDATER_BIG_UPDATE = new Message("Updater.bigUpdate", COLOR_WARNING), // General command messages COMMAND_PLAYERS_ONLY = new Message("Command.justForPlayers", COLOR_ERROR), COMMAND_CONSOLE_ONLY = new Message("Command.justForConsole", COLOR_ERROR), COMMAND_NO_PERMISSION = new Message("Command.noPermission", COLOR_ERROR), COMMAND_INVALID_PLAYER = new Message("Command.invalidPlayer", COLOR_ERROR), COMMAND_INVALID_MATERIAL = new Message("Command.invalidMaterial", COLOR_ERROR), COMMAND_NOTARGET = new Message("Command.noTarget", COLOR_ERROR), COMMAND_DISABLED_IN_WORLD = new Message("Command.disabledInWorld", COLOR_ERROR), COMMAND_NO_MORE_CLICK_WAITING = new Message("Command.noMoreClickWaiting", COLOR_INFO), // CE_Ignore messages COMMAND_IGNORE_SUCCESS = new Message("Command.Ignore.success", COLOR_SUCCESS), // CE_Import messages COMMAND_IMPORT_START = new Message("Command.Import.start", COLOR_INFO), COMMAND_IMPORT_SUCCESS = new Message("Command.Import.success", COLOR_SUCCESS), COMMAND_IMPORT_UNAVAILABLE = new Message("Command.Import.unavailable", COLOR_ERROR), // CE_ShowOwner messages COMMAND_SHOWOWNER_CLICK_ENTITY = new Message("Command.Showowner.clickOnEntity", COLOR_SUCCESS), COMMAND_SHOWOWNER_CLICK_BLOCK = new Message("Command.Showowner.clickOnBlock", COLOR_SUCCESS), COMMAND_SHOWOWNER_ENTITY_UNOWNED = new Message("Command.Showowner.entityUnowned", COLOR_SUCCESS), COMMAND_SHOWOWNER_ENTITY_FOUND = new Message("Command.Showowner.entityOwned", COLOR_SUCCESS), COMMAND_SHOWOWNER_BLOCK_UNOWNED = new Message("Command.Showowner.blockUnowned", COLOR_SUCCESS), COMMAND_SHOWOWNER_BLOCK_FOUND = new Message("Command.Showowner.blockOwned", COLOR_SUCCESS), // CE_Owning messages COMMAND_OWNING_SUCCESS = new Message("Command.Owning.success", COLOR_SUCCESS), // CE_Own messages COMMAND_OWN_BLOCKSUCCESS = new Message("Command.Own.blockSuccess", COLOR_SUCCESS), COMMAND_OWN_CLICK_ENTITY = new Message("Command.Own.clickOnEntity", COLOR_SUCCESS), COMMAND_OWN_CLICK_BLOCK = new Message("Command.Own.clickOnBlock", COLOR_SUCCESS), COMMAND_OWN_ENTITYSUCCESS = new Message("Command.Own.entitySuccess", COLOR_SUCCESS), COMMAND_OWN_NOPERMISSIONFOROTHERS = new Message("Command.Own.noPermissionForOthers", COLOR_ERROR), COMMAND_OWN_SELECTION_SUCCESS = new Message("Command.Own.Selection.success", COLOR_SUCCESS), COMMAND_OWN_SELECTION_NOWORLDEDIT = new Message("Command.Own.Selection.noWorldEdit", COLOR_ERROR), COMMAND_OWN_SELECTION_NOSELECTION = new Message("Command.Own.Selection.noSelection", COLOR_ERROR), COMMAND_OWN_SELECTION_TOO_BIG = new Message("Command.Own.Selection.tooBig", COLOR_ERROR), // CE_OwnOther messages COMMAND_OWNOTHER_SELECTION_SUCCESS = new Message("Command.Ownother.Selection.success", COLOR_SUCCESS), // CE_Unown messages COMMAND_UNOWN_BLOCKSUCCESS = new Message("Command.Unown.blockSuccess", COLOR_SUCCESS), COMMAND_UNOWN_CLICK_ENTITY = new Message("Command.Unown.clickOnEntity", COLOR_SUCCESS), COMMAND_UNOWN_CLICK_BLOCK = new Message("Command.Unown.clickOnBlock", COLOR_SUCCESS), COMMAND_UNOWN_ENTITYSUCCESS = new Message("Command.Unown.entitySuccess", COLOR_SUCCESS), COMMAND_UNOWN_FOROTHERS_NOTALLOWED = new Message("Command.Unown.noPermissionForOthers", COLOR_ERROR), COMMAND_UNOWN_SELECTION_SUCCESS = new Message("Command.Unown.Selection.success", COLOR_SUCCESS), COMMAND_UNOWN_SELECTION_NOWORLDEDIT = new Message("Command.Unown.Selection.noWorldEdit", COLOR_ERROR), COMMAND_UNOWN_SELECTION_NOSELECTION = new Message("Command.Unown.Selection.noSelection", COLOR_ERROR), COMMAND_UNOWN_SELECTION_TOO_BIG = new Message("Command.Unown.Selection.tooBig", COLOR_ERROR), // CE_AddFriend messages COMMAND_ADDFRIEND_SUCCESS = new Message("Command.Addfriend.success", COLOR_SUCCESS), // CE_RemFriend messages COMMAND_REMFRIEND_SUCCESS = new Message("Command.Remfriend.success", COLOR_SUCCESS), // CE_Lock messages COMMAND_LOCK_SUCCESS = new Message("Command.Lock.success", COLOR_SUCCESS), COMMAND_LOCK_CLICK_ENTITY = new Message("Command.Lock.clickOnEntity", COLOR_SUCCESS), COMMAND_LOCK_CLICK_BLOCK = new Message("Command.Lock.clickOnBlock", COLOR_SUCCESS), // CE_Unlock messages COMMAND_UNLOCK_SUCCESS = new Message("Command.Unlock.success", COLOR_SUCCESS), COMMAND_UNLOCK_CLICK_ENTITY = new Message("Command.Unlock.clickOnEntity", COLOR_SUCCESS), COMMAND_UNLOCK_CLICK_BLOCK = new Message("Command.Unlock.clickOnBlock", COLOR_SUCCESS), // CE_Protect messages COMMAND_PROTECT_SUCCESS = new Message("Command.Protect.success", COLOR_SUCCESS), COMMAND_PROTECT_CLICK_ENTITY = new Message("Command.Protect.clickOnEntity", COLOR_SUCCESS), COMMAND_PROTECT_CLICK_BLOCK = new Message("Command.Protect.clickOnBlock", COLOR_SUCCESS), // CE_Unprotect messages COMMAND_UNPROTECT_SUCCESS = new Message("Command.Unprotect.success", COLOR_SUCCESS), COMMAND_UNPROTECT_CLICK_ENTITY = new Message("Command.Unprotect.clickOnEntity", COLOR_SUCCESS), COMMAND_UNPROTECT_CLICK_BLOCK = new Message("Command.Unprotect.clickOnBlock", COLOR_SUCCESS), // CE_List messages COMMAND_LIST_FRIENDS = new Message("Command.List.friendsMessageHead", COLOR_SUCCESS), COMMAND_LIST_PROTECTED = new Message("Command.List.protectedMessageHead", COLOR_SUCCESS), COMMAND_LIST_LOCKED = new Message("Command.List.lockedMessageHead", COLOR_SUCCESS), COMMAND_LIST_EMPTY = new Message("Command.List.empty", COLOR_WARNING), // CE_UnprotectPlayer messages COMMAND_UNPROTECTPLAYER_SUCCESS = new Message("Command.Unprotectplayer.success", COLOR_SUCCESS), // CE_UnownPlayer messages COMMAND_UNOWNPLAYER_SUCCESS = new Message("Command.Unownplayer.success", COLOR_SUCCESS); @VisibleForTesting static FileConfiguration messages = null; private final String path; private final String chatColor; private Message(String path, String chatColor) { this.path = path; this.chatColor = chatColor; } String getPath() { return path; } String getColor() { return chatColor; } public String getMessage(Object... params) { if (params.length == 0) { return toString(); } return MessageFormat.format(toString(), params); } @Override public String toString() { String message = messages.getString(path); if (message == null) { return ""; } return getChatColor(chatColor) + message; } /** * Gets a custom chat color * * @param colorKey one of the color keys (COLOR_SUCCESS, COLOR_ERROR, etc.) * @return a ChatColor string */ static String getChatColor(String colorKey) { if (colorKey == null) return ""; String path = "Colors-DONTTRANSLATE." + colorKey; ChatColor result; try { result = ChatColor.valueOf(messages.getString(path)); } catch (IllegalArgumentException e) { try { Bukkit.getLogger().log(Level.WARNING, "Couldn't find color " + messages.getString(path) + " falling back to default.", ""); } catch (NullPointerException ignored) { } result = ChatColor.valueOf(messages.getDefaults().getString(path)); } return result.toString(); } /** * Needs to be invoked once before any other methods are used. * * @param messageFile the message file * @return true, if successful */ static synchronized boolean loadMessages(Output output, File messageFile) { if (messages == null) { messages = YamlConfiguration.loadConfiguration(messageFile); try { messages.addDefaults(YamlConfiguration.loadConfiguration( new InputStreamReader(Message.class.getResourceAsStream("/messages.yml"), "UTF-8"))); } catch (UnsupportedEncodingException e) { output.printError("Error loading default messages", e); return false; } messages.options().copyDefaults(true); try { messages.save(messageFile); return true; } catch (IOException e) { output.printError("Error saving message file", e); return false; } } else { return true; } } }