diff --git a/.gitignore b/.gitignore index 2637b8b..5c2d75b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,9 @@ .classpath .project +.idea .settings/* bin/* target/* -build.bat -/bin/ -/target/ +build.bat +/bin/ +/target/ diff --git a/pom.xml b/pom.xml index c597cdd..8a8bb5c 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ maven-shade-plugin 3.2.1 - ${project.build.directory}/dependency-reduced-pom.xml + false co.aikar.commands @@ -64,7 +64,7 @@ bungeecord-repo - https://()oss.sonatype.org/content/repositories/snapshots + https://oss.sonatype.org/content/repositories/snapshots jitpack.io diff --git a/src/me/EtienneDx/RealEstate/Config.java b/src/me/EtienneDx/RealEstate/Config.java index c3f505b..7b0c533 100644 --- a/src/me/EtienneDx/RealEstate/Config.java +++ b/src/me/EtienneDx/RealEstate/Config.java @@ -1,10 +1,15 @@ package me.EtienneDx.RealEstate; +import java.io.File; +import java.io.IOException; import java.util.Arrays; +import java.util.HashMap; import java.util.List; import org.bukkit.ChatColor; +import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; import org.bukkit.plugin.PluginDescriptionFile; import me.EtienneDx.AnnotationConfig.AnnotationConfig; @@ -18,6 +23,7 @@ public class Config extends AnnotationConfig public final String configFilePath = RealEstate.pluginDirPath + "config.yml"; public final String logFilePath = RealEstate.pluginDirPath + "GriefProtection_RealEstate.log"; + final static String messagesFilePath = RealEstate.pluginDirPath + File.separator + "messages.yml"; public final String chatPrefix = "[" + ChatColor.GOLD + "RealEstate" + ChatColor.WHITE + "] "; @ConfigField(name="RealEstate.Keywords.SignsHeader", comment = "What is displayed in top of the signs") @@ -88,7 +94,9 @@ public class Config extends AnnotationConfig @ConfigField(name="RealEstate.Settings.PageSize", comment = "How many Real Estate offer should be shown by page using the '/re list' command") public int cfgPageSize = 20; - + + private String[] messages; + public Config() { this.pdf = RealEstate.instance.getDescription(); @@ -118,4 +126,105 @@ public class Config extends AnnotationConfig //YamlConfiguration config = YamlConfiguration.loadConfiguration(new File(this.configFilePath)); this.loadConfig(this.configFilePath); } + + public void loadMessages() { + Messages[] messageIDs = Messages.values(); + this.messages = new String[Messages.values().length]; + + HashMap defaults = new HashMap(); + // initialize defaults + this.addDefault(defaults, Messages.NoTransactionFound, "No transaction found at your location!", null); + this.addDefault(defaults, Messages.PageMustBePositive, "Page must be a positive option!", null); + this.addDefault(defaults, Messages.PageNotExists, "This page does not exist!", null); + this.addDefault(defaults, Messages.RenewRentNow, "Automatic renew is now $a{0} $bfor this {1}", "0: the status; 1: a claim type"); + this.addDefault(defaults, Messages.RenewRentCurrently, "Automatic renew is currently $a{0} $bfor this {1}", "0: the status; 1: a claim type"); + + + // load the config file + FileConfiguration config = YamlConfiguration.loadConfiguration(new File(messagesFilePath)); + + // for each message ID + for (Messages messageID : messageIDs) { + //get default for this message + CustomizableMessage messageData = defaults.get(messageID.name()); + + // if default is missing, log an error and use some fake data for now so that the plugin can run + if (messageData == null) { + RealEstate.instance.log.info("Missing message for " + messageID.name() + ". Please contact the developer."); + messageData = new CustomizableMessage(messageID, "Missing message! ID: " + messageID.name() + ". Please contact a server admin.", null); + } + + // read the message from the file, use default if necessary + this.messages[messageID.ordinal()] = config.getString("Messages." + messageID.name() + ".Text", messageData.text); + config.set("Messages." + messageID.name() + ".Text", this.messages[messageID.ordinal()]); + + this.messages[messageID.ordinal()] = this.messages[messageID.ordinal()].replace('$', (char) 0x00A7); + + if (messageData.notes != null) { + messageData.notes = config.getString("Messages." + messageID.name() + ".Notes", messageData.notes); + config.set("Messages." + messageID.name() + ".Notes", messageData.notes); + } + } + + //save any changes + try { + config.options().header("Use a YAML editor like NotepadPlusPlus to edit this file. \nAfter editing, back up your changes before reloading the server in case you made a syntax error. \nUse dollar signs ($) for formatting codes, which are documented here: http://minecraft.gamepedia.com/Formatting_codes"); + config.save(messagesFilePath); + } catch (IOException exception) { + RealEstate.instance.log.info("Unable to write to the configuration file at \"" + messagesFilePath + "\""); + } + + defaults.clear(); + RealEstate.instance.log.info("Customizable messages loaded."); + System.gc(); + } + + private void addDefault(HashMap defaults, + Messages id, String text, String notes) { + CustomizableMessage message = new CustomizableMessage(id, text, notes); + defaults.put(id.name(), message); + } + + synchronized public String getMessage(Messages messageID, String... args) { + String message = messages[messageID.ordinal()]; + + for (int i = 0; i < args.length; i++) { + String param = args[i]; + message = message.replace("{" + i + "}", param); + } + + return message; + } + //sends a color-coded message to a player + public static void sendMessage(Player player, ChatColor color, Messages messageID, String... args) { + sendMessage(player, color, messageID, 0, args); + } + + //sends a color-coded message to a player + public static void sendMessage(Player player, ChatColor color, Messages messageID, long delayInTicks, String... args) { + String message = RealEstate.instance.config.getMessage(messageID, args); + sendMessage(player, color, message, delayInTicks); + } + + //sends a color-coded message to a player + public static void sendMessage(Player player, ChatColor color, String message) { + if (message == null || message.length() == 0) return; + + if (player == null) { + RealEstate.instance.log.info(color + message); + } else { + player.sendMessage(RealEstate.instance.config.chatPrefix + color + message); + } + } + + public static void sendMessage(Player player, ChatColor color, String message, long delayInTicks) { + SendPlayerMessageTask task = new SendPlayerMessageTask(player, color, message); + + if (delayInTicks > 0) { + RealEstate.instance.getServer().getScheduler().runTaskLater(RealEstate.instance, task, delayInTicks); + } else { + task.run(); + } + } + } diff --git a/src/me/EtienneDx/RealEstate/CustomizableMessage.java b/src/me/EtienneDx/RealEstate/CustomizableMessage.java new file mode 100644 index 0000000..daceb08 --- /dev/null +++ b/src/me/EtienneDx/RealEstate/CustomizableMessage.java @@ -0,0 +1,15 @@ +package me.EtienneDx.RealEstate; + +public class CustomizableMessage +{ + public Messages id; + public String text; + public String notes; + + public CustomizableMessage(Messages id, String text, String notes) + { + this.id = id; + this.text = text; + this.notes = notes; + } +} \ No newline at end of file diff --git a/src/me/EtienneDx/RealEstate/Messages.java b/src/me/EtienneDx/RealEstate/Messages.java new file mode 100644 index 0000000..d23aa86 --- /dev/null +++ b/src/me/EtienneDx/RealEstate/Messages.java @@ -0,0 +1,10 @@ +package me.EtienneDx.RealEstate; + +public enum Messages +{ + NoTransactionFound, + PageMustBePositive, + PageNotExists, + RenewRentNow, + RenewRentCurrently +} diff --git a/src/me/EtienneDx/RealEstate/RECommand.java b/src/me/EtienneDx/RealEstate/RECommand.java index 755a512..eecce8a 100644 --- a/src/me/EtienneDx/RealEstate/RECommand.java +++ b/src/me/EtienneDx/RealEstate/RECommand.java @@ -1,5 +1,6 @@ package me.EtienneDx.RealEstate; +import java.awt.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -50,19 +51,24 @@ public class RECommand extends BaseCommand } else { - player.sendMessage(RealEstate.instance.config.chatPrefix + ChatColor.RED + "No transaction found at your location!"); + Config.sendMessage(player, ChatColor.RED, Messages.NoTransactionFound); } + } @Subcommand("list") @Description("Displays the list of all real estate offers currently existing") @CommandCompletion("all|sell|rent|lease") @Syntax("[all|sell|rent|lease] ") - public static void list(CommandSender player, @Optional String type, @Default("1") int page) + public static void list(CommandSender sender, @Optional String type, @Default("1") int page) { + Player player = null; + if (sender instanceof Player) { + player = (Player) sender; + } if(page <= 0) { - player.sendMessage(RealEstate.instance.config.chatPrefix + ChatColor.RED + "Page must be a positive option!"); + Config.sendMessage(player, ChatColor.RED, Messages.PageMustBePositive); return; } int count = 0; @@ -91,12 +97,12 @@ public class RECommand extends BaseCommand } else { - player.sendMessage(RealEstate.instance.config.chatPrefix + ChatColor.RED + "Invalid option provided!"); + sender.sendMessage(RealEstate.instance.config.chatPrefix + ChatColor.RED + "Invalid option provided!"); return; } if(count == 0) { - player.sendMessage(RealEstate.instance.config.chatPrefix + ChatColor.RED + "No transaction have been found!"); + sender.sendMessage(RealEstate.instance.config.chatPrefix + ChatColor.RED + "No transaction have been found!"); } else { @@ -123,22 +129,22 @@ public class RECommand extends BaseCommand int max = Math.min(start + RealEstate.instance.config.cfgPageSize, count); if(start <= max) { - player.sendMessage(ChatColor.DARK_BLUE + "----= " + ChatColor.WHITE + "[ " + ChatColor.GOLD + typeMsg + " page " + ChatColor.DARK_GREEN + " " + + sender.sendMessage(ChatColor.DARK_BLUE + "----= " + ChatColor.WHITE + "[ " + ChatColor.GOLD + typeMsg + " page " + ChatColor.DARK_GREEN + " " + page + ChatColor.GOLD + " / " + ChatColor.DARK_GREEN + (int)Math.ceil(count / (double)RealEstate.instance.config.cfgPageSize) + ChatColor.WHITE + " ]" + ChatColor.DARK_BLUE + " =----"); for(int i = start; i < max; i++) { RealEstate.instance.log.info("transaction " + i); - transactions.get(i).msgInfo(player); + transactions.get(i).msgInfo(sender); } if(page < (int)Math.ceil(count / (double)RealEstate.instance.config.cfgPageSize)) { - player.sendMessage(ChatColor.GOLD + "To see the next page, type " + ChatColor.GREEN + "/re list " + (type != null ? type : "all") + " " + (page + 1)); + sender.sendMessage(ChatColor.GOLD + "To see the next page, type " + ChatColor.GREEN + "/re list " + (type != null ? type : "all") + " " + (page + 1)); } } else { - player.sendMessage(RealEstate.instance.config.chatPrefix + ChatColor.RED + "This page does not exist!"); + Config.sendMessage(player, ChatColor.RED, Messages.PageNotExists); } } } @@ -161,8 +167,7 @@ public class RECommand extends BaseCommand } if(newStatus == null) { - player.sendMessage(RealEstate.instance.config.chatPrefix + ChatColor.AQUA + "Automatic renew is currently " + - ChatColor.GREEN + (cr.autoRenew ? "enabled" : "disabled") + ChatColor.AQUA + " for this " + claimType + "!"); + Config.sendMessage(player, ChatColor.AQUA, Messages.RenewRentCurrently, cr.autoRenew ? "enabled" : "disabled", claimType); } else if(!newStatus.equalsIgnoreCase("enable") && !newStatus.equalsIgnoreCase("disable")) { @@ -172,8 +177,7 @@ public class RECommand extends BaseCommand { cr.autoRenew = newStatus.equalsIgnoreCase("enable"); RealEstate.transactionsStore.saveData(); - player.sendMessage(RealEstate.instance.config.chatPrefix + ChatColor.AQUA + "Automatic renew is now " + - ChatColor.GREEN + (cr.autoRenew ? "enabled" : "disabled") + ChatColor.AQUA + " for this " + claimType + "!"); + Config.sendMessage(player, ChatColor.AQUA, Messages.RenewRentNow, cr.autoRenew ? "enabled" : "disabled", claimType); } else { diff --git a/src/me/EtienneDx/RealEstate/RealEstate.java b/src/me/EtienneDx/RealEstate/RealEstate.java index e450f07..865dff6 100644 --- a/src/me/EtienneDx/RealEstate/RealEstate.java +++ b/src/me/EtienneDx/RealEstate/RealEstate.java @@ -79,6 +79,7 @@ public class RealEstate extends JavaPlugin } this.config = new Config(); this.config.loadConfig();// loads config or default + this.config.loadMessages();// loads messages this.config.saveConfig();// save eventual default ConfigurationSerialization.registerClass(ClaimSell.class); diff --git a/src/me/EtienneDx/RealEstate/SendPlayerMessageTask.java b/src/me/EtienneDx/RealEstate/SendPlayerMessageTask.java new file mode 100644 index 0000000..21ccedc --- /dev/null +++ b/src/me/EtienneDx/RealEstate/SendPlayerMessageTask.java @@ -0,0 +1,32 @@ +package me.EtienneDx.RealEstate; + +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +import java.util.logging.Logger; + +class SendPlayerMessageTask implements Runnable +{ + private Player player; + private ChatColor color; + private String message; + + + public SendPlayerMessageTask(Player player, ChatColor color, String message) + { + this.player = player; + this.color = color; + this.message = message; + } + + @Override + public void run() + { + if(player == null) + { + RealEstate.instance.log.info(color + message); + return; + } + Config.sendMessage(this.player, this.color, this.message); + } +}