diff options
266 files changed, 6186 insertions, 2537 deletions
diff --git a/.gitignore b/.gitignore index 6c25fbdd7..1083defe4 100644 --- a/.gitignore +++ b/.gitignore @@ -37,4 +37,5 @@ /WebPush/apikey.php /WebPush/nbproject/private /.idea -*.iml
\ No newline at end of file +*.iml +/EssentialsSigns/nbproject/private/
\ No newline at end of file diff --git a/Essentials/src/com/earth2me/essentials/AlternativeCommandsHandler.java b/Essentials/src/com/earth2me/essentials/AlternativeCommandsHandler.java deleted file mode 100644 index e75644ad5..000000000 --- a/Essentials/src/com/earth2me/essentials/AlternativeCommandsHandler.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.earth2me.essentials; - -import java.util.*; -import java.util.logging.Level; -import java.util.logging.Logger; -import org.bukkit.command.Command; -import org.bukkit.command.PluginCommand; -import org.bukkit.command.PluginCommandYamlParser; -import org.bukkit.plugin.Plugin; - - -public class AlternativeCommandsHandler -{ - private static final Logger LOGGER = Logger.getLogger("Minecraft"); - private final transient Map<String, List<PluginCommand>> altcommands = new HashMap<String, List<PluginCommand>>(); - private final transient Map<String, String> disabledList = new HashMap<String, String>(); - private final transient IEssentials ess; - - public AlternativeCommandsHandler(final IEssentials ess) - { - this.ess = ess; - for (Plugin plugin : ess.getServer().getPluginManager().getPlugins()) - { - if (plugin.isEnabled()) - { - addPlugin(plugin); - } - } - } - - public final void addPlugin(final Plugin plugin) - { - if (plugin.getDescription().getMain().contains("com.earth2me.essentials")) - { - return; - } - final List<Command> commands = PluginCommandYamlParser.parse(plugin); - final String pluginName = plugin.getDescription().getName().toLowerCase(Locale.ENGLISH); - - for (Command command : commands) - { - final PluginCommand pc = (PluginCommand)command; - final List<String> labels = new ArrayList<String>(pc.getAliases()); - labels.add(pc.getName()); - - PluginCommand reg = ess.getServer().getPluginCommand(pluginName + ":" + pc.getName().toLowerCase(Locale.ENGLISH)); - if (reg == null) - { - reg = ess.getServer().getPluginCommand(pc.getName().toLowerCase(Locale.ENGLISH)); - } - if (reg == null || !reg.getPlugin().equals(plugin)) - { - continue; - } - for (String label : labels) - { - List<PluginCommand> plugincommands = altcommands.get(label.toLowerCase(Locale.ENGLISH)); - if (plugincommands == null) - { - plugincommands = new ArrayList<PluginCommand>(); - altcommands.put(label.toLowerCase(Locale.ENGLISH), plugincommands); - } - boolean found = false; - for (PluginCommand pc2 : plugincommands) - { - if (pc2.getPlugin().equals(plugin)) - { - found = true; - } - } - if (!found) - { - plugincommands.add(reg); - } - } - } - } - - public void removePlugin(final Plugin plugin) - { - final Iterator<Map.Entry<String, List<PluginCommand>>> iterator = altcommands.entrySet().iterator(); - while (iterator.hasNext()) - { - final Map.Entry<String, List<PluginCommand>> entry = iterator.next(); - final Iterator<PluginCommand> pcIterator = entry.getValue().iterator(); - while (pcIterator.hasNext()) - { - final PluginCommand pc = pcIterator.next(); - if (pc.getPlugin() == null || pc.getPlugin().equals(plugin)) - { - pcIterator.remove(); - } - } - if (entry.getValue().isEmpty()) - { - iterator.remove(); - } - } - } - - public PluginCommand getAlternative(final String label) - { - final List<PluginCommand> commands = altcommands.get(label); - if (commands == null || commands.isEmpty()) - { - return null; - } - if (commands.size() == 1) - { - return commands.get(0); - } - // return the first command that is not an alias - for (PluginCommand command : commands) - { - if (command.getName().equalsIgnoreCase(label)) - { - return command; - } - } - // return the first alias - return commands.get(0); - } - - public void executed(final String label, final String otherLabel) - { - if (ess.getSettings().isDebug()) - { - LOGGER.log(Level.INFO, "Essentials: Alternative command " + label + " found, using " + otherLabel); - } - disabledList.put(label, otherLabel); - } - - public Map<String, String> disabledCommands() - { - return disabledList; - } -} diff --git a/Essentials/src/com/earth2me/essentials/Backup.java b/Essentials/src/com/earth2me/essentials/Backup.java index ada36c9d7..205dba19e 100644 --- a/Essentials/src/com/earth2me/essentials/Backup.java +++ b/Essentials/src/com/earth2me/essentials/Backup.java @@ -1,23 +1,29 @@ package com.earth2me.essentials; +import com.earth2me.essentials.api.IBackup; import static com.earth2me.essentials.I18n._; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.ISettings; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Level; import java.util.logging.Logger; +import lombok.Cleanup; +import org.bukkit.Bukkit; import org.bukkit.Server; import org.bukkit.command.CommandSender; -public class Backup implements Runnable +public class Backup implements Runnable, IBackup { - private static final Logger LOGGER = Logger.getLogger("Minecraft"); + private static final Logger LOGGER = Bukkit.getLogger(); private transient final Server server; private transient final IEssentials ess; - private transient boolean running = false; + private transient final AtomicBoolean running = new AtomicBoolean(false); private transient int taskId = -1; - private transient boolean active = false; + private transient final AtomicBoolean active = new AtomicBoolean(false); public Backup(final IEssentials ess) { @@ -29,34 +35,34 @@ public class Backup implements Runnable } } - void onPlayerJoin() + public void startTask() { - startTask(); - } - - private void startTask() - { - if (!running) + if (running.compareAndSet(false, true)) { - final long interval = ess.getSettings().getBackupInterval() * 1200; // minutes -> ticks + @Cleanup + final ISettings settings = ess.getSettings(); + settings.acquireReadLock(); + final long interval = settings.getData().getGeneral().getBackup().getInterval() * 1200; // minutes -> ticks if (interval < 1200) { + running.set(false); return; } taskId = ess.scheduleSyncRepeatingTask(this, interval, interval); - running = true; } } @Override public void run() { - if (active) + if (!active.compareAndSet(false, true)) { return; } - active = true; - final String command = ess.getSettings().getBackupCommand(); + @Cleanup + final ISettings settings = ess.getSettings(); + settings.acquireReadLock(); + final String command = settings.getData().getGeneral().getBackup().getCommand(); if (command == null || "".equals(command)) { return; @@ -117,13 +123,13 @@ public class Backup implements Runnable server.dispatchCommand(cs, "save-on"); if (server.getOnlinePlayers().length == 0) { - running = false; + running.set(false); if (taskId != -1) { server.getScheduler().cancelTask(taskId); } } - active = false; + active.set(false); LOGGER.log(Level.INFO, _("backupFinished")); } }); diff --git a/Essentials/src/com/earth2me/essentials/Console.java b/Essentials/src/com/earth2me/essentials/Console.java index d07171c63..16a8aefd0 100644 --- a/Essentials/src/com/earth2me/essentials/Console.java +++ b/Essentials/src/com/earth2me/essentials/Console.java @@ -2,6 +2,7 @@ package com.earth2me.essentials; import org.bukkit.Server; import org.bukkit.command.CommandSender; +import com.earth2me.essentials.api.IReplyTo; public final class Console implements IReplyTo @@ -14,13 +15,13 @@ public final class Console implements IReplyTo { } - public static CommandSender getCommandSender(Server server) throws Exception + public static CommandSender getCommandSender(final Server server) throws Exception { return server.getConsoleSender(); } @Override - public void setReplyTo(CommandSender user) + public void setReplyTo(final CommandSender user) { replyTo = user; } diff --git a/Essentials/src/com/earth2me/essentials/Enchantments.java b/Essentials/src/com/earth2me/essentials/Enchantments.java index dac789353..da42bf71c 100644 --- a/Essentials/src/com/earth2me/essentials/Enchantments.java +++ b/Essentials/src/com/earth2me/essentials/Enchantments.java @@ -9,8 +9,13 @@ import java.util.regex.Pattern; import org.bukkit.enchantments.Enchantment; -public class Enchantments +public final class Enchantments { + + private Enchantments() + { + } + private static final transient Pattern NUMPATTERN = Pattern.compile("\\d+"); private static final Map<String, Enchantment> ENCHANTMENTS = new HashMap<String, Enchantment>(); @@ -56,7 +61,7 @@ public class Enchantments ENCHANTMENTS.put("aquaaffinity", Enchantment.WATER_WORKER); } - public static Enchantment getByName(String name) { + public static Enchantment getByName(final String name) { Enchantment enchantment; if (NUMPATTERN.matcher(name).matches()) { enchantment = Enchantment.getById(Integer.parseInt(name)); diff --git a/Essentials/src/com/earth2me/essentials/Essentials.java b/Essentials/src/com/earth2me/essentials/Essentials.java index a80b3685a..ab25f107e 100644 --- a/Essentials/src/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/com/earth2me/essentials/Essentials.java @@ -18,18 +18,13 @@ package com.earth2me.essentials; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.api.Economy; -import com.earth2me.essentials.api.IJails; -import com.earth2me.essentials.commands.EssentialsCommand; -import com.earth2me.essentials.commands.IEssentialsCommand; -import com.earth2me.essentials.commands.NoChargeException; -import com.earth2me.essentials.commands.NotEnoughArgumentsException; +import com.earth2me.essentials.api.*; import com.earth2me.essentials.craftbukkit.ItemDupeFix; +import com.earth2me.essentials.listener.*; import com.earth2me.essentials.perm.PermissionsHandler; import com.earth2me.essentials.register.payment.Methods; -import com.earth2me.essentials.signs.SignBlockListener; -import com.earth2me.essentials.signs.SignEntityListener; -import com.earth2me.essentials.signs.SignPlayerListener; +import com.earth2me.essentials.settings.SettingsHolder; +import com.earth2me.essentials.user.UserMap; import java.io.File; import java.io.FileReader; import java.io.IOException; @@ -43,7 +38,6 @@ import org.bukkit.Server; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; -import org.bukkit.command.PluginCommand; import org.bukkit.entity.Player; import org.bukkit.event.Event.Priority; import org.bukkit.event.Event.Type; @@ -54,7 +48,6 @@ import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginDescriptionFile; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.scheduler.BukkitScheduler; import org.yaml.snakeyaml.error.YAMLException; @@ -64,18 +57,18 @@ public class Essentials extends JavaPlugin implements IEssentials private static final Logger LOGGER = Logger.getLogger("Minecraft"); private transient ISettings settings; private final transient TNTExplodeListener tntListener = new TNTExplodeListener(this); - private transient Jails jails; - private transient Warps warps; - private transient Worth worth; - private transient List<IConf> confList; - private transient Backup backup; - private transient ItemDb itemDb; + private transient IJails jails; + private transient IWarps warps; + private transient IWorth worth; + private transient List<IReload> reloadList; + private transient IBackup backup; + private transient IItemDb itemDb; private transient final Methods paymentMethod = new Methods(); private transient PermissionsHandler permissionsHandler; - private transient AlternativeCommandsHandler alternativeCommandsHandler; - private transient UserMap userMap; + private transient IUserMap userMap; private transient ExecuteTimer execTimer; private transient I18n i18n; + private transient ICommandHandler commandHandler; @Override public ISettings getSettings() @@ -99,10 +92,10 @@ public class Essentials extends JavaPlugin implements IEssentials LOGGER.log(Level.INFO, _("usingTempFolderForTesting")); LOGGER.log(Level.INFO, dataFolder.toString()); this.initialize(null, server, new PluginDescriptionFile(new FileReader(new File("src" + File.separator + "plugin.yml"))), dataFolder, null, null); - settings = new Settings(this); + settings = new SettingsHolder(this); i18n.updateLocale("en"); userMap = new UserMap(this); - permissionsHandler = new PermissionsHandler(this, false); + permissionsHandler = new PermissionsHandler(this); Economy.setEss(this); } @@ -147,24 +140,26 @@ public class Essentials extends JavaPlugin implements IEssentials final EssentialsUpgrade upgrade = new EssentialsUpgrade(this); upgrade.beforeSettings(); execTimer.mark("Upgrade"); - confList = new ArrayList<IConf>(); - settings = new Settings(this); - confList.add(settings); + reloadList = new ArrayList<IReload>(); + settings = new SettingsHolder(this); + reloadList.add(settings); execTimer.mark("Settings"); upgrade.afterSettings(); execTimer.mark("Upgrade2"); i18n.updateLocale(settings.getLocale()); userMap = new UserMap(this); - confList.add(userMap); + reloadList.add(userMap); execTimer.mark("Init(Usermap)"); - warps = new Warps(getServer(), this.getDataFolder()); - confList.add(warps); + warps = new Warps(this); + reloadList.add(warps); execTimer.mark("Init(Spawn/Warp)"); worth = new Worth(this.getDataFolder()); - confList.add(worth); + reloadList.add(worth); itemDb = new ItemDb(this); - confList.add(itemDb); + reloadList.add(itemDb); execTimer.mark("Init(Worth/ItemDB)"); + commandHandler = new EssentialsCommandHandler(Essentials.class.getClassLoader(), "com.earth2me.essentials.commands.Command", "essentials.", this); + reloadList.add(commandHandler); reload(); } catch (YAMLException exception) @@ -194,12 +189,11 @@ public class Essentials extends JavaPlugin implements IEssentials return; } backup = new Backup(this); - permissionsHandler = new PermissionsHandler(this, settings.useBukkitPermissions()); - alternativeCommandsHandler = new AlternativeCommandsHandler(this); + permissionsHandler = new PermissionsHandler(this); final EssentialsPluginListener serverListener = new EssentialsPluginListener(this); pm.registerEvent(Type.PLUGIN_ENABLE, serverListener, Priority.Low, this); pm.registerEvent(Type.PLUGIN_DISABLE, serverListener, Priority.Low, this); - confList.add(serverListener); + reloadList.add(serverListener); final EssentialsPlayerListener playerListener = new EssentialsPlayerListener(this); pm.registerEvent(Type.PLAYER_JOIN, playerListener, Priority.Monitor, this); @@ -220,22 +214,6 @@ public class Essentials extends JavaPlugin implements IEssentials final EssentialsBlockListener blockListener = new EssentialsBlockListener(this); pm.registerEvent(Type.BLOCK_PLACE, blockListener, Priority.Lowest, this); - final SignBlockListener signBlockListener = new SignBlockListener(this); - pm.registerEvent(Type.SIGN_CHANGE, signBlockListener, Priority.Highest, this); - pm.registerEvent(Type.BLOCK_PLACE, signBlockListener, Priority.Low, this); - pm.registerEvent(Type.BLOCK_BREAK, signBlockListener, Priority.Highest, this); - pm.registerEvent(Type.BLOCK_IGNITE, signBlockListener, Priority.Low, this); - pm.registerEvent(Type.BLOCK_BURN, signBlockListener, Priority.Low, this); - pm.registerEvent(Type.BLOCK_PISTON_EXTEND, signBlockListener, Priority.Low, this); - pm.registerEvent(Type.BLOCK_PISTON_RETRACT, signBlockListener, Priority.Low, this); - - final SignPlayerListener signPlayerListener = new SignPlayerListener(this); - pm.registerEvent(Type.PLAYER_INTERACT, signPlayerListener, Priority.Low, this); - - final SignEntityListener signEntityListener = new SignEntityListener(this); - pm.registerEvent(Type.ENTITY_EXPLODE, signEntityListener, Priority.Low, this); - pm.registerEvent(Type.ENDERMAN_PICKUP, signEntityListener, Priority.Low, this); - final EssentialsEntityListener entityListener = new EssentialsEntityListener(this); pm.registerEvent(Type.ENTITY_DAMAGE, entityListener, Priority.Lowest, this); pm.registerEvent(Type.ENTITY_COMBUST, entityListener, Priority.Lowest, this); @@ -245,12 +223,12 @@ public class Essentials extends JavaPlugin implements IEssentials //TODO: Check if this should be here, and not above before reload() jails = new Jails(this); - confList.add(jails); + reloadList.add(jails); pm.registerEvent(Type.ENTITY_EXPLODE, tntListener, Priority.High, this); final EssentialsTimer timer = new EssentialsTimer(this); - getScheduler().scheduleSyncRepeatingTask(this, timer, 1, 100); + getServer().getScheduler().scheduleSyncRepeatingTask(this, timer, 1, 100); Economy.setEss(this); execTimer.mark("RegListeners"); LOGGER.info(_("loadinfo", this.getDescription().getName(), this.getDescription().getVersion(), Util.joinList(this.getDescription().getAuthors()))); @@ -274,10 +252,10 @@ public class Essentials extends JavaPlugin implements IEssentials { Trade.closeLog(); - for (IConf iConf : confList) + for (IReload iReload : reloadList) { - iConf.reloadConfig(); - execTimer.mark("Reload(" + iConf.getClass().getSimpleName() + ")"); + iReload.onReload(); + execTimer.mark("Reload(" + iReload.getClass().getSimpleName() + ")"); } i18n.updateLocale(settings.getLocale()); @@ -286,124 +264,8 @@ public class Essentials extends JavaPlugin implements IEssentials @Override public boolean onCommand(final CommandSender sender, final Command command, final String commandLabel, final String[] args) { - return onCommandEssentials(sender, command, commandLabel, args, Essentials.class.getClassLoader(), "com.earth2me.essentials.commands.Command", "essentials.", null); - } - - @Override - public boolean onCommandEssentials(final CommandSender sender, final Command command, final String commandLabel, final String[] args, final ClassLoader classLoader, final String commandPath, final String permissionPrefix, final IEssentialsModule module) - { - // Allow plugins to override the command via onCommand - if (!getSettings().isCommandOverridden(command.getName()) && (!commandLabel.startsWith("e") || commandLabel.equalsIgnoreCase(command.getName()))) - { - final PluginCommand pc = alternativeCommandsHandler.getAlternative(commandLabel); - if (pc != null) - { - alternativeCommandsHandler.executed(commandLabel, pc.getLabel()); - return pc.execute(sender, commandLabel, args); - } - } - - try - { - User user = null; - if (sender instanceof Player) - { - user = getUser(sender); - LOGGER.log(Level.INFO, String.format("[PLAYER_COMMAND] %s: /%s %s ", ((Player)sender).getName(), commandLabel, EssentialsCommand.getFinalArg(args, 0))); - } - - // New mail notification - if (user != null && !getSettings().isCommandDisabled("mail") && !commandLabel.equals("mail") && user.isAuthorized("essentials.mail")) - { - final List<String> mail = user.getMails(); - if (mail != null && !mail.isEmpty()) - { - user.sendMessage(_("youHaveNewMail", mail.size())); - } - } - - // Check for disabled commands - if (getSettings().isCommandDisabled(commandLabel)) - { - return true; - } - - IEssentialsCommand cmd; - try - { - cmd = (IEssentialsCommand)classLoader.loadClass(commandPath + command.getName()).newInstance(); - cmd.setEssentials(this); - cmd.setEssentialsModule(module); - } - catch (Exception ex) - { - sender.sendMessage(_("commandNotLoaded", commandLabel)); - LOGGER.log(Level.SEVERE, _("commandNotLoaded", commandLabel), ex); - return true; - } - - // Check authorization - if (user != null && !user.isAuthorized(cmd, permissionPrefix)) - { - LOGGER.log(Level.WARNING, _("deniedAccessCommand", user.getName())); - user.sendMessage(_("noAccessCommand")); - return true; - } - - // Run the command - try - { - if (user == null) - { - cmd.run(getServer(), sender, commandLabel, command, args); - } - else - { - cmd.run(getServer(), user, commandLabel, command, args); - } - return true; - } - catch (NoChargeException ex) - { - return true; - } - catch (NotEnoughArgumentsException ex) - { - sender.sendMessage(command.getDescription()); - sender.sendMessage(command.getUsage().replaceAll("<command>", commandLabel)); - if (!ex.getMessage().isEmpty()) - { - sender.sendMessage(ex.getMessage()); - } - return true; - } - catch (Throwable ex) - { - showError(sender, ex, commandLabel); - return true; - } - } - catch (Throwable ex) - { - LOGGER.log(Level.SEVERE, _("commandFailed", commandLabel), ex); - return true; - } - } - - @Override - public void showError(final CommandSender sender, final Throwable exception, final String commandLabel) - { - sender.sendMessage(_("errorWithMessage", exception.getMessage())); - if (getSettings().isDebug()) - { - LOGGER.log(Level.WARNING, _("errorCallingCommand", commandLabel), exception); - } - } - - @Override - public BukkitScheduler getScheduler() - { - return this.getServer().getScheduler(); + return commandHandler.handleCommand(sender, command, commandLabel, args); + //return onCommandEssentials(sender, command, commandLabel, args, Essentials.class.getClassLoader(), "com.earth2me.essentials.commands.Command", "essentials.", null); } @Override @@ -413,75 +275,33 @@ public class Essentials extends JavaPlugin implements IEssentials } @Override - public Warps getWarps() + public IWarps getWarps() { return warps; } @Override - public Worth getWorth() + public IWorth getWorth() { return worth; } @Override - public Backup getBackup() + public IBackup getBackup() { return backup; } - + @Override - public User getUser(final Object base) + public IUser getUser(final Player player) { - if (base instanceof Player) - { - return getUser((Player)base); - } - if (base instanceof String) - { - final User user = userMap.getUser((String)base); - if (user != null && user.getBase() instanceof OfflinePlayer) - { - ((OfflinePlayer)user.getBase()).setName((String)base); - } - return user; - } - return null; - } - - private <T extends Player> User getUser(final T base) - { - if (base == null) - { - return null; - } - - if (base instanceof User) - { - return (User)base; - } - User user = userMap.getUser(base.getName()); - - if (user == null) - { - user = new User(base, this); - } - else - { - user.update(base); - } - return user; + return userMap.getUser(player); } - + @Override - public User getOfflineUser(final String name) + public IUser getUser(final String playerName) { - final User user = userMap.getUser(name); - if (user != null && user.getBase() instanceof OfflinePlayer) - { - ((OfflinePlayer)user.getBase()).setName(name); - } - return user; + return userMap.getUser(playerName); } @Override @@ -499,9 +319,9 @@ public class Essentials extends JavaPlugin implements IEssentials } @Override - public void addReloadListener(final IConf listener) + public void addReloadListener(final IReload listener) { - confList.add(listener); + reloadList.add(listener); } @Override @@ -525,8 +345,8 @@ public class Essentials extends JavaPlugin implements IEssentials for (Player player : players) { - final User user = getUser(player); - if (!user.isIgnoredPlayer(sender.getName())) + final IUser user = getUser(player); + if (!user.isIgnoringPlayer(sender.getName())) { player.sendMessage(message); } @@ -538,25 +358,25 @@ public class Essentials extends JavaPlugin implements IEssentials @Override public int scheduleAsyncDelayedTask(final Runnable run) { - return this.getScheduler().scheduleAsyncDelayedTask(this, run); + return this.getServer().getScheduler().scheduleAsyncDelayedTask(this, run); } @Override public int scheduleSyncDelayedTask(final Runnable run) { - return this.getScheduler().scheduleSyncDelayedTask(this, run); + return this.getServer().getScheduler().scheduleSyncDelayedTask(this, run); } @Override public int scheduleSyncDelayedTask(final Runnable run, final long delay) { - return this.getScheduler().scheduleSyncDelayedTask(this, run, delay); + return this.getServer().getScheduler().scheduleSyncDelayedTask(this, run, delay); } @Override public int scheduleSyncRepeatingTask(final Runnable run, final long delay, final long period) { - return this.getScheduler().scheduleSyncRepeatingTask(this, run, delay, period); + return this.getServer().getScheduler().scheduleSyncRepeatingTask(this, run, delay, period); } @Override @@ -572,19 +392,13 @@ public class Essentials extends JavaPlugin implements IEssentials } @Override - public AlternativeCommandsHandler getAlternativeCommandsHandler() - { - return alternativeCommandsHandler; - } - - @Override - public ItemDb getItemDb() + public IItemDb getItemDb() { return itemDb; } @Override - public UserMap getUserMap() + public IUserMap getUserMap() { return userMap; } @@ -594,4 +408,22 @@ public class Essentials extends JavaPlugin implements IEssentials { return i18n; } + + @Override + public IGroups getGroups() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public IEssentialsEconomy getEconomy() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public ICommandHandler getCommandHandler() + { + return commandHandler; + } } diff --git a/Essentials/src/com/earth2me/essentials/EssentialsCommandHandler.java b/Essentials/src/com/earth2me/essentials/EssentialsCommandHandler.java new file mode 100644 index 000000000..473f986bc --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/EssentialsCommandHandler.java @@ -0,0 +1,293 @@ +package com.earth2me.essentials; + +import com.earth2me.essentials.api.ICommandHandler; +import com.earth2me.essentials.api.ISettings; +import static com.earth2me.essentials.I18n._; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.IEssentialsModule; +import com.earth2me.essentials.api.IUser; +import com.earth2me.essentials.commands.EssentialsCommand; +import com.earth2me.essentials.commands.IEssentialsCommand; +import com.earth2me.essentials.commands.NoChargeException; +import com.earth2me.essentials.commands.NotEnoughArgumentsException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.PluginCommand; +import org.bukkit.command.PluginCommandYamlParser; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + + +public class EssentialsCommandHandler implements ICommandHandler +{ + private final transient ClassLoader classLoader; + private final transient String commandPath; + private final transient String permissionPrefix; + private final transient IEssentialsModule module; + private static final transient Logger LOGGER = Bukkit.getLogger(); + private final transient Map<String, List<PluginCommand>> altcommands = new HashMap<String, List<PluginCommand>>(); + private final transient Map<String, String> disabledList = new HashMap<String, String>(); + private final transient IEssentials ess; + + public EssentialsCommandHandler(ClassLoader classLoader, String commandPath, String permissionPrefix, IEssentials ess) + { + this(classLoader, commandPath, permissionPrefix, null, ess); + } + + public EssentialsCommandHandler(ClassLoader classLoader, String commandPath, String permissionPrefix, IEssentialsModule module, IEssentials ess) + { + this.classLoader = classLoader; + this.commandPath = commandPath; + this.permissionPrefix = permissionPrefix; + this.module = module; + this.ess = ess; + for (Plugin plugin : ess.getServer().getPluginManager().getPlugins()) + { + if (plugin.isEnabled()) + { + addPlugin(plugin); + } + } + } + + @Override + public boolean handleCommand(final CommandSender sender, final Command command, final String commandLabel, final String[] args) + { + boolean disabled = false; + boolean overridden = false; + ISettings settings = ess.getSettings(); + settings.acquireReadLock(); + try { + disabled = settings.getData().getCommands().isDisabled(command.getName()); + overridden = !disabled || settings.getData().getCommands().isOverridden(command.getName()); + } finally { + settings.unlock(); + } + // Allow plugins to override the command via onCommand + if (!overridden && (!commandLabel.startsWith("e") || commandLabel.equalsIgnoreCase(command.getName()))) + { + final PluginCommand pc = getAlternative(commandLabel); + if (pc != null) + { + executed(commandLabel, pc.getLabel()); + return pc.execute(sender, commandLabel, args); + } + } + + try + { + IUser user = null; + if (sender instanceof Player) + { + user = ess.getUser((Player)sender); + LOGGER.log(Level.INFO, String.format("[PLAYER_COMMAND] %s: /%s %s ", ((Player)sender).getName(), commandLabel, EssentialsCommand.getFinalArg(args, 0))); + } + + // Check for disabled commands + if (disabled) + { + return true; + } + + IEssentialsCommand cmd; + try + { + cmd = (IEssentialsCommand)classLoader.loadClass(commandPath + command.getName()).newInstance(); + cmd.setEssentials(ess); + cmd.setEssentialsModule(module); + } + catch (Exception ex) + { + sender.sendMessage(_("commandNotLoaded", commandLabel)); + LOGGER.log(Level.SEVERE, _("commandNotLoaded", commandLabel), ex); + return true; + } + + // Check authorization + if (user != null && !user.isAuthorized(cmd, permissionPrefix)) + { + LOGGER.log(Level.WARNING, _("deniedAccessCommand", user.getName())); + user.sendMessage(_("noAccessCommand")); + return true; + } + + // Run the command + try + { + if (user == null) + { + cmd.run(ess.getServer(), sender, commandLabel, command, args); + } + else + { + user.acquireReadLock(); + try + { + cmd.run(ess.getServer(), user, commandLabel, command, args); + } + finally + { + user.unlock(); + } + } + return true; + } + catch (NoChargeException ex) + { + return true; + } + catch (NotEnoughArgumentsException ex) + { + sender.sendMessage(command.getDescription()); + sender.sendMessage(command.getUsage().replaceAll("<command>", commandLabel)); + if (!ex.getMessage().isEmpty()) + { + sender.sendMessage(ex.getMessage()); + } + return true; + } + catch (Throwable ex) + { + showCommandError(sender, commandLabel, ex); + return true; + } + } + catch (Throwable ex) + { + LOGGER.log(Level.SEVERE, _("commandFailed", commandLabel), ex); + return true; + } + } + + @Override + public void showCommandError(final CommandSender sender, final String commandLabel, final Throwable exception) + { + sender.sendMessage(_("errorWithMessage", exception.getMessage())); + if (ess.getSettings().isDebug()) + { + LOGGER.log(Level.WARNING, _("errorCallingCommand", commandLabel), exception); + } + } + + @Override + public void onReload() + { + + } + + public final void addPlugin(final Plugin plugin) + { + if (plugin.getDescription().getMain().contains("com.earth2me.essentials")) + { + return; + } + final List<Command> commands = PluginCommandYamlParser.parse(plugin); + final String pluginName = plugin.getDescription().getName().toLowerCase(Locale.ENGLISH); + + for (Command command : commands) + { + final PluginCommand pc = (PluginCommand)command; + final List<String> labels = new ArrayList<String>(pc.getAliases()); + labels.add(pc.getName()); + + PluginCommand reg = ess.getServer().getPluginCommand(pluginName + ":" + pc.getName().toLowerCase(Locale.ENGLISH)); + if (reg == null) + { + reg = ess.getServer().getPluginCommand(pc.getName().toLowerCase(Locale.ENGLISH)); + } + if (reg == null || !reg.getPlugin().equals(plugin)) + { + continue; + } + for (String label : labels) + { + List<PluginCommand> plugincommands = altcommands.get(label.toLowerCase(Locale.ENGLISH)); + if (plugincommands == null) + { + plugincommands = new ArrayList<PluginCommand>(); + altcommands.put(label.toLowerCase(Locale.ENGLISH), plugincommands); + } + boolean found = false; + for (PluginCommand pc2 : plugincommands) + { + if (pc2.getPlugin().equals(plugin)) + { + found = true; + } + } + if (!found) + { + plugincommands.add(reg); + } + } + } + } + + public void removePlugin(final Plugin plugin) + { + final Iterator<Map.Entry<String, List<PluginCommand>>> iterator = altcommands.entrySet().iterator(); + while (iterator.hasNext()) + { + final Map.Entry<String, List<PluginCommand>> entry = iterator.next(); + final Iterator<PluginCommand> pcIterator = entry.getValue().iterator(); + while (pcIterator.hasNext()) + { + final PluginCommand pc = pcIterator.next(); + if (pc.getPlugin() == null || pc.getPlugin().equals(plugin)) + { + pcIterator.remove(); + } + } + if (entry.getValue().isEmpty()) + { + iterator.remove(); + } + } + } + + public PluginCommand getAlternative(final String label) + { + final List<PluginCommand> commands = altcommands.get(label); + if (commands == null || commands.isEmpty()) + { + return null; + } + if (commands.size() == 1) + { + return commands.get(0); + } + // return the first command that is not an alias + for (PluginCommand command : commands) + { + if (command.getName().equalsIgnoreCase(label)) + { + return command; + } + } + // return the first alias + return commands.get(0); + } + + public void executed(final String label, final String otherLabel) + { + if (ess.getSettings().isDebug()) + { + LOGGER.log(Level.INFO, "Essentials: Alternative command " + label + " found, using " + otherLabel); + } + disabledList.put(label, otherLabel); + } + + public Map<String, String> disabledCommands() + { + return disabledList; + } +} diff --git a/Essentials/src/com/earth2me/essentials/EssentialsConf.java b/Essentials/src/com/earth2me/essentials/EssentialsConf.java index 35252532f..3a37f04b0 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsConf.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsConf.java @@ -16,7 +16,7 @@ import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; import org.bukkit.util.config.Configuration; - +@Deprecated public class EssentialsConf extends Configuration { private static final Logger LOGGER = Logger.getLogger("Minecraft"); diff --git a/Essentials/src/com/earth2me/essentials/EssentialsEntityListener.java b/Essentials/src/com/earth2me/essentials/EssentialsEntityListener.java deleted file mode 100644 index 214fc8c01..000000000 --- a/Essentials/src/com/earth2me/essentials/EssentialsEntityListener.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.earth2me.essentials; - -import static com.earth2me.essentials.I18n._; -import java.util.List; -import java.util.logging.Logger; -import org.bukkit.Material; -import org.bukkit.entity.Animals; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; -import org.bukkit.event.entity.*; -import org.bukkit.inventory.ItemStack; - - -public class EssentialsEntityListener extends EntityListener -{ - private static final Logger LOGGER = Logger.getLogger("Minecraft"); - private final IEssentials ess; - - public EssentialsEntityListener(IEssentials ess) - { - this.ess = ess; - } - - @Override - public void onEntityDamage(EntityDamageEvent event) - { - if (event instanceof EntityDamageByEntityEvent) - { - EntityDamageByEntityEvent edEvent = (EntityDamageByEntityEvent)event; - Entity eAttack = edEvent.getDamager(); - Entity eDefend = edEvent.getEntity(); - if (eDefend instanceof Player && eAttack instanceof Player) - { - User defender = ess.getUser(eDefend); - User attacker = ess.getUser(eAttack); - attacker.updateActivity(true); - ItemStack is = attacker.getItemInHand(); - List<String> commandList = attacker.getPowertool(is); - if (commandList != null && !commandList.isEmpty()) - { - for (String command : commandList) - { - - if (command != null && !command.isEmpty()) - { - attacker.getServer().dispatchCommand(attacker, command.replaceAll("\\{player\\}", defender.getName())); - event.setCancelled(true); - return; - } - } - } - } - if (eDefend instanceof Animals && eAttack instanceof Player) - { - User player = ess.getUser(eAttack); - ItemStack hand = player.getItemInHand(); - if (hand != null && hand.getType() == Material.MILK_BUCKET) { - ((Animals)eDefend).setAge(-24000); - hand.setType(Material.BUCKET); - player.setItemInHand(hand); - player.updateInventory(); - event.setCancelled(true); - } - } - } - if (event.getEntity() instanceof Player && ess.getUser(event.getEntity()).isGodModeEnabled()) - { - final Player player = (Player)event.getEntity(); - player.setFireTicks(0); - player.setRemainingAir(player.getMaximumAir()); - event.setCancelled(true); - } - } - - @Override - public void onEntityCombust(EntityCombustEvent event) - { - if (event.getEntity() instanceof Player && ess.getUser(event.getEntity()).isGodModeEnabled()) - { - event.setCancelled(true); - } - } - - @Override - public void onEntityDeath(final EntityDeathEvent event) - { - if (event instanceof PlayerDeathEvent) - { - final PlayerDeathEvent pdevent = (PlayerDeathEvent)event; - final User user = ess.getUser(pdevent.getEntity()); - if (user.isAuthorized("essentials.back.ondeath") && !ess.getSettings().isCommandDisabled("back")) - { - user.setLastLocation(); - user.sendMessage(_("backAfterDeath")); - } - if (!ess.getSettings().areDeathMessagesEnabled()) - { - pdevent.setDeathMessage(""); - } - } - } - - @Override - public void onFoodLevelChange(FoodLevelChangeEvent event) - { - if (event.getEntity() instanceof Player && ess.getUser(event.getEntity()).isGodModeEnabled()) - { - event.setCancelled(true); - } - } - - @Override - public void onEntityRegainHealth(EntityRegainHealthEvent event) - { - if (event.getRegainReason() == RegainReason.SATIATED && event.getEntity() instanceof Player - && ess.getUser(event.getEntity()).isAfk() && ess.getSettings().getFreezeAfkPlayers()) - { - event.setCancelled(true); - } - } -} diff --git a/Essentials/src/com/earth2me/essentials/EssentialsTimer.java b/Essentials/src/com/earth2me/essentials/EssentialsTimer.java index f3b447dae..66fba3822 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsTimer.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsTimer.java @@ -1,7 +1,13 @@ package com.earth2me.essentials; +import static com.earth2me.essentials.I18n._; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.ISettings; +import com.earth2me.essentials.api.IUser; +import com.earth2me.essentials.user.UserData.TimestampType; import java.util.HashSet; import java.util.Iterator; +import java.util.List; import java.util.Set; import org.bukkit.entity.Player; @@ -9,7 +15,7 @@ import org.bukkit.entity.Player; public class EssentialsTimer implements Runnable { private final transient IEssentials ess; - private final transient Set<User> onlineUsers = new HashSet<User>(); + private final transient Set<IUser> onlineUsers = new HashSet<IUser>(); EssentialsTimer(final IEssentials ess) { @@ -22,19 +28,37 @@ public class EssentialsTimer implements Runnable final long currentTime = System.currentTimeMillis(); for (Player player : ess.getServer().getOnlinePlayers()) { - final User user = ess.getUser(player); + final IUser user = ess.getUser(player); onlineUsers.add(user); user.setLastOnlineActivity(currentTime); user.checkActivity(); + + boolean mailDisabled = false; + ISettings settings = ess.getSettings(); + settings.acquireReadLock(); + try { + mailDisabled = settings.getData().getCommands().isDisabled("mail"); + } finally { + settings.unlock(); + } + // New mail notification + if (user != null && !mailDisabled && user.isAuthorized("essentials.mail") && !user.gotMailInfo()) + { + final List<String> mail = user.getMails(); + if (mail != null && !mail.isEmpty()) + { + user.sendMessage(_("youHaveNewMail", mail.size())); + } + } } - final Iterator<User> iterator = onlineUsers.iterator(); + final Iterator<IUser> iterator = onlineUsers.iterator(); while (iterator.hasNext()) { - final User user = iterator.next(); - if (user.getLastOnlineActivity() < currentTime && user.getLastOnlineActivity() > user.getLastLogout()) + final IUser user = iterator.next(); + if (user.getLastOnlineActivity() < currentTime && user.getLastOnlineActivity() > user.getTimestamp(TimestampType.LOGOUT)) { - user.setLastLogout(user.getLastOnlineActivity()); + user.setTimestamp(TimestampType.LOGOUT, user.getLastOnlineActivity()); iterator.remove(); continue; } diff --git a/Essentials/src/com/earth2me/essentials/EssentialsUpgrade.java b/Essentials/src/com/earth2me/essentials/EssentialsUpgrade.java index ae444af2e..894d95881 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsUpgrade.java +++ b/Essentials/src/com/earth2me/essentials/EssentialsUpgrade.java @@ -4,6 +4,7 @@ import com.earth2me.essentials.craftbukkit.FakeWorld; import com.earth2me.essentials.settings.Spawns; import com.earth2me.essentials.storage.YamlStorageWriter; import static com.earth2me.essentials.I18n._; +import com.earth2me.essentials.api.IEssentials; import java.io.*; import java.math.BigInteger; import java.security.DigestInputStream; @@ -372,7 +373,7 @@ public class EssentialsUpgrade doneFile.save(); } - private void moveUsersDataToUserdataFolder() + /*private void moveUsersDataToUserdataFolder() { final File usersFile = new File(ess.getDataFolder(), "users.yml"); if (!usersFile.exists()) @@ -418,7 +419,7 @@ public class EssentialsUpgrade } } usersFile.renameTo(new File(usersFile.getAbsolutePath() + ".old")); - } + }*/ private void convertWarps() { @@ -561,7 +562,7 @@ public class EssentialsUpgrade } } - private void sanitizeAllUserFilenames() + /*private void sanitizeAllUserFilenames() { if (doneFile.getBoolean("sanitizeAllUserFilenames", false)) { @@ -604,7 +605,7 @@ public class EssentialsUpgrade } doneFile.setProperty("sanitizeAllUserFilenames", true); doneFile.save(); - } + }*/ private World getFakeWorld(final String name) { @@ -791,9 +792,10 @@ public class EssentialsUpgrade public void afterSettings() { - sanitizeAllUserFilenames(); + //TODO? + //sanitizeAllUserFilenames(); updateUsersToNewDefaultHome(); - moveUsersDataToUserdataFolder(); + //moveUsersDataToUserdataFolder(); convertWarps(); updateUsersPowerToolsFormat(); updateUsersHomesFormat(); diff --git a/Essentials/src/com/earth2me/essentials/I18n.java b/Essentials/src/com/earth2me/essentials/I18n.java index 63fdcc065..c5fdaae50 100644 --- a/Essentials/src/com/earth2me/essentials/I18n.java +++ b/Essentials/src/com/earth2me/essentials/I18n.java @@ -1,5 +1,6 @@ package com.earth2me.essentials; +import com.earth2me.essentials.api.IEssentials; import com.earth2me.essentials.api.II18n; import java.io.File; import java.io.FileInputStream; diff --git a/Essentials/src/com/earth2me/essentials/IConf.java b/Essentials/src/com/earth2me/essentials/IConf.java deleted file mode 100644 index 580e6232f..000000000 --- a/Essentials/src/com/earth2me/essentials/IConf.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.earth2me.essentials; - -/** - * @deprecated New interface will be IReload in api package - */ -@Deprecated -public interface IConf { - public void reloadConfig(); -} diff --git a/Essentials/src/com/earth2me/essentials/IEssentials.java b/Essentials/src/com/earth2me/essentials/IEssentials.java deleted file mode 100644 index 20c6c300e..000000000 --- a/Essentials/src/com/earth2me/essentials/IEssentials.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.earth2me.essentials; - -import com.earth2me.essentials.api.IJails; -import com.earth2me.essentials.perm.PermissionsHandler; -import com.earth2me.essentials.register.payment.Methods; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.plugin.Plugin; -import org.bukkit.scheduler.BukkitScheduler; - -/** - * @deprecated This will be moved to the api package soon - */ -@Deprecated -public interface IEssentials extends Plugin -{ - void addReloadListener(IConf listener); - - void reload(); - - boolean onCommandEssentials(CommandSender sender, Command command, String commandLabel, String[] args, ClassLoader classLoader, String commandPath, String permissionPrefix, IEssentialsModule module); - - User getUser(Object base); - - I18n getI18n(); - - User getOfflineUser(String name); - - World getWorld(String name); - - int broadcastMessage(IUser sender, String message); - - ISettings getSettings(); - - BukkitScheduler getScheduler(); - - IJails getJails(); - - Warps getWarps(); - - Worth getWorth(); - - Backup getBackup(); - - Methods getPaymentMethod(); - - int scheduleAsyncDelayedTask(Runnable run); - - int scheduleSyncDelayedTask(Runnable run); - - int scheduleSyncDelayedTask(Runnable run, long delay); - - int scheduleSyncRepeatingTask(final Runnable run, long delay, long period); - - TNTExplodeListener getTNTListener(); - - PermissionsHandler getPermissionsHandler(); - - AlternativeCommandsHandler getAlternativeCommandsHandler(); - - void showError(final CommandSender sender, final Throwable exception, final String commandLabel); - - ItemDb getItemDb(); - - UserMap getUserMap(); -} diff --git a/Essentials/src/com/earth2me/essentials/IReplyTo.java b/Essentials/src/com/earth2me/essentials/IReplyTo.java deleted file mode 100644 index 5bef5fced..000000000 --- a/Essentials/src/com/earth2me/essentials/IReplyTo.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.earth2me.essentials; - -import org.bukkit.command.CommandSender; - -public interface IReplyTo { - public void setReplyTo(CommandSender user); - - public CommandSender getReplyTo(); -} diff --git a/Essentials/src/com/earth2me/essentials/ISettings.java b/Essentials/src/com/earth2me/essentials/ISettings.java index 5c53a6790..12b431bcd 100644 --- a/Essentials/src/com/earth2me/essentials/ISettings.java +++ b/Essentials/src/com/earth2me/essentials/ISettings.java @@ -7,8 +7,8 @@ import java.util.Set; import org.bukkit.ChatColor; import org.bukkit.event.Event.Priority; - -public interface ISettings extends IConf +/*@Deprecated +public interface ISettings extends com.earth2me.essentials.api.ISettings { boolean areSignsDisabled(); @@ -153,4 +153,4 @@ public interface ISettings extends IConf public Priority getRespawnPriority(); long getTpaAcceptCancellation(); -} +}*/ diff --git a/Essentials/src/com/earth2me/essentials/IUser.java b/Essentials/src/com/earth2me/essentials/IUser.java index bff556ab4..872e1a6e2 100644 --- a/Essentials/src/com/earth2me/essentials/IUser.java +++ b/Essentials/src/com/earth2me/essentials/IUser.java @@ -10,8 +10,8 @@ import org.bukkit.inventory.PlayerInventory; /** * @deprecated This will be moved to the api package soon */ -@Deprecated -public interface IUser extends Player +/*@Deprecated +public interface IUser extends Player, com.earth2me.essentials.api.IUser { long getLastTeleportTimestamp(); @@ -46,4 +46,4 @@ public interface IUser extends Player Teleport getTeleport(); void setJail(String jail); -} +}*/ diff --git a/Essentials/src/com/earth2me/essentials/ItemDb.java b/Essentials/src/com/earth2me/essentials/ItemDb.java index e3df50bab..3f453aea9 100644 --- a/Essentials/src/com/earth2me/essentials/ItemDb.java +++ b/Essentials/src/com/earth2me/essentials/ItemDb.java @@ -1,6 +1,7 @@ package com.earth2me.essentials; import com.earth2me.essentials.api.IItemDb; +import com.earth2me.essentials.api.IEssentials; import static com.earth2me.essentials.I18n._; import java.util.HashMap; import java.util.List; @@ -10,7 +11,7 @@ import org.bukkit.Material; import org.bukkit.inventory.ItemStack; -public class ItemDb implements IConf, IItemDb +public class ItemDb implements IItemDb { private final transient IEssentials ess; @@ -24,7 +25,7 @@ public class ItemDb implements IConf, IItemDb private final transient ManagedFile file; @Override - public void reloadConfig() + public void onReload() { final List<String> lines = file.getLines(); diff --git a/Essentials/src/com/earth2me/essentials/Jails.java b/Essentials/src/com/earth2me/essentials/Jails.java index f8ab2d02e..fbec2a32b 100644 --- a/Essentials/src/com/earth2me/essentials/Jails.java +++ b/Essentials/src/com/earth2me/essentials/Jails.java @@ -1,12 +1,15 @@ package com.earth2me.essentials; import com.earth2me.essentials.api.IJails; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.IUser; import com.earth2me.essentials.storage.AsyncStorageObjectHolder; import static com.earth2me.essentials.I18n._; import java.io.File; import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; +import lombok.Cleanup; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.event.Event.Priority; @@ -24,7 +27,7 @@ public class Jails extends AsyncStorageObjectHolder<com.earth2me.essentials.sett public Jails(final IEssentials ess) { super(ess, com.earth2me.essentials.settings.Jails.class); - reloadConfig(); + onReload(); registerListeners(); } @@ -37,9 +40,9 @@ public class Jails extends AsyncStorageObjectHolder<com.earth2me.essentials.sett pluginManager.registerEvent(Type.BLOCK_DAMAGE, blockListener, Priority.Low, ess); pluginManager.registerEvent(Type.BLOCK_PLACE, blockListener, Priority.Low, ess); pluginManager.registerEvent(Type.PLAYER_INTERACT, playerListener, Priority.Low, ess); - pluginManager.registerEvent(Type.PLAYER_RESPAWN, playerListener, Priority.High, ess); - pluginManager.registerEvent(Type.PLAYER_TELEPORT, playerListener, Priority.High, ess); - pluginManager.registerEvent(Type.PLAYER_JOIN, playerListener, Priority.High, ess); + pluginManager.registerEvent(Type.PLAYER_RESPAWN, playerListener, Priority.Highest, ess); + pluginManager.registerEvent(Type.PLAYER_TELEPORT, playerListener, Priority.Highest, ess); + pluginManager.registerEvent(Type.PLAYER_JOIN, playerListener, Priority.Highest, ess); } @Override @@ -119,7 +122,15 @@ public class Jails extends AsyncStorageObjectHolder<com.earth2me.essentials.sett Location loc = getJail(jail); user.getTeleport().now(loc, false, TeleportCause.COMMAND); } - user.setJail(jail); + user.acquireWriteLock(); + try + { + user.getData().setJail(jail); + } + finally + { + unlock(); + } } finally { @@ -151,8 +162,10 @@ public class Jails extends AsyncStorageObjectHolder<com.earth2me.essentials.sett @Override public void onBlockBreak(final BlockBreakEvent event) { - final User user = ess.getUser(event.getPlayer()); - if (user.isJailed()) + @Cleanup + final IUser user = ess.getUser(event.getPlayer()); + user.acquireReadLock(); + if (user.getData().isJailed()) { event.setCancelled(true); } @@ -161,8 +174,10 @@ public class Jails extends AsyncStorageObjectHolder<com.earth2me.essentials.sett @Override public void onBlockPlace(final BlockPlaceEvent event) { - final User user = ess.getUser(event.getPlayer()); - if (user.isJailed()) + @Cleanup + final IUser user = ess.getUser(event.getPlayer()); + user.acquireReadLock(); + if (user.getData().isJailed()) { event.setCancelled(true); } @@ -171,8 +186,10 @@ public class Jails extends AsyncStorageObjectHolder<com.earth2me.essentials.sett @Override public void onBlockDamage(final BlockDamageEvent event) { - final User user = ess.getUser(event.getPlayer()); - if (user.isJailed()) + @Cleanup + final IUser user = ess.getUser(event.getPlayer()); + user.acquireReadLock(); + if (user.getData().isJailed()) { event.setCancelled(true); } @@ -185,8 +202,10 @@ public class Jails extends AsyncStorageObjectHolder<com.earth2me.essentials.sett @Override public void onPlayerInteract(final PlayerInteractEvent event) { - final User user = ess.getUser(event.getPlayer()); - if (user.isJailed()) + @Cleanup + final IUser user = ess.getUser(event.getPlayer()); + user.acquireReadLock(); + if (user.getData().isJailed()) { event.setCancelled(true); } @@ -195,15 +214,17 @@ public class Jails extends AsyncStorageObjectHolder<com.earth2me.essentials.sett @Override public void onPlayerRespawn(final PlayerRespawnEvent event) { - final User user = ess.getUser(event.getPlayer()); - if (!user.isJailed() || user.getJail() == null || user.getJail().isEmpty()) + @Cleanup + final IUser user = ess.getUser(event.getPlayer()); + user.acquireReadLock(); + if (!user.getData().isJailed() || user.getData().getJail() == null || user.getData().getJail().isEmpty()) { return; } try { - event.setRespawnLocation(getJail(user.getJail())); + event.setRespawnLocation(getJail(user.getData().getJail())); } catch (Exception ex) { @@ -214,15 +235,17 @@ public class Jails extends AsyncStorageObjectHolder<com.earth2me.essentials.sett @Override public void onPlayerTeleport(final PlayerTeleportEvent event) { - final User user = ess.getUser(event.getPlayer()); - if (!user.isJailed() || user.getJail() == null || user.getJail().isEmpty()) + @Cleanup + final IUser user = ess.getUser(event.getPlayer()); + user.acquireReadLock(); + if (!user.getData().isJailed() || user.getData().getJail() == null || user.getData().getJail().isEmpty()) { return; } try { - event.setTo(getJail(user.getJail())); + event.setTo(getJail(user.getData().getJail())); } catch (Exception ex) { @@ -234,15 +257,17 @@ public class Jails extends AsyncStorageObjectHolder<com.earth2me.essentials.sett @Override public void onPlayerJoin(final PlayerJoinEvent event) { - final User user = ess.getUser(event.getPlayer()); - if (!user.isJailed() || user.getJail() == null || user.getJail().isEmpty()) + @Cleanup + final IUser user = ess.getUser(event.getPlayer()); + user.acquireReadLock(); + if (!user.getData().isJailed() || user.getData().getJail() == null || user.getData().getJail().isEmpty()) { return; } try { - sendToJail(user, user.getJail()); + sendToJail(user, user.getData().getJail()); } catch (Exception ex) { diff --git a/Essentials/src/com/earth2me/essentials/Kit.java b/Essentials/src/com/earth2me/essentials/Kit.java index 53d2e8784..feb357e9b 100644 --- a/Essentials/src/com/earth2me/essentials/Kit.java +++ b/Essentials/src/com/earth2me/essentials/Kit.java @@ -1,6 +1,8 @@ package com.earth2me.essentials; import static com.earth2me.essentials.I18n._; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.IUser; import com.earth2me.essentials.commands.NoChargeException; import com.earth2me.essentials.craftbukkit.InventoryWorkaround; import java.util.*; @@ -11,7 +13,7 @@ import org.bukkit.inventory.ItemStack; public class Kit { //TODO: Convert this to use one of the new text classes? - public static String listKits(final IEssentials ess, final User user) throws Exception + public static String listKits(final IEssentials ess, final IUser user) throws Exception { try { @@ -33,7 +35,7 @@ public class Kit } - public static void checkTime(final User user, final String kitName, final Map<String, Object> els) throws NoChargeException + public static void checkTime(final IUser user, final String kitName, final Map<String, Object> els) throws NoChargeException { final double delay = els.containsKey("delay") ? ((Number)els.get("delay")).doubleValue() : 0L; final Calendar c = new GregorianCalendar(); @@ -59,7 +61,7 @@ public class Kit } } - public static List<String> getItems(final User user, final Map<String, Object> els) throws Exception + public static List<String> getItems(final IUser user, final Map<String, Object> els) throws Exception { try { @@ -72,7 +74,7 @@ public class Kit } } - public static void expandItems(final IEssentials ess, final User user, final List<String> items) throws Exception + public static void expandItems(final IEssentials ess, final IUser user, final List<String> items) throws Exception { try { diff --git a/Essentials/src/com/earth2me/essentials/ManagedFile.java b/Essentials/src/com/earth2me/essentials/ManagedFile.java index a1918fa20..0a2443f29 100644 --- a/Essentials/src/com/earth2me/essentials/ManagedFile.java +++ b/Essentials/src/com/earth2me/essentials/ManagedFile.java @@ -1,6 +1,7 @@ package com.earth2me.essentials; import static com.earth2me.essentials.I18n._; +import com.earth2me.essentials.api.IEssentials; import java.io.*; import java.math.BigInteger; import java.security.DigestInputStream; diff --git a/Essentials/src/com/earth2me/essentials/OfflinePlayer.java b/Essentials/src/com/earth2me/essentials/OfflinePlayer.java index 097c4c883..42c00ac0a 100644 --- a/Essentials/src/com/earth2me/essentials/OfflinePlayer.java +++ b/Essentials/src/com/earth2me/essentials/OfflinePlayer.java @@ -23,7 +23,7 @@ import org.bukkit.plugin.Plugin; import org.bukkit.util.Vector; -public class OfflinePlayer implements Player +/*public class OfflinePlayer implements Player { private final transient IEssentials ess; private transient Location location = new Location(null, 0, 0, 0, 0, 0); @@ -830,3 +830,4 @@ public class OfflinePlayer implements Player } } } +*/
\ No newline at end of file diff --git a/Essentials/src/com/earth2me/essentials/PlayerExtension.java b/Essentials/src/com/earth2me/essentials/PlayerExtension.java index 7c52e40d1..a6f7a08c4 100644 --- a/Essentials/src/com/earth2me/essentials/PlayerExtension.java +++ b/Essentials/src/com/earth2me/essentials/PlayerExtension.java @@ -11,7 +11,7 @@ import org.bukkit.permissions.Permissible; import org.bukkit.permissions.ServerOperator; -public class PlayerExtension implements Player +/*public class PlayerExtension implements Player { @Delegate(types = { @@ -35,4 +35,4 @@ public class PlayerExtension implements Player { return this.base = base; } -} +}*/ diff --git a/Essentials/src/com/earth2me/essentials/Settings.java b/Essentials/src/com/earth2me/essentials/Settings.java index 682eedaf9..da3a718b6 100644 --- a/Essentials/src/com/earth2me/essentials/Settings.java +++ b/Essentials/src/com/earth2me/essentials/Settings.java @@ -11,7 +11,7 @@ import org.bukkit.event.Event.Priority; import org.bukkit.inventory.ItemStack; -public class Settings implements ISettings +/*public class Settings implements ISettings { private final transient EssentialsConf config; private final static Logger logger = Logger.getLogger("Minecraft"); @@ -612,4 +612,35 @@ public class Settings implements ISettings { return config.getLong("tpa-accept-cancellation", 0); } + + @Override + public com.earth2me.essentials.settings.Settings getData() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void acquireReadLock() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void acquireWriteLock() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void close() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void unlock() + { + throw new UnsupportedOperationException("Not supported yet."); + } } +*/
\ No newline at end of file diff --git a/Essentials/src/com/earth2me/essentials/Teleport.java b/Essentials/src/com/earth2me/essentials/Teleport.java index 9c21ffc6d..4dac70321 100644 --- a/Essentials/src/com/earth2me/essentials/Teleport.java +++ b/Essentials/src/com/earth2me/essentials/Teleport.java @@ -1,11 +1,17 @@ package com.earth2me.essentials; import com.earth2me.essentials.api.ITeleport; +import com.earth2me.essentials.api.IUser; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.ISettings; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.commands.NotEnoughArgumentsException; +import com.earth2me.essentials.user.CooldownException; +import com.earth2me.essentials.user.UserData.TimestampType; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.logging.Logger; +import lombok.Cleanup; import org.bukkit.Location; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; @@ -112,7 +118,7 @@ public class Teleport implements Runnable, ITeleport } catch (Throwable ex) { - ess.showError(user.getBase(), ex, "teleport"); + ess.getCommandHandler().showCommandError(user.getBase(), "teleport", ex); } } catch (Exception ex) @@ -139,30 +145,21 @@ public class Teleport implements Runnable, ITeleport public void warp(String warp, Trade chargeFor, TeleportCause cause) throws Exception { - Location loc = ess.getWarps().getWarp(warp); + final Location loc = ess.getWarps().getWarp(warp); teleport(new Target(loc), chargeFor, cause); user.sendMessage(_("warpingTo", warp)); } public void cooldown(boolean check) throws Exception { - Calendar now = new GregorianCalendar(); - if (user.getLastTeleportTimestamp() > 0) + try { - double cooldown = ess.getSettings().getTeleportCooldown(); - Calendar cooldownTime = new GregorianCalendar(); - cooldownTime.setTimeInMillis(user.getLastTeleportTimestamp()); - cooldownTime.add(Calendar.SECOND, (int)cooldown); - cooldownTime.add(Calendar.MILLISECOND, (int)((cooldown * 1000.0) % 1000.0)); - if (cooldownTime.after(now) && !user.isAuthorized("essentials.teleport.cooldown.bypass")) - { - throw new Exception(_("timeBeforeTeleport", Util.formatDateDiff(cooldownTime.getTimeInMillis()))); - } + user.checkCooldown(TimestampType.LASTTELEPORT, ess.getGroups().getTeleportCooldown(user), !check, "essentials.teleport.cooldown.bypass"); } - // if justCheck is set, don't update lastTeleport; we're just checking - if (!check) + catch (CooldownException ex) { - user.setLastTeleportTimestamp(now.getTimeInMillis()); + throw new Exception(_("timeBeforeTeleport", ex.getMessage())); + } } @@ -190,7 +187,7 @@ public class Teleport implements Runnable, ITeleport { cancel(false); } - + public void teleport(Location loc, Trade chargeFor) throws Exception { teleport(new Target(loc), chargeFor, TeleportCause.PLUGIN); @@ -208,7 +205,7 @@ public class Teleport implements Runnable, ITeleport private void teleport(Target target, Trade chargeFor, TeleportCause cause) throws Exception { - double delay = ess.getSettings().getTeleportDelay(); + double delay = ess.getGroups().getTeleportDelay(user); if (chargeFor != null) { @@ -270,12 +267,28 @@ public class Teleport implements Runnable, ITeleport public void back(Trade chargeFor) throws Exception { - teleport(new Target(user.getLastLocation()), chargeFor, TeleportCause.COMMAND); + user.acquireReadLock(); + try + { + teleport(new Target(user.getData().getLastLocation()), chargeFor, TeleportCause.COMMAND); + } + finally + { + user.unlock(); + } } public void back() throws Exception { - now(new Target(user.getLastLocation()), TeleportCause.COMMAND); + user.acquireReadLock(); + try + { + now(new Target(user.getData().getLastLocation()), TeleportCause.COMMAND); + } + finally + { + user.unlock(); + } } public void home(IUser user, String home, Trade chargeFor) throws Exception diff --git a/Essentials/src/com/earth2me/essentials/Trade.java b/Essentials/src/com/earth2me/essentials/Trade.java index 6cd9ce93a..50e32d7bd 100644 --- a/Essentials/src/com/earth2me/essentials/Trade.java +++ b/Essentials/src/com/earth2me/essentials/Trade.java @@ -1,6 +1,9 @@ package com.earth2me.essentials; import com.earth2me.essentials.craftbukkit.InventoryWorkaround; +import com.earth2me.essentials.api.IUser; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.ISettings; import com.earth2me.essentials.craftbukkit.SetExpFix; import static com.earth2me.essentials.I18n._; import java.io.File; @@ -12,6 +15,7 @@ import java.util.Locale; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; +import lombok.Cleanup; import org.bukkit.Location; import org.bukkit.inventory.ItemStack; @@ -38,7 +42,7 @@ public class Trade { this(null, null, items, null, ess); } - + public Trade(final int exp, final IEssentials ess) { this(null, null, null, exp, ess); @@ -70,18 +74,23 @@ public class Trade throw new ChargeException(_("missingItems", getItemStack().getAmount(), getItemStack().getType().toString().toLowerCase(Locale.ENGLISH).replace("_", " "))); } + @Cleanup + final ISettings settings = ess.getSettings(); + settings.acquireReadLock(); + if (command != null && !command.isEmpty() && !user.isAuthorized("essentials.nocommandcost.all") && !user.isAuthorized("essentials.nocommandcost." + command) - && mon < ess.getSettings().getCommandCost(command.charAt(0) == '/' ? command.substring(1) : command) - && 0 < ess.getSettings().getCommandCost(command.charAt(0) == '/' ? command.substring(1) : command) + && mon < settings.getData().getEconomy().getCommandCost(command.charAt(0) == '/' ? command.substring(1) : command) + && 0 < settings.getData().getEconomy().getCommandCost(command.charAt(0) == '/' ? command.substring(1) : command) && !user.isAuthorized("essentials.eco.loan")) { throw new ChargeException(_("notEnoughMoney")); } - - if (exp != null && exp > 0 - && SetExpFix.getTotalExperience(user) < exp) { + + if (exp != null && exp > 0 + && SetExpFix.getTotalExperience(user) < exp) + { throw new ChargeException(_("notEnoughExperience")); } } @@ -145,8 +154,11 @@ public class Trade && !user.isAuthorized("essentials.nocommandcost.all") && !user.isAuthorized("essentials.nocommandcost." + command)) { + @Cleanup + final ISettings settings = ess.getSettings(); + settings.acquireReadLock(); final double mon = user.getMoney(); - final double cost = ess.getSettings().getCommandCost(command.charAt(0) == '/' ? command.substring(1) : command); + final double cost = settings.getData().getEconomy().getCommandCost(command.charAt(0) == '/' ? command.substring(1) : command); if (mon < cost && cost > 0 && !user.isAuthorized("essentials.eco.loan")) { throw new ChargeException(_("notEnoughMoney")); @@ -173,7 +185,7 @@ public class Trade { return itemStack; } - + public Integer getExperience() { return exp; @@ -182,7 +194,10 @@ public class Trade public static void log(String type, String subtype, String event, String sender, Trade charge, String receiver, Trade pay, Location loc, IEssentials ess) { - if (!ess.getSettings().isEcoLogEnabled()) + @Cleanup + final ISettings settings = ess.getSettings(); + settings.acquireReadLock(); + if (!settings.getData().getEconomy().isLogEnabled()) { return; } @@ -222,7 +237,7 @@ public class Trade { sb.append(charge.getMoney()).append(","); sb.append("money").append(","); - sb.append(ess.getSettings().getCurrencySymbol()); + sb.append(settings.getData().getEconomy().getCurrencySymbol()); } if (charge.getExperience() != null) { @@ -253,7 +268,7 @@ public class Trade { sb.append(pay.getMoney()).append(","); sb.append("money").append(","); - sb.append(ess.getSettings().getCurrencySymbol()); + sb.append(settings.getData().getEconomy().getCurrencySymbol()); } if (pay.getExperience() != null) { diff --git a/Essentials/src/com/earth2me/essentials/User.java b/Essentials/src/com/earth2me/essentials/User.java index daf756e5b..cc60ec009 100644 --- a/Essentials/src/com/earth2me/essentials/User.java +++ b/Essentials/src/com/earth2me/essentials/User.java @@ -3,6 +3,8 @@ package com.earth2me.essentials; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.commands.IEssentialsCommand; import com.earth2me.essentials.register.payment.Method; +import com.earth2me.essentials.user.CooldownException; +import com.earth2me.essentials.user.UserData.TimestampType; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.logging.Level; @@ -12,7 +14,7 @@ import org.bukkit.Location; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; - +/*@Deprecated public class User extends UserData implements Comparable<User>, IReplyTo, IUser { private CommandSender replyTo = null; @@ -543,5 +545,53 @@ public class User extends UserData implements Comparable<User>, IReplyTo, IUser public long getTeleportRequestTime() { return teleportRequestTime; - } -} + } + + @Override + public void onReload() + { + reloadConfig(); + } + + @Override + public void checkCooldown(TimestampType cooldownType, double cooldown, boolean set, String bypassPermission) throws CooldownException + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public com.earth2me.essentials.user.UserData getData() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void acquireReadLock() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void acquireWriteLock() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void close() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void unlock() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void updateDisplayName() + { + throw new UnsupportedOperationException("Not supported yet."); + } +}*/ diff --git a/Essentials/src/com/earth2me/essentials/UserData.java b/Essentials/src/com/earth2me/essentials/UserData.java index 9df1b0342..b72a5d516 100644 --- a/Essentials/src/com/earth2me/essentials/UserData.java +++ b/Essentials/src/com/earth2me/essentials/UserData.java @@ -8,7 +8,7 @@ import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; - +/*@Deprecated public abstract class UserData extends PlayerExtension implements IConf { protected final transient IEssentials ess; @@ -872,4 +872,4 @@ public abstract class UserData extends PlayerExtension implements IConf { config.save(); } -} +}*/ diff --git a/Essentials/src/com/earth2me/essentials/UserMap.java b/Essentials/src/com/earth2me/essentials/UserMap.java index f6b75c3a5..4c3f338ec 100644 --- a/Essentials/src/com/earth2me/essentials/UserMap.java +++ b/Essentials/src/com/earth2me/essentials/UserMap.java @@ -1,5 +1,6 @@ package com.earth2me.essentials; +import com.earth2me.essentials.api.IUserMap; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; @@ -12,8 +13,8 @@ import java.util.concurrent.ConcurrentSkipListSet; import java.util.concurrent.ExecutionException; import org.bukkit.entity.Player; - -public class UserMap extends CacheLoader<String, User> implements IConf +/*@Deprecated +public class UserMap extends CacheLoader<String, User> implements IConf, IUserMap { private final transient IEssentials ess; private final transient Cache<String, User> users = CacheBuilder.newBuilder().softValues().build(this); @@ -121,4 +122,10 @@ public class UserMap extends CacheLoader<String, User> implements IConf final File userFolder = new File(ess.getDataFolder(), "userdata"); return new File(userFolder, Util.sanitizeFileName(name) + ".yml"); } -} + + @Override + public void onReload() + { + loadAllUsersAsync(ess); + } +}*/ diff --git a/Essentials/src/com/earth2me/essentials/Util.java b/Essentials/src/com/earth2me/essentials/Util.java index 6a1df197f..2df4322b9 100644 --- a/Essentials/src/com/earth2me/essentials/Util.java +++ b/Essentials/src/com/earth2me/essentials/Util.java @@ -1,30 +1,91 @@ package com.earth2me.essentials; import static com.earth2me.essentials.I18n._; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.ISettings; +import com.earth2me.essentials.api.InvalidNameException; +import com.earth2me.essentials.external.gnu.inet.encoding.Punycode; +import com.earth2me.essentials.external.gnu.inet.encoding.PunycodeException; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.*; +import java.util.logging.Level; import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; +import lombok.Cleanup; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.entity.LivingEntity; import org.bukkit.inventory.ItemStack; +import org.bukkit.permissions.Permission; +import org.bukkit.permissions.PermissionDefault; +import org.bukkit.plugin.PluginManager; -public class Util +public final class Util { private Util() { } private final static Logger logger = Logger.getLogger("Minecraft"); + private static Pattern unsafeChars = Pattern.compile("[^a-z0-9]"); + private static Pattern unsafeFileChars = Pattern.compile("[\u0000-\u001f]+"); - public static String sanitizeFileName(String name) + public static String sanitizeFileName(String name) throws InvalidNameException { - return name.toLowerCase(Locale.ENGLISH).replaceAll("[^a-z0-9]", "_"); + try + { + String r = name.toLowerCase(Locale.ENGLISH); + r = r.replace('.', (char)('\ue200'+'.')); + r = r.replace('\\', (char)('\ue200'+'\\')); + r = r.replace('/', (char)('\ue200'+'/')); + r = r.replace('"', (char)('\ue200'+'"')); + r = r.replace('<', (char)('\ue200'+'<')); + r = r.replace('>', (char)('\ue200'+'>')); + r = r.replace('|', (char)('\ue200'+'|')); + r = r.replace('?', (char)('\ue200'+'?')); + r = r.replace('*', (char)('\ue200'+'*')); + r = r.replace(':', (char)('\ue200'+':')); + r = r.replace('-', (char)('\ue200'+'-')); + r = unsafeFileChars.matcher(r).replaceAll(""); + return Punycode.encode(r); + } + catch (PunycodeException ex) + { + throw new InvalidNameException(ex); + } + } + + public static String decodeFileName(String name) throws InvalidNameException + { + try + { + String r = Punycode.decode(name); + r = r.replace((char)('\ue200'+'.'), '.'); + r = r.replace((char)('\ue200'+'\\'), '\\'); + r = r.replace((char)('\ue200'+'/'), '/'); + r = r.replace((char)('\ue200'+'"'), '"'); + r = r.replace((char)('\ue200'+'<'), '<'); + r = r.replace((char)('\ue200'+'>'), '>'); + r = r.replace((char)('\ue200'+'|'), '|'); + r = r.replace((char)('\ue200'+'?'), '?'); + r = r.replace((char)('\ue200'+'*'), '*'); + r = r.replace((char)('\ue200'+':'), ':'); + r = r.replace((char)('\ue200'+'-'), '-'); + return r; + } + catch (PunycodeException ex) + { + throw new InvalidNameException(ex); + } + } + + public static String sanitizeKey(String name) + { + return unsafeChars.matcher(name.toLowerCase(Locale.ENGLISH)).replaceAll("_"); } public static String formatDateDiff(long date) @@ -418,7 +479,10 @@ public class Util public static String formatCurrency(final double value, final IEssentials ess) { - String str = ess.getSettings().getCurrencySymbol() + df.format(value); + @Cleanup + final ISettings settings = ess.getSettings(); + settings.acquireReadLock(); + String str = settings.getData().getEconomy().getCurrencySymbol() + df.format(value); if (str.endsWith(".00")) { str = str.substring(0, str.length() - 3); @@ -477,6 +541,46 @@ public class Util } return buf.toString(); } + + public static void registerPermissions(String path, Collection<String> nodes, boolean hasDefault, IEssentials ess) + { + if (nodes == null || nodes.isEmpty()) + { + return; + } + final PluginManager pluginManager = ess.getServer().getPluginManager(); + Permission basePerm = pluginManager.getPermission(path + ".*"); + if (basePerm != null && !basePerm.getChildren().isEmpty()) + { + basePerm.getChildren().clear(); + } + if (basePerm == null) + { + basePerm = new Permission(path + ".*", PermissionDefault.OP); + pluginManager.addPermission(basePerm); + Permission mainPerm = pluginManager.getPermission("essentials.*"); + if (mainPerm == null) + { + mainPerm = new Permission("essentials.*", PermissionDefault.OP); + pluginManager.addPermission(mainPerm); + } + mainPerm.getChildren().put(basePerm.getName(), Boolean.TRUE); + } + + for (String nodeName : nodes) + { + final String permissionName = path + "." + nodeName; + Permission perm = pluginManager.getPermission(permissionName); + if (perm == null) + { + final PermissionDefault defaultPerm = hasDefault && nodeName.equalsIgnoreCase("default") ? PermissionDefault.TRUE : PermissionDefault.OP; + perm = new Permission(permissionName, defaultPerm); + pluginManager.addPermission(perm); + } + basePerm.getChildren().put(permissionName, Boolean.TRUE); + } + basePerm.recalculatePermissibles(); + } private static transient final Pattern COLOR_PATTERN = Pattern.compile("(?i)\u00A7[0-9A-F]"); public static String stripColor(final String input) diff --git a/Essentials/src/com/earth2me/essentials/Warps.java b/Essentials/src/com/earth2me/essentials/Warps.java index 57326b54a..f710d2722 100644 --- a/Essentials/src/com/earth2me/essentials/Warps.java +++ b/Essentials/src/com/earth2me/essentials/Warps.java @@ -1,120 +1,115 @@ package com.earth2me.essentials; import static com.earth2me.essentials.I18n._; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.IWarp; +import com.earth2me.essentials.api.IWarps; +import com.earth2me.essentials.api.InvalidNameException; +import com.earth2me.essentials.settings.WarpHolder; +import com.earth2me.essentials.storage.StorageObjectMap; import java.io.File; import java.util.*; -import java.util.logging.Level; import java.util.logging.Logger; +import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.Server; -public class Warps implements IConf +public class Warps extends StorageObjectMap<IWarp> implements IWarps { - private static final Logger logger = Logger.getLogger("Minecraft"); - private final Map<StringIgnoreCase, EssentialsConf> warpPoints = new HashMap<StringIgnoreCase, EssentialsConf>(); - private final File warpsFolder; - private final Server server; + private static final Logger logger = Bukkit.getLogger(); - public Warps(Server server, File dataFolder) + public Warps(IEssentials ess) { - this.server = server; - warpsFolder = new File(dataFolder, "warps"); - if (!warpsFolder.exists()) - { - warpsFolder.mkdirs(); - } - reloadConfig(); + super(ess, "warps"); } + @Override public boolean isEmpty() { - return warpPoints.isEmpty(); + return getKeySize() == 0; } - public Collection<String> getWarpNames() + @Override + public Collection<String> getList() { - final List<String> keys = new ArrayList<String>(); - for (StringIgnoreCase stringIgnoreCase : warpPoints.keySet()) + final List<String> names = new ArrayList<String>(); + for (String key : getAllKeys()) { - keys.add(stringIgnoreCase.getString()); + IWarp warp = getObject(key); + if (warp == null) + { + continue; + } + warp.acquireReadLock(); + try + { + names.add(warp.getData().getName()); + } + finally + { + warp.unlock(); + } } - Collections.sort(keys, String.CASE_INSENSITIVE_ORDER); - return keys; + Collections.sort(names, String.CASE_INSENSITIVE_ORDER); + return names; } - public Location getWarp(String warp) throws Exception + @Override + public Location getWarp(final String name) throws Exception { - EssentialsConf conf = warpPoints.get(new StringIgnoreCase(warp)); - if (conf == null) + IWarp warp = getObject(name); + if (warp == null) { throw new Exception(_("warpNotExist")); } - return conf.getLocation(null, server); - } - - public void setWarp(String name, Location loc) throws Exception - { - String filename = Util.sanitizeFileName(name); - EssentialsConf conf = warpPoints.get(new StringIgnoreCase(name)); - if (conf == null) + warp.acquireReadLock(); + try { - File confFile = new File(warpsFolder, filename + ".yml"); - if (confFile.exists()) - { - throw new Exception(_("similarWarpExist")); - } - conf = new EssentialsConf(confFile); - warpPoints.put(new StringIgnoreCase(name), conf); + return warp.getData().getLocation(); + } + finally + { + warp.unlock(); } - conf.setProperty(null, loc); - conf.setProperty("name", name); - conf.save(); } - public void delWarp(String name) throws Exception + @Override + public void setWarp(final String name, final Location loc) throws Exception { - EssentialsConf conf = warpPoints.get(new StringIgnoreCase(name)); - if (conf == null) + IWarp warp = getObject(name); + if (warp == null) { - throw new Exception(_("warpNotExist")); + warp = new WarpHolder(name, ess); + } + warp.acquireWriteLock(); + try + { + warp.getData().setLocation(loc); } - if (!conf.getFile().delete()) + finally { - throw new Exception(_("warpDeleteError")); + warp.unlock(); } - warpPoints.remove(new StringIgnoreCase(name)); } @Override - public final void reloadConfig() + public void removeWarp(final String name) throws Exception { - warpPoints.clear(); - File[] listOfFiles = warpsFolder.listFiles(); - if (listOfFiles.length >= 1) - { - for (int i = 0; i < listOfFiles.length; i++) - { - String filename = listOfFiles[i].getName(); - if (listOfFiles[i].isFile() && filename.endsWith(".yml")) - { - try - { - EssentialsConf conf = new EssentialsConf(listOfFiles[i]); - conf.load(); - String name = conf.getString("name"); - if (name != null) - { - warpPoints.put(new StringIgnoreCase(name), conf); - } - } - catch (Exception ex) - { - logger.log(Level.WARNING, _("loadWarpError", filename), ex); - } - } - } - } + removeObject(name); + } + + @Override + public File getWarpFile(String name) throws InvalidNameException + { + return getStorageFile(name); + } + + @Override + public IWarp load(String name) throws Exception + { + final IWarp warp = new WarpHolder(name, ess); + warp.onReload(); + return warp; } diff --git a/Essentials/src/com/earth2me/essentials/Worth.java b/Essentials/src/com/earth2me/essentials/Worth.java index b597bd3e8..e970f2757 100644 --- a/Essentials/src/com/earth2me/essentials/Worth.java +++ b/Essentials/src/com/earth2me/essentials/Worth.java @@ -1,12 +1,13 @@ package com.earth2me.essentials; +import com.earth2me.essentials.api.IWorth; import java.io.File; import java.util.Locale; import java.util.logging.Logger; import org.bukkit.inventory.ItemStack; -public class Worth implements IConf +public class Worth implements IWorth { private static final Logger logger = Logger.getLogger("Minecraft"); private final EssentialsConf config; @@ -54,7 +55,7 @@ public class Worth implements IConf } @Override - public void reloadConfig() + public void onReload() { config.load(); } diff --git a/Essentials/src/com/earth2me/essentials/api/Economy.java b/Essentials/src/com/earth2me/essentials/api/Economy.java index 1d45c8df9..b004cd691 100644 --- a/Essentials/src/com/earth2me/essentials/api/Economy.java +++ b/Essentials/src/com/earth2me/essentials/api/Economy.java @@ -2,12 +2,14 @@ package com.earth2me.essentials.api; import com.earth2me.essentials.EssentialsConf; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.IEssentials; -import com.earth2me.essentials.User; import com.earth2me.essentials.Util; +import com.earth2me.essentials.craftbukkit.DummyOfflinePlayer; +import com.earth2me.essentials.user.User; import java.io.File; import java.util.logging.Level; import java.util.logging.Logger; +import lombok.Cleanup; +import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -39,11 +41,28 @@ public final class Economy { folder.mkdirs(); } - EssentialsConf npcConfig = new EssentialsConf(new File(folder, Util.sanitizeFileName(name) + ".yml")); + double startingBalance = 0; + ISettings settings = ess.getSettings(); + settings.acquireReadLock(); + try { + startingBalance = settings.getData().getEconomy().getStartingBalance(); + } finally { + settings.unlock(); + } + IUser npc = new User(new DummyOfflinePlayer(name), ess); + npc.acquireWriteLock(); + try { + npc.getData().setNpc(true); + npc.setMoney(startingBalance); + } finally { + npc.unlock(); + } + + /*EssentialsConf npcConfig = new EssentialsConf(new File(folder, Util.sanitizeFileName(name) + ".yml")); npcConfig.load(); npcConfig.setProperty("npc", true); npcConfig.setProperty("money", ess.getSettings().getStartingBalance()); - npcConfig.save(); + npcConfig.save();*/ } private static void deleteNPC(String name) @@ -53,26 +72,35 @@ public final class Economy { folder.mkdirs(); } - File config = new File(folder, Util.sanitizeFileName(name) + ".yml"); - EssentialsConf npcConfig = new EssentialsConf(config); - npcConfig.load(); - if (npcConfig.hasProperty("npc") && npcConfig.getBoolean("npc", false)) - { - if (!config.delete()) - { - logger.log(Level.WARNING, _("deleteFileError", config)); + IUser user = ess.getUser(name); + if (user != null) { + boolean npc = false; + user.acquireReadLock(); + try { + npc = user.getData().isNpc(); + } finally { + user.unlock(); + } + if (npc) { + try + { + ess.getUserMap().removeUser(name); + } + catch (InvalidNameException ex) + { + Bukkit.getLogger().log(Level.INFO, name, ex); + } } - ess.getUserMap().removeUser(name); } } - private static User getUserByName(String name) + private static IUser getUserByName(String name) { if (ess == null) { throw new RuntimeException(noCallBeforeLoad); } - User user; + IUser user; Player player = ess.getServer().getPlayer(name); if (player != null) { @@ -80,7 +108,7 @@ public final class Economy } else { - user = ess.getOfflineUser(name); + user = ess.getUser(name); } return user; } @@ -93,7 +121,7 @@ public final class Economy */ public static double getMoney(String name) throws UserDoesNotExistException { - User user = getUserByName(name); + IUser user = getUserByName(name); if (user == null) { throw new UserDoesNotExistException(name); @@ -110,7 +138,7 @@ public final class Economy */ public static void setMoney(String name, double balance) throws UserDoesNotExistException, NoLoanPermittedException { - User user = getUserByName(name); + IUser user = getUserByName(name); if (user == null) { throw new UserDoesNotExistException(name); @@ -186,7 +214,15 @@ public final class Economy { throw new RuntimeException(noCallBeforeLoad); } - setMoney(name, ess.getSettings().getStartingBalance()); + double startingBalance = 0; + ISettings settings = ess.getSettings(); + settings.acquireReadLock(); + try { + startingBalance = settings.getData().getEconomy().getStartingBalance(); + } finally { + settings.unlock(); + } + setMoney(name, startingBalance); } /** @@ -266,12 +302,14 @@ public final class Economy */ public static boolean isNPC(String name) throws UserDoesNotExistException { - User user = getUserByName(name); + @Cleanup + IUser user = getUserByName(name); if (user == null) { throw new UserDoesNotExistException(name); } - return user.isNPC(); + user.acquireReadLock(); + return user.getData().isNpc(); } /** @@ -281,7 +319,7 @@ public final class Economy */ public static boolean createNPC(String name) { - User user = getUserByName(name); + IUser user = getUserByName(name); if (user == null) { createNPCFile(name); @@ -297,7 +335,7 @@ public final class Economy */ public static void removeNPC(String name) throws UserDoesNotExistException { - User user = getUserByName(name); + IUser user = getUserByName(name); if (user == null) { throw new UserDoesNotExistException(name); diff --git a/Essentials/src/com/earth2me/essentials/api/IAlternativeCommandsHandler.java b/Essentials/src/com/earth2me/essentials/api/IAlternativeCommandsHandler.java index 11619bca4..f28174753 100644 --- a/Essentials/src/com/earth2me/essentials/api/IAlternativeCommandsHandler.java +++ b/Essentials/src/com/earth2me/essentials/api/IAlternativeCommandsHandler.java @@ -2,9 +2,14 @@ package com.earth2me.essentials.api; import java.util.Map; import org.bukkit.command.PluginCommand; +import org.bukkit.plugin.Plugin; public interface IAlternativeCommandsHandler { Map<String, String> disabledCommands(); + + public void removePlugin(Plugin plugin); + + public void addPlugin(Plugin plugin); } diff --git a/Essentials/src/com/earth2me/essentials/api/IBackup.java b/Essentials/src/com/earth2me/essentials/api/IBackup.java new file mode 100644 index 000000000..8af074c54 --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/api/IBackup.java @@ -0,0 +1,7 @@ +package com.earth2me.essentials.api; + + +public interface IBackup extends Runnable +{ + public void startTask(); +} diff --git a/Essentials/src/com/earth2me/essentials/api/ICommandHandler.java b/Essentials/src/com/earth2me/essentials/api/ICommandHandler.java new file mode 100644 index 000000000..f756c16c4 --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/api/ICommandHandler.java @@ -0,0 +1,20 @@ +package com.earth2me.essentials.api; + +import java.util.Map; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.Plugin; + + +public interface ICommandHandler extends IReload +{ + Map<String, String> disabledCommands(); + + public void removePlugin(Plugin plugin); + + public void addPlugin(Plugin plugin); + + boolean handleCommand(CommandSender sender, Command command, String commandLabel, String[] args); + + void showCommandError(CommandSender sender, String commandLabel, Throwable exception); +} diff --git a/Essentials/src/com/earth2me/essentials/api/IEssentials.java b/Essentials/src/com/earth2me/essentials/api/IEssentials.java index c04bed0bd..c7dc9483d 100644 --- a/Essentials/src/com/earth2me/essentials/api/IEssentials.java +++ b/Essentials/src/com/earth2me/essentials/api/IEssentials.java @@ -1,17 +1,22 @@ package com.earth2me.essentials.api; +import com.earth2me.essentials.listener.TNTExplodeListener; import com.earth2me.essentials.perm.IPermissionsHandler; import com.earth2me.essentials.register.payment.Methods; import org.bukkit.World; +import org.bukkit.command.Command; import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; -public interface IEssentials extends Plugin, IReload +public interface IEssentials extends Plugin { void addReloadListener(IReload listener); - IUser getUser(Object base); + IUser getUser(Player player); + + IUser getUser(String playerName); int broadcastMessage(IUser sender, String message); @@ -19,7 +24,9 @@ public interface IEssentials extends Plugin, IReload ISettings getSettings(); - IJails getJail(); + IGroups getGroups(); + + IJails getJails(); IWarps getWarps(); @@ -29,7 +36,11 @@ public interface IEssentials extends Plugin, IReload IUserMap getUserMap(); + IBackup getBackup(); + IEssentialsEconomy getEconomy(); + + ICommandHandler getCommandHandler(); World getWorld(String name); @@ -44,8 +55,8 @@ public interface IEssentials extends Plugin, IReload int scheduleSyncRepeatingTask(Runnable run, long delay, long period); IPermissionsHandler getPermissionsHandler(); + + void reload(); - IAlternativeCommandsHandler getAlternativeCommandsHandler(); - - void showCommandError(CommandSender sender, String commandLabel, Throwable exception); + TNTExplodeListener getTNTListener(); } diff --git a/Essentials/src/com/earth2me/essentials/IEssentialsModule.java b/Essentials/src/com/earth2me/essentials/api/IEssentialsModule.java index 69a1a494c..eea919f9d 100644 --- a/Essentials/src/com/earth2me/essentials/IEssentialsModule.java +++ b/Essentials/src/com/earth2me/essentials/api/IEssentialsModule.java @@ -1,5 +1,4 @@ -package com.earth2me.essentials; - +package com.earth2me.essentials.api; public interface IEssentialsModule { diff --git a/Essentials/src/com/earth2me/essentials/api/IGroups.java b/Essentials/src/com/earth2me/essentials/api/IGroups.java new file mode 100644 index 000000000..ba3751014 --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/api/IGroups.java @@ -0,0 +1,20 @@ +package com.earth2me.essentials.api; + +import com.earth2me.essentials.settings.Groups; +import com.earth2me.essentials.storage.IStorageObjectHolder; + + +public interface IGroups extends IStorageObjectHolder<Groups> +{ + double getHealCooldown(IUser player); + + double getTeleportCooldown(IUser player); + + double getTeleportDelay(IUser player); + + String getPrefix(IUser player); + + String getSuffix(IUser player); + + int getHomeLimit(IUser player); +} diff --git a/Essentials/src/com/earth2me/essentials/api/IItemDb.java b/Essentials/src/com/earth2me/essentials/api/IItemDb.java index ee4819215..b37d9e1a2 100644 --- a/Essentials/src/com/earth2me/essentials/api/IItemDb.java +++ b/Essentials/src/com/earth2me/essentials/api/IItemDb.java @@ -3,7 +3,7 @@ package com.earth2me.essentials.api; import org.bukkit.inventory.ItemStack; -public interface IItemDb +public interface IItemDb extends IReload { ItemStack get(final String name, final int quantity) throws Exception; diff --git a/Essentials/src/com/earth2me/essentials/api/IJails.java b/Essentials/src/com/earth2me/essentials/api/IJails.java index 18866d8e5..caa1ee0a8 100644 --- a/Essentials/src/com/earth2me/essentials/api/IJails.java +++ b/Essentials/src/com/earth2me/essentials/api/IJails.java @@ -12,7 +12,7 @@ public interface IJails extends IReload void removeJail(String jail) throws Exception; - void sendToJail(com.earth2me.essentials.IUser user, String jail) throws Exception; + void sendToJail(IUser user, String jail) throws Exception; void setJail(String jailName, Location loc) throws Exception; } diff --git a/Essentials/src/com/earth2me/essentials/api/IReplyTo.java b/Essentials/src/com/earth2me/essentials/api/IReplyTo.java new file mode 100644 index 000000000..c2a1deec5 --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/api/IReplyTo.java @@ -0,0 +1,9 @@ +package com.earth2me.essentials.api; + +import org.bukkit.command.CommandSender; + +public interface IReplyTo { + void setReplyTo(CommandSender user); + + CommandSender getReplyTo(); +} diff --git a/Essentials/src/com/earth2me/essentials/api/ISettings.java b/Essentials/src/com/earth2me/essentials/api/ISettings.java index eff65ad87..6943fba4b 100644 --- a/Essentials/src/com/earth2me/essentials/api/ISettings.java +++ b/Essentials/src/com/earth2me/essentials/api/ISettings.java @@ -6,5 +6,11 @@ import com.earth2me.essentials.storage.IStorageObjectHolder; public interface ISettings extends IStorageObjectHolder<Settings> { + + public String getLocale(); + + public boolean isDebug(); + + public void setDebug(boolean b); } diff --git a/Essentials/src/com/earth2me/essentials/api/ITeleport.java b/Essentials/src/com/earth2me/essentials/api/ITeleport.java index 5b9a19757..bcb018355 100644 --- a/Essentials/src/com/earth2me/essentials/api/ITeleport.java +++ b/Essentials/src/com/earth2me/essentials/api/ITeleport.java @@ -1,10 +1,28 @@ package com.earth2me.essentials.api; +import com.earth2me.essentials.Trade; import org.bukkit.Location; +import org.bukkit.entity.Entity; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; public interface ITeleport { void now(Location loc, boolean cooldown, TeleportCause cause) throws Exception; + + void now(Entity entity, boolean cooldown, TeleportCause cause) throws Exception; + + void back(Trade chargeFor) throws Exception; + + void teleport(Location bed, Trade charge, TeleportCause teleportCause) throws Exception; + + void teleport(Entity entity, Trade chargeFor, TeleportCause cause) throws Exception; + + void home(IUser player, String toLowerCase, Trade charge) throws Exception; + + void respawn(Trade charge, TeleportCause teleportCause) throws Exception; + + void back() throws Exception; + + public void warp(String name, Trade charge, TeleportCause teleportCause) throws Exception; } diff --git a/Essentials/src/com/earth2me/essentials/api/IUser.java b/Essentials/src/com/earth2me/essentials/api/IUser.java index 5d2f9d4b8..0352f3dce 100644 --- a/Essentials/src/com/earth2me/essentials/api/IUser.java +++ b/Essentials/src/com/earth2me/essentials/api/IUser.java @@ -1,32 +1,39 @@ package com.earth2me.essentials.api; import com.earth2me.essentials.commands.IEssentialsCommand; +import com.earth2me.essentials.storage.IStorageObjectHolder; +import com.earth2me.essentials.user.CooldownException; +import com.earth2me.essentials.user.UserData; +import java.util.List; import org.bukkit.Location; +import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -public interface IUser extends Player, IReload +public interface IUser extends Player, IStorageObjectHolder<UserData>, IReload, IReplyTo, Comparable<IUser> { - long getLastTeleportTimestamp(); - boolean isAuthorized(String node); boolean isAuthorized(IEssentialsCommand cmd); boolean isAuthorized(IEssentialsCommand cmd, String permissionPrefix); - void setLastTeleportTimestamp(long time); - - Location getLastLocation(); - Player getBase(); double getMoney(); void takeMoney(double value); + void takeMoney(double value, CommandSender initiator); + void giveMoney(double value); + void giveMoney(double value, CommandSender initiator); + + void setMoney(double value); + + void payUser(final IUser reciever, final double value) throws Exception; + String getGroup(); void setLastLocation(); @@ -36,8 +43,64 @@ public interface IUser extends Player, IReload Location getHome(Location loc) throws Exception; boolean isHidden(); - + ITeleport getTeleport(); - - void setJail(String jail); + + void checkCooldown(UserData.TimestampType cooldownType, double cooldown, boolean set, String bypassPermission) throws CooldownException; + + boolean toggleAfk(); + + void updateActivity(boolean broadcast); + + void updateDisplayName(); + + boolean checkJailTimeout(long currentTime); + + boolean checkMuteTimeout(long currentTime); + + boolean checkBanTimeout(long currentTime); + + long getTimestamp(UserData.TimestampType name); + + void setTimestamp(UserData.TimestampType name, long value); + + void setLastOnlineActivity(long currentTime); + + void checkActivity(); + + long getLastOnlineActivity(); + + boolean isGodModeEnabled(); + + boolean isIgnoringPlayer(String name); + + void setIgnoredPlayer(String name, boolean set); + + Location getAfkPosition(); + + boolean toggleGodModeEnabled(); + + void dispose(); + + void updateCompass(); + + List<String> getHomes(); + + void addMail(String string); + + boolean toggleMuted(); + + boolean toggleSocialSpy(); + + void requestTeleport(IUser user, boolean b); + + boolean isTeleportRequestHere(); + + IUser getTeleportRequester(); + + boolean toggleTeleportEnabled(); + + public boolean gotMailInfo(); + + public List<String> getMails(); } diff --git a/Essentials/src/com/earth2me/essentials/api/IUserMap.java b/Essentials/src/com/earth2me/essentials/api/IUserMap.java index 9e609ab37..fd65b89d2 100644 --- a/Essentials/src/com/earth2me/essentials/api/IUserMap.java +++ b/Essentials/src/com/earth2me/essentials/api/IUserMap.java @@ -2,19 +2,22 @@ package com.earth2me.essentials.api; import java.io.File; import java.util.Set; +import org.bukkit.entity.Player; -public interface IUserMap +public interface IUserMap extends IReload { boolean userExists(final String name); - IUser getUser(final String name); + IUser getUser(final Player player); + + IUser getUser(final String playerName); - void removeUser(final String name); + void removeUser(final String name) throws InvalidNameException; Set<String> getAllUniqueUsers(); int getUniqueUsers(); - File getUserFile(final String name); + File getUserFile(final String name) throws InvalidNameException; } diff --git a/Essentials/src/com/earth2me/essentials/api/IWarp.java b/Essentials/src/com/earth2me/essentials/api/IWarp.java new file mode 100644 index 000000000..82669b52f --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/api/IWarp.java @@ -0,0 +1,10 @@ +package com.earth2me.essentials.api; + +import com.earth2me.essentials.settings.Warp; +import com.earth2me.essentials.storage.IStorageObjectHolder; + + +public interface IWarp extends IStorageObjectHolder<Warp> +{ + +} diff --git a/Essentials/src/com/earth2me/essentials/api/IWarps.java b/Essentials/src/com/earth2me/essentials/api/IWarps.java index 14779e327..2a98ecc64 100644 --- a/Essentials/src/com/earth2me/essentials/api/IWarps.java +++ b/Essentials/src/com/earth2me/essentials/api/IWarps.java @@ -1,5 +1,6 @@ package com.earth2me.essentials.api; +import java.io.File; import java.util.Collection; import org.bukkit.Location; @@ -8,9 +9,13 @@ public interface IWarps extends IReload { Location getWarp(String warp) throws Exception; - Collection<String> getWarps(); + Collection<String> getList(); void removeWarp(String name) throws Exception; void setWarp(String name, Location loc) throws Exception; + + public boolean isEmpty(); + + public File getWarpFile(String name) throws InvalidNameException; } diff --git a/Essentials/src/com/earth2me/essentials/api/InvalidNameException.java b/Essentials/src/com/earth2me/essentials/api/InvalidNameException.java new file mode 100644 index 000000000..9f397ec20 --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/api/InvalidNameException.java @@ -0,0 +1,11 @@ +package com.earth2me.essentials.api; + + +public class InvalidNameException extends Exception +{ + + public InvalidNameException(Throwable thrwbl) + { + super(thrwbl); + } +} diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandafk.java b/Essentials/src/com/earth2me/essentials/commands/Commandafk.java index a1c83606c..dd1ccfb8e 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandafk.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandafk.java @@ -1,8 +1,9 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import org.bukkit.Server; +import org.bukkit.entity.Player; public class Commandafk extends EssentialsCommand @@ -13,11 +14,11 @@ public class Commandafk extends EssentialsCommand } @Override - public void run(Server server, User user, String commandLabel, String[] args) throws Exception + public void run(Server server, IUser user, String commandLabel, String[] args) throws Exception { if (args.length > 0 && user.isAuthorized("essentials.afk.others")) { - User afkUser = ess.getUser(ess.getServer().matchPlayer(args[0])); + IUser afkUser = ess.getUser((Player)ess.getServer().matchPlayer(args[0])); if (afkUser != null) { toggleAfk(afkUser); @@ -29,7 +30,7 @@ public class Commandafk extends EssentialsCommand } } - private void toggleAfk(User user) + private void toggleAfk(IUser user) { if (!user.toggleAfk()) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandantioch.java b/Essentials/src/com/earth2me/essentials/commands/Commandantioch.java index 54277d466..03eaa88ec 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandantioch.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandantioch.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.commands; -import com.earth2me.essentials.User; import com.earth2me.essentials.Util; +import com.earth2me.essentials.api.IUser; import org.bukkit.Location; import org.bukkit.Server; import org.bukkit.entity.TNTPrimed; @@ -15,7 +15,7 @@ public class Commandantioch extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { ess.broadcastMessage(user, "...lobbest thou thy Holy Hand Grenade of Antioch towards thy foe,"); ess.broadcastMessage(user, "who being naughty in My sight, shall snuff it."); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandback.java b/Essentials/src/com/earth2me/essentials/commands/Commandback.java index 67698598a..ae36087c2 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandback.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandback.java @@ -2,7 +2,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.Trade; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import org.bukkit.Server; @@ -14,7 +14,7 @@ public class Commandback extends EssentialsCommand } @Override - protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + protected void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { final Trade charge = new Trade(this.getName(), ess); charge.isAffordableFor(user); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandbackup.java b/Essentials/src/com/earth2me/essentials/commands/Commandbackup.java index 32c8c9e80..d1869e5b9 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandbackup.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandbackup.java @@ -1,6 +1,6 @@ package com.earth2me.essentials.commands; -import com.earth2me.essentials.Backup; +import com.earth2me.essentials.api.IBackup; import static com.earth2me.essentials.I18n._; import org.bukkit.Server; import org.bukkit.command.CommandSender; @@ -16,11 +16,7 @@ public class Commandbackup extends EssentialsCommand @Override protected void run(final Server server, final CommandSender sender, final String commandLabel, final String[] args) throws Exception { - final Backup backup = ess.getBackup(); - if (backup == null) - { - throw new Exception(); - } + final IBackup backup = ess.getBackup(); backup.run(); sender.sendMessage(_("backupStarted")); } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandbalance.java b/Essentials/src/com/earth2me/essentials/commands/Commandbalance.java index 58f164ad6..f04b0b136 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandbalance.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandbalance.java @@ -1,8 +1,8 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; import com.earth2me.essentials.Util; +import com.earth2me.essentials.api.IUser; import org.bukkit.Server; import org.bukkit.command.CommandSender; @@ -25,7 +25,7 @@ public class Commandbalance extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { final double bal = (args.length < 1 || !(user.isAuthorized("essentials.balance.others") diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandbalancetop.java b/Essentials/src/com/earth2me/essentials/commands/Commandbalancetop.java index 672f1c6ca..4b598d70d 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandbalancetop.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandbalancetop.java @@ -1,6 +1,6 @@ package com.earth2me.essentials.commands; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.Util; import com.earth2me.essentials.textreader.ArrayListInput; @@ -109,7 +109,7 @@ public class Commandbalancetop extends EssentialsCommand final Map<String, Double> balances = new HashMap<String, Double>(); for (String u : ess.getUserMap().getAllUniqueUsers()) { - final User user = ess.getUserMap().getUser(u); + final IUser user = ess.getUserMap().getUser(u); if (user != null) { balances.put(user.getDisplayName(), user.getMoney()); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandban.java b/Essentials/src/com/earth2me/essentials/commands/Commandban.java index d39419686..c360eeaba 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandban.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandban.java @@ -3,7 +3,9 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.Console; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.OfflinePlayer; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; +import com.earth2me.essentials.user.Ban; +import lombok.Cleanup; import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -23,11 +25,12 @@ public class Commandban extends EssentialsCommand { throw new NotEnoughArgumentsException(); } - final User user = getPlayer(server, args, 0, true); + @Cleanup + final IUser user = getPlayer(server, args, 0, true); if (user.getBase() instanceof OfflinePlayer) { if (sender instanceof Player - && !ess.getUser(sender).isAuthorized("essentials.ban.offline")) + && !ess.getUser((Player)sender).isAuthorized("essentials.ban.offline")) { sender.sendMessage(_("banExempt")); return; @@ -42,11 +45,13 @@ public class Commandban extends EssentialsCommand } } + user.acquireWriteLock(); String banReason; + user.getData().setBan(new Ban()); if (args.length > 1) { banReason = getFinalArg(args, 1); - user.setBanReason(banReason); + user.getData().getBan().setReason(banReason); } else { @@ -58,7 +63,7 @@ public class Commandban extends EssentialsCommand for (Player onlinePlayer : server.getOnlinePlayers()) { - final User player = ess.getUser(onlinePlayer); + final IUser player = ess.getUser(onlinePlayer); if (player.isAuthorized("essentials.ban.notify")) { onlinePlayer.sendMessage(_("playerBanned", senderName, user.getName(), banReason)); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandbanip.java b/Essentials/src/com/earth2me/essentials/commands/Commandbanip.java index 5459bd8fc..f067888f6 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandbanip.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandbanip.java @@ -1,7 +1,8 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; +import lombok.Cleanup; import org.bukkit.Server; import org.bukkit.command.CommandSender; @@ -21,7 +22,9 @@ public class Commandbanip extends EssentialsCommand throw new NotEnoughArgumentsException(); } - final User player = ess.getUser(args[0]); + @Cleanup + final IUser player = ess.getUser(args[0]); + player.acquireReadLock(); if (player == null) { @@ -30,12 +33,12 @@ public class Commandbanip extends EssentialsCommand } else { - final String ipAddress = player.getLastLoginAddress(); + final String ipAddress = player.getData().getIpAddress(); if (ipAddress.length() == 0) { throw new Exception(_("playerNotFound")); } - ess.getServer().banIP(player.getLastLoginAddress()); + ess.getServer().banIP(player.getData().getIpAddress()); sender.sendMessage(_("banIpAddress")); } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandbigtree.java b/Essentials/src/com/earth2me/essentials/commands/Commandbigtree.java index 78d557934..e1e486344 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandbigtree.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandbigtree.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import com.earth2me.essentials.Util; import org.bukkit.Location; import org.bukkit.Server; @@ -16,7 +16,7 @@ public class Commandbigtree extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { TreeType tree; if (args.length > 0 && args[0].equalsIgnoreCase("redwood")) diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandbreak.java b/Essentials/src/com/earth2me/essentials/commands/Commandbreak.java index 2691ad4f2..41b830488 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandbreak.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandbreak.java @@ -1,6 +1,6 @@ package com.earth2me.essentials.commands; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import org.bukkit.Material; import org.bukkit.Server; import org.bukkit.block.Block; @@ -16,7 +16,7 @@ public class Commandbreak extends EssentialsCommand //TODO: Switch to use util class @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { final Block block = user.getTargetBlock(null, 20); if (block == null) diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandclearinventory.java b/Essentials/src/com/earth2me/essentials/commands/Commandclearinventory.java index ef2502b9b..94d83f250 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandclearinventory.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandclearinventory.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import java.util.List; import org.bukkit.Server; import org.bukkit.command.CommandSender; @@ -17,7 +17,7 @@ public class Commandclearinventory extends EssentialsCommand //TODO: Cleanup @Override - public void run(Server server, User user, String commandLabel, String[] args) throws Exception + public void run(Server server, IUser user, String commandLabel, String[] args) throws Exception { if (args.length > 0 && user.isAuthorized("essentials.clearinventory.others")) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandcompass.java b/Essentials/src/com/earth2me/essentials/commands/Commandcompass.java index 25f8c34f6..3bb08967b 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandcompass.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandcompass.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import org.bukkit.Server; @@ -13,7 +13,7 @@ public class Commandcompass extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { final int bearing = (int)(user.getLocation().getYaw() + 180 + 360) % 360; String dir; diff --git a/Essentials/src/com/earth2me/essentials/commands/Commanddelhome.java b/Essentials/src/com/earth2me/essentials/commands/Commanddelhome.java index ce891985e..98b4a79ff 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commanddelhome.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commanddelhome.java @@ -1,10 +1,12 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import java.util.Locale; +import lombok.Cleanup; import org.bukkit.Server; import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; public class Commanddelhome extends EssentialsCommand @@ -22,7 +24,8 @@ public class Commanddelhome extends EssentialsCommand throw new NotEnoughArgumentsException(); } - User user = ess.getUser(sender); + @Cleanup + IUser user = sender instanceof Player ? ess.getUser((Player)sender) : null; String name; final String[] expandedArg = args[0].split(":"); @@ -45,7 +48,8 @@ public class Commanddelhome extends EssentialsCommand * throw new Exception("You cannot remove the vanilla home point"); * } */ - user.delHome(name.toLowerCase(Locale.ENGLISH)); + user.acquireWriteLock(); + user.getData().removeHome(name.toLowerCase(Locale.ENGLISH)); sender.sendMessage(_("deleteHome", name)); } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commanddelwarp.java b/Essentials/src/com/earth2me/essentials/commands/Commanddelwarp.java index 5eab72b33..3b7c42b4c 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commanddelwarp.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commanddelwarp.java @@ -19,7 +19,7 @@ public class Commanddelwarp extends EssentialsCommand { throw new NotEnoughArgumentsException(); } - ess.getWarps().delWarp(args[0]); + ess.getWarps().removeWarp(args[0]); sender.sendMessage(_("deleteWarp", args[0])); } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commanddepth.java b/Essentials/src/com/earth2me/essentials/commands/Commanddepth.java index 6c4fa2647..0124e0bc7 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commanddepth.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commanddepth.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import org.bukkit.Server; @@ -13,7 +13,7 @@ public class Commanddepth extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { final int depth = user.getLocation().getBlockY() - 63; if (depth > 0) diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandeco.java b/Essentials/src/com/earth2me/essentials/commands/Commandeco.java index 8f432ca6e..46f8f6eba 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandeco.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandeco.java @@ -1,7 +1,9 @@ package com.earth2me.essentials.commands; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.ISettings; +import com.earth2me.essentials.api.IUser; import java.util.Locale; +import lombok.Cleanup; import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -37,7 +39,7 @@ public class Commandeco extends EssentialsCommand { for (Player onlinePlayer : server.getOnlinePlayers()) { - final User player = ess.getUser(onlinePlayer); + final IUser player = ess.getUser(onlinePlayer); switch (cmd) { case GIVE: @@ -49,14 +51,16 @@ public class Commandeco extends EssentialsCommand break; case RESET: - player.setMoney(amount == 0 ? ess.getSettings().getStartingBalance() : amount); + @Cleanup ISettings settings = ess.getSettings(); + settings.acquireReadLock(); + player.setMoney(amount == 0 ? settings.getData().getEconomy().getStartingBalance() : amount); break; } } } else { - final User player = getPlayer(server, args, 1, true); + final IUser player = getPlayer(server, args, 1, true); switch (cmd) { case GIVE: @@ -68,7 +72,9 @@ public class Commandeco extends EssentialsCommand break; case RESET: - player.setMoney(amount == 0 ? ess.getSettings().getStartingBalance() : amount); + @Cleanup ISettings settings = ess.getSettings(); + settings.acquireReadLock(); + player.setMoney(amount == 0 ? settings.getData().getEconomy().getStartingBalance() : amount); break; } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandenchant.java b/Essentials/src/com/earth2me/essentials/commands/Commandenchant.java index 51a909d29..ae816141b 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandenchant.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandenchant.java @@ -2,7 +2,7 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.Enchantments; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import com.earth2me.essentials.Util; import java.util.*; import org.bukkit.Server; @@ -19,7 +19,7 @@ public class Commandenchant extends EssentialsCommand //TODO: Implement charge costs: final Trade charge = new Trade("enchant-" + enchantmentName, ess); @Override - protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + protected void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { final ItemStack stack = user.getItemInHand(); if (stack == null) @@ -78,7 +78,7 @@ public class Commandenchant extends EssentialsCommand } } - public static Enchantment getEnchantment(final String name, final User user) throws Exception + public static Enchantment getEnchantment(final String name, final IUser user) throws Exception { final Enchantment enchantment = Enchantments.getByName(name); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandessentials.java b/Essentials/src/com/earth2me/essentials/commands/Commandessentials.java index 14bbf5e02..685f40353 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandessentials.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandessentials.java @@ -1,9 +1,10 @@ package com.earth2me.essentials.commands; +import com.earth2me.essentials.api.ISettings; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.Util; import java.util.HashMap; import java.util.Map; +import lombok.Cleanup; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Server; @@ -46,7 +47,7 @@ public class Commandessentials extends EssentialsCommand sender.sendMessage("/<command> <reload/debug>"); sender.sendMessage(_("blockList")); final StringBuilder disabledCommands = new StringBuilder(); - for (Map.Entry<String, String> entry : ess.getAlternativeCommandsHandler().disabledCommands().entrySet()) + for (Map.Entry<String, String> entry : ess.getCommandHandler().disabledCommands().entrySet()) { if (disabledCommands.length() > 0) { disabledCommands.append(", "); @@ -149,7 +150,7 @@ public class Commandessentials extends EssentialsCommand private void stopTune() { - ess.getScheduler().cancelTask(taskid); + ess.getServer().getScheduler().cancelTask(taskid); for (Block block : noteBlocks.values()) { if (block.getType() == Material.NOTE_BLOCK) diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandext.java b/Essentials/src/com/earth2me/essentials/commands/Commandext.java index 3855e7b68..dac1a3e9c 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandext.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandext.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -26,7 +26,7 @@ public class Commandext extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { if (args.length < 1) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandfeed.java b/Essentials/src/com/earth2me/essentials/commands/Commandfeed.java index 0c1579835..7ab6b7ca9 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandfeed.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandfeed.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import java.util.List; import org.bukkit.Server; import org.bukkit.command.CommandSender; @@ -16,11 +16,11 @@ public class Commandfeed extends EssentialsCommand } @Override - protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + protected void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { if (args.length > 0 && user.isAuthorized("essentials.feed.others")) { - feedOtherPlayers(server,user,args[0]); + feedOtherPlayers(server, user, args[0]); } else { @@ -29,8 +29,8 @@ public class Commandfeed extends EssentialsCommand user.sendMessage(_("feed")); } } - - private void feedOtherPlayers(final Server server, final CommandSender sender, final String name) + + private void feedOtherPlayers(final Server server, final CommandSender sender, final String name) { final List<Player> players = server.matchPlayer(name); if (players.isEmpty()) diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandfireball.java b/Essentials/src/com/earth2me/essentials/commands/Commandfireball.java index 671d0f72b..868924a27 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandfireball.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandfireball.java @@ -1,6 +1,6 @@ package com.earth2me.essentials.commands; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import org.bukkit.Server; import org.bukkit.entity.Fireball; import org.bukkit.entity.SmallFireball; @@ -15,7 +15,7 @@ public class Commandfireball extends EssentialsCommand } @Override - protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + protected void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { boolean small = false; if (args.length > 0 && args[0].equalsIgnoreCase("small")) @@ -23,7 +23,7 @@ public class Commandfireball extends EssentialsCommand small = true; } final Vector direction = user.getEyeLocation().getDirection().multiply(2); - Fireball fireball = user.getWorld().spawn(user.getEyeLocation().add(direction.getX(), direction.getY(), direction.getZ()), small ? SmallFireball.class : Fireball.class); + final Fireball fireball = user.getWorld().spawn(user.getEyeLocation().add(direction.getX(), direction.getY(), direction.getZ()), small ? SmallFireball.class : Fireball.class); fireball.setShooter(user.getBase()); } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandgamemode.java b/Essentials/src/com/earth2me/essentials/commands/Commandgamemode.java index 62ace9357..396e3bef2 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandgamemode.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandgamemode.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import java.util.Locale; import org.bukkit.GameMode; import org.bukkit.Server; @@ -28,7 +28,7 @@ public class Commandgamemode extends EssentialsCommand } @Override - protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + protected void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { if (args.length > 0 && !args[0].trim().isEmpty() && user.isAuthorized("essentials.gamemode.others")) { @@ -44,7 +44,7 @@ public class Commandgamemode extends EssentialsCommand { for (Player matchPlayer : server.matchPlayer(name)) { - final User player = ess.getUser(matchPlayer); + final IUser player = ess.getUser(matchPlayer); if (player.isHidden()) { continue; diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandgetpos.java b/Essentials/src/com/earth2me/essentials/commands/Commandgetpos.java index c61702e59..c7f54c593 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandgetpos.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandgetpos.java @@ -1,6 +1,6 @@ package com.earth2me.essentials.commands; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import org.bukkit.Location; import org.bukkit.Server; import org.bukkit.command.CommandSender; @@ -14,11 +14,11 @@ public class Commandgetpos extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { if (args.length > 0 && user.isAuthorized("essentials.getpos.others")) { - final User otherUser = getPlayer(server, args, 0); + final IUser otherUser = getPlayer(server, args, 0); outputPosition(user, otherUser.getLocation(), user.getLocation()); } else @@ -34,7 +34,7 @@ public class Commandgetpos extends EssentialsCommand { throw new NotEnoughArgumentsException(); } - final User user = getPlayer(server, args, 0); + final IUser user = getPlayer(server, args, 0); outputPosition(sender, user.getLocation(), null); } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandgive.java b/Essentials/src/com/earth2me/essentials/commands/Commandgive.java index d6e3d8f98..08239b32b 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandgive.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandgive.java @@ -1,7 +1,8 @@ package com.earth2me.essentials.commands; +import com.earth2me.essentials.api.ISettings; +import com.earth2me.essentials.api.IUser; import com.earth2me.essentials.craftbukkit.InventoryWorkaround; -import com.earth2me.essentials.User; import java.util.Locale; import org.bukkit.ChatColor; import org.bukkit.Material; @@ -32,29 +33,38 @@ public class Commandgive extends EssentialsCommand final String itemname = stack.getType().toString().toLowerCase(Locale.ENGLISH).replace("_", ""); if (sender instanceof Player - && (ess.getSettings().permissionBasedItemSpawn() - ? (!ess.getUser(sender).isAuthorized("essentials.give.item-all") - && !ess.getUser(sender).isAuthorized("essentials.give.item-" + itemname) - && !ess.getUser(sender).isAuthorized("essentials.give.item-" + stack.getTypeId())) - : (!ess.getUser(sender).isAuthorized("essentials.itemspawn.exempt") - && !ess.getUser(sender).canSpawnItem(stack.getTypeId())))) + && (!ess.getUser((Player)sender).isAuthorized("essentials.give.item-" + itemname) + && !ess.getUser((Player)sender).isAuthorized("essentials.give.item-" + stack.getTypeId()))) { throw new Exception(ChatColor.RED + "You are not allowed to spawn the item " + itemname); } - final User giveTo = getPlayer(server, args, 0); + final IUser giveTo = getPlayer(server, args, 0); + int defaultStackSize = 0; + int oversizedStackSize = 0; + ISettings settings = ess.getSettings(); + settings.acquireReadLock(); + try + { + defaultStackSize = settings.getData().getGeneral().getDefaultStacksize(); + oversizedStackSize = settings.getData().getGeneral().getOversizedStacksize(); + } + finally + { + settings.unlock(); + } if (args.length > 2 && Integer.parseInt(args[2]) > 0) { stack.setAmount(Integer.parseInt(args[2])); } - else if (ess.getSettings().getDefaultStackSize() > 0) + else if (defaultStackSize > 0) { - stack.setAmount(ess.getSettings().getDefaultStackSize()); + stack.setAmount(defaultStackSize); } - else if (ess.getSettings().getOversizedStackSize() > 0 && giveTo.isAuthorized("essentials.oversizedstacks")) + else if (oversizedStackSize > 0 && giveTo.isAuthorized("essentials.oversizedstacks")) { - stack.setAmount(ess.getSettings().getOversizedStackSize()); + stack.setAmount(oversizedStackSize); } if (args.length > 3) @@ -66,7 +76,7 @@ public class Commandgive extends EssentialsCommand { continue; } - final Enchantment enchantment = Commandenchant.getEnchantment(split[0], sender instanceof Player ? ess.getUser(sender) : null); + final Enchantment enchantment = Commandenchant.getEnchantment(split[0], sender instanceof Player ? ess.getUser((Player)sender) : null); int level; if (split.length > 1) { @@ -89,7 +99,7 @@ public class Commandgive extends EssentialsCommand sender.sendMessage(ChatColor.BLUE + "Giving " + stack.getAmount() + " of " + itemName + " to " + giveTo.getDisplayName() + "."); if (giveTo.isAuthorized("essentials.oversizedstacks")) { - InventoryWorkaround.addItem(giveTo.getInventory(), true, ess.getSettings().getOversizedStackSize(), stack); + InventoryWorkaround.addItem(giveTo.getInventory(), true, oversizedStackSize, stack); } else { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandgod.java b/Essentials/src/com/earth2me/essentials/commands/Commandgod.java index 4d5bd424b..0a1ca4dd0 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandgod.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandgod.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -26,7 +26,7 @@ public class Commandgod extends EssentialsCommand } @Override - protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + protected void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { if (args.length > 0 && !args[0].trim().isEmpty() && user.isAuthorized("essentials.god.others")) { @@ -41,7 +41,7 @@ public class Commandgod extends EssentialsCommand { for (Player matchPlayer : server.matchPlayer(name)) { - final User player = ess.getUser(matchPlayer); + final IUser player = ess.getUser(matchPlayer); if (player.isHidden()) { continue; diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandheal.java b/Essentials/src/com/earth2me/essentials/commands/Commandheal.java index 82678c96e..578457bbb 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandheal.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandheal.java @@ -1,7 +1,8 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; +import com.earth2me.essentials.user.UserData.TimestampType; import java.util.List; import org.bukkit.Server; import org.bukkit.command.CommandSender; @@ -16,23 +17,19 @@ public class Commandheal extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { - + if (args.length > 0 && user.isAuthorized("essentials.heal.others")) { - if (!user.isAuthorized("essentials.heal.cooldown.bypass")) - { - user.healCooldown(); - } + user.checkCooldown(TimestampType.LASTHEAL, ess.getGroups().getHealCooldown(user), true, "essentials.heal.cooldown.bypass"); + healOtherPlayers(server, user, args[0]); return; } - if (!user.isAuthorized("essentials.heal.cooldown.bypass")) - { - user.healCooldown(); - } + user.checkCooldown(TimestampType.LASTHEAL, ess.getGroups().getHealCooldown(user), true, "essentials.heal.cooldown.bypass"); + user.setHealth(20); user.setFoodLevel(20); user.sendMessage(_("heal")); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandhelp.java b/Essentials/src/com/earth2me/essentials/commands/Commandhelp.java index 328f692ea..03acac872 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandhelp.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandhelp.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import com.earth2me.essentials.Util; import com.earth2me.essentials.textreader.*; import org.bukkit.Server; @@ -16,7 +16,7 @@ public class Commandhelp extends EssentialsCommand } @Override - protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + protected void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { IText output; String pageStr = args.length > 0 ? args[0] : null; diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandhelpop.java b/Essentials/src/com/earth2me/essentials/commands/Commandhelpop.java index f558a1b52..bd383d1ce 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandhelpop.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandhelpop.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import java.util.logging.Level; import org.bukkit.Server; import org.bukkit.entity.Player; @@ -15,7 +15,7 @@ public class Commandhelpop extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { if (args.length < 1) { @@ -26,7 +26,7 @@ public class Commandhelpop extends EssentialsCommand logger.log(Level.INFO, message); for (Player onlinePlayer : server.getOnlinePlayers()) { - final User player = ess.getUser(onlinePlayer); + final IUser player = ess.getUser(onlinePlayer); if (!player.isAuthorized("essentials.helpop.receive")) { continue; diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandhome.java b/Essentials/src/com/earth2me/essentials/commands/Commandhome.java index d1db6c523..e1197a946 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandhome.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandhome.java @@ -2,10 +2,11 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.Trade; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import com.earth2me.essentials.Util; import java.util.List; import java.util.Locale; +import lombok.Cleanup; import org.bukkit.Location; import org.bukkit.Server; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; @@ -19,11 +20,11 @@ public class Commandhome extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { final Trade charge = new Trade(this.getName(), ess); charge.isAffordableFor(user); - User player = user; + IUser player = user; String homeName = ""; String[] nameParts; if (args.length > 0) diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandignore.java b/Essentials/src/com/earth2me/essentials/commands/Commandignore.java index 93dd029a8..c1afd50cd 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandignore.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandignore.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import org.bukkit.Server; @@ -13,27 +13,28 @@ public class Commandignore extends EssentialsCommand } @Override - protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + protected void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { if (args.length < 1) { throw new NotEnoughArgumentsException(); } - User player; + IUser player; try { player = getPlayer(server, args, 0); } catch (NoSuchFieldException ex) { - player = ess.getOfflineUser(args[0]); + player = ess.getUser(args[0]); } if (player == null) { throw new Exception(_("playerNotFound")); } final String name = player.getName(); - if (user.isIgnoredPlayer(name)) + user.acquireWriteLock(); + if (user.isIgnoringPlayer(name)) { user.setIgnoredPlayer(name, false); user.sendMessage(_("unignorePlayer", player.getName())); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandinvsee.java b/Essentials/src/com/earth2me/essentials/commands/Commandinvsee.java index 1f5c32faa..c2f5b7464 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandinvsee.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandinvsee.java @@ -1,7 +1,8 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; +import com.earth2me.essentials.user.Inventory; import java.util.Arrays; import org.bukkit.Server; import org.bukkit.inventory.ItemStack; @@ -15,29 +16,29 @@ public class Commandinvsee extends EssentialsCommand } @Override - protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + protected void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { - if (args.length < 1 && user.getSavedInventory() == null) + if (args.length < 1 && user.getData().getInventory() == null) { throw new NotEnoughArgumentsException(); } - User invUser = user; + IUser invUser = user; if (args.length == 1) { invUser = getPlayer(server, args, 0); } - if (invUser == user && user.getSavedInventory() != null) + user.acquireWriteLock(); + if (invUser == user && user.getData().getInventory() != null) { - invUser.getInventory().setContents(user.getSavedInventory()); - user.setSavedInventory(null); + invUser.getInventory().setContents(user.getData().getInventory().getBukkitInventory()); + user.getData().setInventory(null); user.sendMessage(_("invRestored")); throw new NoChargeException(); } - - if (user.getSavedInventory() == null) + if (user.getData().getInventory() == null) { - user.setSavedInventory(user.getInventory().getContents()); + user.getData().setInventory(new Inventory(user.getInventory().getContents())); } ItemStack[] invUserStack = invUser.getInventory().getContents(); final int userStackLength = user.getInventory().getContents().length; diff --git a/Essentials/src/com/earth2me/essentials/commands/Commanditem.java b/Essentials/src/com/earth2me/essentials/commands/Commanditem.java index 405b8b799..84165a2ea 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commanditem.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commanditem.java @@ -1,8 +1,9 @@ package com.earth2me.essentials.commands; -import com.earth2me.essentials.craftbukkit.InventoryWorkaround; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.ISettings; +import com.earth2me.essentials.api.IUser; +import com.earth2me.essentials.craftbukkit.InventoryWorkaround; import java.util.Locale; import org.bukkit.Material; import org.bukkit.Server; @@ -18,7 +19,7 @@ public class Commanditem extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { if (args.length < 1) { @@ -27,27 +28,36 @@ public class Commanditem extends EssentialsCommand final ItemStack stack = ess.getItemDb().get(args[0]); final String itemname = stack.getType().toString().toLowerCase(Locale.ENGLISH).replace("_", ""); - if (ess.getSettings().permissionBasedItemSpawn() - ? (!user.isAuthorized("essentials.itemspawn.item-all") - && !user.isAuthorized("essentials.itemspawn.item-" + itemname) + if (!user.isAuthorized("essentials.itemspawn.item-" + itemname) && !user.isAuthorized("essentials.itemspawn.item-" + stack.getTypeId())) - : (!user.isAuthorized("essentials.itemspawn.exempt") - && !user.canSpawnItem(stack.getTypeId()))) { throw new Exception(_("cantSpawnItem", itemname)); } + int defaultStackSize = 0; + int oversizedStackSize = 0; + ISettings settings = ess.getSettings(); + settings.acquireReadLock(); + try + { + defaultStackSize = settings.getData().getGeneral().getDefaultStacksize(); + oversizedStackSize = settings.getData().getGeneral().getOversizedStacksize(); + } + finally + { + settings.unlock(); + } if (args.length > 1 && Integer.parseInt(args[1]) > 0) { stack.setAmount(Integer.parseInt(args[1])); } - else if (ess.getSettings().getDefaultStackSize() > 0) + else if (defaultStackSize > 0) { - stack.setAmount(ess.getSettings().getDefaultStackSize()); + stack.setAmount(defaultStackSize); } - else if (ess.getSettings().getOversizedStackSize() > 0 && user.isAuthorized("essentials.oversizedstacks")) + else if (oversizedStackSize > 0 && user.isAuthorized("essentials.oversizedstacks")) { - stack.setAmount(ess.getSettings().getOversizedStackSize()); + stack.setAmount(oversizedStackSize); } if (args.length > 2) @@ -82,7 +92,7 @@ public class Commanditem extends EssentialsCommand user.sendMessage(_("itemSpawn", stack.getAmount(), displayName)); if (user.isAuthorized("essentials.oversizedstacks")) { - InventoryWorkaround.addItem(user.getInventory(), true, ess.getSettings().getOversizedStackSize(), stack); + InventoryWorkaround.addItem(user.getInventory(), true, oversizedStackSize, stack); } else { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandjump.java b/Essentials/src/com/earth2me/essentials/commands/Commandjump.java index 39ca305e3..cee2134de 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandjump.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandjump.java @@ -2,7 +2,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.Trade; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import com.earth2me.essentials.Util; import org.bukkit.Location; import org.bukkit.Server; @@ -17,7 +17,7 @@ public class Commandjump extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { Location loc; final Location cloc = user.getLocation(); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandkick.java b/Essentials/src/com/earth2me/essentials/commands/Commandkick.java index ae5db48fb..5a1a83cf6 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandkick.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandkick.java @@ -2,7 +2,7 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.Console; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -23,7 +23,7 @@ public class Commandkick extends EssentialsCommand throw new NotEnoughArgumentsException(); } - final User user = getPlayer(server, args, 0); + final IUser user = getPlayer(server, args, 0); if (user.isAuthorized("essentials.kick.exempt")) { throw new Exception(_("kickExempt")); @@ -34,7 +34,7 @@ public class Commandkick extends EssentialsCommand for (Player onlinePlayer : server.getOnlinePlayers()) { - User player = ess.getUser(onlinePlayer); + final IUser player = ess.getUser(onlinePlayer); if (player.isAuthorized("essentials.kick.notify")) { onlinePlayer.sendMessage(_("playerKicked", senderName, user.getName(), kickReason)); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandkit.java b/Essentials/src/com/earth2me/essentials/commands/Commandkit.java index c003d28ac..4d764394b 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandkit.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandkit.java @@ -1,6 +1,7 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.*; +import com.earth2me.essentials.api.IUser; import static com.earth2me.essentials.I18n._; import java.util.*; import org.bukkit.Server; @@ -14,7 +15,7 @@ public class Commandkit extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { if (args.length < 1) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandlightning.java b/Essentials/src/com/earth2me/essentials/commands/Commandlightning.java index be9ac61f5..73ab6db4e 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandlightning.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandlightning.java @@ -1,7 +1,9 @@ package com.earth2me.essentials.commands; +import com.earth2me.essentials.api.ISettings; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; +import lombok.Cleanup; import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.entity.LightningStrike; @@ -19,7 +21,7 @@ public class Commandlightning extends EssentialsCommand public void run(final Server server, final CommandSender sender, final String commandLabel, final String[] args) throws Exception { - User user = null; + IUser user = null; if (sender instanceof Player) { user = ess.getUser(((Player)sender)); @@ -63,7 +65,10 @@ public class Commandlightning extends EssentialsCommand { matchPlayer.setHealth(matchPlayer.getHealth() < 5 ? 0 : matchPlayer.getHealth() - 5); } - if (ess.getSettings().warnOnSmite()) + @Cleanup + final ISettings settings = ess.getSettings(); + settings.acquireReadLock(); + if (settings.getData().getCommands().getLightning().isWarnPlayer()) { matchPlayer.sendMessage(_("lightningSmited")); } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandlist.java b/Essentials/src/com/earth2me/essentials/commands/Commandlist.java index 92833a66c..c7b7546cb 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandlist.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandlist.java @@ -1,7 +1,8 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.ISettings; +import com.earth2me.essentials.api.IUser; import java.util.*; import org.bukkit.Server; import org.bukkit.command.CommandSender; @@ -21,7 +22,7 @@ public class Commandlist extends EssentialsCommand boolean showhidden = false; if (sender instanceof Player) { - if (ess.getUser(sender).isAuthorized("essentials.list.hidden")) + if (ess.getUser((Player)sender).isAuthorized("essentials.list.hidden")) { showhidden = true; } @@ -43,26 +44,37 @@ public class Commandlist extends EssentialsCommand if (showhidden && playerHidden > 0) { online = _("listAmountHidden", server.getOnlinePlayers().length - playerHidden, playerHidden, server.getMaxPlayers()); - } else { - online = _("listAmount",server.getOnlinePlayers().length - playerHidden, server.getMaxPlayers()); + } + else + { + online = _("listAmount", server.getOnlinePlayers().length - playerHidden, server.getMaxPlayers()); } sender.sendMessage(online); + + boolean sortListByGroups = false; + ISettings settings = ess.getSettings(); + settings.acquireReadLock(); + try { + sortListByGroups = settings.getData().getCommands().getList().isSortByGroups(); + } finally { + settings.unlock(); + } - if (ess.getSettings().getSortListByGroups()) + if (sortListByGroups) { - Map<String, List<User>> sort = new HashMap<String, List<User>>(); + Map<String, List<IUser>> sort = new HashMap<String, List<IUser>>(); for (Player OnlinePlayer : server.getOnlinePlayers()) { - final User player = ess.getUser(OnlinePlayer); + final IUser player = ess.getUser(OnlinePlayer); if (player.isHidden() && !showhidden) { continue; } final String group = player.getGroup(); - List<User> list = sort.get(group); + List<IUser> list = sort.get(group); if (list == null) { - list = new ArrayList<User>(); + list = new ArrayList<IUser>(); sort.put(group, list); } list.add(player); @@ -73,10 +85,10 @@ public class Commandlist extends EssentialsCommand { final StringBuilder groupString = new StringBuilder(); groupString.append(group).append(": "); - final List<User> users = sort.get(group); + final List<IUser> users = sort.get(group); Collections.sort(users); boolean first = true; - for (User user : users) + for (IUser user : users) { if (!first) { @@ -86,9 +98,17 @@ public class Commandlist extends EssentialsCommand { first = false; } - if (user.isAfk()) + user.acquireReadLock(); + try + { + if (user.getData().isAfk()) + { + groupString.append(_("listAfkTag")); + } + } + finally { - groupString.append(_("listAfkTag")); + user.unlock(); } if (user.isHidden()) { @@ -102,10 +122,10 @@ public class Commandlist extends EssentialsCommand } else { - final List<User> users = new ArrayList<User>(); + final List<IUser> users = new ArrayList<IUser>(); for (Player OnlinePlayer : server.getOnlinePlayers()) { - final User player = ess.getUser(OnlinePlayer); + final IUser player = ess.getUser(OnlinePlayer); if (player.isHidden() && !showhidden) { continue; @@ -117,7 +137,7 @@ public class Commandlist extends EssentialsCommand final StringBuilder onlineUsers = new StringBuilder(); onlineUsers.append(_("connectedPlayers")); boolean first = true; - for (User user : users) + for (IUser user : users) { if (!first) { @@ -127,9 +147,17 @@ public class Commandlist extends EssentialsCommand { first = false; } - if (user.isAfk()) + user.acquireReadLock(); + try + { + if (user.getData().isAfk()) + { + onlineUsers.append(_("listAfkTag")); + } + } + finally { - onlineUsers.append(_("listAfkTag")); + user.unlock(); } if (user.isHidden()) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandmail.java b/Essentials/src/com/earth2me/essentials/commands/Commandmail.java index 6a66186e7..ad6928b69 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandmail.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandmail.java @@ -1,9 +1,8 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import java.util.List; -import org.bukkit.ChatColor; import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -18,12 +17,12 @@ public class Commandmail extends EssentialsCommand //TODO: Tidy this up @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { if (args.length >= 1 && "read".equalsIgnoreCase(args[0])) { - final List<String> mail = user.getMails(); - if (mail.isEmpty()) + final List<String> mail = user.getData().getMails(); + if (mail == null || mail.isEmpty()) { user.sendMessage(_("noMail")); throw new NoChargeException(); @@ -43,20 +42,20 @@ public class Commandmail extends EssentialsCommand } Player player = server.getPlayer(args[1]); - User u; + IUser u; if (player != null) { u = ess.getUser(player); } else { - u = ess.getOfflineUser(args[1]); + u = ess.getUser(args[1]); } if (u == null) { throw new Exception(_("playerNeverOnServer", args[1])); } - if (!u.isIgnoredPlayer(user.getName())) + if (!u.isIgnoringPlayer(user.getName())) { u.addMail(user.getName() + ": " + getFinalArg(args, 2)); } @@ -75,7 +74,8 @@ public class Commandmail extends EssentialsCommand } if (args.length >= 1 && "clear".equalsIgnoreCase(args[0])) { - user.setMails(null); + user.acquireWriteLock(); + user.getData().setMails(null); user.sendMessage(_("mailCleared")); return; } @@ -96,14 +96,14 @@ public class Commandmail extends EssentialsCommand else if (args.length >= 3 && "send".equalsIgnoreCase(args[0])) { Player player = server.getPlayer(args[1]); - User u; + IUser u; if (player != null) { u = ess.getUser(player); } else { - u = ess.getOfflineUser(args[1]); + u = ess.getUser(args[1]); } if (u == null) { @@ -121,14 +121,14 @@ public class Commandmail extends EssentialsCommand { //allow sending from console without "send" argument, since it's the only thing the console can do Player player = server.getPlayer(args[0]); - User u; + IUser u; if (player != null) { u = ess.getUser(player); } else { - u = ess.getOfflineUser(args[0]); + u = ess.getUser(args[0]); } if (u == null) { @@ -156,7 +156,7 @@ public class Commandmail extends EssentialsCommand { for (String username : ess.getUserMap().getAllUniqueUsers()) { - User user = ess.getUserMap().getUser(username); + IUser user = ess.getUserMap().getUser(username); if (user != null) { user.addMail(message); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandme.java b/Essentials/src/com/earth2me/essentials/commands/Commandme.java index 7ae87251d..2226bedef 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandme.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandme.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import org.bukkit.Server; @@ -13,9 +13,9 @@ public class Commandme extends EssentialsCommand } @Override - public void run(Server server, User user, String commandLabel, String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { - if (user.isMuted()) + if (user.getData().isMuted()) { throw new Exception(_("voiceSilenced")); } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandmore.java b/Essentials/src/com/earth2me/essentials/commands/Commandmore.java index 3fce3110c..9bb5c715d 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandmore.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandmore.java @@ -1,7 +1,8 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.ISettings; +import com.earth2me.essentials.api.IUser; import java.util.Locale; import org.bukkit.Server; import org.bukkit.inventory.ItemStack; @@ -15,35 +16,45 @@ public class Commandmore extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { final ItemStack stack = user.getItemInHand(); if (stack == null) { throw new Exception(_("cantSpawnItem", "Air")); } - if (stack.getAmount() >= ((user.isAuthorized("essentials.oversizedstacks")) - ? ess.getSettings().getOversizedStackSize() : stack.getMaxStackSize())) + int defaultStackSize = 0; + int oversizedStackSize = 0; + ISettings settings = ess.getSettings(); + settings.acquireReadLock(); + try + { + defaultStackSize = settings.getData().getGeneral().getDefaultStacksize(); + oversizedStackSize = settings.getData().getGeneral().getOversizedStacksize(); + } + finally + { + settings.unlock(); + } + if (stack.getAmount() >= ((user.isAuthorized("essentials.oversizedstacks")) + ? oversizedStackSize + : defaultStackSize > 0 ? defaultStackSize : stack.getMaxStackSize())) { throw new NoChargeException(); } final String itemname = stack.getType().toString().toLowerCase(Locale.ENGLISH).replace("_", ""); - if (ess.getSettings().permissionBasedItemSpawn() - ? (!user.isAuthorized("essentials.itemspawn.item-all") - && !user.isAuthorized("essentials.itemspawn.item-" + itemname) - && !user.isAuthorized("essentials.itemspawn.item-" + stack.getTypeId())) - : (!user.isAuthorized("essentials.itemspawn.exempt") - && !user.canSpawnItem(stack.getTypeId()))) + if (!user.isAuthorized("essentials.itemspawn.item-" + itemname) + && !user.isAuthorized("essentials.itemspawn.item-" + stack.getTypeId())) { throw new Exception(_("cantSpawnItem", itemname)); } if (user.isAuthorized("essentials.oversizedstacks")) { - stack.setAmount(ess.getSettings().getOversizedStackSize()); + stack.setAmount(oversizedStackSize); } else { - stack.setAmount(stack.getMaxStackSize()); + stack.setAmount(defaultStackSize > 0 ? defaultStackSize : stack.getMaxStackSize()); } user.updateInventory(); } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandmsg.java b/Essentials/src/com/earth2me/essentials/commands/Commandmsg.java index 34754ec9c..b95fc609b 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandmsg.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandmsg.java @@ -2,9 +2,10 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.Console; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.IReplyTo; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IReplyTo; +import com.earth2me.essentials.api.IUser; import java.util.List; +import lombok.Cleanup; import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -18,7 +19,7 @@ public class Commandmsg extends EssentialsCommand } @Override - public void run(Server server, CommandSender sender, String commandLabel, String[] args) throws Exception + public void run(final Server server, final CommandSender sender, final String commandLabel, String[] args) throws Exception { if (args.length < 2 || args[0].trim().isEmpty() || args[1].trim().isEmpty()) { @@ -27,8 +28,10 @@ public class Commandmsg extends EssentialsCommand if (sender instanceof Player) { - User user = ess.getUser(sender); - if (user.isMuted()) + @Cleanup + IUser user = ess.getUser((Player)sender); + user.acquireReadLock(); + if (user.getData().isMuted()) { throw new Exception(_("voiceSilenced")); } @@ -60,7 +63,7 @@ public class Commandmsg extends EssentialsCommand int i = 0; for (Player p : matches) { - final User u = ess.getUser(p); + final IUser u = ess.getUser(p); if (u.isHidden()) { i++; @@ -74,8 +77,8 @@ public class Commandmsg extends EssentialsCommand for (Player p : matches) { sender.sendMessage(_("msgFormat", translatedMe, p.getDisplayName(), message)); - final User u = ess.getUser(p); - if (sender instanceof Player && (u.isIgnoredPlayer(((Player)sender).getName()) || u.isHidden())) + final IUser u = ess.getUser(p); + if (sender instanceof Player && (u.isIgnoringPlayer(((Player)sender).getName()) || u.isHidden())) { continue; } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandmute.java b/Essentials/src/com/earth2me/essentials/commands/Commandmute.java index 3e70cc507..a3dcf3ce1 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandmute.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandmute.java @@ -1,8 +1,10 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import com.earth2me.essentials.Util; +import com.earth2me.essentials.user.UserData.TimestampType; +import lombok.Cleanup; import org.bukkit.Server; import org.bukkit.command.CommandSender; @@ -22,8 +24,10 @@ public class Commandmute extends EssentialsCommand throw new NotEnoughArgumentsException(); } - final User player = getPlayer(server, args, 0, true); - if (!player.isMuted() && player.isAuthorized("essentials.mute.exempt")) + @Cleanup + final IUser player = getPlayer(server, args, 0, true); + player.acquireReadLock(); + if (!player.getData().isMuted() && player.isAuthorized("essentials.mute.exempt")) { throw new Exception(_("muteExempt")); } @@ -33,7 +37,7 @@ public class Commandmute extends EssentialsCommand String time = getFinalArg(args, 1); muteTimestamp = Util.parseDateDiff(time, true); } - player.setMuteTimeout(muteTimestamp); + player.setTimestamp(TimestampType.MUTE, muteTimestamp); final boolean muted = player.toggleMuted(); sender.sendMessage( muted diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandnear.java b/Essentials/src/com/earth2me/essentials/commands/Commandnear.java index 0afcf1650..e667bb376 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandnear.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandnear.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import org.bukkit.Location; import org.bukkit.Server; import org.bukkit.World; @@ -17,10 +17,10 @@ public class Commandnear extends EssentialsCommand } @Override - protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + protected void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { long radius = 200; - User otherUser = null; + IUser otherUser = null; if (args.length > 0) { @@ -63,7 +63,7 @@ public class Commandnear extends EssentialsCommand protected void run(final Server server, final CommandSender sender, final String commandLabel, final String[] args) throws Exception { - User otherUser = null; + IUser otherUser = null; if (args.length > 0) { otherUser = getPlayer(server, args, 0); @@ -86,7 +86,7 @@ public class Commandnear extends EssentialsCommand sender.sendMessage(_("nearbyPlayers", getLocal(server, otherUser, radius))); } - private String getLocal(final Server server, final User user, final long radius) + private String getLocal(final Server server, final IUser user, final long radius) { final Location loc = user.getLocation(); final World world = loc.getWorld(); @@ -95,7 +95,7 @@ public class Commandnear extends EssentialsCommand for (Player onlinePlayer : server.getOnlinePlayers()) { - final User player = ess.getUser(onlinePlayer); + final IUser player = ess.getUser(onlinePlayer); if (!player.equals(user) && !player.isHidden()) { final Location playerLoc = player.getLocation(); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandnick.java b/Essentials/src/com/earth2me/essentials/commands/Commandnick.java index 95ad5ea84..79fe7b329 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandnick.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandnick.java @@ -1,8 +1,10 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.ISettings; +import com.earth2me.essentials.api.IUser; import java.util.Locale; +import lombok.Cleanup; import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -16,13 +18,16 @@ public class Commandnick extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { if (args.length < 1) { throw new NotEnoughArgumentsException(); } - if (!ess.getSettings().changeDisplayName()) + @Cleanup + final ISettings settings = ess.getSettings(); + settings.acquireReadLock(); + if (!settings.getData().getChat().getChangeDisplayname()) { throw new Exception(_("nickDisplayName")); } @@ -46,7 +51,10 @@ public class Commandnick extends EssentialsCommand { throw new NotEnoughArgumentsException(); } - if (!ess.getSettings().changeDisplayName()) + @Cleanup + final ISettings settings = ess.getSettings(); + settings.acquireReadLock(); + if (!settings.getData().getChat().getChangeDisplayname()) { throw new Exception(_("nickDisplayName")); } @@ -61,7 +69,7 @@ public class Commandnick extends EssentialsCommand sender.sendMessage(_("nickChanged")); } - private String formatNickname(final User user, final String nick) + private String formatNickname(final IUser user, final String nick) { if (user == null || user.isAuthorized("essentials.nick.color")) { @@ -84,7 +92,7 @@ public class Commandnick extends EssentialsCommand } } - private void setNickname(final Server server, final User target, final String nick) throws Exception + private void setNickname(final Server server, final IUser target, final String nick) throws Exception { if (nick.matches("[^a-zA-Z_0-9]")) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandpay.java b/Essentials/src/com/earth2me/essentials/commands/Commandpay.java index 01e1fcffb..daddce587 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandpay.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandpay.java @@ -2,7 +2,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.Trade; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import org.bukkit.Server; import org.bukkit.entity.Player; @@ -15,7 +15,7 @@ public class Commandpay extends EssentialsCommand } @Override - public void run(Server server, User user, String commandLabel, String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { if (args.length < 2) { @@ -32,7 +32,7 @@ public class Commandpay extends EssentialsCommand Boolean foundUser = false; for (Player p : server.matchPlayer(args[0])) { - User u = ess.getUser(p); + IUser u = ess.getUser(p); if (u.isHidden()) { continue; diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandping.java b/Essentials/src/com/earth2me/essentials/commands/Commandping.java index 1fad701b2..758852ed6 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandping.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandping.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import org.bukkit.Server; @@ -13,7 +13,7 @@ public class Commandping extends EssentialsCommand } @Override - public void run(Server server, User player, String commandLabel, String[] args) throws Exception + public void run(final Server server, final IUser player, final String commandLabel, final String[] args) throws Exception { player.sendMessage(_("pong")); } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandpowertool.java b/Essentials/src/com/earth2me/essentials/commands/Commandpowertool.java index ca03364b2..64844fa5f 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandpowertool.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandpowertool.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import com.earth2me.essentials.Util; import java.util.ArrayList; import java.util.List; @@ -19,7 +19,7 @@ public class Commandpowertool extends EssentialsCommand } @Override - protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + protected void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { String command = getFinalArg(args, 0); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandpowertooltoggle.java b/Essentials/src/com/earth2me/essentials/commands/Commandpowertooltoggle.java index c8b737dfa..65eab2409 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandpowertooltoggle.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandpowertooltoggle.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import org.bukkit.Server; @@ -13,7 +13,7 @@ public class Commandpowertooltoggle extends EssentialsCommand } @Override - protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + protected void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { if (!user.hasPowerTools()) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandptime.java b/Essentials/src/com/earth2me/essentials/commands/Commandptime.java index b16cbdc34..2de416acb 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandptime.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandptime.java @@ -2,7 +2,7 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.DescParseTickFormat; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import java.util.*; import org.bukkit.Server; import org.bukkit.World; @@ -36,7 +36,7 @@ public class Commandptime extends EssentialsCommand { userSelector = args[1]; } - Set<User> users = getUsers(server, sender, userSelector); + Set<IUser> users = getUsers(server, sender, userSelector); // If no arguments we are reading the time if (args.length == 0) @@ -45,7 +45,7 @@ public class Commandptime extends EssentialsCommand return; } - User user = ess.getUser(sender); + IUser user = sender instanceof Player ? ess.getUser((Player)sender) : null; if ((!users.contains(user) || users.size() > 1) && user != null && !user.isAuthorized("essentials.ptime.others")) { user.sendMessage(_("pTimeOthersPermission")); @@ -89,14 +89,14 @@ public class Commandptime extends EssentialsCommand /** * Used to get the time and inform */ - private void getUsersTime(final CommandSender sender, final Collection<User> users) + private void getUsersTime(final CommandSender sender, final Collection<IUser> users) { if (users.size() > 1) { sender.sendMessage(_("pTimePlayers")); } - for (User user : users) + for (IUser user : users) { if (user.getPlayerTimeOffset() == 0) { @@ -120,13 +120,13 @@ public class Commandptime extends EssentialsCommand /** * Used to set the time and inform of the change */ - private void setUsersTime(final CommandSender sender, final Collection<User> users, final Long ticks, Boolean relative) + private void setUsersTime(final CommandSender sender, final Collection<IUser> users, final Long ticks, Boolean relative) { // Update the time if (ticks == null) { // Reset - for (User user : users) + for (IUser user : users) { user.resetPlayerTime(); } @@ -134,7 +134,7 @@ public class Commandptime extends EssentialsCommand else { // Set - for (User user : users) + for (IUser user : users) { final World world = user.getWorld(); long time = user.getPlayerTime(); @@ -149,7 +149,7 @@ public class Commandptime extends EssentialsCommand } final StringBuilder msg = new StringBuilder(); - for (User user : users) + for (IUser user : users) { if (msg.length() > 0) { @@ -181,13 +181,13 @@ public class Commandptime extends EssentialsCommand /** * Used to parse an argument of the type "users(s) selector" */ - private Set<User> getUsers(final Server server, final CommandSender sender, final String selector) throws Exception + private Set<IUser> getUsers(final Server server, final CommandSender sender, final String selector) throws Exception { - final Set<User> users = new TreeSet<User>(new UserNameComparator()); + final Set<IUser> users = new TreeSet<IUser>(); // If there is no selector we want the sender itself. Or all users if sender isn't a user. if (selector == null) { - final User user = ess.getUser(sender); + final IUser user = sender instanceof Player ? ess.getUser((Player)sender) : null; if (user == null) { for (Player player : server.getOnlinePlayers()) @@ -203,7 +203,7 @@ public class Commandptime extends EssentialsCommand } // Try to find the user with name = selector - User user = null; + IUser user = null; final List<Player> matchedPlayers = server.matchPlayer(selector); if (!matchedPlayers.isEmpty()) { @@ -231,13 +231,3 @@ public class Commandptime extends EssentialsCommand return users; } } - - -class UserNameComparator implements Comparator<User> -{ - @Override - public int compare(User a, User b) - { - return a.getName().compareTo(b.getName()); - } -} diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandr.java b/Essentials/src/com/earth2me/essentials/commands/Commandr.java index 1da198444..fb8cc7040 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandr.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandr.java @@ -2,8 +2,8 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.Console; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.IReplyTo; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IReplyTo; +import com.earth2me.essentials.api.IUser; import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -38,8 +38,8 @@ public class Commandr extends EssentialsCommand sender.sendMessage(_("msgFormat", _("me"), targetName, message)); if (target instanceof Player) { - User player = ess.getUser(target); - if (player.isIgnoredPlayer(sender instanceof Player ? ((Player)sender).getName() : Console.NAME)) + IUser player = ess.getUser((Player)target); + if (player.isIgnoringPlayer(sender instanceof Player ? ((Player)sender).getName() : Console.NAME)) { return; } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandrealname.java b/Essentials/src/com/earth2me/essentials/commands/Commandrealname.java index b48ac5bcb..61566c215 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandrealname.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandrealname.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import com.earth2me.essentials.Util; import java.util.Locale; import org.bukkit.Server; @@ -26,7 +26,7 @@ public class Commandrealname extends EssentialsCommand final String whois = args[0].toLowerCase(Locale.ENGLISH); for (Player onlinePlayer : server.getOnlinePlayers()) { - final User u = ess.getUser(onlinePlayer); + final IUser u = ess.getUser(onlinePlayer); if (u.isHidden()) { continue; diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandremove.java b/Essentials/src/com/earth2me/essentials/commands/Commandremove.java index d245d1239..28c8da441 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandremove.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandremove.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import java.util.Locale; import org.bukkit.Chunk; import org.bukkit.Server; @@ -29,7 +29,7 @@ public class Commandremove extends EssentialsCommand } @Override - protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + protected void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { if (args.length < 1) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandrepair.java b/Essentials/src/com/earth2me/essentials/commands/Commandrepair.java index cf9e43f9f..0847302b2 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandrepair.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandrepair.java @@ -2,6 +2,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.*; +import com.earth2me.essentials.api.IUser; import java.util.ArrayList; import java.util.List; import java.util.Locale; @@ -18,7 +19,7 @@ public class Commandrepair extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { if (args.length < 1) { @@ -34,7 +35,6 @@ public class Commandrepair extends EssentialsCommand } if (!item.getEnchantments().isEmpty() - && !ess.getSettings().getRepairEnchanted() && !user.isAuthorized("essentials.repair.enchanted")) { throw new Exception(_("repairEnchanted")); @@ -113,7 +113,6 @@ public class Commandrepair extends EssentialsCommand continue; } if (!item.getEnchantments().isEmpty() - && !ess.getSettings().getRepairEnchanted() && !user.isAuthorized("essentials.repair.enchanted")) { continue; diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandseen.java b/Essentials/src/com/earth2me/essentials/commands/Commandseen.java index cf500e094..1510c1531 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandseen.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandseen.java @@ -1,8 +1,9 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import com.earth2me.essentials.Util; +import com.earth2me.essentials.user.UserData.TimestampType; import org.bukkit.Server; import org.bukkit.command.CommandSender; @@ -23,17 +24,17 @@ public class Commandseen extends EssentialsCommand } try { - User u = getPlayer(server, args, 0); - sender.sendMessage(_("seenOnline", u.getDisplayName(), Util.formatDateDiff(u.getLastLogin()))); + IUser u = getPlayer(server, args, 0); + sender.sendMessage(_("seenOnline", u.getDisplayName(), Util.formatDateDiff(u.getTimestamp(TimestampType.LOGIN)))); } catch (NoSuchFieldException e) { - User u = ess.getOfflineUser(args[0]); + IUser u = ess.getUser(args[0]); if (u == null) { throw new Exception(_("playerNotFound")); } - sender.sendMessage(_("seenOffline", u.getDisplayName(), Util.formatDateDiff(u.getLastLogout()))); + sender.sendMessage(_("seenOffline", u.getDisplayName(), Util.formatDateDiff(u.getTimestamp(TimestampType.LOGOUT)))); if (u.isBanned()) { sender.sendMessage(_("whoisBanned", _("true"))); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandsell.java b/Essentials/src/com/earth2me/essentials/commands/Commandsell.java index d59c09b1e..8697e8762 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandsell.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandsell.java @@ -1,10 +1,10 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.craftbukkit.InventoryWorkaround; import com.earth2me.essentials.Trade; -import com.earth2me.essentials.User; import com.earth2me.essentials.Util; +import com.earth2me.essentials.api.IUser; +import com.earth2me.essentials.craftbukkit.InventoryWorkaround; import java.util.Locale; import java.util.logging.Level; import org.bukkit.Material; @@ -20,7 +20,7 @@ public class Commandsell extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { if (args.length < 1) { @@ -74,7 +74,7 @@ public class Commandsell extends EssentialsCommand sellItem(user, is, args, false); } - private void sellItem(User user, ItemStack is, String[] args, boolean isBulkSell) throws Exception + private void sellItem(IUser user, ItemStack is, String[] args, boolean isBulkSell) throws Exception { if (is == null || is.getType() == Material.AIR) { @@ -92,16 +92,11 @@ public class Commandsell extends EssentialsCommand } double worth = ess.getWorth().getPrice(is); boolean stack = args.length > 1 && args[1].endsWith("s"); - boolean requireStack = ess.getSettings().isTradeInStacks(id); if (Double.isNaN(worth)) { throw new Exception(_("itemCannotBeSold")); } - if (requireStack && !stack) - { - throw new Exception(_("itemMustBeStacked")); - } int max = 0; @@ -135,10 +130,6 @@ public class Commandsell extends EssentialsCommand amount += max; } - if (requireStack) - { - amount -= amount % is.getType().getMaxStackSize(); - } if (amount > max || amount < 1) { if (!isBulkSell) diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandsethome.java b/Essentials/src/com/earth2me/essentials/commands/Commandsethome.java index e7687fcfd..134b122af 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandsethome.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandsethome.java @@ -1,8 +1,11 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; +import java.util.HashMap; import java.util.Locale; +import lombok.Cleanup; +import org.bukkit.Location; import org.bukkit.Server; @@ -14,7 +17,7 @@ public class Commandsethome extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, String[] args) throws Exception { if (args.length > 0) { @@ -29,14 +32,19 @@ public class Commandsethome extends EssentialsCommand { if (user.isAuthorized("essentials.sethome.multiple")) { - if ((user.isAuthorized("essentials.sethome.multiple.unlimited")) || (user.getHomes().size() < ess.getSettings().getHomeLimit(user)) + if ((user.isAuthorized("essentials.sethome.multiple.unlimited")) || (user.getHomes().size() < ess.getGroups().getHomeLimit(user)) || (user.getHomes().contains(args[0].toLowerCase(Locale.ENGLISH)))) { - user.setHome(args[0].toLowerCase(Locale.ENGLISH)); + user.acquireWriteLock(); + if (user.getData().getHomes() == null) + { + user.getData().setHomes(new HashMap<String, Location>()); + } + user.getData().getHomes().put(args[0].toLowerCase(Locale.ENGLISH), user.getLocation()); } else { - throw new Exception(_("maxHomes", ess.getSettings().getHomeLimit(user))); + throw new Exception(_("maxHomes", ess.getGroups().getHomeLimit(user))); } } @@ -49,11 +57,8 @@ public class Commandsethome extends EssentialsCommand { if (user.isAuthorized("essentials.sethome.others")) { - User usersHome = ess.getUser(ess.getServer().getPlayer(args[0])); - if (usersHome == null) - { - usersHome = ess.getOfflineUser(args[0]); - } + @Cleanup + IUser usersHome = ess.getUser(ess.getServer().getPlayer(args[0])); if (usersHome == null) { throw new Exception(_("playerNotFound")); @@ -63,13 +68,24 @@ public class Commandsethome extends EssentialsCommand { name = "home"; } - usersHome.setHome(name, user.getLocation()); + + usersHome.acquireWriteLock(); + if (usersHome.getData().getHomes() == null) + { + usersHome.getData().setHomes(new HashMap<String, Location>()); + } + usersHome.getData().getHomes().put(name, user.getLocation()); } } } else { - user.setHome(); + user.acquireWriteLock(); + if (user.getData().getHomes() == null) + { + user.getData().setHomes(new HashMap<String, Location>()); + } + user.getData().getHomes().put("home", user.getLocation()); } user.sendMessage(_("homeSet")); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandsetjail.java b/Essentials/src/com/earth2me/essentials/commands/Commandsetjail.java index 8ed298303..efef540b9 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandsetjail.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandsetjail.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import org.bukkit.Server; @@ -13,7 +13,7 @@ public class Commandsetjail extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { if (args.length < 1) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandsetwarp.java b/Essentials/src/com/earth2me/essentials/commands/Commandsetwarp.java index 1a7d27b4b..b4524b041 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandsetwarp.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandsetwarp.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import org.bukkit.Location; import org.bukkit.Server; @@ -14,7 +14,7 @@ public class Commandsetwarp extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { if (args.length < 1) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandsetworth.java b/Essentials/src/com/earth2me/essentials/commands/Commandsetworth.java index 1d236b70a..0a689755a 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandsetworth.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandsetworth.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import org.bukkit.Server; import org.bukkit.inventory.ItemStack; @@ -14,7 +14,7 @@ public class Commandsetworth extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { if (args.length < 2) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandsocialspy.java b/Essentials/src/com/earth2me/essentials/commands/Commandsocialspy.java index 6080642a1..495393290 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandsocialspy.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandsocialspy.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import org.bukkit.Server; @@ -13,7 +13,7 @@ public class Commandsocialspy extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { user.sendMessage("ยง7SocialSpy " + (user.toggleSocialSpy() ? _("enabled") : _("disabled"))); } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java b/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java index 73c86eba4..5c264c084 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandspawner.java @@ -2,7 +2,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.Mob; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import com.earth2me.essentials.Util; import java.util.Locale; import org.bukkit.Location; @@ -19,7 +19,7 @@ public class Commandspawner extends EssentialsCommand } @Override - protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + protected void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { if (args.length < 1 || args[0].length() < 2) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandspawnmob.java b/Essentials/src/com/earth2me/essentials/commands/Commandspawnmob.java index f867a1503..ba6255765 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandspawnmob.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandspawnmob.java @@ -3,7 +3,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.Mob; import com.earth2me.essentials.Mob.MobException; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import com.earth2me.essentials.Util; import java.util.Locale; import java.util.Random; @@ -22,7 +22,7 @@ public class Commandspawnmob extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { if (args.length < 1) { @@ -76,7 +76,7 @@ public class Commandspawnmob extends EssentialsCommand { throw new Exception(_("unableToSpawnMob")); } - User otherUser = null; + IUser otherUser = null; if (args.length >= 3) { otherUser = getPlayer(ess.getServer(), args, 2); @@ -184,7 +184,7 @@ public class Commandspawnmob extends EssentialsCommand } } - private void changeMobData(final CreatureType type, final Entity spawned, final String data, final User user) throws Exception + private void changeMobData(final CreatureType type, final Entity spawned, final String data, final IUser user) throws Exception { if (type == CreatureType.SLIME || type == CreatureType.MAGMA_CUBE) { @@ -238,7 +238,7 @@ public class Commandspawnmob extends EssentialsCommand { final Wolf wolf = ((Wolf)spawned); wolf.setTamed(true); - wolf.setOwner(user); + wolf.setOwner(user.getBase()); wolf.setSitting(true); if (data.equalsIgnoreCase("tamedbaby")) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandsudo.java b/Essentials/src/com/earth2me/essentials/commands/Commandsudo.java index 7f758ad2e..d73fdf13e 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandsudo.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandsudo.java @@ -1,6 +1,6 @@ package com.earth2me.essentials.commands; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.command.PluginCommand; @@ -21,7 +21,7 @@ public class Commandsudo extends EssentialsCommand throw new NotEnoughArgumentsException(); } - final User user = getPlayer(server, args, 0, false); + final IUser user = getPlayer(server, args, 0, false); final String command = args[1]; final String[] arguments = new String[args.length - 2]; if (arguments.length > 0) diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandsuicide.java b/Essentials/src/com/earth2me/essentials/commands/Commandsuicide.java index aa2ed5567..25c77856e 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandsuicide.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandsuicide.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import org.bukkit.Server; @@ -13,7 +13,7 @@ public class Commandsuicide extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { user.setHealth(0); user.sendMessage(_("suicideMessage")); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtempban.java b/Essentials/src/com/earth2me/essentials/commands/Commandtempban.java index 144d19d15..7fc31130c 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtempban.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtempban.java @@ -3,8 +3,9 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.Console; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.OfflinePlayer; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import com.earth2me.essentials.Util; +import com.earth2me.essentials.user.Ban; import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -24,11 +25,11 @@ public class Commandtempban extends EssentialsCommand { throw new NotEnoughArgumentsException(); } - final User user = getPlayer(server, args, 0, true); + final IUser user = getPlayer(server, args, 0, true); if (user.getBase() instanceof OfflinePlayer) { if (sender instanceof Player - && !ess.getUser(sender).isAuthorized("essentials.tempban.offline")) + && !ess.getUser((Player)sender).isAuthorized("essentials.tempban.offline")) { sender.sendMessage(_("tempbanExempt")); return; @@ -46,15 +47,17 @@ public class Commandtempban extends EssentialsCommand final long banTimestamp = Util.parseDateDiff(time, true); final String banReason = _("tempBanned", Util.formatDateDiff(banTimestamp)); - user.setBanReason(banReason); - user.setBanTimeout(banTimestamp); + user.acquireWriteLock(); + user.getData().setBan(new Ban()); + user.getData().getBan().setReason(banReason); + user.getData().getBan().setTimeout(banTimestamp); user.setBanned(true); user.kickPlayer(banReason); final String senderName = sender instanceof Player ? ((Player)sender).getDisplayName() : Console.NAME; for (Player onlinePlayer : server.getOnlinePlayers()) { - final User player = ess.getUser(onlinePlayer); + final IUser player = ess.getUser(onlinePlayer); if (player.isAuthorized("essentials.ban.notify")) { onlinePlayer.sendMessage(_("playerBanned", senderName, user.getName(), banReason)); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandthunder.java b/Essentials/src/com/earth2me/essentials/commands/Commandthunder.java index 3cb60e6e3..a682ce0f5 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandthunder.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandthunder.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import org.bukkit.Server; import org.bukkit.World; @@ -14,7 +14,7 @@ public class Commandthunder extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { if (args.length < 1) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtime.java b/Essentials/src/com/earth2me/essentials/commands/Commandtime.java index c49f34fbd..51fbd9e87 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtime.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtime.java @@ -2,11 +2,12 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.DescParseTickFormat; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import java.util.*; import org.bukkit.Server; import org.bukkit.World; import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; public class Commandtime extends EssentialsCommand @@ -34,7 +35,7 @@ public class Commandtime extends EssentialsCommand return; } - final User user = ess.getUser(sender); + final IUser user = sender instanceof Player ? ess.getUser((Player)sender) : null; if (user != null && !user.isAuthorized("essentials.time.set")) { user.sendMessage(_("timeSetPermission")); @@ -110,7 +111,7 @@ public class Commandtime extends EssentialsCommand // If there is no selector we want the world the user is currently in. Or all worlds if it isn't a user. if (selector == null) { - final User user = ess.getUser(sender); + final IUser user = sender instanceof Player ? ess.getUser((Player)sender) : null; if (user == null) { worlds.addAll(server.getWorlds()); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtogglejail.java b/Essentials/src/com/earth2me/essentials/commands/Commandtogglejail.java index f98343311..04b605468 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtogglejail.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtogglejail.java @@ -2,8 +2,10 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.OfflinePlayer; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import com.earth2me.essentials.Util; +import com.earth2me.essentials.user.UserData.TimestampType; +import lombok.Cleanup; import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -24,14 +26,16 @@ public class Commandtogglejail extends EssentialsCommand throw new NotEnoughArgumentsException(); } - final User player = getPlayer(server, args, 0, true); + @Cleanup + final IUser player = getPlayer(server, args, 0, true); + player.acquireReadLock(); - if (args.length >= 2 && !player.isJailed()) + if (args.length >= 2 && !player.getData().isJailed()) { if (player.getBase() instanceof OfflinePlayer) { if (sender instanceof Player - && !ess.getUser(sender).isAuthorized("essentials.togglejail.offline")) + && !ess.getUser((Player)sender).isAuthorized("essentials.togglejail.offline")) { sender.sendMessage(_("mayNotJail")); return; @@ -54,16 +58,16 @@ public class Commandtogglejail extends EssentialsCommand // Check if jail exists ess.getJails().getJail(args[1]); } - player.setJailed(true); + player.acquireWriteLock(); + player.getData().setJailed(true); player.sendMessage(_("userJailed")); - player.setJail(null); - player.setJail(args[1]); + player.getData().setJail(args[1]); long timeDiff = 0; if (args.length > 2) { final String time = getFinalArg(args, 2); timeDiff = Util.parseDateDiff(time, true); - player.setJailTimeout(timeDiff); + player.setTimestamp(TimestampType.JAIL, timeDiff); } sender.sendMessage((timeDiff > 0 ? _("playerJailedFor", player.getName(), Util.formatDateDiff(timeDiff)) @@ -71,31 +75,33 @@ public class Commandtogglejail extends EssentialsCommand return; } - if (args.length >= 2 && player.isJailed() && !args[1].equalsIgnoreCase(player.getJail())) + if (args.length >= 2 && player.getData().isJailed() && !args[1].equalsIgnoreCase(player.getData().getJail())) { - sender.sendMessage(_("jailAlreadyIncarcerated", player.getJail())); + sender.sendMessage(_("jailAlreadyIncarcerated", player.getData().getJail())); return; } - if (args.length >= 2 && player.isJailed() && args[1].equalsIgnoreCase(player.getJail())) + if (args.length >= 2 && player.getData().isJailed() && args[1].equalsIgnoreCase(player.getData().getJail())) { final String time = getFinalArg(args, 2); final long timeDiff = Util.parseDateDiff(time, true); - player.setJailTimeout(timeDiff); + player.acquireWriteLock(); + player.setTimestamp(TimestampType.JAIL, timeDiff); sender.sendMessage(_("jailSentenceExtended", Util.formatDateDiff(timeDiff))); return; } - if (args.length == 1 || (args.length == 2 && args[1].equalsIgnoreCase(player.getJail()))) + if (args.length == 1 || (args.length == 2 && args[1].equalsIgnoreCase(player.getData().getJail()))) { - if (!player.isJailed()) + if (!player.getData().isJailed()) { throw new NotEnoughArgumentsException(); } - player.setJailed(false); - player.setJailTimeout(0); + player.acquireWriteLock(); + player.getData().setJailed(false); + player.setTimestamp(TimestampType.JAIL, 0); player.sendMessage(_("jailReleasedPlayerNotify")); - player.setJail(null); + player.getData().setJail(null); if (!(player.getBase() instanceof OfflinePlayer)) { player.getTeleport().back(); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtop.java b/Essentials/src/com/earth2me/essentials/commands/Commandtop.java index e91d0984a..30518ea0b 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtop.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtop.java @@ -2,7 +2,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.Trade; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import org.bukkit.Location; import org.bukkit.Server; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; @@ -16,7 +16,7 @@ public class Commandtop extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { final int topX = user.getLocation().getBlockX(); final int topZ = user.getLocation().getBlockZ(); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtp.java b/Essentials/src/com/earth2me/essentials/commands/Commandtp.java index 7ea3f0541..b051aa313 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtp.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtp.java @@ -3,7 +3,8 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.Console; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.Trade; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; +import lombok.Cleanup; import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; @@ -17,7 +18,7 @@ public class Commandtp extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { switch (args.length) { @@ -25,8 +26,10 @@ public class Commandtp extends EssentialsCommand throw new NotEnoughArgumentsException(); case 1: - final User player = getPlayer(server, args, 0); - if (!player.isTeleportEnabled()) + @Cleanup + final IUser player = getPlayer(server, args, 0); + player.acquireReadLock(); + if (!player.getData().isTeleportEnabled()) { throw new Exception(_("teleportDisabled", player.getDisplayName())); } @@ -43,8 +46,8 @@ public class Commandtp extends EssentialsCommand throw new Exception("You need access to /tpohere to teleport other players."); } user.sendMessage(_("teleporting")); - final User target = getPlayer(server, args, 0); - final User toPlayer = getPlayer(server, args, 1); + final IUser target = getPlayer(server, args, 0); + final IUser toPlayer = getPlayer(server, args, 1); target.getTeleport().now(toPlayer, false, TeleportCause.COMMAND); target.sendMessage(_("teleportAtoB", user.getDisplayName(), toPlayer.getDisplayName())); break; @@ -60,8 +63,8 @@ public class Commandtp extends EssentialsCommand } sender.sendMessage(_("teleporting")); - final User target = getPlayer(server, args, 0); - final User toPlayer = getPlayer(server, args, 1); + final IUser target = getPlayer(server, args, 0); + final IUser toPlayer = getPlayer(server, args, 1); target.getTeleport().now(toPlayer, false, TeleportCause.COMMAND); target.sendMessage(_("teleportAtoB", Console.NAME, toPlayer.getDisplayName())); } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtpa.java b/Essentials/src/com/earth2me/essentials/commands/Commandtpa.java index 34195d51a..599ae334b 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtpa.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtpa.java @@ -1,7 +1,8 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; +import lombok.Cleanup; import org.bukkit.Server; @@ -13,19 +14,21 @@ public class Commandtpa extends EssentialsCommand } @Override - public void run(Server server, User user, String commandLabel, String[] args) throws Exception + public void run(Server server, IUser user, String commandLabel, String[] args) throws Exception { if (args.length < 1) { throw new NotEnoughArgumentsException(); } - User player = getPlayer(server, args, 0); - if (!player.isTeleportEnabled()) + @Cleanup + IUser player = getPlayer(server, args, 0); + player.acquireReadLock(); + if (!player.getData().isTeleportEnabled()) { throw new Exception(_("teleportDisabled", player.getDisplayName())); } - if (!player.isIgnoredPlayer(user.getName())) + if (!player.isIgnoringPlayer(user.getName())) { player.requestTeleport(user, false); player.sendMessage(_("teleportRequest", user.getDisplayName())); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtpaall.java b/Essentials/src/com/earth2me/essentials/commands/Commandtpaall.java index c0abdc1ad..e9494db2e 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtpaall.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtpaall.java @@ -1,7 +1,8 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; +import lombok.Cleanup; import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -27,21 +28,23 @@ public class Commandtpaall extends EssentialsCommand throw new NotEnoughArgumentsException(); } - final User player = getPlayer(server, args, 0); + final IUser player = getPlayer(server, args, 0); teleportAAllPlayers(server, sender, player); } - private void teleportAAllPlayers(final Server server, final CommandSender sender, final User user) + private void teleportAAllPlayers(final Server server, final CommandSender sender, final IUser user) { sender.sendMessage(_("teleportAAll")); for (Player onlinePlayer : server.getOnlinePlayers()) { - final User player = ess.getUser(onlinePlayer); + @Cleanup + final IUser player = ess.getUser(onlinePlayer); + player.acquireReadLock(); if (user == player) { continue; } - if (!player.isTeleportEnabled()) + if (!player.getData().isTeleportEnabled()) { continue; } @@ -57,7 +60,7 @@ public class Commandtpaall extends EssentialsCommand } catch (Exception ex) { - ess.showError(sender, ex, getName()); + ess.showCommandError(sender, getName(), ex); } } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtpaccept.java b/Essentials/src/com/earth2me/essentials/commands/Commandtpaccept.java index 0cece3310..12a471605 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtpaccept.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtpaccept.java @@ -3,7 +3,8 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.OfflinePlayer; import com.earth2me.essentials.Trade; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; +import lombok.Cleanup; import org.bukkit.Server; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; @@ -16,12 +17,15 @@ public class Commandtpaccept extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { - - final User target = user.getTeleportRequest(); - if (target == null - || target.getBase() instanceof OfflinePlayer + if (user.getTeleportRequester() == null) + { + throw new Exception(_("noPendingRequest")); + } + + final IUser target = user.getTeleportRequester(); + if (target.getBase() instanceof OfflinePlayer || (user.isTeleportRequestHere() && !target.isAuthorized("essentials.tpahere"))) { throw new Exception(_("noPendingRequest")); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtpahere.java b/Essentials/src/com/earth2me/essentials/commands/Commandtpahere.java index 376c2be44..76a4422dd 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtpahere.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtpahere.java @@ -1,7 +1,8 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; +import lombok.Cleanup; import org.bukkit.Server; @@ -13,15 +14,17 @@ public class Commandtpahere extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { if (args.length < 1) { throw new NotEnoughArgumentsException(); } - final User player = getPlayer(server, args, 0); - if (!player.isTeleportEnabled()) + @Cleanup + final IUser player = getPlayer(server, args, 0); + player.acquireReadLock(); + if (!player.getData().isTeleportEnabled()) { throw new Exception(_("teleportDisabled", player.getDisplayName())); } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtpall.java b/Essentials/src/com/earth2me/essentials/commands/Commandtpall.java index f21f1a6bc..9643a0ff3 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtpall.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtpall.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -28,16 +28,16 @@ public class Commandtpall extends EssentialsCommand throw new NotEnoughArgumentsException(); } - final User player = getPlayer(server, args, 0); + final IUser player = getPlayer(server, args, 0); teleportAllPlayers(server, sender, player); } - private void teleportAllPlayers(Server server, CommandSender sender, User user) + private void teleportAllPlayers(Server server, CommandSender sender, IUser user) { sender.sendMessage(_("teleportAll")); for (Player onlinePlayer : server.getOnlinePlayers()) { - final User player = ess.getUser(onlinePlayer); + final IUser player = ess.getUser(onlinePlayer); if (user == player) { continue; @@ -48,7 +48,7 @@ public class Commandtpall extends EssentialsCommand } catch (Exception ex) { - ess.showError(sender, ex, getName()); + ess.showCommandError(sender, getName(), ex); } } } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtpdeny.java b/Essentials/src/com/earth2me/essentials/commands/Commandtpdeny.java index 92bba1054..6a2c787bc 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtpdeny.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtpdeny.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import org.bukkit.Server; @@ -13,9 +13,9 @@ public class Commandtpdeny extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { - final User player = user.getTeleportRequest(); + final IUser player = user.getTeleportRequester(); if (player == null) { throw new Exception(_("noPendingRequest")); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtphere.java b/Essentials/src/com/earth2me/essentials/commands/Commandtphere.java index 733091d1a..065c5d2a4 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtphere.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtphere.java @@ -2,7 +2,8 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.Trade; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; +import lombok.Cleanup; import org.bukkit.Server; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; @@ -15,10 +16,12 @@ public class Commandtphere extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { - final User player = getPlayer(server, args, 0); - if (!player.isTeleportEnabled()) + @Cleanup + final IUser player = getPlayer(server, args, 0); + player.acquireReadLock(); + if (!player.getData().isTeleportEnabled()) { throw new Exception(_("teleportDisabled", player.getDisplayName())); } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtpo.java b/Essentials/src/com/earth2me/essentials/commands/Commandtpo.java index 7c13b80d4..5da17488f 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtpo.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtpo.java @@ -2,7 +2,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.OfflinePlayer; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import org.bukkit.Server; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; @@ -15,7 +15,7 @@ public class Commandtpo extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { if (args.length < 1) { @@ -23,7 +23,7 @@ public class Commandtpo extends EssentialsCommand } //Just basically the old tp command - final User player = getPlayer(server, args, 0, true); + final IUser player = getPlayer(server, args, 0, true); // Check if user is offline if (player.getBase() instanceof OfflinePlayer) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtpohere.java b/Essentials/src/com/earth2me/essentials/commands/Commandtpohere.java index e226f0702..51bc900c2 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtpohere.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtpohere.java @@ -2,7 +2,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.OfflinePlayer; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import org.bukkit.Server; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; @@ -15,7 +15,7 @@ public class Commandtpohere extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { if (args.length < 1) { @@ -23,7 +23,7 @@ public class Commandtpohere extends EssentialsCommand } //Just basically the old tphere command - final User player = getPlayer(server, args, 0, true); + final IUser player = getPlayer(server, args, 0, true); // Check if user is offline if (player.getBase() instanceof OfflinePlayer) diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtppos.java b/Essentials/src/com/earth2me/essentials/commands/Commandtppos.java index 226fa44e3..0a85f4499 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtppos.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtppos.java @@ -2,7 +2,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.Trade; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import org.bukkit.Location; import org.bukkit.Server; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; @@ -16,7 +16,7 @@ public class Commandtppos extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { if (args.length < 3) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtptoggle.java b/Essentials/src/com/earth2me/essentials/commands/Commandtptoggle.java index 1fc4c2aa4..d2256ac72 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtptoggle.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtptoggle.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import org.bukkit.Server; @@ -13,7 +13,7 @@ public class Commandtptoggle extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { user.sendMessage(user.toggleTeleportEnabled() ? _("teleportationEnabled") diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandtree.java b/Essentials/src/com/earth2me/essentials/commands/Commandtree.java index 20cc9d46f..314aa6420 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandtree.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandtree.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import com.earth2me.essentials.Util; import org.bukkit.Location; import org.bukkit.Server; @@ -16,7 +16,7 @@ public class Commandtree extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { TreeType tree; if (args.length < 1) diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandunban.java b/Essentials/src/com/earth2me/essentials/commands/Commandunban.java index 8bc3ad068..186420fa1 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandunban.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandunban.java @@ -1,7 +1,8 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; +import lombok.Cleanup; import org.bukkit.Server; import org.bukkit.command.CommandSender; @@ -23,7 +24,10 @@ public class Commandunban extends EssentialsCommand try { - final User player = getPlayer(server, args, 0, true); + @Cleanup + final IUser player = getPlayer(server, args, 0, true); + player.acquireWriteLock(); + player.getData().setBan(null); player.setBanned(false); sender.sendMessage(_("unbannedPlayer")); } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandunbanip.java b/Essentials/src/com/earth2me/essentials/commands/Commandunbanip.java index c539a596c..5a48f9843 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandunbanip.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandunbanip.java @@ -1,7 +1,8 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; +import lombok.Cleanup; import org.bukkit.Server; import org.bukkit.command.CommandSender; @@ -22,8 +23,10 @@ public class Commandunbanip extends EssentialsCommand } try { - final User user = getPlayer(server, args, 0, true); - ess.getServer().unbanIP(user.getLastLoginAddress()); + @Cleanup + final IUser user = getPlayer(server, args, 0, true); + user.acquireReadLock(); + ess.getServer().unbanIP(user.getData().getIpAddress()); } catch (Exception ex) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandunlimited.java b/Essentials/src/com/earth2me/essentials/commands/Commandunlimited.java index beff6a77b..27ba32faf 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandunlimited.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandunlimited.java @@ -2,9 +2,10 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.craftbukkit.InventoryWorkaround; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import java.util.List; import java.util.Locale; +import lombok.Cleanup; import org.bukkit.Material; import org.bukkit.Server; import org.bukkit.inventory.ItemStack; @@ -18,19 +19,21 @@ public class Commandunlimited extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { if (args.length < 1) { throw new NotEnoughArgumentsException(); } - User target = user; + @Cleanup + IUser target = user; if (args.length > 1 && user.isAuthorized("essentials.unlimited.others")) { target = getPlayer(server, args, 1); - } + target.acquireReadLock(); + } if (args[0].equalsIgnoreCase("list")) { @@ -39,7 +42,8 @@ public class Commandunlimited extends EssentialsCommand } else if (args[0].equalsIgnoreCase("clear")) { - final List<Integer> itemList = target.getUnlimited(); + //TODO: Fix this, the clear should always work, even when the player does not have permission. + final List<Integer> itemList = target.getData().getUnlimited(); int index = 0; while (itemList.size() > index) @@ -57,7 +61,7 @@ public class Commandunlimited extends EssentialsCommand } } - private String getList(final User target) + private String getList(final IUser target) { final StringBuilder output = new StringBuilder(); output.append(_("unlimitedItems")).append(" "); @@ -81,7 +85,7 @@ public class Commandunlimited extends EssentialsCommand return output.toString(); } - private Boolean toggleUnlimited(final User user, final User target, final String item) throws Exception + private Boolean toggleUnlimited(final IUser user, final IUser target, final String item) throws Exception { final ItemStack stack = ess.getItemDb().get(item, 1); stack.setAmount(Math.min(stack.getType().getMaxStackSize(), 2)); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandwarp.java b/Essentials/src/com/earth2me/essentials/commands/Commandwarp.java index 51b64563b..fab643f7e 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandwarp.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandwarp.java @@ -2,9 +2,9 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.Trade; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import com.earth2me.essentials.Util; -import com.earth2me.essentials.Warps; +import com.earth2me.essentials.api.IWarps; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -23,7 +23,7 @@ public class Commandwarp extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { if (args.length == 0 || args[0].matches("[0-9]+")) { @@ -36,7 +36,7 @@ public class Commandwarp extends EssentialsCommand } if (args.length > 0) { - User otherUser = null; + IUser otherUser = null; if (args.length == 2 && user.isAuthorized("essentials.warp.otherplayers")) { otherUser = ess.getUser(server.getPlayer(args[1])); @@ -60,7 +60,7 @@ public class Commandwarp extends EssentialsCommand warpList(sender, args); throw new NoChargeException(); } - User otherUser = ess.getUser(server.getPlayer(args[1])); + IUser otherUser = ess.getUser(server.getPlayer(args[1])); if (otherUser == null) { throw new Exception(_("playerNotFound")); @@ -73,14 +73,14 @@ public class Commandwarp extends EssentialsCommand //TODO: Use one of the new text classes, like /help ? private void warpList(final CommandSender sender, final String[] args) throws Exception { - final Warps warps = ess.getWarps(); + final IWarps warps = ess.getWarps(); if (warps.isEmpty()) { throw new Exception(_("noWarpsDefined")); } - final List<String> warpNameList = new ArrayList<String>(warps.getWarpNames()); + final List<String> warpNameList = new ArrayList<String>(warps.getList()); - if (sender instanceof User) + if (sender instanceof IUser) { final Iterator<String> iterator = warpNameList.iterator(); while (iterator.hasNext()) @@ -112,7 +112,7 @@ public class Commandwarp extends EssentialsCommand } } - private void warpUser(final User user, final String name) throws Exception + private void warpUser(final IUser user, final String name) throws Exception { final Trade charge = new Trade(this.getName(), ess); charge.isAffordableFor(user); diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandweather.java b/Essentials/src/com/earth2me/essentials/commands/Commandweather.java index 1229c9ee4..ee2156251 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandweather.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandweather.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import org.bukkit.Server; import org.bukkit.World; import org.bukkit.command.CommandSender; @@ -16,7 +16,7 @@ public class Commandweather extends EssentialsCommand //TODO: Remove duplication @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { if (args.length < 1) { diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandwhois.java b/Essentials/src/com/earth2me/essentials/commands/Commandwhois.java index 7e211455e..8dcd3ffa5 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandwhois.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandwhois.java @@ -1,9 +1,11 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import com.earth2me.essentials.Util; +import com.earth2me.essentials.api.ISettings; import java.util.Locale; +import lombok.Cleanup; import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -26,7 +28,7 @@ public class Commandwhois extends EssentialsCommand boolean showhidden = false; if (sender instanceof Player) { - if (ess.getUser(sender).isAuthorized("essentials.list.hidden")) + if (ess.getUser((Player)sender).isAuthorized("essentials.list.hidden")) { showhidden = true; } @@ -36,15 +38,21 @@ public class Commandwhois extends EssentialsCommand showhidden = true; } final String whois = args[0].toLowerCase(Locale.ENGLISH); - final int prefixLength = Util.stripColor(ess.getSettings().getNicknamePrefix()).length(); + @Cleanup + ISettings settings = ess.getSettings(); + settings.acquireReadLock(); + final int prefixLength = Util.stripColor(settings.getData().getChat().getNicknamePrefix()).length(); for (Player onlinePlayer : server.getOnlinePlayers()) { - final User user = ess.getUser(onlinePlayer); + @Cleanup + final IUser user = ess.getUser(onlinePlayer); + if (user.isHidden() && !showhidden) { continue; } - final String nickName = Util.stripColor(user.getNickname()); + user.acquireReadLock(); + final String nickName = Util.stripColor(user.getData().getNickname()); if (!whois.equalsIgnoreCase(nickName) && !whois.substring(prefixLength).equalsIgnoreCase(nickName) && !whois.equalsIgnoreCase(user.getName())) @@ -58,17 +66,17 @@ public class Commandwhois extends EssentialsCommand sender.sendMessage(_("whoisGod", (user.isGodModeEnabled() ? _("true") : _("false")))); sender.sendMessage(_("whoisGamemode", _(user.getGameMode().toString().toLowerCase(Locale.ENGLISH)))); sender.sendMessage(_("whoisLocation", user.getLocation().getWorld().getName(), user.getLocation().getBlockX(), user.getLocation().getBlockY(), user.getLocation().getBlockZ())); - if (!ess.getSettings().isEcoDisabled()) + if (!settings.getData().getEconomy().isEcoDisabled()) { sender.sendMessage(_("whoisMoney", Util.formatCurrency(user.getMoney(), ess))); } - sender.sendMessage(user.isAfk() + sender.sendMessage(user.getData().isAfk() ? _("whoisStatusAway") : _("whoisStatusAvailable")); sender.sendMessage(_("whoisIPAddress", user.getAddress().getAddress().toString())); - final String location = user.getGeoLocation(); + final String location = user.getData().getGeolocation(); if (location != null - && (sender instanceof Player ? ess.getUser(sender).isAuthorized("essentials.geoip.show") : true)) + && (sender instanceof Player ? ess.getUser((Player)sender).isAuthorized("essentials.geoip.show") : true)) { sender.sendMessage(_("whoisGeoLocation", location)); } diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandworld.java b/Essentials/src/com/earth2me/essentials/commands/Commandworld.java index 41554c8ce..bfb56543c 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandworld.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandworld.java @@ -2,7 +2,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.Trade; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import java.util.List; import org.bukkit.Location; import org.bukkit.Server; @@ -18,7 +18,7 @@ public class Commandworld extends EssentialsCommand } @Override - protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + protected void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { World world; @@ -54,13 +54,11 @@ public class Commandworld extends EssentialsCommand } } - if (ess.getSettings().getIsWorldTeleportPermissions()) + + if (!user.isAuthorized("essentials.world." + world.getName())) { - if (!user.isAuthorized("essentials.world." + world.getName())) - { - user.sendMessage(_("invalidWorld")); //TODO: Make a "world teleport denied" translation - throw new NoChargeException(); - } + user.sendMessage(_("invalidWorld")); //TODO: Make a "world teleport denied" translation + throw new NoChargeException(); } double factor; diff --git a/Essentials/src/com/earth2me/essentials/commands/Commandworth.java b/Essentials/src/com/earth2me/essentials/commands/Commandworth.java index 586b31873..cdc8788c0 100644 --- a/Essentials/src/com/earth2me/essentials/commands/Commandworth.java +++ b/Essentials/src/com/earth2me/essentials/commands/Commandworth.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import com.earth2me.essentials.Util; import java.util.Locale; import org.bukkit.Server; @@ -18,7 +18,7 @@ public class Commandworth extends EssentialsCommand //TODO: Remove duplication @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { ItemStack iStack = user.getInventory().getItemInHand(); int amount = iStack.getAmount(); diff --git a/Essentials/src/com/earth2me/essentials/commands/EssentialsCommand.java b/Essentials/src/com/earth2me/essentials/commands/EssentialsCommand.java index 13328e1b5..6e679de9b 100644 --- a/Essentials/src/com/earth2me/essentials/commands/EssentialsCommand.java +++ b/Essentials/src/com/earth2me/essentials/commands/EssentialsCommand.java @@ -1,11 +1,10 @@ package com.earth2me.essentials.commands; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.IEssentials; -import com.earth2me.essentials.IEssentialsModule; -import com.earth2me.essentials.OfflinePlayer; import com.earth2me.essentials.Trade; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.IEssentialsModule; +import com.earth2me.essentials.api.IUser; import java.util.List; import java.util.logging.Logger; import org.bukkit.Server; @@ -44,12 +43,12 @@ public abstract class EssentialsCommand implements IEssentialsCommand return name; } - protected User getPlayer(final Server server, final String[] args, final int pos) throws NoSuchFieldException, NotEnoughArgumentsException + protected IUser getPlayer(final Server server, final String[] args, final int pos) throws NoSuchFieldException, NotEnoughArgumentsException { return getPlayer(server, args, pos, false); } - protected User getPlayer(final Server server, final String[] args, final int pos, final boolean getOffline) throws NoSuchFieldException, NotEnoughArgumentsException + protected IUser getPlayer(final Server server, final String[] args, final int pos, final boolean getOffline) throws NoSuchFieldException, NotEnoughArgumentsException { if (args.length <= pos) { @@ -59,10 +58,10 @@ public abstract class EssentialsCommand implements IEssentialsCommand { throw new NoSuchFieldException(_("playerNotFound")); } - final User user = ess.getUser(args[pos]); + final IUser user = ess.getUser(args[pos]); if (user != null) { - if (!getOffline && (user.getBase() instanceof OfflinePlayer || user.isHidden())) + if (!getOffline && (!user.isOnline() || user.isHidden())) { throw new NoSuchFieldException(_("playerNotFound")); } @@ -74,13 +73,13 @@ public abstract class EssentialsCommand implements IEssentialsCommand { for (Player player : matches) { - final User userMatch = ess.getUser(player); + final IUser userMatch = ess.getUser(player); if (userMatch.getDisplayName().startsWith(args[pos]) && (getOffline || !userMatch.isHidden())) { return userMatch; } } - final User userMatch = ess.getUser(matches.get(0)); + final IUser userMatch = ess.getUser(matches.get(0)); if (getOffline || !userMatch.isHidden()) { return userMatch; @@ -90,7 +89,7 @@ public abstract class EssentialsCommand implements IEssentialsCommand } @Override - public final void run(final Server server, final User user, final String commandLabel, final Command cmd, final String[] args) throws Exception + public final void run(final Server server, final IUser user, final String commandLabel, final Command cmd, final String[] args) throws Exception { final Trade charge = new Trade(this.getName(), ess); charge.isAffordableFor(user); @@ -98,7 +97,7 @@ public abstract class EssentialsCommand implements IEssentialsCommand charge.charge(user); } - protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + protected void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { run(server, (CommandSender)user.getBase(), commandLabel, args); } diff --git a/Essentials/src/com/earth2me/essentials/commands/IEssentialsCommand.java b/Essentials/src/com/earth2me/essentials/commands/IEssentialsCommand.java index 439c14d70..66dc05ff5 100644 --- a/Essentials/src/com/earth2me/essentials/commands/IEssentialsCommand.java +++ b/Essentials/src/com/earth2me/essentials/commands/IEssentialsCommand.java @@ -1,8 +1,8 @@ package com.earth2me.essentials.commands; -import com.earth2me.essentials.IEssentials; -import com.earth2me.essentials.IEssentialsModule; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IEssentialsModule; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.IUser; import org.bukkit.Server; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -12,7 +12,7 @@ public interface IEssentialsCommand { String getName(); - void run(Server server, User user, String commandLabel, Command cmd, String[] args) + void run(Server server, IUser user, String commandLabel, Command cmd, String[] args) throws Exception; void run(Server server, CommandSender sender, String commandLabel, Command cmd, String[] args) diff --git a/Essentials/src/com/earth2me/essentials/craftbukkit/DummyOfflinePlayer.java b/Essentials/src/com/earth2me/essentials/craftbukkit/DummyOfflinePlayer.java new file mode 100644 index 000000000..93efc8720 --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/craftbukkit/DummyOfflinePlayer.java @@ -0,0 +1,93 @@ +package com.earth2me.essentials.craftbukkit; + +import java.util.Map; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; + + +public class DummyOfflinePlayer implements OfflinePlayer +{ + private final transient String name; + + public DummyOfflinePlayer(String name) + { + this.name = name; + } + + @Override + public boolean isOnline() + { + return false; + } + + @Override + public String getName() + { + return name; + } + + @Override + public boolean isBanned() + { + return false; + } + + @Override + public void setBanned(boolean bln) + { + } + + @Override + public boolean isWhitelisted() + { + return false; + } + + @Override + public void setWhitelisted(boolean bln) + { + } + + @Override + public Player getPlayer() + { + return Bukkit.getPlayerExact(name); + } + + @Override + public long getFirstPlayed() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public long getLastPlayed() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public boolean hasPlayedBefore() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public boolean isOp() + { + return false; + } + + @Override + public void setOp(boolean bln) + { + } + + @Override + public Map<String, Object> serialize() + { + throw new UnsupportedOperationException("Not supported yet."); + } + +} diff --git a/Essentials/src/com/earth2me/essentials/craftbukkit/OfflineBedLocation.java b/Essentials/src/com/earth2me/essentials/craftbukkit/OfflineBedLocation.java index 3ddfd20b5..b42deb128 100644 --- a/Essentials/src/com/earth2me/essentials/craftbukkit/OfflineBedLocation.java +++ b/Essentials/src/com/earth2me/essentials/craftbukkit/OfflineBedLocation.java @@ -1,6 +1,6 @@ package com.earth2me.essentials.craftbukkit; -import com.earth2me.essentials.IEssentials; +import com.earth2me.essentials.api.IEssentials; import java.util.logging.Level; import java.util.logging.Logger; import net.minecraft.server.NBTTagCompound; diff --git a/Essentials/src/com/earth2me/essentials/external/gnu/inet/encoding/Punycode.java b/Essentials/src/com/earth2me/essentials/external/gnu/inet/encoding/Punycode.java new file mode 100644 index 000000000..831d071a7 --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/external/gnu/inet/encoding/Punycode.java @@ -0,0 +1,321 @@ +package com.earth2me.essentials.external.gnu.inet.encoding; + + +/** + * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software + * Foundation, Inc. + * + * Author: Oliver Hitz + * + * This file is part of GNU Libidn. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + * USA + */ +/** + * This class offers static methods for encoding/decoding strings + * using the Punycode algorithm. + * <ul> + * <li>RFC3492 Punycode + * </ul> + * Note that this implementation only supports 16-bit Unicode code + * points. + */ +/* + * Changes by snowleo: + * - Correctly catch wrong characters after the delimiter + * - If the string starts with the delimiter, it's an encoded string + * - If there is no delimiter, it's an ascii string. + * - Note: the string should never contain the delimiter. + */ +public class Punycode +{ + /* + * Punycode parameters + */ + final static int TMIN = 1; + final static int TMAX = 26; + final static int BASE = 36; + final static int INITIAL_N = 128; + final static int INITIAL_BIAS = 72; + final static int DAMP = 700; + final static int SKEW = 38; + final static char DELIMITER = '-'; + + /** + * Punycodes a unicode string. + * + * @param input Unicode string. + * @return Punycoded string. + */ + public static String encode(String input) + throws PunycodeException + { + int n = INITIAL_N; + int delta = 0; + int bias = INITIAL_BIAS; + StringBuffer output = new StringBuffer(); + + // Copy all basic code points to the output + int b = 0; + for (int i = 0; i < input.length(); i++) + { + char c = input.charAt(i); + if (isBasic(c)) + { + output.append(c); + b++; + } + } + + // Append delimiter + if (b < input.length()) // Changed by snowleo + { + output.append(DELIMITER); + } + + int h = b; + while (h < input.length()) + { + int m = Integer.MAX_VALUE; + + // Find the minimum code point >= n + for (int i = 0; i < input.length(); i++) + { + int c = input.charAt(i); + if (c >= n && c < m) + { + m = c; + } + } + + if (m - n > (Integer.MAX_VALUE - delta) / (h + 1)) + { + throw new PunycodeException(PunycodeException.OVERFLOW); + } + delta = delta + (m - n) * (h + 1); + n = m; + + for (int j = 0; j < input.length(); j++) + { + int c = input.charAt(j); + if (c < n) + { + delta++; + if (0 == delta) + { + throw new PunycodeException(PunycodeException.OVERFLOW); + } + } + if (c == n) + { + int q = delta; + + for (int k = BASE;; k += BASE) + { + int t; + if (k <= bias) + { + t = TMIN; + } + else if (k >= bias + TMAX) + { + t = TMAX; + } + else + { + t = k - bias; + } + if (q < t) + { + break; + } + output.append((char)digit2codepoint(t + (q - t) % (BASE - t))); + q = (q - t) / (BASE - t); + } + + output.append((char)digit2codepoint(q)); + bias = adapt(delta, h + 1, h == b); + delta = 0; + h++; + } + } + + delta++; + n++; + } + + return output.toString(); + } + + /** + * Decode a punycoded string. + * + * @param input Punycode string + * @return Unicode string. + */ + public static String decode(String input) + throws PunycodeException + { + int n = INITIAL_N; + int i = 0; + int bias = INITIAL_BIAS; + StringBuffer output = new StringBuffer(); + + int d = input.lastIndexOf(DELIMITER); + // Change start by snowleo + if (d < 0) { + return input; + } + else if (d > 0) // Change end by snowleo + { + for (int j = 0; j < d; j++) + { + char c = input.charAt(j); + if (!isBasic(c)) + { + throw new PunycodeException(PunycodeException.BAD_INPUT); + } + output.append(c); + } + d++; + } + else + { + d = 1; // Changed by snowleo + } + + while (d < input.length()) + { + int oldi = i; + int w = 1; + + for (int k = BASE;; k += BASE) + { + if (d == input.length()) + { + throw new PunycodeException(PunycodeException.BAD_INPUT); + } + int c = input.charAt(d++); + int digit = codepoint2digit(c); + if (digit > (Integer.MAX_VALUE - i) / w) + { + throw new PunycodeException(PunycodeException.OVERFLOW); + } + + i = i + digit * w; + + int t; + if (k <= bias) + { + t = TMIN; + } + else if (k >= bias + TMAX) + { + t = TMAX; + } + else + { + t = k - bias; + } + if (digit < t) + { + break; + } + w = w * (BASE - t); + } + + bias = adapt(i - oldi, output.length() + 1, oldi == 0); + + if (i / (output.length() + 1) > Integer.MAX_VALUE - n) + { + throw new PunycodeException(PunycodeException.OVERFLOW); + } + + n = n + i / (output.length() + 1); + i = i % (output.length() + 1); + output.insert(i, (char)n); + i++; + } + + return output.toString(); + } + + public final static int adapt(int delta, int numpoints, boolean first) + { + if (first) + { + delta = delta / DAMP; + } + else + { + delta = delta / 2; + } + + delta = delta + (delta / numpoints); + + int k = 0; + while (delta > ((BASE - TMIN) * TMAX) / 2) + { + delta = delta / (BASE - TMIN); + k = k + BASE; + } + + return k + ((BASE - TMIN + 1) * delta) / (delta + SKEW); + } + + public final static boolean isBasic(char c) + { + return c < 0x80; + } + + public final static int digit2codepoint(int d) + throws PunycodeException + { + if (d < 26) + { + // 0..25 : 'a'..'z' + return d + 'a'; + } + else if (d < 36) + { + // 26..35 : '0'..'9'; + return d - 26 + '0'; + } + else + { + throw new PunycodeException(PunycodeException.BAD_INPUT); + } + } + + public final static int codepoint2digit(int c) + throws PunycodeException + { + if (c - '0' < 10 && c >= '0') // Changed by snowleo + { + // '0'..'9' : 26..35 + return c - '0' + 26; + } + else if (c - 'a' < 26 && c >= 'a') // Changed by snowleo + { + // 'a'..'z' : 0..25 + return c - 'a'; + } + else + { + throw new PunycodeException(PunycodeException.BAD_INPUT); + } + } +} diff --git a/Essentials/src/com/earth2me/essentials/external/gnu/inet/encoding/PunycodeException.java b/Essentials/src/com/earth2me/essentials/external/gnu/inet/encoding/PunycodeException.java new file mode 100644 index 000000000..4f8ce93d1 --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/external/gnu/inet/encoding/PunycodeException.java @@ -0,0 +1,45 @@ +package com.earth2me.essentials.external.gnu.inet.encoding; + + +/** + * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software + * Foundation, Inc. + * + * Author: Oliver Hitz + * + * This file is part of GNU Libidn. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + * USA + */ +/** + * Exception handling for Punycode class. + */ +public class PunycodeException + extends Exception +{ + public static String OVERFLOW = "Overflow."; + public static String BAD_INPUT = "Bad input."; + + /** + * Creates a new PunycodeException. + * + * @param m message. + */ + public PunycodeException(String m) + { + super(m); + } +} diff --git a/Essentials/src/com/earth2me/essentials/EssentialsBlockListener.java b/Essentials/src/com/earth2me/essentials/listener/EssentialsBlockListener.java index ceda6a60c..22f433260 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsBlockListener.java +++ b/Essentials/src/com/earth2me/essentials/listener/EssentialsBlockListener.java @@ -1,8 +1,9 @@ -package com.earth2me.essentials; +package com.earth2me.essentials.listener; -import java.util.logging.Logger; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.IUser; +import com.earth2me.essentials.Util; import org.bukkit.GameMode; -import org.bukkit.Material; import org.bukkit.event.block.BlockListener; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.inventory.ItemStack; @@ -10,30 +11,30 @@ import org.bukkit.inventory.ItemStack; public class EssentialsBlockListener extends BlockListener { - private final IEssentials ess; - private static final Logger logger = Logger.getLogger("Minecraft"); + private final transient IEssentials ess; - public EssentialsBlockListener(IEssentials ess) + public EssentialsBlockListener(final IEssentials ess) { + super(); this.ess = ess; } @Override - public void onBlockPlace(BlockPlaceEvent event) + public void onBlockPlace(final BlockPlaceEvent event) { if (event.isCancelled()) { return; } - final User user = ess.getUser(event.getPlayer()); // Do not rely on getItemInHand(); // http://leaky.bukkit.org/issues/663 - final ItemStack is = Util.convertBlockToItem(event.getBlockPlaced()); - if (is == null) + final ItemStack itemstack = Util.convertBlockToItem(event.getBlockPlaced()); + if (itemstack == null) { return; } - boolean unlimitedForUser = user.hasUnlimited(is); + final IUser user = ess.getUser(event.getPlayer()); + final boolean unlimitedForUser = user.getData().hasUnlimited(itemstack.getType()); if (unlimitedForUser && user.getGameMode() == GameMode.SURVIVAL) { ess.scheduleSyncDelayedTask( @@ -42,7 +43,7 @@ public class EssentialsBlockListener extends BlockListener @Override public void run() { - user.getInventory().addItem(is); + user.getInventory().addItem(itemstack); user.updateInventory(); } }); diff --git a/Essentials/src/com/earth2me/essentials/listener/EssentialsEntityListener.java b/Essentials/src/com/earth2me/essentials/listener/EssentialsEntityListener.java new file mode 100644 index 000000000..3523578cb --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/listener/EssentialsEntityListener.java @@ -0,0 +1,140 @@ +package com.earth2me.essentials.listener; + +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.ISettings; +import com.earth2me.essentials.api.IUser; +import static com.earth2me.essentials.I18n._; +import java.util.List; +import lombok.Cleanup; +import org.bukkit.Material; +import org.bukkit.entity.Animals; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; +import org.bukkit.event.entity.*; +import org.bukkit.inventory.ItemStack; + + +public class EssentialsEntityListener extends EntityListener +{ + private final transient IEssentials ess; + + public EssentialsEntityListener(final IEssentials ess) + { + super(); + this.ess = ess; + } + + @Override + public void onEntityDamage(final EntityDamageEvent event) + { + if (event instanceof EntityDamageByEntityEvent) + { + final EntityDamageByEntityEvent edEvent = (EntityDamageByEntityEvent)event; + final Entity eAttack = edEvent.getDamager(); + final Entity eDefend = edEvent.getEntity(); + if (eDefend instanceof Player && eAttack instanceof Player) + { + @Cleanup + final IUser attacker = ess.getUser((Player)eAttack); + attacker.acquireReadLock(); + attacker.updateActivity(true); + final ItemStack itemstack = attacker.getItemInHand(); + final List<String> commandList = attacker.getData().getPowertool(itemstack.getType()); + if (commandList != null && !commandList.isEmpty()) + { + for (String command : commandList) + { + + if (command != null && !command.isEmpty()) + { + final IUser defender = ess.getUser((Player)eDefend); + attacker.getServer().dispatchCommand(attacker, command.replaceAll("\\{player\\}", defender.getName())); + event.setCancelled(true); + return; + } + } + } + } + if (eDefend instanceof Animals && eAttack instanceof Player) + { + final IUser player = ess.getUser((Player)eAttack); + final ItemStack hand = player.getItemInHand(); + if (hand != null && hand.getType() == Material.MILK_BUCKET) + { + ((Animals)eDefend).setAge(-24000); + hand.setType(Material.BUCKET); + player.setItemInHand(hand); + player.updateInventory(); + event.setCancelled(true); + } + } + } + if (event.getEntity() instanceof Player && ess.getUser((Player)event.getEntity()).isGodModeEnabled()) + { + final Player player = (Player)event.getEntity(); + player.setFireTicks(0); + player.setRemainingAir(player.getMaximumAir()); + event.setCancelled(true); + } + } + + @Override + public void onEntityCombust(final EntityCombustEvent event) + { + if (event.getEntity() instanceof Player && ess.getUser((Player)event.getEntity()).isGodModeEnabled()) + { + event.setCancelled(true); + } + } + + @Override + public void onEntityDeath(final EntityDeathEvent event) + { + if (event instanceof PlayerDeathEvent) + { + final PlayerDeathEvent pdevent = (PlayerDeathEvent)event; + final IUser user = ess.getUser((Player)pdevent.getEntity()); + @Cleanup + final ISettings settings = ess.getSettings(); + settings.acquireReadLock(); + if (user.isAuthorized("essentials.back.ondeath") && !settings.getData().getCommands().isDisabled("back")) + { + user.setLastLocation(); + user.sendMessage(_("backAfterDeath")); + } + if (!settings.getData().getGeneral().isDeathMessages()) + { + pdevent.setDeathMessage(""); + } + } + } + + @Override + public void onFoodLevelChange(final FoodLevelChangeEvent event) + { + if (event.getEntity() instanceof Player && ess.getUser((Player)event.getEntity()).isGodModeEnabled()) + { + event.setCancelled(true); + } + } + + @Override + public void onEntityRegainHealth(final EntityRegainHealthEvent event) + { + + if (event.getRegainReason() == RegainReason.SATIATED && event.getEntity() instanceof Player) + { + @Cleanup + final ISettings settings = ess.getSettings(); + settings.acquireReadLock(); + @Cleanup + final IUser user = ess.getUser((Player)event.getEntity()); + user.acquireReadLock(); + if (user.getData().isAfk() && settings.getData().getCommands().getAfk().isFreezeAFKPlayers()) + { + event.setCancelled(true); + } + } + } +} diff --git a/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java b/Essentials/src/com/earth2me/essentials/listener/EssentialsPlayerListener.java index bb6741d30..bdb9d67b7 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java +++ b/Essentials/src/com/earth2me/essentials/listener/EssentialsPlayerListener.java @@ -1,11 +1,16 @@ -package com.earth2me.essentials; +package com.earth2me.essentials.listener; +import com.earth2me.essentials.api.ISettings; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.IUser; +import com.earth2me.essentials.Util; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.craftbukkit.SetBed; import com.earth2me.essentials.textreader.IText; import com.earth2me.essentials.textreader.KeywordReplacer; import com.earth2me.essentials.textreader.TextInput; import com.earth2me.essentials.textreader.TextPager; +import com.earth2me.essentials.user.UserData.TimestampType; import java.io.IOException; import java.util.Arrays; import java.util.Iterator; @@ -13,6 +18,7 @@ import java.util.List; import java.util.Locale; import java.util.logging.Level; import java.util.logging.Logger; +import lombok.Cleanup; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Server; @@ -33,6 +39,7 @@ public class EssentialsPlayerListener extends PlayerListener public EssentialsPlayerListener(final IEssentials parent) { + super(); this.ess = parent; this.server = parent.getServer(); } @@ -40,19 +47,18 @@ public class EssentialsPlayerListener extends PlayerListener @Override public void onPlayerRespawn(final PlayerRespawnEvent event) { - final User user = ess.getUser(event.getPlayer()); - updateCompass(user); - if (ess.getSettings().changeDisplayName()) - { - user.setDisplayNick(); - } + final IUser user = ess.getUser(event.getPlayer()); + user.updateCompass(); + user.updateDisplayName(); } @Override public void onPlayerChat(final PlayerChatEvent event) { - final User user = ess.getUser(event.getPlayer()); - if (user.isMuted()) + @Cleanup + final IUser user = ess.getUser(event.getPlayer()); + user.acquireReadLock(); + if (user.getData().isMuted()) { event.setCancelled(true); user.sendMessage(_("playerMuted")); @@ -61,17 +67,14 @@ public class EssentialsPlayerListener extends PlayerListener final Iterator<Player> it = event.getRecipients().iterator(); while (it.hasNext()) { - final User u = ess.getUser(it.next()); - if (u.isIgnoredPlayer(user.getName())) + final IUser player = ess.getUser(it.next()); + if (player.isIgnoringPlayer(user.getName())) { it.remove(); } } user.updateActivity(true); - if (ess.getSettings().changeDisplayName()) - { - user.setDisplayNick(); - } + user.updateDisplayName(); } @Override @@ -81,9 +84,14 @@ public class EssentialsPlayerListener extends PlayerListener { return; } - final User user = ess.getUser(event.getPlayer()); + @Cleanup + final IUser user = ess.getUser(event.getPlayer()); + user.acquireReadLock(); + @Cleanup + final ISettings settings = ess.getSettings(); + settings.acquireReadLock(); - if (user.isAfk() && ess.getSettings().getFreezeAfkPlayers()) + if (user.getData().isAfk() && settings.getData().getCommands().getAfk().isFreezeAFKPlayers()) { final Location from = event.getFrom(); final Location to = event.getTo().clone(); @@ -111,15 +119,20 @@ public class EssentialsPlayerListener extends PlayerListener @Override public void onPlayerQuit(final PlayerQuitEvent event) { - final User user = ess.getUser(event.getPlayer()); - if (ess.getSettings().removeGodOnDisconnect() && user.isGodModeEnabled()) + @Cleanup + final IUser user = ess.getUser(event.getPlayer()); + user.acquireReadLock(); + @Cleanup + final ISettings settings = ess.getSettings(); + settings.acquireReadLock(); + if (settings.getData().getCommands().getGod().isRemoveOnDisconnect() && user.isGodModeEnabled()) { user.toggleGodModeEnabled(); } - if (user.getSavedInventory() != null) + if (user.getData().getInventory() != null) { - user.getInventory().setContents(user.getSavedInventory()); - user.setSavedInventory(null); + user.getInventory().setContents(user.getData().getInventory().getBukkitInventory()); + user.getData().setInventory(null); } user.updateActivity(false); user.dispose(); @@ -128,21 +141,24 @@ public class EssentialsPlayerListener extends PlayerListener @Override public void onPlayerJoin(final PlayerJoinEvent event) { - ess.getBackup().onPlayerJoin(); - final User user = ess.getUser(event.getPlayer()); + ess.getBackup().startTask(); + @Cleanup + final IUser user = ess.getUser(event.getPlayer()); + user.acquireWriteLock(); - if (ess.getSettings().changeDisplayName()) - { - user.setDisplayNick(); - } - user.setLastLoginAddress(user.getAddress().getAddress().getHostAddress()); + user.updateDisplayName(); + user.getData().setIpAddress(user.getAddress().getAddress().getHostAddress()); user.updateActivity(false); if (user.isAuthorized("essentials.sleepingignored")) { user.setSleepingIgnored(true); } - if (!ess.getSettings().isCommandDisabled("motd") && user.isAuthorized("essentials.motd")) + @Cleanup + final ISettings settings = ess.getSettings(); + settings.acquireReadLock(); + + if (!settings.getData().getCommands().isDisabled("motd") && user.isAuthorized("essentials.motd")) { try { @@ -153,7 +169,7 @@ public class EssentialsPlayerListener extends PlayerListener } catch (IOException ex) { - if (ess.getSettings().isDebug()) + if (settings.getData().getGeneral().isDebug()) { LOGGER.log(Level.WARNING, ex.getMessage(), ex); } @@ -164,10 +180,10 @@ public class EssentialsPlayerListener extends PlayerListener } } - if (!ess.getSettings().isCommandDisabled("mail") && user.isAuthorized("essentials.mail")) + if (!settings.getData().getCommands().isDisabled("mail") && user.isAuthorized("essentials.mail")) { - final List<String> mail = user.getMails(); - if (mail.isEmpty()) + final List<String> mail = user.getData().getMails(); + if (mail == null || mail.isEmpty()) { user.sendMessage(_("noNewMail")); } @@ -183,21 +199,23 @@ public class EssentialsPlayerListener extends PlayerListener { if (event.getResult() != Result.ALLOWED && event.getResult() != Result.KICK_FULL && event.getResult() != Result.KICK_BANNED) { - LOGGER.log(Level.INFO, "Disconnecting user " + event.getPlayer().toString() + " due to " + event.getResult().toString()); + LOGGER.log(Level.INFO, "Disconnecting user {0} due to {1}", new Object[]{event.getPlayer().toString(), event.getResult().toString()}); return; } - User user = ess.getUser(event.getPlayer()); - user.setNPC(false); + @Cleanup + final IUser user = ess.getUser(event.getPlayer()); + user.acquireWriteLock(); + user.getData().setNpc(false); final long currentTime = System.currentTimeMillis(); final boolean banExpired = user.checkBanTimeout(currentTime); user.checkMuteTimeout(currentTime); user.checkJailTimeout(currentTime); - if (banExpired == false && (user.isBanned() || event.getResult() == Result.KICK_BANNED)) + if (!banExpired && (user.isBanned() || event.getResult() == Result.KICK_BANNED)) { - final String banReason = user.getBanReason(); - event.disallow(Result.KICK_BANNED, banReason != null && !banReason.isEmpty() && !banReason.equalsIgnoreCase("ban") ? banReason : _("defaultBanReason")); + final String banReason = user.getData().getBan() == null ? "" : user.getData().getBan().getReason(); + event.disallow(Result.KICK_BANNED, banReason == null || banReason.isEmpty() || banReason.equalsIgnoreCase("ban") ? _("defaultBanReason") : banReason); return; } @@ -208,53 +226,42 @@ public class EssentialsPlayerListener extends PlayerListener } event.allow(); - user.setLastLogin(System.currentTimeMillis()); - updateCompass(user); - } - - private void updateCompass(final User user) - { - Location loc = user.getHome(user.getLocation()); - if (loc == null) - { - loc = user.getBedSpawnLocation(); - } - if (loc != null) - { - user.setCompassTarget(loc); - } + user.setTimestamp(TimestampType.LOGIN, System.currentTimeMillis()); + user.updateCompass(); } @Override - public void onPlayerTeleport(PlayerTeleportEvent event) + public void onPlayerTeleport(final PlayerTeleportEvent event) { if (event.isCancelled()) { return; } - final User user = ess.getUser(event.getPlayer()); + @Cleanup + final ISettings settings = ess.getSettings(); + settings.acquireReadLock(); + final IUser user = ess.getUser(event.getPlayer()); //There is TeleportCause.COMMMAND but plugins have to actively pass the cause in on their teleports. - if ((event.getCause() == TeleportCause.PLUGIN || event.getCause() == TeleportCause.COMMAND) && ess.getSettings().registerBackInListener()) + if ((event.getCause() == TeleportCause.PLUGIN || event.getCause() == TeleportCause.COMMAND) && settings.getData().getCommands().getBack().isRegisterBackInListener()) { user.setLastLocation(); } - if (ess.getSettings().changeDisplayName()) - { - user.setDisplayNick(); - } - updateCompass(user); + user.updateDisplayName(); + user.updateCompass(); } @Override public void onPlayerEggThrow(final PlayerEggThrowEvent event) { - final User user = ess.getUser(event.getPlayer()); - final ItemStack is = new ItemStack(Material.EGG, 1); - if (user.hasUnlimited(is)) + @Cleanup + final IUser user = ess.getUser(event.getPlayer()); + user.acquireReadLock(); + final ItemStack hand = new ItemStack(Material.EGG, 1); + if (user.getData().hasUnlimited(hand.getType())) { - user.getInventory().addItem(is); + user.getInventory().addItem(hand); user.updateInventory(); } } @@ -262,8 +269,10 @@ public class EssentialsPlayerListener extends PlayerListener @Override public void onPlayerBucketEmpty(final PlayerBucketEmptyEvent event) { - final User user = ess.getUser(event.getPlayer()); - if (user.hasUnlimited(new ItemStack(event.getBucket()))) + @Cleanup + final IUser user = ess.getUser(event.getPlayer()); + user.acquireReadLock(); + if (user.getData().hasUnlimited(event.getBucket())) { event.getItemStack().setType(event.getBucket()); ess.scheduleSyncDelayedTask(new Runnable() @@ -280,7 +289,7 @@ public class EssentialsPlayerListener extends PlayerListener @Override public void onPlayerAnimation(final PlayerAnimationEvent event) { - final User user = ess.getUser(event.getPlayer()); + final IUser user = ess.getUser(event.getPlayer()); user.updateActivity(true); usePowertools(event); } @@ -291,13 +300,15 @@ public class EssentialsPlayerListener extends PlayerListener { return; } - final User user = ess.getUser(event.getPlayer()); - final ItemStack is = user.getItemInHand(); - if (is == null || is.getType() == Material.AIR || !user.arePowerToolsEnabled()) + @Cleanup + final IUser user = ess.getUser(event.getPlayer()); + user.acquireReadLock(); + final ItemStack hand = user.getItemInHand(); + if (hand == null || hand.getType() == Material.AIR || !user.getData().isPowertoolsenabled()) { return; } - final List<String> commandList = user.getPowertool(is); + final List<String> commandList = user.getData().getPowertool(hand.getType()); if (commandList == null || commandList.isEmpty()) { return; @@ -329,15 +340,17 @@ public class EssentialsPlayerListener extends PlayerListener { return; } - final User user = ess.getUser(event.getPlayer()); + final IUser user = ess.getUser(event.getPlayer()); final String cmd = event.getMessage().toLowerCase(Locale.ENGLISH).split(" ")[0].replace("/", "").toLowerCase(Locale.ENGLISH); final List<String> commands = Arrays.asList("msg", "r", "mail", "m", "t", "emsg", "tell", "er", "reply", "ereply", "email"); if (commands.contains(cmd)) { for (Player player : ess.getServer().getOnlinePlayers()) { - User spyer = ess.getUser(player); - if (spyer.isSocialSpyEnabled() && !user.equals(spyer)) + @Cleanup + IUser spyer = ess.getUser(player); + spyer.acquireReadLock(); + if (spyer.getData().isSocialspy() && !user.equals(spyer)) { player.sendMessage(user.getDisplayName() + " : " + event.getMessage()); } @@ -352,10 +365,15 @@ public class EssentialsPlayerListener extends PlayerListener @Override public void onPlayerChangedWorld(final PlayerChangedWorldEvent event) { - if (ess.getSettings().getNoGodWorlds().contains(event.getPlayer().getLocation().getWorld().getName())) - { - User user = ess.getUser(event.getPlayer()); - if (user.isGodModeEnabledRaw()) + @Cleanup + final ISettings settings = ess.getSettings(); + settings.acquireReadLock(); + if (!settings.getData().getWorldOptions(event.getPlayer().getLocation().getWorld().getName()).isGodmode()) + { + @Cleanup + final IUser user = ess.getUser(event.getPlayer()); + user.acquireReadLock(); + if (user.getData().isGodmode()) { user.sendMessage(_("noGodWorldWarning")); } @@ -374,21 +392,33 @@ public class EssentialsPlayerListener extends PlayerListener return; } - if (ess.getSettings().getUpdateBedAtDaytime() && event.getClickedBlock().getType() == Material.BED_BLOCK) + @Cleanup + final ISettings settings = ess.getSettings(); + settings.acquireReadLock(); + if (settings.getData().getCommands().getHome().isUpdateBedAtDaytime() && event.getClickedBlock().getType() == Material.BED_BLOCK) { SetBed.setBed(event.getPlayer(), event.getClickedBlock()); } } @Override - public void onPlayerPickupItem(PlayerPickupItemEvent event) + public void onPlayerPickupItem(final PlayerPickupItemEvent event) { - if (event.isCancelled() || !ess.getSettings().getDisableItemPickupWhileAfk()) + if (event.isCancelled()) + { + return; + } + @Cleanup + final ISettings settings = ess.getSettings(); + settings.acquireReadLock(); + if (!settings.getData().getCommands().getAfk().isDisableItemPickupWhileAfk()) { return; } - final User user = ess.getUser(event.getPlayer()); - if (user.isAfk()) + @Cleanup + final IUser user = ess.getUser(event.getPlayer()); + user.acquireReadLock(); + if (user.getData().isAfk()) { event.setCancelled(true); } diff --git a/Essentials/src/com/earth2me/essentials/EssentialsPluginListener.java b/Essentials/src/com/earth2me/essentials/listener/EssentialsPluginListener.java index b0ee0b543..8e1f8f374 100644 --- a/Essentials/src/com/earth2me/essentials/EssentialsPluginListener.java +++ b/Essentials/src/com/earth2me/essentials/listener/EssentialsPluginListener.java @@ -1,5 +1,7 @@ -package com.earth2me.essentials; +package com.earth2me.essentials.listener; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.IReload; import java.util.logging.Level; import java.util.logging.Logger; import org.bukkit.event.server.PluginDisableEvent; @@ -7,13 +9,14 @@ import org.bukkit.event.server.PluginEnableEvent; import org.bukkit.event.server.ServerListener; -public class EssentialsPluginListener extends ServerListener implements IConf +public class EssentialsPluginListener extends ServerListener implements IReload { private final transient IEssentials ess; private static final Logger LOGGER = Logger.getLogger("Minecraft"); public EssentialsPluginListener(final IEssentials ess) { + super(); this.ess = ess; } @@ -21,10 +24,10 @@ public class EssentialsPluginListener extends ServerListener implements IConf public void onPluginEnable(final PluginEnableEvent event) { ess.getPermissionsHandler().checkPermissions(); - ess.getAlternativeCommandsHandler().addPlugin(event.getPlugin()); + ess.getCommandHandler().addPlugin(event.getPlugin()); if (!ess.getPaymentMethod().hasMethod() && ess.getPaymentMethod().setMethod(ess.getServer().getPluginManager())) { - LOGGER.log(Level.INFO, "[Essentials] Payment method found (" + ess.getPaymentMethod().getMethod().getName() + " version: " + ess.getPaymentMethod().getMethod().getVersion() + ")"); + LOGGER.log(Level.INFO, "[Essentials] Payment method found ({0} version: {1})", new Object[]{ess.getPaymentMethod().getMethod().getName(), ess.getPaymentMethod().getMethod().getVersion()}); } } @@ -32,7 +35,7 @@ public class EssentialsPluginListener extends ServerListener implements IConf public void onPluginDisable(final PluginDisableEvent event) { ess.getPermissionsHandler().checkPermissions(); - ess.getAlternativeCommandsHandler().removePlugin(event.getPlugin()); + ess.getCommandHandler().removePlugin(event.getPlugin()); // Check to see if the plugin thats being disabled is the one we are using if (ess.getPaymentMethod() != null && ess.getPaymentMethod().hasMethod() && ess.getPaymentMethod().checkDisabled(event.getPlugin())) { @@ -42,9 +45,8 @@ public class EssentialsPluginListener extends ServerListener implements IConf } @Override - public void reloadConfig() + public void onReload() { - ess.getPermissionsHandler().setUseSuperperms(ess.getSettings().useBukkitPermissions()); - ess.getPermissionsHandler().checkPermissions(); + //ess.getPermissionsHandler().setUseSuperperms(ess.getSettings().useBukkitPermissions()); } } diff --git a/Essentials/src/com/earth2me/essentials/TNTExplodeListener.java b/Essentials/src/com/earth2me/essentials/listener/TNTExplodeListener.java index 4ae259a32..1f0035d76 100644 --- a/Essentials/src/com/earth2me/essentials/TNTExplodeListener.java +++ b/Essentials/src/com/earth2me/essentials/listener/TNTExplodeListener.java @@ -1,6 +1,8 @@ -package com.earth2me.essentials; +package com.earth2me.essentials.listener; +import com.earth2me.essentials.api.IEssentials; import com.earth2me.essentials.craftbukkit.FakeExplosion; +import java.util.concurrent.atomic.AtomicBoolean; import org.bukkit.entity.LivingEntity; import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.entity.EntityListener; @@ -9,7 +11,7 @@ import org.bukkit.event.entity.EntityListener; public class TNTExplodeListener extends EntityListener implements Runnable { private final transient IEssentials ess; - private transient boolean enabled = false; + private transient AtomicBoolean enabled = new AtomicBoolean(false); private transient int timer = -1; public TNTExplodeListener(final IEssentials ess) @@ -20,15 +22,14 @@ public class TNTExplodeListener extends EntityListener implements Runnable public void enable() { - if (!enabled) + if (enabled.compareAndSet(false, true)) { - enabled = true; timer = ess.scheduleSyncDelayedTask(this, 1000); return; } if (timer != -1) { - ess.getScheduler().cancelTask(timer); + ess.getServer().getScheduler().cancelTask(timer); timer = ess.scheduleSyncDelayedTask(this, 1000); } } @@ -36,7 +37,7 @@ public class TNTExplodeListener extends EntityListener implements Runnable @Override public void onEntityExplode(final EntityExplodeEvent event) { - if (!enabled) + if (!enabled.get()) { return; } @@ -51,6 +52,6 @@ public class TNTExplodeListener extends EntityListener implements Runnable @Override public void run() { - enabled = false; + enabled.set(false); } } diff --git a/Essentials/src/com/earth2me/essentials/perm/AbstractPermissionsHandler.java b/Essentials/src/com/earth2me/essentials/perm/AbstractPermissionsHandler.java new file mode 100644 index 000000000..6c01d7de1 --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/perm/AbstractPermissionsHandler.java @@ -0,0 +1,10 @@ +package com.earth2me.essentials.perm; + + +public abstract class AbstractPermissionsHandler implements IPermissionsHandler +{ + @Override + public void checkPermissions() + { + } +} diff --git a/Essentials/src/com/earth2me/essentials/perm/ConfigPermissionsHandler.java b/Essentials/src/com/earth2me/essentials/perm/ConfigPermissionsHandler.java index fad479444..4cee6b5ad 100644 --- a/Essentials/src/com/earth2me/essentials/perm/ConfigPermissionsHandler.java +++ b/Essentials/src/com/earth2me/essentials/perm/ConfigPermissionsHandler.java @@ -1,12 +1,12 @@ package com.earth2me.essentials.perm; -import com.earth2me.essentials.IEssentials; +import com.earth2me.essentials.api.IEssentials; import java.util.List; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; -public class ConfigPermissionsHandler implements IPermissionsHandler +/*public class ConfigPermissionsHandler extends AbstractPermissionsHandler { private final transient IEssentials ess; @@ -58,4 +58,4 @@ public class ConfigPermissionsHandler implements IPermissionsHandler { return null; } -} +}*/ diff --git a/Essentials/src/com/earth2me/essentials/perm/GroupManagerHandler.java b/Essentials/src/com/earth2me/essentials/perm/GroupManagerHandler.java index 8c3cdf1e2..9e9c25e1f 100644 --- a/Essentials/src/com/earth2me/essentials/perm/GroupManagerHandler.java +++ b/Essentials/src/com/earth2me/essentials/perm/GroupManagerHandler.java @@ -8,7 +8,7 @@ import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; -public class GroupManagerHandler implements IPermissionsHandler +public class GroupManagerHandler extends AbstractPermissionsHandler { private final transient GroupManager groupManager; diff --git a/Essentials/src/com/earth2me/essentials/perm/IPermissionsHandler.java b/Essentials/src/com/earth2me/essentials/perm/IPermissionsHandler.java index 27af48e8c..d769eddd7 100644 --- a/Essentials/src/com/earth2me/essentials/perm/IPermissionsHandler.java +++ b/Essentials/src/com/earth2me/essentials/perm/IPermissionsHandler.java @@ -19,4 +19,6 @@ public interface IPermissionsHandler String getPrefix(Player base); String getSuffix(Player base); + + public void checkPermissions(); } diff --git a/Essentials/src/com/earth2me/essentials/perm/NullPermissionsHandler.java b/Essentials/src/com/earth2me/essentials/perm/NullPermissionsHandler.java index b51aeb055..5a931ef14 100644 --- a/Essentials/src/com/earth2me/essentials/perm/NullPermissionsHandler.java +++ b/Essentials/src/com/earth2me/essentials/perm/NullPermissionsHandler.java @@ -5,7 +5,7 @@ import java.util.List; import org.bukkit.entity.Player; -public class NullPermissionsHandler implements IPermissionsHandler +public class NullPermissionsHandler extends AbstractPermissionsHandler { @Override public String getGroup(final Player base) diff --git a/Essentials/src/com/earth2me/essentials/perm/Permissions2Handler.java b/Essentials/src/com/earth2me/essentials/perm/Permissions2Handler.java index 6b5ff5b73..3945f5375 100644 --- a/Essentials/src/com/earth2me/essentials/perm/Permissions2Handler.java +++ b/Essentials/src/com/earth2me/essentials/perm/Permissions2Handler.java @@ -8,7 +8,7 @@ import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; -public class Permissions2Handler implements IPermissionsHandler +public class Permissions2Handler extends AbstractPermissionsHandler { private final transient PermissionHandler permissionHandler; diff --git a/Essentials/src/com/earth2me/essentials/perm/Permissions3Handler.java b/Essentials/src/com/earth2me/essentials/perm/Permissions3Handler.java index 190d5b8c5..7b0c1085f 100644 --- a/Essentials/src/com/earth2me/essentials/perm/Permissions3Handler.java +++ b/Essentials/src/com/earth2me/essentials/perm/Permissions3Handler.java @@ -8,7 +8,7 @@ import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; -public class Permissions3Handler implements IPermissionsHandler +public class Permissions3Handler extends AbstractPermissionsHandler { private final transient PermissionHandler permissionHandler; diff --git a/Essentials/src/com/earth2me/essentials/perm/PermissionsExHandler.java b/Essentials/src/com/earth2me/essentials/perm/PermissionsExHandler.java index 5d8e62232..6d7fbf777 100644 --- a/Essentials/src/com/earth2me/essentials/perm/PermissionsExHandler.java +++ b/Essentials/src/com/earth2me/essentials/perm/PermissionsExHandler.java @@ -8,7 +8,7 @@ import ru.tehkode.permissions.PermissionUser; import ru.tehkode.permissions.bukkit.PermissionsEx; -public class PermissionsExHandler implements IPermissionsHandler +public class PermissionsExHandler extends AbstractPermissionsHandler { private final transient PermissionManager manager; diff --git a/Essentials/src/com/earth2me/essentials/perm/PermissionsHandler.java b/Essentials/src/com/earth2me/essentials/perm/PermissionsHandler.java index 8c16aab7a..282a138ab 100644 --- a/Essentials/src/com/earth2me/essentials/perm/PermissionsHandler.java +++ b/Essentials/src/com/earth2me/essentials/perm/PermissionsHandler.java @@ -15,18 +15,18 @@ public class PermissionsHandler implements IPermissionsHandler private transient String defaultGroup = "default"; private final transient Plugin plugin; private final static Logger LOGGER = Logger.getLogger("Minecraft"); - private transient boolean useSuperperms = false; + //private transient boolean useSuperperms = false; public PermissionsHandler(final Plugin plugin) { this.plugin = plugin; } - public PermissionsHandler(final Plugin plugin, final boolean useSuperperms) + /*public PermissionsHandler(final Plugin plugin, final boolean useSuperperms) { this.plugin = plugin; this.useSuperperms = useSuperperms; - } + }*/ public PermissionsHandler(final Plugin plugin, final String defaultGroup) { @@ -96,6 +96,7 @@ public class PermissionsHandler implements IPermissionsHandler return suffix; } + @Override public void checkPermissions() { final PluginManager pluginManager = plugin.getServer().getPluginManager(); @@ -166,14 +167,14 @@ public class PermissionsHandler implements IPermissionsHandler return; } - if (useSuperperms) - { + //if (useSuperperms) + //{ if (!(handler instanceof SuperpermsHandler)) { LOGGER.log(Level.INFO, "Essentials: Using superperms based permissions."); handler = new SuperpermsHandler(); } - } + /*} else { if (!(handler instanceof ConfigPermissionsHandler)) @@ -181,11 +182,11 @@ public class PermissionsHandler implements IPermissionsHandler LOGGER.log(Level.INFO, "Essentials: Using config based permissions. Enable superperms in config."); handler = new ConfigPermissionsHandler(plugin); } - } + }*/ } - public void setUseSuperperms(final boolean useSuperperms) + /*public void setUseSuperperms(final boolean useSuperperms) { this.useSuperperms = useSuperperms; - } + }*/ } diff --git a/Essentials/src/com/earth2me/essentials/perm/SuperpermsHandler.java b/Essentials/src/com/earth2me/essentials/perm/SuperpermsHandler.java index 70a118bcf..1828ec527 100644 --- a/Essentials/src/com/earth2me/essentials/perm/SuperpermsHandler.java +++ b/Essentials/src/com/earth2me/essentials/perm/SuperpermsHandler.java @@ -4,7 +4,7 @@ import java.util.List; import org.bukkit.entity.Player; -public class SuperpermsHandler implements IPermissionsHandler +public class SuperpermsHandler extends AbstractPermissionsHandler { @Override public String getGroup(final Player base) diff --git a/Essentials/src/com/earth2me/essentials/settings/Chat.java b/Essentials/src/com/earth2me/essentials/settings/Chat.java index 623228c4e..82a18e051 100644 --- a/Essentials/src/com/earth2me/essentials/settings/Chat.java +++ b/Essentials/src/com/earth2me/essentials/settings/Chat.java @@ -12,8 +12,12 @@ public class Chat implements StorageObject { @Comment("The character(s) to prefix all nicknames, so that you know they are not true usernames.") private String nicknamePrefix = "~"; - @Comment("Disable this if you have any other plugin, that modifies the displayname of a user.") - private boolean changeDisplayname = true; + @Comment( + { + "Disable this if you have any other plugin, that modifies the displayname of a user.", + "If it is not set, it will be enabled if EssentialsChat is installed, otherwise not." + }) + private Boolean changeDisplayname; private String displaynameFormat = "{PREFIX}{NICKNAMEPREFIX}{NAME}{SUFFIX}"; @Comment( { diff --git a/Essentials/src/com/earth2me/essentials/settings/Commands.java b/Essentials/src/com/earth2me/essentials/settings/Commands.java index 08efc881c..2a9012760 100644 --- a/Essentials/src/com/earth2me/essentials/settings/Commands.java +++ b/Essentials/src/com/earth2me/essentials/settings/Commands.java @@ -15,11 +15,13 @@ import lombok.EqualsAndHashCode; public class Commands implements StorageObject { private Afk afk = new Afk(); + private Back back = new Back(); private God god = new God(); private Help help = new Help(); private Home home = new Home(); private Kit kit = new Kit(); private Lightning lightning = new Lightning(); + private com.earth2me.essentials.settings.commands.List list = new com.earth2me.essentials.settings.commands.List(); private Spawnmob spawnmob = new Spawnmob(); @ListType @Comment( @@ -33,8 +35,40 @@ public class Commands implements StorageObject "We should try to take priority over /god. If this doesn't work, use /essentials:god or /egod.", "If god is set using WorldGuard, use /ungod to remove then use whichever you see fit." }) - private List<String> overwritten = new ArrayList<String>(); + private List<String> overridden = new ArrayList<String>(); @ListType @Comment("Disabled commands will be completelly unavailable on the server.") private List<String> disabled = new ArrayList<String>(); + + public boolean isDisabled(final String commandName) + { + if (disabled == null) + { + return false; + } + for (String disabledCommand : disabled) + { + if (commandName.equalsIgnoreCase(disabledCommand)) + { + return true; + } + } + return false; + } + + public boolean isOverridden(final String commandName) + { + if (overridden == null) + { + return false; + } + for (String overriddenCommand : overridden) + { + if (commandName.equalsIgnoreCase(overriddenCommand)) + { + return true; + } + } + return false; + } } diff --git a/Essentials/src/com/earth2me/essentials/settings/Economy.java b/Essentials/src/com/earth2me/essentials/settings/Economy.java index 5872dada9..21b6f3b05 100644 --- a/Essentials/src/com/earth2me/essentials/settings/Economy.java +++ b/Essentials/src/com/earth2me/essentials/settings/Economy.java @@ -40,4 +40,15 @@ public class Economy implements StorageObject @Comment("Enable this to log all interactions with trade/buy/sell signs and sell command") private boolean logEnabled = false; private Worth worth = new Worth(); + private boolean tradeInStacks = false; + + public double getCommandCost(String command) + { + if (commandCosts == null) + { + return 0; + } + Double price = commandCosts.get(command); + return price == null || Double.isNaN(price) || Double.isInfinite(price) ? 0 : price; + } } diff --git a/Essentials/src/com/earth2me/essentials/settings/General.java b/Essentials/src/com/earth2me/essentials/settings/General.java index a7cf537bb..67cd0ee27 100644 --- a/Essentials/src/com/earth2me/essentials/settings/General.java +++ b/Essentials/src/com/earth2me/essentials/settings/General.java @@ -30,4 +30,18 @@ public class General implements StorageObject "If not, set to ''" }) private String newPlayerAnnouncement = "&dWelcome {DISPLAYNAME} to the server!"; + @Comment( + { + "The number of items given, if the quantity parameter is left out in /item or /give.", + "If this number is below 1, the maximum stack size size is given. If oversized stacks", + "is not enabled, any number higher then the maximum stack size results in more than one stack." + }) + private int defaultStacksize = -1; + @Comment( + { + "Oversized stacks are stacks that ignore the normal max stacksize.", + "They can be obtained using /give and /item, if the player has essentials.oversizedstacks permission.", + "How many items should be in a oversized stack?" + }) + private int oversizedStacksize = 64; } diff --git a/Essentials/src/com/earth2me/essentials/settings/GroupsHolder.java b/Essentials/src/com/earth2me/essentials/settings/GroupsHolder.java new file mode 100644 index 000000000..0ddd2b758 --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/settings/GroupsHolder.java @@ -0,0 +1,150 @@ +package com.earth2me.essentials.settings; + +import com.earth2me.essentials.Util; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.IGroups; +import com.earth2me.essentials.api.IUser; +import com.earth2me.essentials.storage.AsyncStorageObjectHolder; +import java.io.File; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Map; +import java.util.Map.Entry; + + +public class GroupsHolder extends AsyncStorageObjectHolder<Groups> implements IGroups +{ + public GroupsHolder(final IEssentials ess) + { + super(ess, Groups.class); + } + + @Override + public File getStorageFile() + { + return new File(ess.getDataFolder(), "groups.yml"); + } + + public void registerPermissions() + { + acquireReadLock(); + try + { + final Map<String, GroupOptions> groups = getData().getGroups(); + if (groups == null || groups.isEmpty()) + { + return; + } + Util.registerPermissions("essentials.groups", groups.keySet(), true, ess); + } + finally + { + unlock(); + } + } + + public Collection<GroupOptions> getGroups(final IUser player) + { + acquireReadLock(); + try + { + final Map<String, GroupOptions> groups = getData().getGroups(); + if (groups == null || groups.isEmpty()) + { + return Collections.emptyList(); + } + final ArrayList<GroupOptions> list = new ArrayList(); + for (Entry<String, GroupOptions> entry : groups.entrySet()) + { + if (player.isAuthorized("essentials.groups." + entry.getKey())) + { + list.add(entry.getValue()); + } + } + return list; + } + finally + { + unlock(); + } + } + + @Override + public double getHealCooldown(final IUser player) + { + for (GroupOptions groupOptions : getGroups(player)) + { + if (groupOptions.getHealCooldown() != null) + { + return groupOptions.getHealCooldown(); + } + } + return 0; + } + + @Override + public double getTeleportCooldown(final IUser player) + { + for (GroupOptions groupOptions : getGroups(player)) + { + if (groupOptions.getTeleportCooldown() != null) + { + return groupOptions.getTeleportCooldown(); + } + } + return 0; + } + + @Override + public double getTeleportDelay(final IUser player) + { + for (GroupOptions groupOptions : getGroups(player)) + { + if (groupOptions.getTeleportDelay() != null) + { + return groupOptions.getTeleportDelay(); + } + } + return 0; + } + + @Override + public String getPrefix(final IUser player) + { + for (GroupOptions groupOptions : getGroups(player)) + { + if (groupOptions.getPrefix() != null) + { + return groupOptions.getPrefix(); + } + } + return ""; + } + + @Override + public String getSuffix(final IUser player) + { + for (GroupOptions groupOptions : getGroups(player)) + { + if (groupOptions.getSuffix() != null) + { + return groupOptions.getSuffix(); + } + } + return ""; + } + + @Override + public int getHomeLimit(final IUser player) + { + for (GroupOptions groupOptions : getGroups(player)) + { + if (groupOptions.getHomes() != null) + { + return groupOptions.getHomes(); + } + } + return 0; + } +} diff --git a/Essentials/src/com/earth2me/essentials/settings/Settings.java b/Essentials/src/com/earth2me/essentials/settings/Settings.java index 4c2ff2dd9..6e5ec9793 100644 --- a/Essentials/src/com/earth2me/essentials/settings/Settings.java +++ b/Essentials/src/com/earth2me/essentials/settings/Settings.java @@ -1,7 +1,10 @@ package com.earth2me.essentials.settings; import com.earth2me.essentials.storage.Comment; +import com.earth2me.essentials.storage.MapValueType; import com.earth2me.essentials.storage.StorageObject; +import java.util.HashMap; +import java.util.Map; import lombok.Data; import lombok.EqualsAndHashCode; @@ -50,9 +53,20 @@ public class Settings implements StorageObject { "##########################################################", "+------------------------------------------------------+ #", - "| Group Settings | #", + "| Worlds Settings | #", "+------------------------------------------------------+ #", "##########################################################" }) - private Groups groups = new Groups(); + @MapValueType(WorldOptions.class) + private Map<String, WorldOptions> worlds = new HashMap<String, WorldOptions>(); + + public WorldOptions getWorldOptions(final String name) + { + if (worlds == null) + { + worlds = new HashMap<String, WorldOptions>(); + } + final WorldOptions options = worlds.get(name); + return (options == null) ? new WorldOptions() : options; + } } diff --git a/Essentials/src/com/earth2me/essentials/settings/SettingsHolder.java b/Essentials/src/com/earth2me/essentials/settings/SettingsHolder.java new file mode 100644 index 000000000..434d9b922 --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/settings/SettingsHolder.java @@ -0,0 +1,64 @@ +package com.earth2me.essentials.settings; + +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.ISettings; +import com.earth2me.essentials.storage.AsyncStorageObjectHolder; +import java.io.File; +import java.util.concurrent.atomic.AtomicBoolean; + + +public class SettingsHolder extends AsyncStorageObjectHolder<Settings> implements ISettings +{ + private final transient AtomicBoolean debug = new AtomicBoolean(false); + public SettingsHolder(final IEssentials ess) + { + super(ess, Settings.class); + onReload(); + } + + @Override + public final void onReload() + { + super.onReload(); + acquireReadLock(); + try { + debug.set(getData().getGeneral().isDebug()); + } finally { + unlock(); + } + } + + @Override + public File getStorageFile() + { + return new File(ess.getDataFolder(), "settings.yml"); + } + + @Override + public String getLocale() + { + acquireReadLock(); + try { + return getData().getGeneral().getLocale(); + } finally { + unlock(); + } + } + + @Override + public boolean isDebug() + { + return debug.get(); + } + + public void setDebug(final boolean set) + { + debug.set(set); + acquireWriteLock(); + try { + getData().getGeneral().setDebug(set); + } finally { + unlock(); + } + } +} diff --git a/Essentials/src/com/earth2me/essentials/settings/Warp.java b/Essentials/src/com/earth2me/essentials/settings/Warp.java new file mode 100644 index 000000000..20a252afb --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/settings/Warp.java @@ -0,0 +1,14 @@ +package com.earth2me.essentials.settings; + +import com.earth2me.essentials.storage.StorageObject; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.bukkit.Location; + +@Data +@EqualsAndHashCode(callSuper = false) +public class Warp implements StorageObject +{ + private String name; + private Location location; +} diff --git a/Essentials/src/com/earth2me/essentials/settings/WarpHolder.java b/Essentials/src/com/earth2me/essentials/settings/WarpHolder.java new file mode 100644 index 000000000..0de075fc5 --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/settings/WarpHolder.java @@ -0,0 +1,36 @@ +package com.earth2me.essentials.settings; + +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.IWarp; +import com.earth2me.essentials.api.InvalidNameException; +import com.earth2me.essentials.storage.AsyncStorageObjectHolder; +import com.earth2me.essentials.storage.StorageObject; +import java.io.File; +import java.io.IOException; + + +public class WarpHolder extends AsyncStorageObjectHolder<Warp> implements IWarp +{ + private final String name; + + public WarpHolder(String name, IEssentials ess) + { + super(ess, Warp.class); + this.name = name; + onReload(); + } + + @Override + public File getStorageFile() throws IOException + { + try + { + return ess.getWarps().getWarpFile(name); + } + catch (InvalidNameException ex) + { + throw new IOException(ex.getMessage(), ex); + } + } + +} diff --git a/Essentials/src/com/earth2me/essentials/settings/WorldOptions.java b/Essentials/src/com/earth2me/essentials/settings/WorldOptions.java new file mode 100644 index 000000000..33271b460 --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/settings/WorldOptions.java @@ -0,0 +1,14 @@ +package com.earth2me.essentials.settings; + +import com.earth2me.essentials.storage.Comment; +import com.earth2me.essentials.storage.StorageObject; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = false) +public class WorldOptions implements StorageObject +{ + @Comment("Disables godmode for all players if they teleport to this world.") + private boolean godmode = true; +} diff --git a/Essentials/src/com/earth2me/essentials/settings/Worlds.java b/Essentials/src/com/earth2me/essentials/settings/Worlds.java new file mode 100644 index 000000000..88d435c4b --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/settings/Worlds.java @@ -0,0 +1,15 @@ +package com.earth2me.essentials.settings; + +import com.earth2me.essentials.storage.MapValueType; +import com.earth2me.essentials.storage.StorageObject; +import java.util.HashMap; +import java.util.Map; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = false) +public class Worlds implements StorageObject +{ + +}
\ No newline at end of file diff --git a/Essentials/src/com/earth2me/essentials/settings/commands/Afk.java b/Essentials/src/com/earth2me/essentials/settings/commands/Afk.java index 80cae7e8a..f46e52d52 100644 --- a/Essentials/src/com/earth2me/essentials/settings/commands/Afk.java +++ b/Essentials/src/com/earth2me/essentials/settings/commands/Afk.java @@ -15,14 +15,14 @@ public class Afk implements StorageObject "After this timeout in seconds, the user will be set as afk.", "Set to -1 for no timeout." }) - private int autoAFK = 300; + private long autoAFK = 300; @Comment( { "Auto-AFK Kick", "After this timeout in seconds, the user will be kicked from the server.", "Set to -1 for no timeout." }) - private int autoAFKKick = -1; + private long autoAFKKick = -1; @Comment( { "Set this to true, if you want to freeze the player, if he is afk.", @@ -33,4 +33,6 @@ public class Afk implements StorageObject "since the player will not get a message, if he tries to move." }) private boolean freezeAFKPlayers = false; + + private boolean disableItemPickupWhileAfk = true; } diff --git a/Essentials/src/com/earth2me/essentials/settings/commands/Back.java b/Essentials/src/com/earth2me/essentials/settings/commands/Back.java new file mode 100644 index 000000000..bd2afdd62 --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/settings/commands/Back.java @@ -0,0 +1,19 @@ +package com.earth2me.essentials.settings.commands; + +import com.earth2me.essentials.storage.Comment; +import com.earth2me.essentials.storage.StorageObject; +import lombok.Data; +import lombok.EqualsAndHashCode; + + +@Data +@EqualsAndHashCode(callSuper = false) +public class Back implements StorageObject +{ + @Comment( + { + "Do you want essentials to keep track of previous location for /back in the teleport listener?", + "If you set this to true any plugin that uses teleport will have the previous location registered." + }) + private boolean registerBackInListener = false; +} diff --git a/Essentials/src/com/earth2me/essentials/settings/commands/Home.java b/Essentials/src/com/earth2me/essentials/settings/commands/Home.java index 8b3a0ca82..b856c881b 100644 --- a/Essentials/src/com/earth2me/essentials/settings/commands/Home.java +++ b/Essentials/src/com/earth2me/essentials/settings/commands/Home.java @@ -21,4 +21,6 @@ public class Home implements StorageObject private boolean bedSetsHome = false; @Comment("If no home is set, should the player be send to spawn, when /home is used.") private boolean spawnIfNoHome = false; + @Comment("Allows people to set their bed at daytime") + private boolean updateBedAtDaytime = true; } diff --git a/Essentials/src/com/earth2me/essentials/settings/commands/List.java b/Essentials/src/com/earth2me/essentials/settings/commands/List.java new file mode 100644 index 000000000..ca2c61d2d --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/settings/commands/List.java @@ -0,0 +1,16 @@ +package com.earth2me.essentials.settings.commands; + + +import com.earth2me.essentials.storage.Comment; +import com.earth2me.essentials.storage.StorageObject; +import lombok.Data; +import lombok.EqualsAndHashCode; + + +@Data +@EqualsAndHashCode(callSuper = false) +public class List implements StorageObject +{ + @Comment("Sort output of /list command by groups") + private boolean sortByGroups = true; +} diff --git a/Essentials/src/com/earth2me/essentials/signs/SignMail.java b/Essentials/src/com/earth2me/essentials/signs/SignMail.java deleted file mode 100644 index b220fb2f5..000000000 --- a/Essentials/src/com/earth2me/essentials/signs/SignMail.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.earth2me.essentials.signs; - -import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.IEssentials; -import com.earth2me.essentials.User; -import java.util.List; - - -public class SignMail extends EssentialsSign -{ - public SignMail() - { - super("Mail"); - } - - @Override - protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException - { - final List<String> mail = player.getMails(); - if (mail.isEmpty()) - { - player.sendMessage(_("noNewMail")); - return false; - } - for (String s : mail) - { - player.sendMessage(s); - } - player.sendMessage(_("markMailAsRead")); - return true; - } -} diff --git a/Essentials/src/com/earth2me/essentials/storage/AbstractDelayedYamlFileReader.java b/Essentials/src/com/earth2me/essentials/storage/AbstractDelayedYamlFileReader.java index d48b4a060..049a5c61e 100644 --- a/Essentials/src/com/earth2me/essentials/storage/AbstractDelayedYamlFileReader.java +++ b/Essentials/src/com/earth2me/essentials/storage/AbstractDelayedYamlFileReader.java @@ -1,10 +1,11 @@ package com.earth2me.essentials.storage; -import com.earth2me.essentials.IEssentials; +import com.earth2me.essentials.api.IEssentials; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; +import java.util.concurrent.locks.ReentrantLock; import java.util.logging.Level; import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; @@ -12,54 +13,78 @@ import org.bukkit.plugin.Plugin; public abstract class AbstractDelayedYamlFileReader<T extends StorageObject> implements Runnable { - private final transient File file; private final transient Class<T> clazz; private final transient Plugin plugin; + private final transient ReentrantLock lock = new ReentrantLock(); - public AbstractDelayedYamlFileReader(final IEssentials ess, final File file, final Class<T> clazz) + public AbstractDelayedYamlFileReader(final IEssentials ess, final Class<T> clazz) { - this.file = file; this.clazz = clazz; this.plugin = ess; - ess.scheduleAsyncDelayedTask(this); } - public abstract void onStart(); + public void schedule(boolean instant) + { + if (instant) + { + run(); + } + else + { + plugin.getServer().getScheduler().scheduleAsyncDelayedTask(plugin, this); + } + } + + public abstract File onStart() throws IOException; @Override public void run() { - onStart(); + lock.lock(); try { - final FileReader reader = new FileReader(file); + final File file = onStart(); try { - final T object = new YamlStorageReader(reader, plugin).load(clazz); - onSuccess(object); - } - finally - { + final FileReader reader = new FileReader(file); try { - reader.close(); + final T object = new YamlStorageReader(reader, plugin).load(clazz); + onSuccess(object); } - catch (IOException ex) + finally { - Bukkit.getLogger().log(Level.SEVERE, "File can't be closed: " + file.toString(), ex); + try + { + reader.close(); + } + catch (IOException ex) + { + Bukkit.getLogger().log(Level.SEVERE, "File can't be closed: " + file.toString(), ex); + } } - } + } + catch (FileNotFoundException ex) + { + onException(); + Bukkit.getLogger().log(Level.INFO, "File not found: " + file.toString()); + } + catch (ObjectLoadException ex) + { + onException(); + File broken = new File(file.getAbsolutePath() + ".broken." + System.currentTimeMillis()); + file.renameTo(broken); + Bukkit.getLogger().log(Level.SEVERE, "The file " + file.toString() + " is broken, it has been renamed to " + broken.toString(), ex.getCause()); + } } - catch (FileNotFoundException ex) + catch (IOException ex) { - onException(); - Bukkit.getLogger().log(Level.INFO, "File not found: " + file.toString()); + Bukkit.getLogger().log(Level.SEVERE, "File could not be opened: " + ex.getMessage(), ex); } - catch (ObjectLoadException ex) + finally { - onException(); - Bukkit.getLogger().log(Level.SEVERE, "File broken: " + file.toString(), ex.getCause()); + lock.unlock(); } } diff --git a/Essentials/src/com/earth2me/essentials/storage/AbstractDelayedYamlFileWriter.java b/Essentials/src/com/earth2me/essentials/storage/AbstractDelayedYamlFileWriter.java index 697ef7730..4a5ecd8ba 100644 --- a/Essentials/src/com/earth2me/essentials/storage/AbstractDelayedYamlFileWriter.java +++ b/Essentials/src/com/earth2me/essentials/storage/AbstractDelayedYamlFileWriter.java @@ -1,54 +1,76 @@ package com.earth2me.essentials.storage; -import com.earth2me.essentials.IEssentials; +import com.earth2me.essentials.api.IEssentials; import java.io.File; import java.io.FileNotFoundException; +import java.io.IOException; import java.io.PrintWriter; +import java.util.concurrent.locks.ReentrantLock; import java.util.logging.Level; import java.util.logging.Logger; import org.bukkit.Bukkit; +import org.bukkit.plugin.Plugin; public abstract class AbstractDelayedYamlFileWriter implements Runnable { - private final transient File file; + private final transient Plugin plugin; + private final transient ReentrantLock lock = new ReentrantLock(); - public AbstractDelayedYamlFileWriter(IEssentials ess, File file) + public AbstractDelayedYamlFileWriter(IEssentials ess) { - this.file = file; - ess.scheduleAsyncDelayedTask(this); + this.plugin = ess; } + public void schedule() + { + plugin.getServer().getScheduler().scheduleAsyncDelayedTask(plugin, this); + } + + public abstract File getFile() throws IOException; + public abstract StorageObject getObject(); @Override public void run() { - PrintWriter pw = null; + lock.lock(); try { - final StorageObject object = getObject(); - final File folder = file.getParentFile(); - if (!folder.exists()) + final File file = getFile(); + PrintWriter pw = null; + try + { + final StorageObject object = getObject(); + final File folder = file.getParentFile(); + if (!folder.exists()) + { + folder.mkdirs(); + } + pw = new PrintWriter(file); + new YamlStorageWriter(pw).save(object); + } + catch (FileNotFoundException ex) { - folder.mkdirs(); + Bukkit.getLogger().log(Level.SEVERE, file.toString(), ex); + } + finally + { + onFinish(); + if (pw != null) + { + pw.close(); + } } - pw = new PrintWriter(file); - new YamlStorageWriter(pw).save(object); } - catch (FileNotFoundException ex) + catch (IOException ex) { - Bukkit.getLogger().log(Level.SEVERE, file.toString(), ex); + Bukkit.getLogger().log(Level.SEVERE, ex.getMessage(), ex); } finally { - onFinish(); - if (pw != null) - { - pw.close(); - } + lock.unlock(); } - } public abstract void onFinish(); diff --git a/Essentials/src/com/earth2me/essentials/storage/AsyncStorageObjectHolder.java b/Essentials/src/com/earth2me/essentials/storage/AsyncStorageObjectHolder.java index 31c61a63f..48ed3cc0e 100644 --- a/Essentials/src/com/earth2me/essentials/storage/AsyncStorageObjectHolder.java +++ b/Essentials/src/com/earth2me/essentials/storage/AsyncStorageObjectHolder.java @@ -1,20 +1,23 @@ package com.earth2me.essentials.storage; -import com.earth2me.essentials.IConf; -import com.earth2me.essentials.IEssentials; -import com.earth2me.essentials.api.IReload; +import com.earth2me.essentials.api.IEssentials; import java.io.File; +import java.io.IOException; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.logging.Level; import org.bukkit.Bukkit; -public abstract class AsyncStorageObjectHolder<T extends StorageObject> implements IConf, IStorageObjectHolder<T>, IReload +public abstract class AsyncStorageObjectHolder<T extends StorageObject> implements IStorageObjectHolder<T> { private transient T data; private final transient ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); private final transient Class<T> clazz; protected final transient IEssentials ess; + private final transient StorageObjectDataWriter writer = new StorageObjectDataWriter(); + private final transient StorageObjectDataReader reader = new StorageObjectDataReader(); + private final transient AtomicBoolean loaded = new AtomicBoolean(false); public AsyncStorageObjectHolder(final IEssentials ess, final Class<T> clazz) { @@ -30,16 +33,29 @@ public abstract class AsyncStorageObjectHolder<T extends StorageObject> implemen } } + /** + * Warning: If you access this method, you have to acquire a read or write lock first + * + * + * @return Object storing all the data + */ + @Override public T getData() { + if (!loaded.get()) + { + reader.schedule(true); + } return data; } + @Override public void acquireReadLock() { rwl.readLock().lock(); } + @Override public void acquireWriteLock() { while (rwl.getReadHoldCount() > 0) @@ -50,17 +66,19 @@ public abstract class AsyncStorageObjectHolder<T extends StorageObject> implemen rwl.readLock().lock(); } + @Override public void close() { unlock(); } + @Override public void unlock() { if (rwl.isWriteLockedByCurrentThread()) { rwl.writeLock().unlock(); - new StorageObjectDataWriter(); + writer.schedule(); } while (rwl.getReadHoldCount() > 0) { @@ -69,25 +87,25 @@ public abstract class AsyncStorageObjectHolder<T extends StorageObject> implemen } @Override - public void reloadConfig() - { - new StorageObjectDataReader(); - } - - @Override public void onReload() { - new StorageObjectDataReader(); + reader.schedule(false); } - public abstract File getStorageFile(); + public abstract File getStorageFile() throws IOException; private class StorageObjectDataWriter extends AbstractDelayedYamlFileWriter { public StorageObjectDataWriter() { - super(ess, getStorageFile()); + super(ess); + } + + @Override + public File getFile() throws IOException + { + return getStorageFile(); } @Override @@ -109,13 +127,15 @@ public abstract class AsyncStorageObjectHolder<T extends StorageObject> implemen { public StorageObjectDataReader() { - super(ess, getStorageFile(), clazz); + super(ess, clazz); } @Override - public void onStart() + public File onStart() throws IOException { + final File file = getStorageFile(); rwl.writeLock().lock(); + return file; } @Override @@ -126,6 +146,7 @@ public abstract class AsyncStorageObjectHolder<T extends StorageObject> implemen data = object; } rwl.writeLock().unlock(); + loaded.set(true); } @Override @@ -143,6 +164,7 @@ public abstract class AsyncStorageObjectHolder<T extends StorageObject> implemen } } rwl.writeLock().unlock(); + loaded.set(true); } } } diff --git a/Essentials/src/com/earth2me/essentials/storage/BukkitConstructor.java b/Essentials/src/com/earth2me/essentials/storage/BukkitConstructor.java index 5070be552..b04b89448 100644 --- a/Essentials/src/com/earth2me/essentials/storage/BukkitConstructor.java +++ b/Essentials/src/com/earth2me/essentials/storage/BukkitConstructor.java @@ -215,6 +215,20 @@ public class BukkitConstructor extends Constructor } return new EnchantmentLevel(enchant, level); } + if (node.getType().isEnum()) { + final String val = (String)constructScalar((ScalarNode)node); + if (val.isEmpty()) + { + return null; + } + for (Object object : node.getType().getEnumConstants()) + { + if (object.toString().equalsIgnoreCase(val)) { + return object; + } + } + return null; + } return super.construct(node); } } diff --git a/Essentials/src/com/earth2me/essentials/storage/IStorageObjectHolder.java b/Essentials/src/com/earth2me/essentials/storage/IStorageObjectHolder.java index f48e54002..0d582ece8 100644 --- a/Essentials/src/com/earth2me/essentials/storage/IStorageObjectHolder.java +++ b/Essentials/src/com/earth2me/essentials/storage/IStorageObjectHolder.java @@ -1,9 +1,9 @@ package com.earth2me.essentials.storage; -import com.earth2me.essentials.user.UserData; +import com.earth2me.essentials.api.IReload; -public interface IStorageObjectHolder<T extends StorageObject> +public interface IStorageObjectHolder<T extends StorageObject> extends IReload { T getData(); diff --git a/Essentials/src/com/earth2me/essentials/storage/IStorageObjectMap.java b/Essentials/src/com/earth2me/essentials/storage/IStorageObjectMap.java new file mode 100644 index 000000000..f23d4cc7b --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/storage/IStorageObjectMap.java @@ -0,0 +1,24 @@ + +package com.earth2me.essentials.storage; + +import com.earth2me.essentials.api.IReload; +import com.earth2me.essentials.api.InvalidNameException; +import java.io.File; +import java.util.Set; + + + +interface IStorageObjectMap<I> extends IReload +{ + boolean objectExists(final String name); + + I getObject(final String name); + + void removeObject(final String name) throws InvalidNameException; + + Set<String> getAllKeys(); + + int getKeySize(); + + File getStorageFile(final String name) throws InvalidNameException; +} diff --git a/Essentials/src/com/earth2me/essentials/storage/StorageObjectMap.java b/Essentials/src/com/earth2me/essentials/storage/StorageObjectMap.java new file mode 100644 index 000000000..51593c492 --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/storage/StorageObjectMap.java @@ -0,0 +1,137 @@ +package com.earth2me.essentials.storage; + +import com.earth2me.essentials.Util; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.InvalidNameException; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.util.concurrent.UncheckedExecutionException; +import java.io.File; +import java.io.IOException; +import java.util.Collections; +import java.util.Locale; +import java.util.Set; +import java.util.concurrent.ConcurrentSkipListSet; +import java.util.concurrent.ExecutionException; +import java.util.logging.Level; +import org.bukkit.Bukkit; + + +public abstract class StorageObjectMap<I> extends CacheLoader<String, I> implements IStorageObjectMap<I> +{ + protected final transient IEssentials ess; + private final transient File folder; + protected final transient Cache<String, I> cache = CacheBuilder.newBuilder().softValues().build(this); + protected final transient ConcurrentSkipListSet<String> keys = new ConcurrentSkipListSet<String>(); + + public StorageObjectMap(final IEssentials ess, final String folderName) + { + super(); + this.ess = ess; + this.folder = new File(ess.getDataFolder(), folderName); + if (!folder.exists()) + { + folder.mkdirs(); + } + loadAllObjectsAsync(); + } + + private void loadAllObjectsAsync() + { + ess.scheduleAsyncDelayedTask(new Runnable() + { + @Override + public void run() + { + if (!folder.exists() || !folder.isDirectory()) + { + return; + } + keys.clear(); + cache.invalidateAll(); + for (String string : folder.list()) + { + try + { + if (!string.endsWith(".yml")) + { + continue; + } + final String name = Util.decodeFileName(string.substring(0, string.length() - 4)); + keys.add(name.toLowerCase(Locale.ENGLISH)); + } + catch (InvalidNameException ex) + { + Bukkit.getLogger().log(Level.WARNING, "Invalid filename: " + string, ex); + } + } + } + }); + } + + @Override + public boolean objectExists(final String name) + { + return keys.contains(name.toLowerCase(Locale.ENGLISH)); + } + + @Override + public I getObject(final String name) + { + try + { + return (I)cache.get(name.toLowerCase(Locale.ENGLISH)); + } + catch (ExecutionException ex) + { + return null; + } + catch (UncheckedExecutionException ex) + { + return null; + } + } + + @Override + public abstract I load(final String name) throws Exception; + + @Override + public void removeObject(final String name) throws InvalidNameException + { + keys.remove(name.toLowerCase(Locale.ENGLISH)); + cache.invalidate(name.toLowerCase(Locale.ENGLISH)); + File file = getStorageFile(name); + if (file.exists()) + { + } + } + + @Override + public Set<String> getAllKeys() + { + return Collections.unmodifiableSet(keys); + } + + @Override + public int getKeySize() + { + return keys.size(); + } + + @Override + public File getStorageFile(final String name) throws InvalidNameException + { + if (!folder.exists() || !folder.isDirectory()) + { + throw new InvalidNameException(new IOException("Folder does not exists: " + folder)); + } + return new File(folder, Util.sanitizeFileName(name) + ".yml"); + } + + @Override + public void onReload() + { + loadAllObjectsAsync(); + } +} diff --git a/Essentials/src/com/earth2me/essentials/storage/YamlStorageWriter.java b/Essentials/src/com/earth2me/essentials/storage/YamlStorageWriter.java index fd1f0f863..fe12735ef 100644 --- a/Essentials/src/com/earth2me/essentials/storage/YamlStorageWriter.java +++ b/Essentials/src/com/earth2me/essentials/storage/YamlStorageWriter.java @@ -218,6 +218,11 @@ public class YamlStorageWriter implements IStorageWriter YAML.dumpAll(Collections.singletonList(data).iterator(), writer); } } + else if (data instanceof Enum) + { + writeMaterial(data.toString()); + writer.println(); + } else if (data instanceof Material) { writeMaterial(data); @@ -260,6 +265,10 @@ public class YamlStorageWriter implements IStorageWriter writer.print(output); } } + else if (data instanceof Enum) + { + writeMaterial(data.toString()); + } else if (data instanceof Material) { writeMaterial(data); diff --git a/Essentials/src/com/earth2me/essentials/textreader/HelpInput.java b/Essentials/src/com/earth2me/essentials/textreader/HelpInput.java index 85c00c1b6..7d8fc78d0 100644 --- a/Essentials/src/com/earth2me/essentials/textreader/HelpInput.java +++ b/Essentials/src/com/earth2me/essentials/textreader/HelpInput.java @@ -1,12 +1,14 @@ package com.earth2me.essentials.textreader; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.IEssentials; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.ISettings; +import com.earth2me.essentials.api.IUser; import java.io.IOException; import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; +import lombok.Cleanup; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginDescriptionFile; @@ -21,8 +23,11 @@ public class HelpInput implements IText private final transient Map<String, Integer> bookmarks = new HashMap<String, Integer>(); private final static Logger logger = Logger.getLogger("Minecraft"); - public HelpInput(final User user, final String match, final IEssentials ess) throws IOException + public HelpInput(final IUser user, final String match, final IEssentials ess) throws IOException { + @Cleanup + final ISettings settings = ess.getSettings(); + settings.acquireReadLock(); boolean reported = false; String pluginName = ""; for (Plugin p : ess.getServer().getPluginManager().getPlugins()) @@ -48,14 +53,14 @@ public class HelpInput implements IText if (pluginName.contains("essentials")) { final String node = "essentials." + k.getKey(); - if (!ess.getSettings().isCommandDisabled(k.getKey()) && user.isAuthorized(node)) + if (!settings.getData().getCommands().isDisabled(k.getKey()) && user.isAuthorized(node)) { lines.add("ยงc" + k.getKey() + "ยง7: " + k.getValue().get(DESCRIPTION)); } } else { - if (ess.getSettings().showNonEssCommandsInHelp()) + if (settings.getData().getCommands().getHelp().isShowNonEssCommandsInHelp()) { final HashMap<String, Object> value = k.getValue(); Object permissions = null; @@ -96,7 +101,7 @@ public class HelpInput implements IText } else { - if (!ess.getSettings().hidePermissionlessHelp()) + if (!settings.getData().getCommands().getHelp().isHidePermissionlessCommands()) { lines.add("ยงc" + k.getKey() + "ยง7: " + value.get(DESCRIPTION)); } diff --git a/Essentials/src/com/earth2me/essentials/textreader/KeywordReplacer.java b/Essentials/src/com/earth2me/essentials/textreader/KeywordReplacer.java index 182dba9d3..775b0cf95 100644 --- a/Essentials/src/com/earth2me/essentials/textreader/KeywordReplacer.java +++ b/Essentials/src/com/earth2me/essentials/textreader/KeywordReplacer.java @@ -1,12 +1,13 @@ package com.earth2me.essentials.textreader; import com.earth2me.essentials.DescParseTickFormat; -import com.earth2me.essentials.IEssentials; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.IUser; import java.text.DateFormat; import java.util.Date; import java.util.List; import java.util.Map; +import lombok.Cleanup; import org.bukkit.World; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -33,11 +34,13 @@ public class KeywordReplacer implements IText String version; if (sender instanceof Player) { - final User user = ess.getUser(sender); + @Cleanup + final IUser user = ess.getUser((Player)sender); + user.acquireReadLock(); displayName = user.getDisplayName(); ipAddress = user.getAddress().getAddress().toString(); balance = Double.toString(user.getMoney()); - mails = Integer.toString(user.getMails().size()); + mails = Integer.toString(user.getData().getMails() == null ? 0 : user.getData().getMails().size()); world = user.getLocation().getWorld().getName(); worldTime12 = DescParseTickFormat.format12(user.getWorld().getTime()); worldTime24 = DescParseTickFormat.format24(user.getWorld().getTime()); @@ -98,7 +101,7 @@ public class KeywordReplacer implements IText date = DateFormat.getDateInstance(DateFormat.MEDIUM, ess.getI18n().getCurrentLocale()).format(new Date()); time = DateFormat.getTimeInstance(DateFormat.MEDIUM, ess.getI18n().getCurrentLocale()).format(new Date()); - + version = ess.getServer().getVersion(); for (int i = 0; i < input.getLines().size(); i++) diff --git a/Essentials/src/com/earth2me/essentials/textreader/TextInput.java b/Essentials/src/com/earth2me/essentials/textreader/TextInput.java index b25c30d51..ec797e64f 100644 --- a/Essentials/src/com/earth2me/essentials/textreader/TextInput.java +++ b/Essentials/src/com/earth2me/essentials/textreader/TextInput.java @@ -1,12 +1,17 @@ package com.earth2me.essentials.textreader; -import com.earth2me.essentials.IEssentials; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.IUser; import com.earth2me.essentials.Util; +import com.earth2me.essentials.api.InvalidNameException; import java.io.*; import java.util.*; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import sun.util.BuddhistCalendar; public class TextInput implements IText @@ -21,11 +26,18 @@ public class TextInput implements IText File file = null; if (sender instanceof Player) { - final User user = ess.getUser(sender); - file = new File(ess.getDataFolder(), filename + "_" + Util.sanitizeFileName(user.getName()) + ".txt"); - if (!file.exists()) + try + { + final IUser user = ess.getUser((Player)sender); + file = new File(ess.getDataFolder(), filename + "_" + Util.sanitizeFileName(user.getName()) + ".txt"); + if (!file.exists()) + { + file = new File(ess.getDataFolder(), filename + "_" + Util.sanitizeFileName(user.getGroup()) + ".txt"); + } + } + catch (InvalidNameException ex) { - file = new File(ess.getDataFolder(), filename + "_" + Util.sanitizeFileName(user.getGroup()) + ".txt"); + Bukkit.getLogger().log(Level.WARNING, ex.getMessage(), ex); } } if (file == null || !file.exists()) diff --git a/Essentials/src/com/earth2me/essentials/user/CooldownException.java b/Essentials/src/com/earth2me/essentials/user/CooldownException.java new file mode 100644 index 000000000..b986a5552 --- /dev/null +++ b/Essentials/src/com/earth2me/essentials/user/CooldownException.java @@ -0,0 +1,12 @@ +package com.earth2me.essentials.user; + + +public class CooldownException extends Exception +{ + + public CooldownException(String timeLeft) + { + super(timeLeft); + } + +} diff --git a/Essentials/src/com/earth2me/essentials/user/Inventory.java b/Essentials/src/com/earth2me/essentials/user/Inventory.java index 0812f54a0..c39df0d54 100644 --- a/Essentials/src/com/earth2me/essentials/user/Inventory.java +++ b/Essentials/src/com/earth2me/essentials/user/Inventory.java @@ -18,10 +18,42 @@ public class Inventory implements StorageObject private int size; @MapKeyType(Integer.class) @MapValueType(ItemStack.class) - private Map<Integer, ItemStack> items = new HashMap<Integer, ItemStack>(); + private Map<Integer, ItemStack> items = null; public Inventory() { - items.put(1, new ItemStack(Material.APPLE, 64)); + } + + public Inventory(ItemStack[] contents) + { + size = contents.length; + if (items == null) { + items = new HashMap<Integer, ItemStack>(size); + } + items.clear(); + for (int i = 0; i < contents.length; i++) + { + ItemStack itemStack = contents[i]; + if (itemStack == null) { + continue; + } + items.put(i, itemStack); + } + } + + public ItemStack[] getBukkitInventory() + { + if (items == null) { + throw new IllegalStateException(); + } + final ItemStack[] inventory = new ItemStack[size]; + for (Map.Entry<Integer, ItemStack> entry : items.entrySet()) + { + if (entry.getKey() < 0 || entry.getKey()>= size) { + continue; + } + inventory[entry.getKey()] = entry.getValue(); + } + return inventory; } } diff --git a/Essentials/src/com/earth2me/essentials/user/User.java b/Essentials/src/com/earth2me/essentials/user/User.java index 0e544ae06..294e51d1d 100644 --- a/Essentials/src/com/earth2me/essentials/user/User.java +++ b/Essentials/src/com/earth2me/essentials/user/User.java @@ -1,25 +1,59 @@ package com.earth2me.essentials.user; -import com.earth2me.essentials.IEssentials; -import com.earth2me.essentials.IUser; +import com.earth2me.essentials.Console; +import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.Teleport; +import com.earth2me.essentials.Util; +import com.earth2me.essentials.api.*; import com.earth2me.essentials.commands.IEssentialsCommand; +import com.earth2me.essentials.register.payment.Method; +import java.util.Calendar; +import java.util.GregorianCalendar; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.logging.Logger; import lombok.Cleanup; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.OfflinePlayer; +import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; public class User extends UserBase implements IUser { + private CommandSender replyTo = null; + @Getter + private transient IUser teleportRequester; + @Getter + private transient boolean teleportRequestHere; + @Getter + private transient final ITeleport teleport; + @Getter + private transient long teleportRequestTime; + @Getter + @Setter + private transient long lastOnlineActivity; + private transient long lastActivity = System.currentTimeMillis(); + @Getter + @Setter + private boolean hidden = false; + private transient Location afkPosition; + private static final Logger logger = Bukkit.getLogger(); + private AtomicBoolean gotMailInfo = new AtomicBoolean(false); + public User(final Player base, final IEssentials ess) { super(base, ess); + teleport = new Teleport(this, ess); } public User(final OfflinePlayer offlinePlayer, final IEssentials ess) { super(offlinePlayer, ess); + teleport = new Teleport(this, ess); } public void example() @@ -38,12 +72,195 @@ public class User extends UserBase implements IUser } @Override - public long getLastTeleportTimestamp() + public boolean isAuthorized(String node) + { + if (!isOnlineUser()) + { + return false; + } + + if (getData().isJailed()) + { + return false; + } + + return ess.getPermissionsHandler().hasPermission(base, node); + } + + @Override + public boolean isAuthorized(IEssentialsCommand cmd) + { + return isAuthorized(cmd, "essentials."); + } + + @Override + public boolean isAuthorized(IEssentialsCommand cmd, String permissionPrefix) + { + return isAuthorized(permissionPrefix + (cmd.getName().equals("r") ? "msg" : cmd.getName())); + } + + public void checkCooldown(final UserData.TimestampType cooldownType, final double cooldown, final boolean set, final String bypassPermission) throws CooldownException + { + final Calendar now = new GregorianCalendar(); + if (getTimestamp(cooldownType) > 0) + { + final Calendar cooldownTime = new GregorianCalendar(); + cooldownTime.setTimeInMillis(getTimestamp(cooldownType)); + cooldownTime.add(Calendar.SECOND, (int)cooldown); + cooldownTime.add(Calendar.MILLISECOND, (int)((cooldown * 1000.0) % 1000.0)); + if (cooldownTime.after(now) && !isAuthorized(bypassPermission)) + { + throw new CooldownException(Util.formatDateDiff(cooldownTime.getTimeInMillis())); + } + } + if (set) + { + setTimestamp(cooldownType, now.getTimeInMillis()); + } + } + + @Override + public void giveMoney(final double value) + { + giveMoney(value, null); + } + + public void giveMoney(final double value, final CommandSender initiator) + { + + if (value == 0) + { + return; + } + acquireWriteLock(); + try + { + setMoney(getMoney() + value); + sendMessage(_("addedToAccount", Util.formatCurrency(value, ess))); + if (initiator != null) + { + initiator.sendMessage(_("addedToOthersAccount", Util.formatCurrency(value, ess), this.getDisplayName())); + } + } + finally + { + unlock(); + } + } + + public void payUser(final IUser reciever, final double value) throws Exception + { + if (value == 0) + { + return; + } + if (canAfford(value)) + { + setMoney(getMoney() - value); + reciever.setMoney(reciever.getMoney() + value); + sendMessage(_("moneySentTo", Util.formatCurrency(value, ess), reciever.getDisplayName())); + reciever.sendMessage(_("moneyRecievedFrom", Util.formatCurrency(value, ess), getDisplayName())); + } + else + { + throw new Exception(_("notEnoughMoney")); + } + } + + @Override + public void takeMoney(final double value) + { + takeMoney(value, null); + } + + public void takeMoney(final double value, final CommandSender initiator) + { + if (value == 0) + { + return; + } + setMoney(getMoney() - value); + sendMessage(_("takenFromAccount", Util.formatCurrency(value, ess))); + if (initiator != null) + { + initiator.sendMessage(_("takenFromOthersAccount", Util.formatCurrency(value, ess), this.getDisplayName())); + } + } + + public boolean canAfford(final double cost) + { + final double mon = getMoney(); + return mon >= cost || isAuthorized("essentials.eco.loan"); + } + + public void setHome() + { + setHome("home", getLocation()); + } + + public void setHome(final String name) + { + setHome(name, getLocation()); + } + + @Override + public void setLastLocation() + { + acquireWriteLock(); + try + { + getData().setLastLocation(getLocation()); + } + finally + { + unlock(); + } + } + + public void requestTeleport(final User player, final boolean here) + { + teleportRequestTime = System.currentTimeMillis(); + teleportRequester = player; + teleportRequestHere = here; + } + + public String getNick(boolean addprefixsuffix) { acquireReadLock(); try { - return getData().getTimestamps().get("lastteleport"); + final String nick = getData().getNickname(); + @Cleanup + final ISettings settings = ess.getSettings(); + settings.acquireReadLock(); + @Cleanup + final IGroups groups = ess.getGroups(); + groups.acquireReadLock(); + // default: {PREFIX}{NICKNAMEPREFIX}{NAME}{SUFFIX} + String displayname = settings.getData().getChat().getDisplaynameFormat(); + if (settings.getData().getCommands().isDisabled("nick") || nick == null || nick.isEmpty() || nick.equals(getName())) + { + displayname = displayname.replace("{NAME}", getName()); + } + else + { + displayname = displayname.replace("{NAME}", nick); + displayname = displayname.replace("{NICKNAMEPREFIX}", settings.getData().getChat().getNicknamePrefix()); + } + + if (displayname.contains("{PREFIX}")) + { + displayname = displayname.replace("{PREFIX}", groups.getPrefix(this)); + } + if (displayname.contains("{SUFFIX}")) + { + displayname = displayname.replace("{SUFFIX}", groups.getSuffix(this)); + } + displayname = displayname.replace("{WORLDNAME}", this.getWorld().getName()); + displayname = displayname.replace('&', 'ยง'); + displayname = displayname.concat("ยงf"); + + return displayname; } finally { @@ -51,31 +268,101 @@ public class User extends UserBase implements IUser } } + public void setDisplayNick() + { + String name = getNick(true); + setDisplayName(name); + if (name.length() > 16) + { + name = getNick(false); + } + if (name.length() > 16) + { + name = name.substring(0, name.charAt(15) == 'ยง' ? 15 : 16); + } + try + { + setPlayerListName(name); + } + catch (IllegalArgumentException e) + { + logger.info("Playerlist for " + name + " was not updated. Use a shorter displayname prefix."); + } + } + @Override - public boolean isAuthorized(String node) + public String getDisplayName() { - throw new UnsupportedOperationException("Not supported yet."); + return super.getDisplayName() == null ? super.getName() : super.getDisplayName(); } @Override - public boolean isAuthorized(IEssentialsCommand cmd) + public void updateDisplayName() { - throw new UnsupportedOperationException("Not supported yet."); + @Cleanup + final ISettings settings = ess.getSettings(); + settings.acquireReadLock(); + if (isOnlineUser() && settings.getData().getChat().getChangeDisplayname()) + { + setDisplayNick(); + } } @Override - public boolean isAuthorized(IEssentialsCommand cmd, String permissionPrefix) + public double getMoney() { - throw new UnsupportedOperationException("Not supported yet."); + if (ess.getPaymentMethod().hasMethod()) + { + try + { + final Method method = ess.getPaymentMethod().getMethod(); + if (!method.hasAccount(this.getName())) + { + throw new Exception(); + } + final Method.MethodAccount account = ess.getPaymentMethod().getMethod().getAccount(this.getName()); + return account.balance(); + } + catch (Throwable ex) + { + } + } + return super.getMoney(); } @Override - public void setLastTeleportTimestamp(long time) + public void setMoney(final double value) + { + if (ess.getPaymentMethod().hasMethod()) + { + try + { + final Method method = ess.getPaymentMethod().getMethod(); + if (!method.hasAccount(this.getName())) + { + throw new Exception(); + } + final Method.MethodAccount account = ess.getPaymentMethod().getMethod().getAccount(this.getName()); + account.set(value); + } + catch (Throwable ex) + { + } + } + super.setMoney(value); + } + + public void setAfk(final boolean set) { acquireWriteLock(); try { - getData().getTimestamps().put("lastteleport", time); + this.setSleepingIgnored(this.isAuthorized("essentials.sleepingignored") ? true : set); + if (set && !getData().isAfk()) + { + afkPosition = getLocation(); + } + getData().setAfk(set); } finally { @@ -84,12 +371,38 @@ public class User extends UserBase implements IUser } @Override - public Location getLastLocation() + public boolean toggleAfk() + { + final boolean now = super.toggleAfk(); + this.setSleepingIgnored(this.isAuthorized("essentials.sleepingignored") ? true : now); + return now; + } + + //Returns true if status expired during this check + public boolean checkJailTimeout(final long currentTime) { acquireReadLock(); try { - return getData().getLastLocation(); + if (getTimestamp(UserData.TimestampType.JAIL) > 0 && getTimestamp(UserData.TimestampType.JAIL) < currentTime && getData().isJailed()) + { + acquireWriteLock(); + + setTimestamp(UserData.TimestampType.JAIL, 0); + getData().setJailed(false); + sendMessage(_("haveBeenReleased")); + getData().setJail(null); + + try + { + teleport.back(); + } + catch (Exception ex) + { + } + return true; + } + return false; } finally { @@ -97,13 +410,21 @@ public class User extends UserBase implements IUser } } - @Override - public double getMoney() + //Returns true if status expired during this check + public boolean checkMuteTimeout(final long currentTime) { acquireReadLock(); try { - return getData().getMoney(); + if (getTimestamp(UserData.TimestampType.MUTE) > 0 && getTimestamp(UserData.TimestampType.MUTE) < currentTime && getData().isMuted()) + { + acquireWriteLock(); + setTimestamp(UserData.TimestampType.MUTE, 0); + sendMessage(_("canTalkAgain")); + getData().setMuted(false); + return true; + } + return false; } finally { @@ -111,13 +432,20 @@ public class User extends UserBase implements IUser } } - @Override - public void takeMoney(double value) + //Returns true if status expired during this check + public boolean checkBanTimeout(final long currentTime) { - acquireWriteLock(); + acquireReadLock(); try { - getData().setMoney(getData().getMoney() - value); + if (getData().getBan() != null && getData().getBan().getTimeout() > 0 && getData().getBan().getTimeout() < currentTime && isBanned()) + { + acquireWriteLock(); + getData().setBan(null); + setBanned(false); + return true; + } + return false; } finally { @@ -125,13 +453,21 @@ public class User extends UserBase implements IUser } } - @Override - public void giveMoney(double value) + public void updateActivity(final boolean broadcast) { - acquireWriteLock(); + acquireReadLock(); try { - getData().setMoney(getData().getMoney() + value); + if (getData().isAfk()) + { + acquireWriteLock(); + getData().setAfk(false); + if (broadcast && !hidden) + { + ess.broadcastMessage(this, _("userIsNotAway", getDisplayName())); + } + } + lastActivity = System.currentTimeMillis(); } finally { @@ -139,19 +475,73 @@ public class User extends UserBase implements IUser } } - @Override - public String getGroup() + public void checkActivity() { - throw new UnsupportedOperationException("Not supported yet."); + @Cleanup + final ISettings settings = ess.getSettings(); + settings.acquireReadLock(); + final long autoafkkick = settings.getData().getCommands().getAfk().getAutoAFKKick(); + if (autoafkkick > 0 && lastActivity > 0 && (lastActivity + (autoafkkick * 1000)) < System.currentTimeMillis() + && !hidden && !isAuthorized("essentials.kick.exempt") && !isAuthorized("essentials.afk.kickexempt")) + { + final String kickReason = _("autoAfkKickReason", autoafkkick / 60.0); + lastActivity = 0; + kickPlayer(kickReason); + + + for (Player player : ess.getServer().getOnlinePlayers()) + { + final IUser user = ess.getUser(player); + if (user.isAuthorized("essentials.kick.notify")) + { + player.sendMessage(_("playerKicked", Console.NAME, getName(), kickReason)); + } + } + } + final long autoafk = settings.getData().getCommands().getAfk().getAutoAFK(); + acquireReadLock(); + try + { + if (!getData().isAfk() && autoafk > 0 && lastActivity + autoafk * 1000 < System.currentTimeMillis() && isAuthorized("essentials.afk")) + { + setAfk(true); + if (!hidden) + { + ess.broadcastMessage(this, _("userIsAway", getDisplayName())); + } + } + } + finally + { + unlock(); + } } - @Override - public void setLastLocation() + public Location getAfkPosition() { - acquireWriteLock(); + return afkPosition; + } + + public boolean toggleGodModeEnabled() + { + if (!isGodModeEnabled()) + { + setFoodLevel(20); + } + return super.toggleGodmode(); + } + + public boolean isGodModeEnabled() + { + acquireReadLock(); try { - getData().setLastLocation(base.getLocation()); + @Cleanup + final ISettings settings = ess.getSettings(); + settings.acquireReadLock(); + return (getData().isGodmode() + && !settings.getData().getWorldOptions(getLocation().getWorld().getName()).isGodmode()) + || (getData().isAfk() && settings.getData().getCommands().getAfk().isFreezeAFKPlayers()); } finally { @@ -160,40 +550,92 @@ public class User extends UserBase implements IUser } @Override - public Location getHome(String name) throws Exception + public String getGroup() { - throw new UnsupportedOperationException("Not supported yet."); + return ess.getPermissionsHandler().getGroup(base); } - @Override - public Location getHome(Location loc) throws Exception + public boolean inGroup(final String group) { - throw new UnsupportedOperationException("Not supported yet."); + return ess.getPermissionsHandler().inGroup(base, group); + } + + public boolean canBuild() + { + return ess.getPermissionsHandler().canBuild(base, getGroup()); } @Override - public boolean isHidden() + public Location getHome(Location loc) throws Exception { throw new UnsupportedOperationException("Not supported yet."); } @Override - public Teleport getTeleport() + public Location getHome(String name) throws Exception { throw new UnsupportedOperationException("Not supported yet."); } @Override - public void setJail(final String jail) + public void updateCompass() { - acquireWriteLock(); try { - getData().setJail(jail); + Location loc = getHome(getLocation()); + if (loc == null) + { + loc = getBedSpawnLocation(); + } + if (loc != null) + { + setCompassTarget(loc); + } } - finally + catch (Exception ex) { - unlock(); + // Ignore } } + + @Override + public List<String> getHomes() + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public int compareTo(final IUser t) + { + return Util.stripColor(this.getDisplayName()).compareTo(Util.stripColor(t.getDisplayName())); + } + + @Override + public void requestTeleport(IUser user, boolean b) + { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void setReplyTo(CommandSender user) + { + replyTo = user; + } + + @Override + public CommandSender getReplyTo() + { + return replyTo; + } + + @Override + public boolean gotMailInfo() { + return gotMailInfo.getAndSet(true); + } + + @Override + public void addMail(String mail) { + super.addMail(mail); + gotMailInfo.set(false); + } } diff --git a/Essentials/src/com/earth2me/essentials/user/UserBase.java b/Essentials/src/com/earth2me/essentials/user/UserBase.java index 9dda2f950..4326f6218 100644 --- a/Essentials/src/com/earth2me/essentials/user/UserBase.java +++ b/Essentials/src/com/earth2me/essentials/user/UserBase.java @@ -1,12 +1,21 @@ package com.earth2me.essentials.user; -import com.earth2me.essentials.IEssentials; +import com.earth2me.essentials.Util; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.ISettings; +import com.earth2me.essentials.api.InvalidNameException; import com.earth2me.essentials.craftbukkit.OfflineBedLocation; import com.earth2me.essentials.storage.AsyncStorageObjectHolder; import java.io.File; +import java.io.IOException; +import java.util.*; +import java.util.logging.Level; +import java.util.logging.Logger; +import lombok.Cleanup; import lombok.Delegate; import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.OfflinePlayer; import org.bukkit.command.CommandSender; import org.bukkit.configuration.serialization.ConfigurationSerializable; import org.bukkit.entity.Entity; @@ -15,18 +24,16 @@ import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.permissions.Permissible; import org.bukkit.permissions.ServerOperator; -import org.bukkit.OfflinePlayer; public abstract class UserBase extends AsyncStorageObjectHolder<UserData> implements Player, IOfflineUser { - @Delegate(types = { Player.class, Entity.class, CommandSender.class, ServerOperator.class, HumanEntity.class, ConfigurationSerializable.class, LivingEntity.class, Permissible.class - },excludes=IOfflinePlayer.class) + }, excludes = IOfflinePlayer.class) protected Player base; protected transient OfflinePlayer offlinePlayer; @@ -34,14 +41,14 @@ public abstract class UserBase extends AsyncStorageObjectHolder<UserData> implem { super(ess, UserData.class); this.base = base; - reloadConfig(); + onReload(); } - + public UserBase(final OfflinePlayer offlinePlayer, final IEssentials ess) { super(ess, UserData.class); this.offlinePlayer = offlinePlayer; - reloadConfig(); + onReload(); } public final Player getBase() @@ -58,65 +65,336 @@ public abstract class UserBase extends AsyncStorageObjectHolder<UserData> implem { setBase(base); } - + public void update(final OfflinePlayer offlinePlayer) { this.offlinePlayer = offlinePlayer; } - + public void dispose() { this.offlinePlayer = Bukkit.getOfflinePlayer(base.getName()); this.base = null; } - - public boolean isOnlineUser() { + + public boolean isOnlineUser() + { return base != null; } @Override public String getName() { - if (isOnlineUser()) { + if (isOnlineUser()) + { return base.getName(); - } else { + } + else + { return offlinePlayer.getName(); } } - + @Override public String getDisplayName() { - if (isOnlineUser()) { + if (isOnlineUser()) + { return base.getDisplayName(); - } else { + } + else + { return offlinePlayer.getName(); } } - + @Override public Location getBedSpawnLocation() { - if (isOnlineUser()) { + if (isOnlineUser()) + { return base.getBedSpawnLocation(); - } else { + } + else + { return OfflineBedLocation.getBedLocation(base.getName(), ess); - } + } } @Override public void setBanned(boolean bln) { - if (isOnlineUser()) { + if (isOnlineUser()) + { base.setBanned(bln); - } else { + } + else + { offlinePlayer.setBanned(bln); } } @Override - public File getStorageFile() + public File getStorageFile() throws IOException + { + try + { + return ess.getUserMap().getUserFile(getName()); + } + catch (InvalidNameException ex) + { + throw new IOException(ex.getMessage(), ex); + } + } + + public long getTimestamp(final UserData.TimestampType name) + { + acquireReadLock(); + try + { + if (getData().getTimestamps() == null) + { + return 0; + } + Long ts = getData().getTimestamps().get(name); + return ts == null ? 0 : ts; + } + finally + { + unlock(); + } + } + + public void setTimestamp(final UserData.TimestampType name, final long value) + { + acquireWriteLock(); + try + { + if (getData().getTimestamps() == null) + { + getData().setTimestamps(new HashMap<UserData.TimestampType, Long>()); + } + getData().getTimestamps().put(name, value); + } + finally + { + unlock(); + } + } + + public void setMoney(final double value) + { + acquireWriteLock(); + try + { + @Cleanup + final ISettings settings = ess.getSettings(); + settings.acquireReadLock(); + if (Math.abs(getData().getMoney()) > settings.getData().getEconomy().getMaxMoney()) + { + getData().setMoney(getData().getMoney() < 0 ? -settings.getData().getEconomy().getMaxMoney() : settings.getData().getEconomy().getMaxMoney()); + } + else + { + getData().setMoney(value); + } + } + finally + { + unlock(); + } + } + + public double getMoney() + { + acquireReadLock(); + try + { + Double money = getData().getMoney(); + @Cleanup + final ISettings settings = ess.getSettings(); + settings.acquireReadLock(); + if (money == null) + { + money = (double)settings.getData().getEconomy().getStartingBalance(); + } + if (Math.abs(money) > settings.getData().getEconomy().getMaxMoney()) + { + money = money < 0 ? -settings.getData().getEconomy().getMaxMoney() : settings.getData().getEconomy().getMaxMoney(); + } + return money; + } + finally + { + unlock(); + } + } + + public void setHome(String name, Location loc) + { + acquireWriteLock(); + try + { + Map<String, Location> homes = getData().getHomes(); + if (homes == null) + { + homes = new HashMap<String, Location>(); + getData().setHomes(homes); + } + homes.put(Util.sanitizeKey(name), loc); + } + finally + { + unlock(); + } + } + + public boolean toggleAfk() + { + acquireWriteLock(); + try + { + boolean ret = !getData().isAfk(); + getData().setAfk(ret); + return ret; + } + finally + { + unlock(); + } + } + + public boolean toggleGodmode() + { + acquireWriteLock(); + try + { + boolean ret = !getData().isGodmode(); + getData().setGodmode(ret); + return ret; + } + finally + { + unlock(); + } + } + + public boolean toggleMuted() { - return ess.getUserMap().getUserFile(getName()); + acquireWriteLock(); + try + { + boolean ret = !getData().isMuted(); + getData().setMuted(ret); + return ret; + } + finally + { + unlock(); + } + } + + public boolean toggleSocialSpy() + { + acquireWriteLock(); + try + { + boolean ret = !getData().isSocialspy(); + getData().setSocialspy(ret); + return ret; + } + finally + { + unlock(); + } + } + + public boolean toggleTeleportEnabled() + { + acquireWriteLock(); + try + { + boolean ret = !getData().isTeleportEnabled(); + getData().setTeleportEnabled(ret); + return ret; + } + finally + { + unlock(); + } + } + + public boolean isIgnoringPlayer(final String name) + { + acquireReadLock(); + try + { + return getData().getIgnore() == null ? false : getData().getIgnore().contains(name.toLowerCase(Locale.ENGLISH)); + } + finally + { + unlock(); + } + } + + public void setIgnoredPlayer(final String name, final boolean set) + { + acquireWriteLock(); + try + { + if (getData().getIgnore() == null) + { + getData().setIgnore(new HashSet<String>()); + } + if (set) + { + getData().getIgnore().add(name.toLowerCase(Locale.ENGLISH)); + } + else + { + getData().getIgnore().remove(name.toLowerCase(Locale.ENGLISH)); + } + } + finally + { + unlock(); + } + } + + public void addMail(String string) + { + acquireWriteLock(); + try + { + if (getData().getMails() == null) + { + getData().setMails(new ArrayList<String>()); + } + getData().getMails().add(string); + } + finally + { + unlock(); + } + } + + public List<String> getMails() + { + acquireReadLock(); + try + { + if (getData().getMails() == null) + { + return Collections.emptyList(); + } + else + { + return new ArrayList<String>(getData().getMails()); + } + } + finally + { + unlock(); + } } } diff --git a/Essentials/src/com/earth2me/essentials/user/UserData.java b/Essentials/src/com/earth2me/essentials/user/UserData.java index 4586d0627..b9eb61008 100644 --- a/Essentials/src/com/earth2me/essentials/user/UserData.java +++ b/Essentials/src/com/earth2me/essentials/user/UserData.java @@ -15,8 +15,12 @@ import org.bukkit.Material; @EqualsAndHashCode(callSuper = false) public class UserData implements StorageObject { + public enum TimestampType + { + JAIL, MUTE, LASTHEAL, LASTTELEPORT, LOGIN, LOGOUT + } private String nickname; - private double money; + private Double money; @MapValueType(Location.class) private Map<String, Location> homes = new HashMap<String, Location>(); @ListType(Material.class) @@ -25,8 +29,9 @@ public class UserData implements StorageObject @MapKeyType(Material.class) private Map<Material, List<String>> powerTools = new HashMap<Material, List<String>>(); private Location lastLocation; + @MapKeyType(TimestampType.class) @MapValueType(Long.class) - private Map<String, Long> timestamps; + private Map<TimestampType, Long> timestamps = new HashMap<TimestampType, Long>(); private String jail; @ListType private List<String> mails; @@ -52,5 +57,24 @@ public class UserData implements StorageObject unlimited.add(Material.ARROW); unlimited.add(Material.APPLE); powerTools.put(Material.DEAD_BUSH, Collections.singletonList("test")); + timestamps.put(TimestampType.JAIL, Long.MIN_VALUE); + } + + public boolean hasUnlimited(Material mat) + { + return unlimited != null && unlimited.contains(mat); + } + + public List<String> getPowertool(Material mat) + { + return powerTools == null ? Collections.<String>emptyList() : powerTools.get(mat); + } + + public void removeHome(String home) + { + if (homes == null) { + return; + } + homes.remove(home); } } diff --git a/Essentials/src/com/earth2me/essentials/user/UserMap.java b/Essentials/src/com/earth2me/essentials/user/UserMap.java index 821ee4c8f..96744da1d 100644 --- a/Essentials/src/com/earth2me/essentials/user/UserMap.java +++ b/Essentials/src/com/earth2me/essentials/user/UserMap.java @@ -1,85 +1,38 @@ package com.earth2me.essentials.user; -import com.earth2me.essentials.IConf; -import com.earth2me.essentials.IEssentials; -import com.earth2me.essentials.Util; -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.util.concurrent.UncheckedExecutionException; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.IUser; +import com.earth2me.essentials.api.IUserMap; +import com.earth2me.essentials.api.InvalidNameException; +import com.earth2me.essentials.storage.StorageObjectMap; import java.io.File; -import java.util.Collections; import java.util.Locale; import java.util.Set; -import java.util.concurrent.ConcurrentSkipListSet; -import java.util.concurrent.ExecutionException; import org.bukkit.Bukkit; import org.bukkit.entity.Player; -public class UserMap extends CacheLoader<String, User> implements IConf +public class UserMap extends StorageObjectMap<IUser> implements IUserMap { - private final transient IEssentials ess; - private final transient Cache<String, User> users = CacheBuilder.newBuilder().softValues().build(this); - private final transient ConcurrentSkipListSet<String> keys = new ConcurrentSkipListSet<String>(); - public UserMap(final IEssentials ess) { - super(); - this.ess = ess; - loadAllUsersAsync(ess); - } - - private void loadAllUsersAsync(final IEssentials ess) - { - ess.scheduleAsyncDelayedTask(new Runnable() - { - @Override - public void run() - { - final File userdir = new File(ess.getDataFolder(), "userdata"); - if (!userdir.exists()) - { - return; - } - keys.clear(); - users.invalidateAll(); - for (String string : userdir.list()) - { - if (!string.endsWith(".yml")) - { - continue; - } - final String name = string.substring(0, string.length() - 4); - keys.add(name.toLowerCase(Locale.ENGLISH)); - } - } - }); + super(ess, "users"); } + @Override public boolean userExists(final String name) { - return keys.contains(name.toLowerCase(Locale.ENGLISH)); + return objectExists(name); } - public User getUser(final String name) + @Override + public IUser getUser(final String name) { - try - { - return users.get(name.toLowerCase(Locale.ENGLISH)); - } - catch (ExecutionException ex) - { - return null; - } - catch (UncheckedExecutionException ex) - { - return null; - } + return getObject(name); } @Override - public User load(final String name) throws Exception + public IUser load(final String name) throws Exception { for (Player player : ess.getServer().getOnlinePlayers()) { @@ -99,30 +52,46 @@ public class UserMap extends CacheLoader<String, User> implements IConf } @Override - public void reloadConfig() + public void removeUser(final String name) throws InvalidNameException { - loadAllUsersAsync(ess); + removeObject(name); } - public void removeUser(final String name) + @Override + public Set<String> getAllUniqueUsers() { - keys.remove(name.toLowerCase(Locale.ENGLISH)); - users.invalidate(name.toLowerCase(Locale.ENGLISH)); + return getAllKeys(); } - public Set<String> getAllUniqueUsers() + @Override + public int getUniqueUsers() { - return Collections.unmodifiableSet(keys); + return getKeySize(); } - public int getUniqueUsers() + @Override + public File getUserFile(String name) throws InvalidNameException { - return keys.size(); + return getStorageFile(name); } - public File getUserFile(final String name) + @Override + public IUser getUser(final Player player) { - final File userFolder = new File(ess.getDataFolder(), "userdata"); - return new File(userFolder, Util.sanitizeFileName(name) + ".yml"); + if (player instanceof IUser) + { + return (IUser)player; + } + IUser user = getUser(player.getName()); + + if (user == null) + { + user = new User(player, ess); + } + else + { + ((User)user).update(player); + } + return user; } } diff --git a/Essentials/src/messages_en.properties b/Essentials/src/messages_en.properties deleted file mode 100644 index 9476b8bcf..000000000 --- a/Essentials/src/messages_en.properties +++ /dev/null @@ -1,406 +0,0 @@ -#version: TeamCity -# Single quotes have to be doubled: '' -# Translations start here -# by: -action=* {0} {1} -addedToAccount=\u00a7a{0} has been added to your account. -addedToOthersAccount=\u00a7a{0} has been added to {1} account. -alertBroke=broke: -alertFormat=\u00a73[{0}] \u00a7f {1} \u00a76 {2} at: {3} -alertPlaced=placed: -alertUsed=used: -autoAfkKickReason=You have been kicked for idling more than {0} minutes. -backAfterDeath=\u00a77Use the /back command to return to your death point. -backUsageMsg=\u00a77Returning to previous location. -backupFinished=Backup finished -backupStarted=Backup started -balance=\u00a77Balance: {0} -balanceTop=\u00a77 Top balances ({0}) -banExempt=\u00a7cYou can not ban that player. -banIpAddress=\u00a77Banned IP address -bannedIpsFileError=Error reading banned-ips.txt -bannedIpsFileNotFound=banned-ips.txt not found -bannedPlayersFileError=Error reading banned-players.txt -bannedPlayersFileNotFound=banned-players.txt not found -bigTreeFailure=\u00a7cBig tree generation failure. Try again on grass or dirt. -bigTreeSuccess= \u00a77Big tree spawned. -blockList=Essentials relayed the following commands to another plugin: -broadcast=[\u00a7cBroadcast\u00a7f]\u00a7a {0} -buildAlert=\u00a7cYou are not permitted to build -bukkitFormatChanged=Bukkit version format changed. Version not checked. -burnMsg=\u00a77You set {0} on fire for {1} seconds. -canTalkAgain=\u00a77You can talk again -cantFindGeoIpDB=Can''t find GeoIP database! -cantReadGeoIpDB=Failed to read GeoIP database! -cantSpawnItem=\u00a7cYou are not allowed to spawn the item {0} -commandFailed=Command {0} failed: -commandHelpFailedForPlugin=Error getting help for: {0} -commandNotLoaded=\u00a7cCommand {0} is improperly loaded. -compassBearing=\u00a77Bearing: {0} ({1} degrees). -configFileMoveError=Failed to move config.yml to backup location. -configFileRenameError=Failed to rename temp file to config.yml -connectedPlayers=Connected players: -connectionFailed=Failed to open connection. -cooldownWithMessage=\u00a7cCooldown: {0} -corruptNodeInConfig=\u00a74Notice: Your configuration file has a corrupt {0} node. -couldNotFindTemplate=Could not find template {0} -creatingConfigFromTemplate=Creating config from template: {0} -creatingEmptyConfig=Creating empty config: {0} -creative=creative -day=day -days=days -defaultBanReason=The Ban Hammer has spoken! -deleteFileError=Could not delete file: {0} -deleteHome=\u00a77Home {0} has been removed. -deleteJail=\u00a77Jail {0} has been removed. -deleteWarp=\u00a77Warp {0} has been removed. -deniedAccessCommand={0} was denied access to command. -dependancyDownloaded=[Essentials] Dependancy {0} downloaded successfully. -dependancyException=[Essentials] An error occurred when trying to download a dependacy -dependancyNotFound=[Essentials] A required dependancy was not found, downloading now. -depth=\u00a77You are at sea level. -depthAboveSea=\u00a77You are {0} block(s) above sea level. -depthBelowSea=\u00a77You are {0} block(s) below sea level. -destinationNotSet=Destination not set -disableUnlimited=\u00a77Disabled unlimited placing of {0} for {1}. -disabled=disabled -disabledToSpawnMob=Spawning this mob was disabled in the config file. -dontMoveMessage=\u00a77Teleportation will commence in {0}. Don''t move. -downloadingGeoIp=Downloading GeoIP database ... this might take a while (country: 0.6 MB, city: 20MB) -duplicatedUserdata=Duplicated userdata: {0} and {1} -enableUnlimited=\u00a77Giving unlimited amount of {0} to {1}. -enabled=enabled -enchantmentApplied = \u00a77The enchantment {0} has been applied to your item in hand. -enchantmentNotFound = \u00a7cEnchantment not found -enchantmentPerm = \u00a7cYou do not have the permission for {0} -enchantmentRemoved = \u00a77The enchantment {0} has been removed from your item in hand. -enchantments = \u00a77Enchantments: {0} -errorCallingCommand=Error calling command /{0} -errorWithMessage=\u00a7cError: {0} -essentialsHelp1=The file is broken and Essentials can't open it. Essentials is now disabled. If you can't fix the file yourself, go to http://tiny.cc/EssentialsChat -essentialsHelp2=The file is broken and Essentials can't open it. Essentials is now disabled. If you can't fix the file yourself, either type /essentialshelp in game or go to http://tiny.cc/EssentialsChat -essentialsReload=\u00a77Essentials Reloaded {0} -extinguish=\u00a77You extinguished yourself. -extinguishOthers=\u00a77You extinguished {0}. -failedToCloseConfig=Failed to close config {0} -failedToCreateConfig=Failed to create config {0} -failedToWriteConfig=Failed to write config {0} -false=false -feed=\u00a77Your appetite was sated. -feedOther=\u00a77Satisfied {0}. -fileRenameError=Renaming file {0} failed -foreverAlone=\u00a7cYou have nobody to whom you can reply. -freedMemory=Freed {0} MB. -gameMode=\u00a77Set game mode {0} for {1}. -gcchunks= chunks, -gcentities= entities -gcfree=Free memory: {0} MB -gcmax=Maximum memory: {0} MB -gctotal=Allocated memory: {0} MB -geoIpUrlEmpty=GeoIP download url is empty. -geoIpUrlInvalid=GeoIP download url is invalid. -geoipJoinFormat=Player {0} comes from {1} -godDisabledFor=disabled for {0} -godEnabledFor=enabled for {0} -godMode=\u00a77God mode {0}. -haveBeenReleased=\u00a77You have been released -heal=\u00a77You have been healed. -healOther=\u00a77Healed {0}. -helpConsole=To view help from the console, type ?. -helpOp=\u00a7c[HelpOp]\u00a7f \u00a77{0}:\u00a7f {1} -helpPages=Page \u00a7c{0}\u00a7f of \u00a7c{1}\u00a7f: -holeInFloor=Hole in floor -homeSet=\u00a77Home set. -homeSetToBed=\u00a77Your home is now set to this bed. -homes=Homes: {0} -hour=hour -hours=hours -ignorePlayer=You ignore player {0} from now on. -illegalDate=Illegal date format. -infoChapter=Select chapter: -infoChapterPages=Chapter {0}, page \u00a7c{1}\u00a7f of \u00a7c{2}\u00a7f: -infoFileDoesNotExist=File info.txt does not exist. Creating one for you. -infoPages=Page \u00a7c{0}\u00a7f of \u00a7c{1}\u00a7f: -infoUnknownChapter=Unknown chapter. -invBigger=The other users inventory is bigger than yours. -invRestored=Your inventory has been restored. -invSee=You see the inventory of {0}. -invSeeHelp=Use /invsee to restore your inventory. -invalidCharge=\u00a7cInvalid charge. -invalidMob=Invalid mob type. -invalidServer=Invalid server! -invalidSignLine=Line {0} on sign is invalid. -invalidWorld=\u00a7cInvalid world. -inventoryCleared=\u00a77Inventory Cleared. -inventoryClearedOthers=\u00a77Inventory of \u00a7c{0}\u00a77 cleared. -is=is -itemCannotBeSold=That item cannot be sold to the server. -itemMustBeStacked=Item must be traded in stacks. A quantity of 2s would be two stacks, etc. -itemNotEnough1=\u00a7cYou do not have enough of that item to sell. -itemNotEnough2=\u00a77If you meant to sell all of your items of that type, use /sell itemname -itemNotEnough3=\u00a77/sell itemname -1 will sell all but one item, etc. -itemSellAir=You really tried to sell Air? Put an item in your hand. -itemSold=\u00a77Sold for \u00a7c{0} \u00a77({1} {2} at {3} each) -itemSoldConsole={0} sold {1} for \u00a77{2} \u00a77({3} items at {4} each) -itemSpawn=\u00a77Giving {0} of {1} -itemsCsvNotLoaded=Could not load items.csv. -jailAlreadyIncarcerated=\u00a7cPerson is already in jail: {0} -jailMessage=\u00a7cYou do the crime, you do the time. -jailNotExist=That jail does not exist. -jailReleased=\u00a77Player \u00a7e{0}\u00a77 unjailed. -jailReleasedPlayerNotify=\u00a77You have been released! -jailSentenceExtended=Jail time extend to: {0) -jailSet=\u00a77Jail {0} has been set -jumpError=That would hurt your computer''s brain. -kickDefault=Kicked from server -kickExempt=\u00a7cYou can not kick that person. -kill=\u00a77Killed {0}. -kitError2=\u00a7cThat kit does not exist or is improperly defined. -kitError=\u00a7cThere are no valid kits. -kitErrorHelp=\u00a7cPerhaps an item is missing a quantity in the configuration? -kitGive=\u00a77Giving kit {0}. -kitInvFull=\u00a7cYour inventory was full, placing kit on the floor -kitTimed=\u00a7cYou can''t use that kit again for another {0}. -kits=\u00a77Kits: {0} -lightningSmited=\u00a77You have just been smited -lightningUse=\u00a77Smiting {0} -listAfkTag = \u00a77[AFK]\u00a7f -listAmount = \u00a79There are \u00a7c{0}\u00a79 out of maximum \u00a7c{1}\u00a79 players online. -listAmountHidden = \u00a79There are \u00a7c{0}\u00a77/{1}\u00a79 out of maximum \u00a7c{2}\u00a79 players online. -listHiddenTag = \u00a77[HIDDEN]\u00a7f -loadWarpError=Failed to load warp {0} -loadinfo=Loaded {0} build {1} by: {2} -localFormat=Local: <{0}> {1} -mailClear=\u00a7cTo mark your mail as read, type /mail clear -mailCleared=\u00a77Mail Cleared! -mailSent=\u00a77Mail sent! -markMailAsRead=\u00a7cTo mark your mail as read, type /mail clear -markedAsAway=\u00a77You are now marked as away. -markedAsNotAway=\u00a77You are no longer marked as away. -maxHomes=You cannot set more than {0} homes. -mayNotJail=\u00a7cYou may not jail that person -me=me -minute=minute -minutes=minutes -missingItems=You do not have {0}x {1}. -missingPrefixSuffix=Missing a prefix or suffix for {0} -mobSpawnError=Error while changing mob spawner. -mobSpawnLimit=Mob quantity limited to server limit -mobSpawnTarget=Target block must be a mob spawner. -mobsAvailable=\u00a77Mobs: {0} -moneyRecievedFrom=\u00a7a{0} has been received from {1} -moneySentTo=\u00a7a{0} has been sent to {1} -moneyTaken={0} taken from your bank account. -month=month -months=months -moreThanZero=Quantities must be greater than 0. -msgFormat=\u00a77[{0}\u00a77 -> {1}\u00a77] \u00a7f{2} -muteExempt=\u00a7cYou may not mute that player. -mutedPlayer=Player {0} muted. -mutedPlayerFor=Player {0} muted for {1}. -mutedUserSpeaks={0} tried to speak, but is muted. -nearbyPlayers=Players nearby: {0} -needTpohere=You need access to /tpohere to teleport other players. -negativeBalanceError=User is not allowed to have a negative balance. -nickChanged=Nickname changed. -nickDisplayName=\u00a77You have to enable change-displayname in Essentials config. -nickInUse=\u00a7cThat name is already in use. -nickNamesAlpha=\u00a7cNicknames must be alphanumeric. -nickNoMore=\u00a77You no longer have a nickname. -nickOthersPermission=\u00a7cYou do not have permission to change the nickname of others -nickSet=\u00a77Your nickname is now \u00a7c{0} -noAccessCommand=\u00a7cYou do not have access to that command. -noAccessPermission=\u00a7cYou do not have permission to access that {0}. -noDestroyPermission=\u00a7cYou do not have permission to destroy that {0}. -noGodWorldWarning=\u00a7cWarning! God mode in this world disabled. -noHelpFound=\u00a7cNo matching commands. -noHomeSet=You have not set a home. -noHomeSetPlayer=Player has not set a home. -noKitPermission=\u00a7cYou need the \u00a7c{0}\u00a7c permission to use that kit. -noKits=\u00a77There are no kits available yet -noMail=You do not have any mail -noMotd=\u00a7cThere is no message of the day. -noNewMail=\u00a77You have no new mail. -noPendingRequest=You do not have a pending request. -noPerm=\u00a7cYou do not have the \u00a7f{0}\u00a7c permission. -noPermToSpawnMob=\u00a7cYou don''t have permission to spawn this mob. -noPlacePermission=\u00a7cYou do not have permission to place a block near that sign. -noPowerTools=You have no power tools assigned. -noRules=\u00a7cThere are no rules specified yet. -noWarpsDefined=No warps defined -none=none -notAllowedToQuestion=\u00a7cYou are not authorized to use question. -notAllowedToShout=\u00a7cYou are not authorized to shout. -notEnoughExperience=You do not have enough experience. -notEnoughMoney=You do not have sufficient funds. -notRecommendedBukkit=* ! * Bukkit version is not the recommended build for Essentials. -notSupportedYet=Not supported yet. -nothingInHand = \u00a7cYou have nothing in your hand. -now=now -numberRequired=A number goes there, silly. -onlyDayNight=/time only supports day/night. -onlyPlayers=Only in-game players can use {0}. -onlySunStorm=/weather only supports sun/storm. -orderBalances=Ordering balances of {0} users, please wait ... -pTimeCurrent=\u00a7e{0}''s\u00a7f time is {1}. -pTimeCurrentFixed=\u00a7e{0}''s\u00a7f time is fixed to {1}. -pTimeNormal=\u00a7e{0}''s\u00a7f time is normal and matches the server. -pTimeOthersPermission=\u00a7cYou are not authorized to set other players'' time. -pTimePlayers=These players have their own time: -pTimeReset=Player time has been reset for: \u00a7e{0} -pTimeSet=Player time is set to \u00a73{0}\u00a7f for: \u00a7e{1} -pTimeSetFixed=Player time is fixed to \u00a73{0}\u00a7f for: \u00a7e{1} -parseError=Error parsing {0} on line {1} -pendingTeleportCancelled=\u00a7cPending teleportation request cancelled. -permissionsError=Missing Permissions/GroupManager; chat prefixes/suffixes will be disabled. -playerBanned=\u00a7cPlayer {0} banned {1} for {2} -playerInJail=\u00a7cPlayer is already in jail {0}. -playerJailed=\u00a77Player {0} jailed. -playerJailedFor= \u00a77Player {0} jailed for {1}. -playerKicked=\u00a7cPlayer {0} kicked {1} for {2} -playerMuted=\u00a77You have been muted -playerMutedFor=\u00a77You have been muted for {0} -playerNeverOnServer=\u00a7cPlayer {0} was never on this server. -playerNotFound=\u00a7cPlayer not found. -playerUnmuted=\u00a77You have been unmuted -pong=Pong! -possibleWorlds=\u00a77Possible worlds are the numbers 0 through {0}. -powerToolAir=Command can''t be attached to air. -powerToolAlreadySet=Command \u00a7c{0}\u00a7f is already assigned to {1}. -powerToolAttach=\u00a7c{0}\u00a7f command assigned to {1}. -powerToolClearAll=All powertool commands have been cleared. -powerToolList={1} has the following commands: \u00a7c{0}\u00a7f. -powerToolListEmpty={0} has no commands assigned. -powerToolNoSuchCommandAssigned=Command \u00a7c{0}\u00a7f has not been assigned to {1}. -powerToolRemove=Command \u00a7c{0}\u00a7f removed from {1}. -powerToolRemoveAll=All commands removed from {0}. -powerToolsDisabled=All of your power tools have been enabled. -powerToolsEnabled=All of your power tools have been enabled. -protectionOwner=\u00a76[EssentialsProtect] Protection owner: {0} -questionFormat=\u00a77[Question]\u00a7f {0} -readNextPage=Type /{0} {1} to read the next page -reloadAllPlugins=\u00a77Reloaded all plugins. -removed=\u00a77Removed {0} entities. -repair=You have successfully repaired your: \u00a7e{0}. -repairAlreadyFixed=\u00a77This item does not need repairing. -repairEnchanted=\u00a77You are not allowed to repair enchanted items. -repairInvalidType=\u00a7cThis item cannot be repaired. -repairNone=There were no items that needing repairing. -requestAccepted=\u00a77Teleport request accepted. -requestAcceptedFrom=\u00a77{0} accepted your teleport request. -requestDenied=\u00a77Teleport request denied. -requestDeniedFrom=\u00a77{0} denied your teleport request -requestSent=\u00a77Request sent to {0}\u00a77. -requiredBukkit=* ! * You need atleast build {0} of CraftBukkit, download it from http://ci.bukkit.org. -returnPlayerToJailError=Error occurred when trying to return player to jail. -second=second -seconds=seconds -seenOffline=Player {0} is offline since {1} -seenOnline=Player {0} is online since {1} -serverFull=Server is full -setSpawner=Changed spawner type to {0} -sheepMalformedColor=Malformed color. -shoutFormat=\u00a77[Shout]\u00a7f {0} -signFormatFail=\u00a74[{0}] -signFormatSuccess=\u00a71[{0}] -signFormatTemplate=[{0}] -signProtectInvalidLocation=\u00a74You are not allowed to create sign here. -similarWarpExist=A warp with a similar name already exists. -slimeMalformedSize=Malformed size. -soloMob=That mob likes to be alone -spawnSet=\u00a77Spawn location set for group {0}. -spawned=spawned -suicideMessage=\u00a77Goodbye Cruel World... -suicideSuccess= \u00a77{0} took their own life -survival=survival -takenFromAccount=\u00a7c{0} has been taken from your account. -takenFromOthersAccount=\u00a7c{0} has been taken from {1} account. -teleportAAll=\u00a77Teleporting request sent to all players... -teleportAll=\u00a77Teleporting all players... -teleportAtoB=\u00a77{0}\u00a77 teleported you to {1}\u00a77. -teleportDisabled={0} has teleportation disabled. -teleportHereRequest=\u00a7c{0}\u00a7c has requested that you teleport to them. -teleportNewPlayerError=Failed to teleport new player -teleportRequest=\u00a7c{0}\u00a7c has requested to teleport to you. -teleportTop=\u00a77Teleporting to top. -teleportationCommencing=\u00a77Teleportation commencing... -teleportationDisabled=\u00a77Teleportation disabled. -teleportationEnabled=\u00a77Teleportation enabled. -teleporting=\u00a77Teleporting... -teleportingPortal=\u00a77Teleporting via portal. -tempBanned=Temporarily banned from server for {0} -tempbanExempt=\u00a77You may not tempban that player -thunder= You {0} thunder in your world -thunderDuration=You {0} thunder in your world for {1} seconds. -timeBeforeHeal=Time before next heal: {0} -timeBeforeTeleport=Time before next teleport: {0} -timeFormat=\u00a73{0}\u00a7f or \u00a73{1}\u00a7f or \u00a73{2}\u00a7f -timePattern=(?:([0-9]+)\\s*y[a-z]*[,\\s]*)?(?:([0-9]+)\\s*mo[a-z]*[,\\s]*)?(?:([0-9]+)\\s*w[a-z]*[,\\s]*)?(?:([0-9]+)\\s*d[a-z]*[,\\s]*)?(?:([0-9]+)\\s*h[a-z]*[,\\s]*)?(?:([0-9]+)\\s*m[a-z]*[,\\s]*)?(?:([0-9]+)\\s*(?:s[a-z]*)?)? -timeSet=Time set in all worlds. -timeSetPermission=\u00a7cYou are not authorized to set the time. -timeWorldCurrent=The current time in {0} is \u00a73{1} -timeWorldSet=The time was set to {0} in: \u00a7c{1} -tradeCompleted=\u00a77Trade completed. -tradeSignEmpty=The trade sign does not have enough supply left. -tradeSignEmptyOwner=There is nothing to collect from this trade sign. -treeFailure=\u00a7cTree generation failure. Try again on grass or dirt. -treeSpawned=\u00a77Tree spawned. -true=true -typeTpaccept=\u00a77To teleport, type \u00a7c/tpaccept\u00a77. -typeTpdeny=\u00a77To deny this request, type \u00a7c/tpdeny\u00a77. -typeWorldName=\u00a77You can also type the name of a specific world. -unableToSpawnMob=Unable to spawn mob. -unbannedIP=Unbanned IP address. -unbannedPlayer=Unbanned player. -unignorePlayer=You are not ignoring player {0} anymore. -unknownItemId=Unknown item id: {0} -unknownItemInList=Unknown item {0} in {1} list. -unknownItemName=Unknown item name: {0} -unlimitedItemPermission=\u00a7cNo permission for unlimited item {0}. -unlimitedItems=Unlimited items: -unmutedPlayer=Player {0} unmuted. -upgradingFilesError=Error while upgrading the files -userDoesNotExist=The user {0} does not exist. -userIsAway={0} is now AFK -userIsNotAway={0} is no longer AFK -userJailed=\u00a77You have been jailed -userUsedPortal={0} used an existing exit portal. -userdataMoveBackError=Failed to move userdata/{0}.tmp to userdata/{1} -userdataMoveError=Failed to move userdata/{0} to userdata/{1}.tmp -usingTempFolderForTesting=Using temp folder for testing: -versionMismatch=Version mismatch! Please update {0} to the same version. -versionMismatchAll=Version mismatch! Please update all Essentials jars to the same version. -voiceSilenced=\u00a77Your voice has been silenced -warpDeleteError=Problem deleting the warp file. -warpListPermission=\u00a7cYou do not have Permission to list that warps. -warpNotExist=That warp does not exist. -warpSet=\u00a77Warp {0} set. -warpUsePermission=\u00a7cYou do not have Permission to use that warp. -warpingTo=\u00a77Warping to {0}. -warps=Warps: {0} -warpsCount=\u00a77There are {0} warps. Showing page {1} of {2}. -weatherStorm=\u00a77You set the weather to storm in {0} -weatherStormFor=\u00a77You set the weather to storm in {0} for {1} seconds -weatherSun=\u00a77You set the weather to sun in {0} -weatherSunFor=\u00a77You set the weather to sun in {0} for {1} seconds -whoisBanned=\u00a79 - Banned: {0} -whoisGamemode=\u00a79 - Gamemode: {0} -whoisGeoLocation=\u00a79 - Location: {0} -whoisGod=\u00a79 - God mode: {0} -whoisHealth=\u00a79 - Health: {0}/20 -whoisIPAddress=\u00a79 - IP Address: {0} -whoisIs={0} is {1} -whoisLocation=\u00a79 - Location: ({0}, {1}, {2}, {3}) -whoisMoney=\u00a79 - Money: {0} -whoisOP=\u00a79 - OP: {0} -whoisStatusAvailable=\u00a79 - Status: Available -whoisStatusAway=\u00a79 - Status: \u00a7cAway\u00a7f -worth=\u00a77Stack of {0} worth \u00a7c{1}\u00a77 ({2} item(s) at {3} each) -worthMeta=\u00a77Stack of {0} with metadata of {1} worth \u00a7c{2}\u00a77 ({3} item(s) at {4} each) -worthSet=Worth value set -year=year -years=years -youAreHealed=\u00a77You have been healed. -youHaveNewMail=\u00a7cYou have {0} messages!\u00a7f Type \u00a77/mail read\u00a7f to view your mail. -requestTimedOut=\u00a7cTeleport request has timed out -teleportRequestTimeoutInfo=\u00a77This request will timeout after {0} seconds. diff --git a/Essentials/src/plugin.yml b/Essentials/src/plugin.yml index 2cb225390..4c5a49ed2 100644 --- a/Essentials/src/plugin.yml +++ b/Essentials/src/plugin.yml @@ -3,7 +3,7 @@ name: Essentials main: com.earth2me.essentials.Essentials # Note to developers: This next line cannot change, or the automatic versioning system will break. version: TeamCity -website: http://ci.earth2me.net/ +website: http://tiny.cc/EssentialsWiki description: Provides an essential, core set of commands for Bukkit. authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo, ceulemans, Xeology, KHobbits] commands: @@ -341,7 +341,7 @@ commands: tpa: description: Request to teleport to the specified player. usage: /<command> <player> - aliases: [call,etpa,ecall] + aliases: [call,join,etpa,ecall,ejoin] tpaall: description: Requests all players online to teleport to you. usage: /<command> <player> @@ -353,7 +353,7 @@ commands: tpahere: description: Request that the specified player teleport to you. usage: /<command> <player> - aliases: [etpahere] + aliases: [come,etpahere,ecome] tpall: description: Teleport all online players to another player. usage: /<command> <player> diff --git a/Essentials/test/com/earth2me/essentials/EconomyTest.java b/Essentials/test/com/earth2me/essentials/EconomyTest.java index 219d68b40..1fe8c76c5 100644 --- a/Essentials/test/com/earth2me/essentials/EconomyTest.java +++ b/Essentials/test/com/earth2me/essentials/EconomyTest.java @@ -3,6 +3,8 @@ package com.earth2me.essentials; import com.earth2me.essentials.api.Economy; import com.earth2me.essentials.api.NoLoanPermittedException; import com.earth2me.essentials.api.UserDoesNotExistException; +import com.earth2me.essentials.craftbukkit.DummyOfflinePlayer; +import com.earth2me.essentials.user.User; import java.io.IOException; import junit.framework.TestCase; import org.bukkit.World.Environment; @@ -34,7 +36,7 @@ public class EconomyTest extends TestCase { fail("IOException"); } - server.addPlayer(new OfflinePlayer(PLAYERNAME, ess)); + server.addPlayer(new User(new DummyOfflinePlayer(PLAYERNAME), ess)); } // only one big test, since we use static instances @@ -45,7 +47,7 @@ public class EconomyTest extends TestCase assertFalse("NPC does not exists", Economy.playerExists(NPCNAME)); assertTrue("Create NPC", Economy.createNPC(NPCNAME)); assertTrue("NPC exists", Economy.playerExists(NPCNAME)); - assertNotNull("NPC can be accessed", ess.getOfflineUser(NPCNAME)); + assertNotNull("NPC can be accessed", ess.getUser(NPCNAME)); try { Economy.removeNPC(NPCNAME); diff --git a/Essentials/test/com/earth2me/essentials/FakeServer.java b/Essentials/test/com/earth2me/essentials/FakeServer.java index 306f0d6a1..35e5f6f53 100644 --- a/Essentials/test/com/earth2me/essentials/FakeServer.java +++ b/Essentials/test/com/earth2me/essentials/FakeServer.java @@ -2,6 +2,9 @@ package com.earth2me.essentials; import com.earth2me.essentials.craftbukkit.FakeWorld; import com.avaje.ebean.config.ServerConfig; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.craftbukkit.DummyOfflinePlayer; +import com.earth2me.essentials.user.User; import java.io.File; import java.util.*; import java.util.concurrent.Callable; @@ -323,13 +326,6 @@ public class FakeServer implements Server players.add(base1); } - public OfflinePlayer createPlayer(String name, IEssentials ess) - { - OfflinePlayer player = new OfflinePlayer(name, ess); - player.setLocation(new Location(worlds.get(0), 0, 0, 0, 0, 0)); - return player; - } - @Override public World createWorld(String string, Environment e, ChunkGenerator cg) { diff --git a/Essentials/test/com/earth2me/essentials/StorageTest.java b/Essentials/test/com/earth2me/essentials/StorageTest.java index b7fe23433..a04c6b34f 100644 --- a/Essentials/test/com/earth2me/essentials/StorageTest.java +++ b/Essentials/test/com/earth2me/essentials/StorageTest.java @@ -133,7 +133,7 @@ public class StorageTest extends TestCase } - @Test + /*@Test public void testOldUserdata() { ExecuteTimer ext = new ExecuteTimer(); @@ -157,5 +157,5 @@ public class StorageTest extends TestCase user.reloadConfig(); ext.mark("reloaded file (cached)"); System.out.println(ext.end()); - } + }*/ } diff --git a/Essentials/test/com/earth2me/essentials/UserTest.java b/Essentials/test/com/earth2me/essentials/UserTest.java index ef9ab515d..8ce847ea5 100644 --- a/Essentials/test/com/earth2me/essentials/UserTest.java +++ b/Essentials/test/com/earth2me/essentials/UserTest.java @@ -5,11 +5,14 @@ import junit.framework.TestCase; import org.bukkit.Location; import org.bukkit.World.Environment; import org.bukkit.plugin.InvalidDescriptionException; +import com.earth2me.essentials.api.IUser; +import com.earth2me.essentials.craftbukkit.DummyOfflinePlayer; +import com.earth2me.essentials.user.User; public class UserTest extends TestCase { - private final OfflinePlayer base1; + private final IUser base1; private final Essentials ess; private final FakeServer server; @@ -31,7 +34,7 @@ public class UserTest extends TestCase { fail("IOException"); } - base1 = server.createPlayer("testPlayer1", ess); + base1 = new User(new DummyOfflinePlayer("testPlayer1"), ess); server.addPlayer(base1); ess.getUser(base1); } @@ -41,7 +44,7 @@ public class UserTest extends TestCase System.out.println(getName() + " should " + what); } - public void testUpdate() + /*public void testUpdate() { OfflinePlayer base1alt = server.createPlayer(base1.getName(), ess); assertEquals(base1alt, ess.getUser(base1alt).getBase()); @@ -49,11 +52,11 @@ public class UserTest extends TestCase public void testHome() { - User user = ess.getUser(base1); + IUser user = ess.getUser(base1); Location loc = base1.getLocation(); user.setHome(); OfflinePlayer base2 = server.createPlayer(base1.getName(), ess); - User user2 = ess.getUser(base2); + IUser user2 = ess.getUser(base2); Location home = user2.getHome(loc); assertNotNull(home); @@ -63,12 +66,12 @@ public class UserTest extends TestCase assertEquals(loc.getZ(), home.getZ()); assertEquals(loc.getYaw(), home.getYaw()); assertEquals(loc.getPitch(), home.getPitch()); - } + }*/ public void testMoney() { should("properly set, take, give, and get money"); - User user = ess.getUser(base1); + IUser user = ess.getUser(base1); double i; user.setMoney(i = 100.5); user.takeMoney(50); @@ -81,7 +84,7 @@ public class UserTest extends TestCase public void testGetGroup() { should("return the default group"); - User user = ess.getUser(base1); + IUser user = ess.getUser(base1); assertEquals(user.getGroup(), "default"); } } diff --git a/Essentials/test/com/earth2me/essentials/UtilTest.java b/Essentials/test/com/earth2me/essentials/UtilTest.java index 71282a18f..d19c309ea 100644 --- a/Essentials/test/com/earth2me/essentials/UtilTest.java +++ b/Essentials/test/com/earth2me/essentials/UtilTest.java @@ -1,8 +1,11 @@ package com.earth2me.essentials; +import com.earth2me.essentials.api.InvalidNameException; import java.io.IOException; import java.util.Calendar; import java.util.GregorianCalendar; +import java.util.logging.Level; +import java.util.logging.Logger; import junit.framework.TestCase; import org.bukkit.World.Environment; import org.bukkit.plugin.InvalidDescriptionException; @@ -171,4 +174,26 @@ public class UtilTest extends TestCase b = new GregorianCalendar(2000, 3, 7, 10, 0, 0); assertEquals(" 10 years 6 months 10 days 13 hours 45 minutes 45 seconds", Util.formatDateDiff(a, b)); } + + public void filenameTest() { + try + { + assertEquals("_-", Util.sanitizeFileName("\u0000")); + assertEquals("_-", Util.sanitizeFileName("\u0001")); + assertEquals("_-", Util.sanitizeFileName("\u001f")); + assertEquals(" -", Util.sanitizeFileName(" ")); + assertEquals("_-", Util.sanitizeFileName("..")); + assertEquals("_-", Util.sanitizeFileName("..\\")); + assertEquals("_-", Util.sanitizeFileName("../")); + assertEquals("_-", Util.sanitizeFileName("\"")); + assertEquals("_-", Util.sanitizeFileName("<>?:*.")); + assertEquals("a-0fa", Util.sanitizeFileName("aรค")); + + } + catch (InvalidNameException ex) + { + Logger.getLogger(UtilTest.class.getName()).log(Level.SEVERE, null, ex); + } + + } } diff --git a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChat.java b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChat.java index 25ce85cc8..3035a75f0 100644 --- a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChat.java +++ b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChat.java @@ -1,10 +1,12 @@ package com.earth2me.essentials.chat; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.IEssentials; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.chat.listenerlevel.EssentialsChatPlayerListenerHighest; +import com.earth2me.essentials.chat.listenerlevel.EssentialsChatPlayerListenerLowest; +import com.earth2me.essentials.chat.listenerlevel.EssentialsChatPlayerListenerNormal; import java.util.HashMap; import java.util.Map; -import java.util.concurrent.ConcurrentSkipListMap; import java.util.logging.Level; import java.util.logging.Logger; import org.bukkit.event.Event.Priority; @@ -17,8 +19,6 @@ import org.bukkit.plugin.java.JavaPlugin; public class EssentialsChat extends JavaPlugin { private static final Logger LOGGER = Logger.getLogger("Minecraft"); - private transient Map<String, IEssentialsChatListener> chatListener; - @Override public void onEnable() @@ -35,16 +35,17 @@ public class EssentialsChat extends JavaPlugin return; } - chatListener = new ConcurrentSkipListMap<String, IEssentialsChatListener>(); final Map<PlayerChatEvent, String> charges = new HashMap<PlayerChatEvent, String>(); - - final EssentialsChatPlayerListenerLowest playerListenerLowest = new EssentialsChatPlayerListenerLowest(getServer(), ess, chatListener); - final EssentialsChatPlayerListenerNormal playerListenerNormal = new EssentialsChatPlayerListenerNormal(getServer(), ess, chatListener, charges); - final EssentialsChatPlayerListenerHighest playerListenerHighest = new EssentialsChatPlayerListenerHighest(getServer(), ess, chatListener, charges); + + final EssentialsChatPlayerListenerLowest playerListenerLowest = new EssentialsChatPlayerListenerLowest(getServer(), ess); + final EssentialsChatPlayerListenerNormal playerListenerNormal = new EssentialsChatPlayerListenerNormal(getServer(), ess, charges); + final EssentialsChatPlayerListenerHighest playerListenerHighest = new EssentialsChatPlayerListenerHighest(getServer(), ess, charges); + final EssentialsLocalChatEventListener localChatListener = new EssentialsLocalChatEventListener(getServer(), ess); pluginManager.registerEvent(Type.PLAYER_CHAT, playerListenerLowest, Priority.Lowest, this); pluginManager.registerEvent(Type.PLAYER_CHAT, playerListenerNormal, Priority.Normal, this); pluginManager.registerEvent(Type.PLAYER_CHAT, playerListenerHighest, Priority.Highest, this); + pluginManager.registerEvent(Type.CUSTOM_EVENT, localChatListener, Priority.Highest, this); LOGGER.info(_("loadinfo", this.getDescription().getName(), this.getDescription().getVersion(), "essentials team")); } @@ -52,19 +53,5 @@ public class EssentialsChat extends JavaPlugin @Override public void onDisable() { - if (chatListener != null) - { - chatListener.clear(); - } - } - - public void addEssentialsChatListener(final String plugin, final IEssentialsChatListener listener) - { - chatListener.put(plugin, listener); - } - - public IEssentialsChatListener removeEssentialsChatListener(final String plugin) - { - return chatListener.remove(plugin); } } diff --git a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayer.java b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayer.java index 2d6e1ae4e..17cc7c2f3 100644 --- a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayer.java +++ b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayer.java @@ -2,14 +2,13 @@ package com.earth2me.essentials.chat; import com.earth2me.essentials.ChargeException; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.IEssentials; +import com.earth2me.essentials.api.IEssentials; import com.earth2me.essentials.Trade; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; +import java.util.Locale; import java.util.Map; import java.util.logging.Logger; -import org.bukkit.Location; import org.bukkit.Server; -import org.bukkit.World; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerChatEvent; @@ -20,16 +19,15 @@ public abstract class EssentialsChatPlayer extends PlayerListener { protected transient IEssentials ess; protected final static Logger logger = Logger.getLogger("Minecraft"); - protected final transient Map<String, IEssentialsChatListener> listeners; - protected final transient Server server; + protected final transient Server server; - public EssentialsChatPlayer(Server server, IEssentials ess, Map<String, IEssentialsChatListener> listeners) + public EssentialsChatPlayer(final Server server, final IEssentials ess) { this.ess = ess; - this.listeners = listeners; this.server = server; } + @Override public void onPlayerChat(final PlayerChatEvent event) { } @@ -45,15 +43,8 @@ public abstract class EssentialsChatPlayer extends PlayerListener { return true; } - for (IEssentialsChatListener listener : listeners.values()) - { - if (listener.shouldHandleThisChat(event)) - { - return true; - } - } - final User user = ess.getUser(event.getPlayer()); + final IUser user = ess.getUser(event.getPlayer()); if (!isAffordableFor(user, command)) { event.setCancelled(true); @@ -61,17 +52,25 @@ public abstract class EssentialsChatPlayer extends PlayerListener } return false; } + + protected void chargeChat (final PlayerChatEvent event, final Map<PlayerChatEvent, String> charges) { + + final IUser user = ess.getUser(event.getPlayer()); + + String charge = charges.remove(event); + if (charge == null) + { + charge = "chat"; + } - public String getChatType(final String message) - { - switch (message.charAt(0)) + try { - case '!': - return "shout"; - case '?': - return "question"; - default: - return ""; + charge(user, charge); + } + catch (ChargeException e) + { + ess.getCommandHandler().showCommandError(user, charge, e); + event.setCancelled(true); } } @@ -106,47 +105,69 @@ public abstract class EssentialsChatPlayer extends PlayerListener return true; } - protected void sendLocalChat(final User sender, final long radius, final PlayerChatEvent event) + protected void formatChat(final PlayerChatEvent event) + { + final IUser user = ess.getUser(event.getPlayer()); + if (user.isAuthorized("essentials.chat.color")) + { + event.setMessage(event.getMessage().replaceAll("&([0-9a-f])", "\u00a7$1")); + } + event.setFormat(ess.getSettings().getChatFormat(user.getGroup()).replace('&', '\u00a7').replace("\u00a7\u00a7", "&").replace("{DISPLAYNAME}", "%1$s").replace("{GROUP}", user.getGroup()).replace("{MESSAGE}", "%2$s").replace("{WORLDNAME}", user.getWorld().getName()).replace("{SHORTWORLDNAME}", user.getWorld().getName().substring(0, 1).toUpperCase(Locale.ENGLISH))); + } + + protected String getChatType(final String message) + { + switch (message.charAt(0)) + { + case '!': + return "shout"; + case '?': + return "question"; + //case '@': + // return "admin"; + default: + return ""; + } + } + + protected void handleLocalChat(final Map<PlayerChatEvent, String> charges, final PlayerChatEvent event) { - event.setCancelled(true); - logger.info(_("localFormat", sender.getName(), event.getMessage())); - final Location loc = sender.getLocation(); - final World world = loc.getWorld(); - for (Player onlinePlayer : server.getOnlinePlayers()) + long radius = ess.getSettings().getChatRadius(); + radius *= radius; + + final IUser user = ess.getUser(event.getPlayer()); + final String chatType = getChatType(event.getMessage()); + final StringBuilder command = new StringBuilder(); + command.append("chat"); + + if (event.getMessage().length() > 0 && chatType.length() > 0) { - String type = "[L]"; - final User user = ess.getUser(onlinePlayer); - //TODO: remove reference to op - if (user.isIgnoredPlayer(sender.getName()) && !sender.isOp()) - { - continue; - } - if (!user.equals(sender)) - { - final Location playerLoc = user.getLocation(); - if (playerLoc.getWorld() != world) { continue; } - final double delta = playerLoc.distanceSquared(loc); - - if (delta > radius) - { - if (user.isAuthorized("essentials.chat.spy")) - { - type = type.concat("[Spy]"); - } - else - { - continue; - } - } - } + command.append("-").append(chatType); + final StringBuilder permission = new StringBuilder(); + permission.append("essentials.chat.").append(chatType); + + final StringBuilder format = new StringBuilder(); + format.append(chatType).append("Format"); - String message = String.format(event.getFormat(), type.concat(sender.getDisplayName()), event.getMessage()); - for (IEssentialsChatListener listener : listeners.values()) + final StringBuilder errorMsg = new StringBuilder(); + errorMsg.append("notAllowedTo").append(chatType.substring(0, 1).toUpperCase(Locale.ENGLISH)).append(chatType.substring(1)); + + if (user.isAuthorized(permission.toString())) { - message = listener.modifyMessage(event, onlinePlayer, message); + event.setMessage(event.getMessage().substring(1)); + event.setFormat(_(format.toString(), event.getFormat())); + charges.put(event, command.toString()); + return; } - user.sendMessage(message); + + user.sendMessage(_(errorMsg.toString())); + event.setCancelled(true); + return; } + + event.setCancelled(true); + final EssentialsLocalChatEvent localChat = new EssentialsLocalChatEvent(event, radius); + ess.getServer().getPluginManager().callEvent(localChat); } } diff --git a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerHighest.java b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerHighest.java deleted file mode 100644 index 22989d4f9..000000000 --- a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerHighest.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.earth2me.essentials.chat; - -import com.earth2me.essentials.ChargeException; -import com.earth2me.essentials.IEssentials; -import com.earth2me.essentials.User; -import java.util.Map; -import org.bukkit.Server; -import org.bukkit.event.player.PlayerChatEvent; - - -public class EssentialsChatPlayerListenerHighest extends EssentialsChatPlayer -{ - private final transient Map<PlayerChatEvent, String> charges; - - public EssentialsChatPlayerListenerHighest(final Server server, - final IEssentials ess, - final Map<String, IEssentialsChatListener> listeners, - final Map<PlayerChatEvent, String> charges) - { - super(server, ess, listeners); - this.charges = charges; - } - - @Override - public void onPlayerChat(final PlayerChatEvent event) - { - String charge = charges.remove(event); - if (charge == null) - { - charge = "chat"; - } - if (isAborted(event)) - { - return; - } - - /** - * This file should handle charging the user for the action before returning control back - */ - final User user = ess.getUser(event.getPlayer()); - - try - { - charge(user, charge); - } - catch (ChargeException e) - { - ess.showError(user, e, charge); - event.setCancelled(true); - return; - } - } -} diff --git a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerLowest.java b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerLowest.java deleted file mode 100644 index de5757951..000000000 --- a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerLowest.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.earth2me.essentials.chat; - -import com.earth2me.essentials.IEssentials; -import com.earth2me.essentials.User; -import java.util.Locale; -import java.util.Map; -import org.bukkit.Server; -import org.bukkit.event.player.PlayerChatEvent; - - -public class EssentialsChatPlayerListenerLowest extends EssentialsChatPlayer -{ - public EssentialsChatPlayerListenerLowest(final Server server, - final IEssentials ess, - final Map<String, IEssentialsChatListener> listeners) - { - super(server, ess, listeners); - } - - @Override - public void onPlayerChat(final PlayerChatEvent event) - { - if (isAborted(event)) - { - return; - } - - /** - * This listener should apply the general chat formatting only...then return control back the event handler - */ - final User user = ess.getUser(event.getPlayer()); - if (user.isAuthorized("essentials.chat.color")) - { - event.setMessage(event.getMessage().replaceAll("&([0-9a-f])", "\u00a7$1")); - } - event.setFormat(ess.getSettings().getChatFormat(user.getGroup()).replace('&', '\u00a7').replace("\u00a7\u00a7", "&").replace("{DISPLAYNAME}", "%1$s").replace("{GROUP}", user.getGroup()).replace("{MESSAGE}", "%2$s").replace("{WORLDNAME}", user.getWorld().getName()).replace("{SHORTWORLDNAME}", user.getWorld().getName().substring(0, 1).toUpperCase(Locale.ENGLISH))); - } -} diff --git a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerNormal.java b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerNormal.java deleted file mode 100644 index 4e3cbefc0..000000000 --- a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsChatPlayerListenerNormal.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.earth2me.essentials.chat; - -import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.IEssentials; -import com.earth2me.essentials.User; -import java.util.Locale; -import java.util.Map; -import org.bukkit.Server; -import org.bukkit.event.player.PlayerChatEvent; - - -public class EssentialsChatPlayerListenerNormal extends EssentialsChatPlayer -{ - private final transient Map<PlayerChatEvent, String> charges; - - public EssentialsChatPlayerListenerNormal(final Server server, - final IEssentials ess, - final Map<String, IEssentialsChatListener> listeners, - final Map<PlayerChatEvent, String> charges) - { - super(server, ess, listeners); - this.charges = charges; - } - - @Override - public void onPlayerChat(final PlayerChatEvent event) - { - if (isAborted(event)) - { - return; - } - - /** - * This file should handle detection of the local chat features... if local chat is enabled, we need to handle - * it here - */ - final String chatType = getChatType(event.getMessage()); - final StringBuilder command = new StringBuilder(); - command.append("chat"); - - if (chatType.length() > 0) - { - command.append("-").append(chatType); - } - long radius = ess.getSettings().getChatRadius(); - if (radius < 1) - { - return; - } - radius *= radius; - final User user = ess.getUser(event.getPlayer()); - - if (event.getMessage().length() > 0 && chatType.length() > 0) - { - final StringBuilder permission = new StringBuilder(); - permission.append("essentials.chat.").append(chatType); - - final StringBuilder format = new StringBuilder(); - format.append(chatType).append("Format"); - - final StringBuilder errorMsg = new StringBuilder(); - errorMsg.append("notAllowedTo").append(chatType.substring(0, 1).toUpperCase(Locale.ENGLISH)).append(chatType.substring(1)); - - if (user.isAuthorized(permission.toString())) - { - event.setMessage(event.getMessage().substring(1)); - event.setFormat(_(format.toString(), event.getFormat())); - charges.put(event, command.toString()); - return; - } - - user.sendMessage(_(errorMsg.toString())); - event.setCancelled(true); - return; - } - - sendLocalChat(user, radius, event); - } -} diff --git a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsLocalChatEvent.java b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsLocalChatEvent.java new file mode 100644 index 000000000..fe605b89a --- /dev/null +++ b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsLocalChatEvent.java @@ -0,0 +1,100 @@ +package com.earth2me.essentials.chat; + +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.player.PlayerChatEvent; + + +public class EssentialsLocalChatEvent extends Event implements Cancellable +{ + private Player player; + private String message; + private String format = "<%1$s> %2$s"; + private long radius; + private boolean cancelled = false; + private PlayerChatEvent parentEvent = null; + + public EssentialsLocalChatEvent(final Player player, final String message, final String format, final long radius) + { + super("EssLocalChat"); + this.player = player; + this.message = message; + this.format = format; + this.radius = radius; + } + + public EssentialsLocalChatEvent(final PlayerChatEvent event, final long radius) + { + this(event.getPlayer(), event.getMessage(), event.getFormat(), radius); + this.parentEvent = event; + } + + @Override + public boolean isCancelled() + { + return cancelled; + } + + @Override + public void setCancelled(final boolean cancel) + { + this.cancelled = cancel; + } + + public String getMessage() + { + return message; + } + + public void setMessage(final String message) + { + this.message = message; + } + + public void setPlayer(final Player player) + { + this.player = player; + } + + public Player getPlayer() + { + return player; + } + + public String getFormat() + { + return format; + } + + public void setFormat(final String format) + { + // Oh for a better way to do this! + try + { + String.format(format, player, message); + } + catch (RuntimeException ex) + { + ex.fillInStackTrace(); + throw ex; + } + + this.format = format; + } + + public long getRadius() + { + return radius; + } + + public void setRadius(final long radius) + { + this.radius = radius; + } + + public PlayerChatEvent getParentEvent() + { + return parentEvent; + } +}
\ No newline at end of file diff --git a/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsLocalChatEventListener.java b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsLocalChatEventListener.java new file mode 100644 index 000000000..df3c959f4 --- /dev/null +++ b/EssentialsChat/src/com/earth2me/essentials/chat/EssentialsLocalChatEventListener.java @@ -0,0 +1,78 @@ +package com.earth2me.essentials.chat; + +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.IUser; +import com.earth2me.essentials.chat.EssentialsLocalChatEvent; +import org.bukkit.Location; +import org.bukkit.Server; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.CustomEventListener; +import org.bukkit.event.Event; +import org.bukkit.event.Listener; + +public class EssentialsLocalChatEventListener extends CustomEventListener implements Listener { + + + protected transient IEssentials ess; + protected final transient Server server; + + public EssentialsLocalChatEventListener(final Server server, final IEssentials ess) + { + this.ess = ess; + this.server = server; + } + + public void onLocalChat(final EssentialsLocalChatEvent event) { + final Player sender = event.getPlayer(); + if (event.getRadius() < 1) + { + return; + } + event.setCancelled(true); + final Location loc = sender.getLocation(); + final World world = loc.getWorld(); + + for (Player onlinePlayer : server.getOnlinePlayers()) + { + String type = "[L]"; + final IUser user = ess.getUser(onlinePlayer); + //TODO: remove reference to op + if (user.isIgnoringPlayer(sender.getName()) && !sender.isOp()) + { + continue; + } + if (!user.equals(sender)) + { + final Location playerLoc = user.getLocation(); + if (playerLoc.getWorld() != world) + { + continue; + } + final double delta = playerLoc.distanceSquared(loc); + + if (delta > event.getRadius()) + { + if (user.isAuthorized("essentials.chat.spy")) + { + type = type.concat("[Spy]"); + } + else + { + continue; + } + } + } + + final String message = String.format(event.getFormat(), type.concat(sender.getDisplayName()), event.getMessage()); + user.sendMessage(message); + } + } + + @Override + public void onCustomEvent(final Event event) { + if (event instanceof EssentialsLocalChatEvent) { + onLocalChat((EssentialsLocalChatEvent) event); + } + } +}
\ No newline at end of file diff --git a/EssentialsChat/src/com/earth2me/essentials/chat/IEssentialsChatListener.java b/EssentialsChat/src/com/earth2me/essentials/chat/IEssentialsChatListener.java deleted file mode 100644 index 5c9c5c219..000000000 --- a/EssentialsChat/src/com/earth2me/essentials/chat/IEssentialsChatListener.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.earth2me.essentials.chat; - -import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerChatEvent; - - -public interface IEssentialsChatListener -{ - boolean shouldHandleThisChat(PlayerChatEvent event); - - String modifyMessage(PlayerChatEvent event, Player target, String message); -} diff --git a/EssentialsChat/src/com/earth2me/essentials/chat/listenerlevel/EssentialsChatPlayerListenerHighest.java b/EssentialsChat/src/com/earth2me/essentials/chat/listenerlevel/EssentialsChatPlayerListenerHighest.java new file mode 100644 index 000000000..7868f2295 --- /dev/null +++ b/EssentialsChat/src/com/earth2me/essentials/chat/listenerlevel/EssentialsChatPlayerListenerHighest.java @@ -0,0 +1,32 @@ +package com.earth2me.essentials.chat.listenerlevel; + +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.chat.EssentialsChatPlayer; +import java.util.Map; +import org.bukkit.Server; +import org.bukkit.event.player.PlayerChatEvent; + + +public class EssentialsChatPlayerListenerHighest extends EssentialsChatPlayer +{ + private final transient Map<PlayerChatEvent, String> charges; + + public EssentialsChatPlayerListenerHighest(final Server server, + final IEssentials ess, + final Map<PlayerChatEvent, String> charges) + { + super(server, ess); + this.charges = charges; + } + + @Override + public void onPlayerChat(final PlayerChatEvent event) + { + if (isAborted(event)) + { + return; + } + + chargeChat(event, charges); + } +} diff --git a/EssentialsChat/src/com/earth2me/essentials/chat/listenerlevel/EssentialsChatPlayerListenerLowest.java b/EssentialsChat/src/com/earth2me/essentials/chat/listenerlevel/EssentialsChatPlayerListenerLowest.java new file mode 100644 index 000000000..37394c3e6 --- /dev/null +++ b/EssentialsChat/src/com/earth2me/essentials/chat/listenerlevel/EssentialsChatPlayerListenerLowest.java @@ -0,0 +1,26 @@ +package com.earth2me.essentials.chat.listenerlevel; + +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.chat.EssentialsChatPlayer; +import org.bukkit.Server; +import org.bukkit.event.player.PlayerChatEvent; + + +public class EssentialsChatPlayerListenerLowest extends EssentialsChatPlayer +{ + public EssentialsChatPlayerListenerLowest(final Server server, final IEssentials ess) + { + super(server, ess); + } + + @Override + public void onPlayerChat(final PlayerChatEvent event) + { + if (isAborted(event)) + { + return; + } + + formatChat(event); + } +}
\ No newline at end of file diff --git a/EssentialsChat/src/com/earth2me/essentials/chat/listenerlevel/EssentialsChatPlayerListenerNormal.java b/EssentialsChat/src/com/earth2me/essentials/chat/listenerlevel/EssentialsChatPlayerListenerNormal.java new file mode 100644 index 000000000..c1a9968ef --- /dev/null +++ b/EssentialsChat/src/com/earth2me/essentials/chat/listenerlevel/EssentialsChatPlayerListenerNormal.java @@ -0,0 +1,32 @@ +package com.earth2me.essentials.chat.listenerlevel; + +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.chat.EssentialsChatPlayer; +import java.util.Map; +import org.bukkit.Server; +import org.bukkit.event.player.PlayerChatEvent; + + +public class EssentialsChatPlayerListenerNormal extends EssentialsChatPlayer +{ + private final transient Map<PlayerChatEvent, String> charges; + + public EssentialsChatPlayerListenerNormal(final Server server, + final IEssentials ess, + final Map<PlayerChatEvent, String> charges) + { + super(server, ess); + this.charges = charges; + } + + @Override + public void onPlayerChat(final PlayerChatEvent event) + { + if (isAborted(event)) + { + return; + } + + handleLocalChat(charges, event); + } +} diff --git a/EssentialsChat/src/plugin.yml b/EssentialsChat/src/plugin.yml index cc129f825..f6885521c 100644 --- a/EssentialsChat/src/plugin.yml +++ b/EssentialsChat/src/plugin.yml @@ -3,7 +3,7 @@ name: EssentialsChat main: com.earth2me.essentials.chat.EssentialsChat # Note to developers: This next line cannot change, or the automatic versioning system will break. version: TeamCity -website: http://www.earth2me.net:8001/ +website: http://tiny.cc/EssentialsWiki description: Provides chat control features for Essentials. Requires Permissions. authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo, ceulemans, Xeology, KHobbits, Okamosy] depend: [Essentials] diff --git a/EssentialsGeoIP/src/com/earth2me/essentials/geoip/EssentialsGeoIP.java b/EssentialsGeoIP/src/com/earth2me/essentials/geoip/EssentialsGeoIP.java index e0ca6cd7c..f9436d7f0 100644 --- a/EssentialsGeoIP/src/com/earth2me/essentials/geoip/EssentialsGeoIP.java +++ b/EssentialsGeoIP/src/com/earth2me/essentials/geoip/EssentialsGeoIP.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.geoip; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.IEssentials; +import com.earth2me.essentials.api.IEssentials; import java.util.logging.Level; import java.util.logging.Logger; import org.bukkit.event.Event.Priority; diff --git a/EssentialsGeoIP/src/com/earth2me/essentials/geoip/EssentialsGeoIPPlayerListener.java b/EssentialsGeoIP/src/com/earth2me/essentials/geoip/EssentialsGeoIPPlayerListener.java index ee187c2aa..5a33fecc9 100644 --- a/EssentialsGeoIP/src/com/earth2me/essentials/geoip/EssentialsGeoIPPlayerListener.java +++ b/EssentialsGeoIP/src/com/earth2me/essentials/geoip/EssentialsGeoIPPlayerListener.java @@ -2,9 +2,9 @@ package com.earth2me.essentials.geoip; import com.earth2me.essentials.EssentialsConf; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.IConf; -import com.earth2me.essentials.IEssentials; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IReload; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.IUser; import com.maxmind.geoip.Location; import com.maxmind.geoip.LookupService; import com.maxmind.geoip.regionName; @@ -21,7 +21,7 @@ import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerListener; -public class EssentialsGeoIPPlayerListener extends PlayerListener implements IConf +public class EssentialsGeoIPPlayerListener extends PlayerListener implements IReload { LookupService ls = null; private static final Logger logger = Logger.getLogger("Minecraft"); @@ -36,13 +36,13 @@ public class EssentialsGeoIPPlayerListener extends PlayerListener implements ICo this.dataFolder = dataFolder; this.config = new EssentialsConf(new File(dataFolder, "config.yml")); config.setTemplateName("/config.yml", EssentialsGeoIP.class); - reloadConfig(); + onReload(); } @Override public void onPlayerJoin(PlayerJoinEvent event) { - User u = ess.getUser(event.getPlayer()); + IUser u = ess.getUser(event.getPlayer()); if (u.isAuthorized("essentials.geoip.hide")) { return; @@ -73,13 +73,21 @@ public class EssentialsGeoIPPlayerListener extends PlayerListener implements ICo } if (config.getBoolean("show-on-whois", true)) { - u.setGeoLocation(sb.toString()); + u.acquireWriteLock(); + try + { + u.getData().setGeolocation(sb.toString()); + } + finally + { + u.unlock(); + } } if (config.getBoolean("show-on-login", true) && !u.isHidden()) { for (Player player : event.getPlayer().getServer().getOnlinePlayers()) { - User user = ess.getUser(player); + IUser user = ess.getUser(player); if (user.isAuthorized("essentials.geoip.show")) { user.sendMessage(_("geoipJoinFormat", u.getDisplayName(), sb.toString())); @@ -89,7 +97,7 @@ public class EssentialsGeoIPPlayerListener extends PlayerListener implements ICo } @Override - public final void reloadConfig() + public final void onReload() { config.load(); diff --git a/EssentialsGeoIP/src/plugin.yml b/EssentialsGeoIP/src/plugin.yml index 92fdc9963..ebdc3a97f 100644 --- a/EssentialsGeoIP/src/plugin.yml +++ b/EssentialsGeoIP/src/plugin.yml @@ -3,7 +3,7 @@ name: EssentialsGeoIP main: com.earth2me.essentials.geoip.EssentialsGeoIP # Note to developers: This next line cannot change, or the automatic versioning system will break. version: TeamCity -website: http://www.earth2me.net:8001/ +website: http://tiny.cc/EssentialsWiki description: Shows the country or city of a user on login and /whois. authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo, ceulemans, Xeology] depend: [Essentials]
\ No newline at end of file diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsConnect.java b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsConnect.java index 569123cd5..7f9ec44e4 100644 --- a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsConnect.java +++ b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsConnect.java @@ -1,8 +1,8 @@ package com.earth2me.essentials.protect; -import com.earth2me.essentials.IConf; -import com.earth2me.essentials.IEssentials; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IReload; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.IUser; import com.earth2me.essentials.protect.data.ProtectedBlockMemory; import com.earth2me.essentials.protect.data.ProtectedBlockMySQL; import com.earth2me.essentials.protect.data.ProtectedBlockSQLite; @@ -45,7 +45,7 @@ public class EssentialsConnect return ess; } - public void alert(final User user, final String item, final String type) + public void alert(final IUser user, final String item, final String type) { final Location loc = user.getLocation(); final String warnMessage = _("alertFormat", user.getName(), type, item, @@ -54,7 +54,7 @@ public class EssentialsConnect LOGGER.log(Level.WARNING, warnMessage); for (Player p : ess.getServer().getOnlinePlayers()) { - final User alertUser = ess.getUser(p); + final IUser alertUser = ess.getUser(p); if (alertUser.isAuthorized("essentials.protect.alerts")) { alertUser.sendMessage(warnMessage); @@ -63,10 +63,10 @@ public class EssentialsConnect } - private class ProtectReloader implements IConf + private class ProtectReloader implements IReload { @Override - public void reloadConfig() + public void onReload() { if (protect.getStorage() != null) { diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectBlockListener.java b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectBlockListener.java index 03ad19cb4..f30de1d81 100644 --- a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectBlockListener.java +++ b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectBlockListener.java @@ -1,8 +1,8 @@ package com.earth2me.essentials.protect; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.IEssentials; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.IUser; import com.earth2me.essentials.protect.data.IProtectedBlock; import java.util.ArrayList; import java.util.List; @@ -31,7 +31,7 @@ public class EssentialsProtectBlockListener extends BlockListener return; } - final User user = ess.getUser(event.getPlayer()); + final IUser user = ess.getUser(event.getPlayer()); if (prot.getSettingBool(ProtectConfig.disable_build) && !user.canBuild()) { @@ -228,7 +228,7 @@ public class EssentialsProtectBlockListener extends BlockListener { return; } - final User user = ess.getUser(event.getPlayer()); + final IUser user = ess.getUser(event.getPlayer()); if (prot.getSettingBool(ProtectConfig.disable_build) && !user.canBuild()) { diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectEntityListener.java b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectEntityListener.java index 89167b2b9..41b4a69a5 100644 --- a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectEntityListener.java +++ b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectEntityListener.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.protect; -import com.earth2me.essentials.IEssentials; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.IUser; import com.earth2me.essentials.craftbukkit.FakeExplosion; import java.util.Locale; import org.bukkit.Material; @@ -39,7 +39,7 @@ public class EssentialsProtectEntityListener extends EntityListener return; } - final User user = ess.getUser(target); + final IUser user = target instanceof Player ? ess.getUser((Player)target) : null; if (event instanceof EntityDamageByBlockEvent) { final DamageCause cause = event.getCause(); @@ -77,7 +77,7 @@ public class EssentialsProtectEntityListener extends EntityListener { final EntityDamageByEntityEvent edEvent = (EntityDamageByEntityEvent)event; final Entity eAttack = edEvent.getDamager(); - final User attacker = ess.getUser(eAttack); + final IUser attacker = eAttack instanceof Player ? ess.getUser((Player)eAttack) : null; // PVP Settings if (target instanceof Player && eAttack instanceof Player @@ -134,7 +134,7 @@ public class EssentialsProtectEntityListener extends EntityListener || (((Projectile)edEvent.getDamager()).getShooter() instanceof Player && prot.getSettingBool(ProtectConfig.disable_pvp) && (!user.isAuthorized("essentials.protect.pvp") - || !ess.getUser(((Projectile)edEvent.getDamager()).getShooter()).isAuthorized("essentials.protect.pvp"))))) + || !ess.getUser((Player)((Projectile)edEvent.getDamager()).getShooter()).isAuthorized("essentials.protect.pvp"))))) { event.setCancelled(true); return; @@ -299,7 +299,7 @@ public class EssentialsProtectEntityListener extends EntityListener { return; } - final User user = ess.getUser(event.getTarget()); + final IUser user = ess.getUser((Player)event.getTarget()); if ((event.getReason() == TargetReason.CLOSEST_PLAYER || event.getReason() == TargetReason.TARGET_ATTACKED_ENTITY || event.getReason() == TargetReason.PIG_ZOMBIE_TARGET diff --git a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectPlayerListener.java b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectPlayerListener.java index ad7831a53..a3f13a428 100644 --- a/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectPlayerListener.java +++ b/EssentialsProtect/src/com/earth2me/essentials/protect/EssentialsProtectPlayerListener.java @@ -1,8 +1,8 @@ package com.earth2me.essentials.protect; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.IEssentials; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.IUser; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.event.block.Action; @@ -26,7 +26,7 @@ public class EssentialsProtectPlayerListener extends PlayerListener public void onPlayerInteract(final PlayerInteractEvent event) { // Do not return if cancelled, because the interact event has 2 cancelled states. - final User user = ess.getUser(event.getPlayer()); + final IUser user = ess.getUser(event.getPlayer()); if (event.hasItem() && (event.getItem().getType() == Material.WATER_BUCKET diff --git a/EssentialsProtect/src/plugin.yml b/EssentialsProtect/src/plugin.yml index 6407c45ee..bbe628e67 100644 --- a/EssentialsProtect/src/plugin.yml +++ b/EssentialsProtect/src/plugin.yml @@ -3,7 +3,7 @@ name: EssentialsProtect main: com.earth2me.essentials.protect.EssentialsProtect # Note to developers: This next line cannot change, or the automatic versioning system will break. version: TeamCity -website: http://www.earth2me.net:8001/ +website: http://tiny.cc/EssentialsWiki description: Provides protection for various parts of the world. authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo, ceulemans, Xeology, KHobbits] softdepend: [Essentials]
\ No newline at end of file diff --git a/EssentialsSigns/build.xml b/EssentialsSigns/build.xml new file mode 100644 index 000000000..220f99e55 --- /dev/null +++ b/EssentialsSigns/build.xml @@ -0,0 +1,74 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- You may freely edit this file. See commented blocks below for --> +<!-- some examples of how to customize the build. --> +<!-- (If you delete it and reopen the project it will be recreated.) --> +<!-- By default, only the Clean and Build commands use this build script. --> +<!-- Commands such as Run, Debug, and Test only use this build script if --> +<!-- the Compile on Save feature is turned off for the project. --> +<!-- You can turn off the Compile on Save (or Deploy on Save) setting --> +<!-- in the project's Project Properties dialog box.--> +<project name="EssentialsSigns" default="default" basedir="."> + <description>Builds, tests, and runs the project EssentialsSigns.</description> + <import file="nbproject/build-impl.xml"/> + <!-- + + There exist several targets which are by default empty and which can be + used for execution of your tasks. These targets are usually executed + before and after some main targets. They are: + + -pre-init: called before initialization of project properties + -post-init: called after initialization of project properties + -pre-compile: called before javac compilation + -post-compile: called after javac compilation + -pre-compile-single: called before javac compilation of single file + -post-compile-single: called after javac compilation of single file + -pre-compile-test: called before javac compilation of JUnit tests + -post-compile-test: called after javac compilation of JUnit tests + -pre-compile-test-single: called before javac compilation of single JUnit test + -post-compile-test-single: called after javac compilation of single JUunit test + -pre-jar: called before JAR building + -post-jar: called after JAR building + -post-clean: called after cleaning build products + + (Targets beginning with '-' are not intended to be called on their own.) + + Example of inserting an obfuscator after compilation could look like this: + + <target name="-post-compile"> + <obfuscate> + <fileset dir="${build.classes.dir}"/> + </obfuscate> + </target> + + For list of available properties check the imported + nbproject/build-impl.xml file. + + + Another way to customize the build is by overriding existing main targets. + The targets of interest are: + + -init-macrodef-javac: defines macro for javac compilation + -init-macrodef-junit: defines macro for junit execution + -init-macrodef-debug: defines macro for class debugging + -init-macrodef-java: defines macro for class execution + -do-jar-with-manifest: JAR building (if you are using a manifest) + -do-jar-without-manifest: JAR building (if you are not using a manifest) + run: execution of project + -javadoc-build: Javadoc generation + test-report: JUnit report generation + + An example of overriding the target for project execution could look like this: + + <target name="run" depends="EssentialsSigns-impl.jar"> + <exec dir="bin" executable="launcher.exe"> + <arg file="${dist.jar}"/> + </exec> + </target> + + Notice that the overridden target depends on the jar target and not only on + the compile target as the regular run target does. Again, for a list of available + properties which you can use, check the target you are overriding in the + nbproject/build-impl.xml file. + + --> +</project> diff --git a/EssentialsSigns/manifest.mf b/EssentialsSigns/manifest.mf new file mode 100644 index 000000000..328e8e5bc --- /dev/null +++ b/EssentialsSigns/manifest.mf @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +X-COMMENT: Main-Class will be added automatically by build + diff --git a/EssentialsSigns/nbproject/build-impl.xml b/EssentialsSigns/nbproject/build-impl.xml new file mode 100644 index 000000000..27d55521e --- /dev/null +++ b/EssentialsSigns/nbproject/build-impl.xml @@ -0,0 +1,1083 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +*** GENERATED FROM project.xml - DO NOT EDIT *** +*** EDIT ../build.xml INSTEAD *** + +For the purpose of easier reading the script +is divided into following sections: + + - initialization + - compilation + - jar + - execution + - debugging + - javadoc + - junit compilation + - junit execution + - junit debugging + - applet + - cleanup + + --> +<project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir=".." default="default" name="EssentialsSigns-impl"> + <fail message="Please build using Ant 1.8.0 or higher."> + <condition> + <not> + <antversion atleast="1.8.0"/> + </not> + </condition> + </fail> + <target depends="test,jar,javadoc" description="Build and test whole project." name="default"/> + <!-- + ====================== + INITIALIZATION SECTION + ====================== + --> + <target name="-pre-init"> + <!-- Empty placeholder for easier customization. --> + <!-- You can override this target in the ../build.xml file. --> + </target> + <target depends="-pre-init" name="-init-private"> + <property file="nbproject/private/config.properties"/> + <property file="nbproject/private/configs/${config}.properties"/> + <property file="nbproject/private/private.properties"/> + </target> + <target name="-pre-init-libraries"> + <property location="../lib/nblibraries.properties" name="libraries.path"/> + <dirname file="${libraries.path}" property="libraries.dir.nativedirsep"/> + <pathconvert dirsep="/" property="libraries.dir"> + <path path="${libraries.dir.nativedirsep}"/> + </pathconvert> + <basename file="${libraries.path}" property="libraries.basename" suffix=".properties"/> + <available file="${libraries.dir}/${libraries.basename}-private.properties" property="private.properties.available"/> + </target> + <target depends="-pre-init-libraries" if="private.properties.available" name="-init-private-libraries"> + <loadproperties encoding="ISO-8859-1" srcfile="${libraries.dir}/${libraries.basename}-private.properties"> + <filterchain> + <replacestring from="$${base}" to="${libraries.dir}"/> + <escapeunicode/> + </filterchain> + </loadproperties> + </target> + <target depends="-pre-init,-init-private,-init-private-libraries" name="-init-libraries"> + <loadproperties encoding="ISO-8859-1" srcfile="${libraries.path}"> + <filterchain> + <replacestring from="$${base}" to="${libraries.dir}"/> + <escapeunicode/> + </filterchain> + </loadproperties> + </target> + <target depends="-pre-init,-init-private,-init-libraries" name="-init-user"> + <property file="${user.properties.file}"/> + <!-- The two properties below are usually overridden --> + <!-- by the active platform. Just a fallback. --> + <property name="default.javac.source" value="1.4"/> + <property name="default.javac.target" value="1.4"/> + </target> + <target depends="-pre-init,-init-private,-init-libraries,-init-user" name="-init-project"> + <property file="nbproject/configs/${config}.properties"/> + <property file="nbproject/project.properties"/> + </target> + <target depends="-pre-init,-init-private,-init-libraries,-init-user,-init-project,-init-macrodef-property" name="-do-init"> + <available file="${manifest.file}" property="manifest.available"/> + <condition property="splashscreen.available"> + <and> + <not> + <equals arg1="${application.splash}" arg2="" trim="true"/> + </not> + <available file="${application.splash}"/> + </and> + </condition> + <condition property="main.class.available"> + <and> + <isset property="main.class"/> + <not> + <equals arg1="${main.class}" arg2="" trim="true"/> + </not> + </and> + </condition> + <condition property="manifest.available+main.class"> + <and> + <isset property="manifest.available"/> + <isset property="main.class.available"/> + </and> + </condition> + <condition property="do.archive"> + <not> + <istrue value="${jar.archive.disabled}"/> + </not> + </condition> + <condition property="do.mkdist"> + <and> + <isset property="do.archive"/> + <isset property="libs.CopyLibs.classpath"/> + <not> + <istrue value="${mkdist.disabled}"/> + </not> + </and> + </condition> + <condition property="manifest.available+main.class+mkdist.available"> + <and> + <istrue value="${manifest.available+main.class}"/> + <isset property="do.mkdist"/> + </and> + </condition> + <condition property="do.archive+manifest.available"> + <and> + <isset property="manifest.available"/> + <istrue value="${do.archive}"/> + </and> + </condition> + <condition property="do.archive+main.class.available"> + <and> + <isset property="main.class.available"/> + <istrue value="${do.archive}"/> + </and> + </condition> + <condition property="do.archive+splashscreen.available"> + <and> + <isset property="splashscreen.available"/> + <istrue value="${do.archive}"/> + </and> + </condition> + <condition property="do.archive+manifest.available+main.class"> + <and> + <istrue value="${manifest.available+main.class}"/> + <istrue value="${do.archive}"/> + </and> + </condition> + <condition property="manifest.available-mkdist.available"> + <or> + <istrue value="${manifest.available}"/> + <isset property="do.mkdist"/> + </or> + </condition> + <condition property="manifest.available+main.class-mkdist.available"> + <or> + <istrue value="${manifest.available+main.class}"/> + <isset property="do.mkdist"/> + </or> + </condition> + <condition property="have.tests"> + <or> + <available file="${test.src.dir}"/> + </or> + </condition> + <condition property="have.sources"> + <or> + <available file="${src.dir}"/> + </or> + </condition> + <condition property="netbeans.home+have.tests"> + <and> + <isset property="netbeans.home"/> + <isset property="have.tests"/> + </and> + </condition> + <condition property="no.javadoc.preview"> + <and> + <isset property="javadoc.preview"/> + <isfalse value="${javadoc.preview}"/> + </and> + </condition> + <property name="run.jvmargs" value=""/> + <property name="javac.compilerargs" value=""/> + <property name="work.dir" value="${basedir}"/> + <condition property="no.deps"> + <and> + <istrue value="${no.dependencies}"/> + </and> + </condition> + <property name="javac.debug" value="true"/> + <property name="javadoc.preview" value="true"/> + <property name="application.args" value=""/> + <property name="source.encoding" value="${file.encoding}"/> + <property name="runtime.encoding" value="${source.encoding}"/> + <condition property="javadoc.encoding.used" value="${javadoc.encoding}"> + <and> + <isset property="javadoc.encoding"/> + <not> + <equals arg1="${javadoc.encoding}" arg2=""/> + </not> + </and> + </condition> + <property name="javadoc.encoding.used" value="${source.encoding}"/> + <property name="includes" value="**"/> + <property name="excludes" value=""/> + <property name="do.depend" value="false"/> + <condition property="do.depend.true"> + <istrue value="${do.depend}"/> + </condition> + <path id="endorsed.classpath.path" path="${endorsed.classpath}"/> + <condition else="" property="endorsed.classpath.cmd.line.arg" value="-Xbootclasspath/p:'${toString:endorsed.classpath.path}'"> + <length length="0" string="${endorsed.classpath}" when="greater"/> + </condition> + <condition else="false" property="jdkBug6558476"> + <and> + <matches pattern="1\.[56]" string="${java.specification.version}"/> + <not> + <os family="unix"/> + </not> + </and> + </condition> + <property name="javac.fork" value="${jdkBug6558476}"/> + <property name="jar.index" value="false"/> + <property name="jar.index.metainf" value="${jar.index}"/> + <property name="copylibs.rebase" value="true"/> + <available file="${meta.inf.dir}/persistence.xml" property="has.persistence.xml"/> + </target> + <target name="-post-init"> + <!-- Empty placeholder for easier customization. --> + <!-- You can override this target in the ../build.xml file. --> + </target> + <target depends="-pre-init,-init-private,-init-libraries,-init-user,-init-project,-do-init" name="-init-check"> + <fail unless="src.dir">Must set src.dir</fail> + <fail unless="test.src.dir">Must set test.src.dir</fail> + <fail unless="build.dir">Must set build.dir</fail> + <fail unless="dist.dir">Must set dist.dir</fail> + <fail unless="build.classes.dir">Must set build.classes.dir</fail> + <fail unless="dist.javadoc.dir">Must set dist.javadoc.dir</fail> + <fail unless="build.test.classes.dir">Must set build.test.classes.dir</fail> + <fail unless="build.test.results.dir">Must set build.test.results.dir</fail> + <fail unless="build.classes.excludes">Must set build.classes.excludes</fail> + <fail unless="dist.jar">Must set dist.jar</fail> + </target> + <target name="-init-macrodef-property"> + <macrodef name="property" uri="http://www.netbeans.org/ns/j2se-project/1"> + <attribute name="name"/> + <attribute name="value"/> + <sequential> + <property name="@{name}" value="${@{value}}"/> + </sequential> + </macrodef> + </target> + <target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-macrodef-javac-with-processors"> + <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3"> + <attribute default="${src.dir}" name="srcdir"/> + <attribute default="${build.classes.dir}" name="destdir"/> + <attribute default="${javac.classpath}" name="classpath"/> + <attribute default="${javac.processorpath}" name="processorpath"/> + <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/> + <attribute default="${includes}" name="includes"/> + <attribute default="${excludes}" name="excludes"/> + <attribute default="${javac.debug}" name="debug"/> + <attribute default="${empty.dir}" name="sourcepath"/> + <attribute default="${empty.dir}" name="gensrcdir"/> + <element name="customize" optional="true"/> + <sequential> + <property location="${build.dir}/empty" name="empty.dir"/> + <mkdir dir="${empty.dir}"/> + <mkdir dir="@{apgeneratedsrcdir}"/> + <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}"> + <src> + <dirset dir="@{gensrcdir}" erroronmissingdir="false"> + <include name="*"/> + </dirset> + </src> + <classpath> + <path path="@{classpath}"/> + </classpath> + <compilerarg line="${endorsed.classpath.cmd.line.arg}"/> + <compilerarg line="${javac.compilerargs}"/> + <compilerarg value="-processorpath"/> + <compilerarg path="@{processorpath}:${empty.dir}"/> + <compilerarg line="${ap.processors.internal}"/> + <compilerarg line="${annotation.processing.processor.options}"/> + <compilerarg value="-s"/> + <compilerarg path="@{apgeneratedsrcdir}"/> + <compilerarg line="${ap.proc.none.internal}"/> + <customize/> + </javac> + </sequential> + </macrodef> + </target> + <target depends="-init-ap-cmdline-properties" name="-init-macrodef-javac-without-processors" unless="ap.supported.internal"> + <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3"> + <attribute default="${src.dir}" name="srcdir"/> + <attribute default="${build.classes.dir}" name="destdir"/> + <attribute default="${javac.classpath}" name="classpath"/> + <attribute default="${javac.processorpath}" name="processorpath"/> + <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/> + <attribute default="${includes}" name="includes"/> + <attribute default="${excludes}" name="excludes"/> + <attribute default="${javac.debug}" name="debug"/> + <attribute default="${empty.dir}" name="sourcepath"/> + <attribute default="${empty.dir}" name="gensrcdir"/> + <element name="customize" optional="true"/> + <sequential> + <property location="${build.dir}/empty" name="empty.dir"/> + <mkdir dir="${empty.dir}"/> + <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" fork="${javac.fork}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}"> + <src> + <dirset dir="@{gensrcdir}" erroronmissingdir="false"> + <include name="*"/> + </dirset> + </src> + <classpath> + <path path="@{classpath}"/> + </classpath> + <compilerarg line="${endorsed.classpath.cmd.line.arg}"/> + <compilerarg line="${javac.compilerargs}"/> + <customize/> + </javac> + </sequential> + </macrodef> + </target> + <target depends="-init-macrodef-javac-with-processors,-init-macrodef-javac-without-processors" name="-init-macrodef-javac"> + <macrodef name="depend" uri="http://www.netbeans.org/ns/j2se-project/3"> + <attribute default="${src.dir}" name="srcdir"/> + <attribute default="${build.classes.dir}" name="destdir"/> + <attribute default="${javac.classpath}" name="classpath"/> + <sequential> + <depend cache="${build.dir}/depcache" destdir="@{destdir}" excludes="${excludes}" includes="${includes}" srcdir="@{srcdir}"> + <classpath> + <path path="@{classpath}"/> + </classpath> + </depend> + </sequential> + </macrodef> + <macrodef name="force-recompile" uri="http://www.netbeans.org/ns/j2se-project/3"> + <attribute default="${build.classes.dir}" name="destdir"/> + <sequential> + <fail unless="javac.includes">Must set javac.includes</fail> + <pathconvert pathsep="${line.separator}" property="javac.includes.binary"> + <path> + <filelist dir="@{destdir}" files="${javac.includes}"/> + </path> + <globmapper from="*.java" to="*.class"/> + </pathconvert> + <tempfile deleteonexit="true" property="javac.includesfile.binary"/> + <echo file="${javac.includesfile.binary}" message="${javac.includes.binary}"/> + <delete> + <files includesfile="${javac.includesfile.binary}"/> + </delete> + <delete> + <fileset file="${javac.includesfile.binary}"/> + </delete> + </sequential> + </macrodef> + </target> + <target name="-init-macrodef-junit"> + <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3"> + <attribute default="${includes}" name="includes"/> + <attribute default="${excludes}" name="excludes"/> + <attribute default="**" name="testincludes"/> + <sequential> + <property name="junit.forkmode" value="perTest"/> + <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" showoutput="true" tempdir="${build.dir}"> + <batchtest todir="${build.test.results.dir}"> + <fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}"> + <filename name="@{testincludes}"/> + </fileset> + </batchtest> + <classpath> + <path path="${run.test.classpath}"/> + </classpath> + <syspropertyset> + <propertyref prefix="test-sys-prop."/> + <mapper from="test-sys-prop.*" to="*" type="glob"/> + </syspropertyset> + <formatter type="brief" usefile="false"/> + <formatter type="xml"/> + <jvmarg line="${endorsed.classpath.cmd.line.arg}"/> + <jvmarg value="-ea"/> + <jvmarg line="${run.jvmargs}"/> + </junit> + </sequential> + </macrodef> + </target> + <target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile, -profile-init-check" name="profile-init"/> + <target name="-profile-pre-init"> + <!-- Empty placeholder for easier customization. --> + <!-- You can override this target in the ../build.xml file. --> + </target> + <target name="-profile-post-init"> + <!-- Empty placeholder for easier customization. --> + <!-- You can override this target in the ../build.xml file. --> + </target> + <target name="-profile-init-macrodef-profile"> + <macrodef name="resolve"> + <attribute name="name"/> + <attribute name="value"/> + <sequential> + <property name="@{name}" value="${env.@{value}}"/> + </sequential> + </macrodef> + <macrodef name="profile"> + <attribute default="${main.class}" name="classname"/> + <element name="customize" optional="true"/> + <sequential> + <property environment="env"/> + <resolve name="profiler.current.path" value="${profiler.info.pathvar}"/> + <java classname="@{classname}" dir="${profiler.info.dir}" fork="true" jvm="${profiler.info.jvm}"> + <jvmarg line="${endorsed.classpath.cmd.line.arg}"/> + <jvmarg value="${profiler.info.jvmargs.agent}"/> + <jvmarg line="${profiler.info.jvmargs}"/> + <env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/> + <arg line="${application.args}"/> + <classpath> + <path path="${run.classpath}"/> + </classpath> + <syspropertyset> + <propertyref prefix="run-sys-prop."/> + <mapper from="run-sys-prop.*" to="*" type="glob"/> + </syspropertyset> + <customize/> + </java> + </sequential> + </macrodef> + </target> + <target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile" name="-profile-init-check"> + <fail unless="profiler.info.jvm">Must set JVM to use for profiling in profiler.info.jvm</fail> + <fail unless="profiler.info.jvmargs.agent">Must set profiler agent JVM arguments in profiler.info.jvmargs.agent</fail> + </target> + <target depends="-init-debug-args" name="-init-macrodef-nbjpda"> + <macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1"> + <attribute default="${main.class}" name="name"/> + <attribute default="${debug.classpath}" name="classpath"/> + <attribute default="" name="stopclassname"/> + <sequential> + <nbjpdastart addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}" transport="${debug-transport}"> + <classpath> + <path path="@{classpath}"/> + </classpath> + </nbjpdastart> + </sequential> + </macrodef> + <macrodef name="nbjpdareload" uri="http://www.netbeans.org/ns/j2se-project/1"> + <attribute default="${build.classes.dir}" name="dir"/> + <sequential> + <nbjpdareload> + <fileset dir="@{dir}" includes="${fix.classes}"> + <include name="${fix.includes}*.class"/> + </fileset> + </nbjpdareload> + </sequential> + </macrodef> + </target> + <target name="-init-debug-args"> + <property name="version-output" value="java version "${ant.java.version}"/> + <condition property="have-jdk-older-than-1.4"> + <or> + <contains string="${version-output}" substring="java version "1.0"/> + <contains string="${version-output}" substring="java version "1.1"/> + <contains string="${version-output}" substring="java version "1.2"/> + <contains string="${version-output}" substring="java version "1.3"/> + </or> + </condition> + <condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none"> + <istrue value="${have-jdk-older-than-1.4}"/> + </condition> + <condition else="dt_socket" property="debug-transport-by-os" value="dt_shmem"> + <os family="windows"/> + </condition> + <condition else="${debug-transport-by-os}" property="debug-transport" value="${debug.transport}"> + <isset property="debug.transport"/> + </condition> + </target> + <target depends="-init-debug-args" name="-init-macrodef-debug"> + <macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3"> + <attribute default="${main.class}" name="classname"/> + <attribute default="${debug.classpath}" name="classpath"/> + <element name="customize" optional="true"/> + <sequential> + <java classname="@{classname}" dir="${work.dir}" fork="true"> + <jvmarg line="${endorsed.classpath.cmd.line.arg}"/> + <jvmarg line="${debug-args-line}"/> + <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/> + <jvmarg value="-Dfile.encoding=${runtime.encoding}"/> + <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/> + <jvmarg line="${run.jvmargs}"/> + <classpath> + <path path="@{classpath}"/> + </classpath> + <syspropertyset> + <propertyref prefix="run-sys-prop."/> + <mapper from="run-sys-prop.*" to="*" type="glob"/> + </syspropertyset> + <customize/> + </java> + </sequential> + </macrodef> + </target> + <target name="-init-macrodef-java"> + <macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1"> + <attribute default="${main.class}" name="classname"/> + <attribute default="${run.classpath}" name="classpath"/> + <element name="customize" optional="true"/> + <sequential> + <java classname="@{classname}" dir="${work.dir}" fork="true"> + <jvmarg line="${endorsed.classpath.cmd.line.arg}"/> + <jvmarg value="-Dfile.encoding=${runtime.encoding}"/> + <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/> + <jvmarg line="${run.jvmargs}"/> + <classpath> + <path path="@{classpath}"/> + </classpath> + <syspropertyset> + <propertyref prefix="run-sys-prop."/> + <mapper from="run-sys-prop.*" to="*" type="glob"/> + </syspropertyset> + <customize/> + </java> + </sequential> + </macrodef> + </target> + <target name="-init-macrodef-copylibs"> + <macrodef name="copylibs" uri="http://www.netbeans.org/ns/j2se-project/3"> + <attribute default="${manifest.file}" name="manifest"/> + <element name="customize" optional="true"/> + <sequential> + <property location="${build.classes.dir}" name="build.classes.dir.resolved"/> + <pathconvert property="run.classpath.without.build.classes.dir"> + <path path="${run.classpath}"/> + <map from="${build.classes.dir.resolved}" to=""/> + </pathconvert> + <pathconvert pathsep=" " property="jar.classpath"> + <path path="${run.classpath.without.build.classes.dir}"/> + <chainedmapper> + <flattenmapper/> + <globmapper from="*" to="lib/*"/> + </chainedmapper> + </pathconvert> + <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/> + <copylibs compress="${jar.compress}" index="${jar.index}" indexMetaInf="${jar.index.metainf}" jarfile="${dist.jar}" manifest="@{manifest}" rebase="${copylibs.rebase}" runtimeclasspath="${run.classpath.without.build.classes.dir}"> + <fileset dir="${build.classes.dir}"/> + <manifest> + <attribute name="Class-Path" value="${jar.classpath}"/> + <customize/> + </manifest> + </copylibs> + </sequential> + </macrodef> + </target> + <target name="-init-presetdef-jar"> + <presetdef name="jar" uri="http://www.netbeans.org/ns/j2se-project/1"> + <jar compress="${jar.compress}" index="${jar.index}" jarfile="${dist.jar}"> + <j2seproject1:fileset dir="${build.classes.dir}"/> + </jar> + </presetdef> + </target> + <target name="-init-ap-cmdline-properties"> + <property name="annotation.processing.enabled" value="true"/> + <property name="annotation.processing.processors.list" value=""/> + <property name="annotation.processing.processor.options" value=""/> + <property name="annotation.processing.run.all.processors" value="true"/> + <property name="javac.processorpath" value="${javac.classpath}"/> + <property name="javac.test.processorpath" value="${javac.test.classpath}"/> + <condition property="ap.supported.internal" value="true"> + <not> + <matches pattern="1\.[0-5](\..*)?" string="${javac.source}"/> + </not> + </condition> + </target> + <target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-ap-cmdline-supported"> + <condition else="" property="ap.processors.internal" value="-processor ${annotation.processing.processors.list}"> + <isfalse value="${annotation.processing.run.all.processors}"/> + </condition> + <condition else="" property="ap.proc.none.internal" value="-proc:none"> + <isfalse value="${annotation.processing.enabled}"/> + </condition> + </target> + <target depends="-init-ap-cmdline-properties,-init-ap-cmdline-supported" name="-init-ap-cmdline"> + <property name="ap.cmd.line.internal" value=""/> + </target> + <target depends="-pre-init,-init-private,-init-libraries,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-junit,-init-macrodef-nbjpda,-init-macrodef-debug,-init-macrodef-java,-init-presetdef-jar,-init-ap-cmdline" name="init"/> + <!-- + =================== + COMPILATION SECTION + =================== + --> + <target name="-deps-jar-init" unless="built-jar.properties"> + <property location="${build.dir}/built-jar.properties" name="built-jar.properties"/> + <delete file="${built-jar.properties}" quiet="true"/> + </target> + <target if="already.built.jar.${basedir}" name="-warn-already-built-jar"> + <echo level="warn" message="Cycle detected: EssentialsSigns was already built"/> + </target> + <target depends="init,-deps-jar-init" name="deps-jar" unless="no.deps"> + <mkdir dir="${build.dir}"/> + <touch file="${built-jar.properties}" verbose="false"/> + <property file="${built-jar.properties}" prefix="already.built.jar."/> + <antcall target="-warn-already-built-jar"/> + <propertyfile file="${built-jar.properties}"> + <entry key="${basedir}" value=""/> + </propertyfile> + <antcall target="-maybe-call-dep"> + <param name="call.built.properties" value="${built-jar.properties}"/> + <param location="${project.Essentials}" name="call.subproject"/> + <param location="${project.Essentials}/build.xml" name="call.script"/> + <param name="call.target" value="jar"/> + <param name="transfer.built-jar.properties" value="${built-jar.properties}"/> + </antcall> + </target> + <target depends="init,-check-automatic-build,-clean-after-automatic-build" name="-verify-automatic-build"/> + <target depends="init" name="-check-automatic-build"> + <available file="${build.classes.dir}/.netbeans_automatic_build" property="netbeans.automatic.build"/> + </target> + <target depends="init" if="netbeans.automatic.build" name="-clean-after-automatic-build"> + <antcall target="clean"/> + </target> + <target depends="init,deps-jar" name="-pre-pre-compile"> + <mkdir dir="${build.classes.dir}"/> + </target> + <target name="-pre-compile"> + <!-- Empty placeholder for easier customization. --> + <!-- You can override this target in the ../build.xml file. --> + </target> + <target if="do.depend.true" name="-compile-depend"> + <pathconvert property="build.generated.subdirs"> + <dirset dir="${build.generated.sources.dir}" erroronmissingdir="false"> + <include name="*"/> + </dirset> + </pathconvert> + <j2seproject3:depend srcdir="${src.dir}:${build.generated.subdirs}"/> + </target> + <target depends="init,deps-jar,-pre-pre-compile,-pre-compile, -copy-persistence-xml,-compile-depend" if="have.sources" name="-do-compile"> + <j2seproject3:javac gensrcdir="${build.generated.sources.dir}"/> + <copy todir="${build.classes.dir}"> + <fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/> + </copy> + </target> + <target if="has.persistence.xml" name="-copy-persistence-xml"> + <mkdir dir="${build.classes.dir}/META-INF"/> + <copy todir="${build.classes.dir}/META-INF"> + <fileset dir="${meta.inf.dir}" includes="persistence.xml"/> + </copy> + </target> + <target name="-post-compile"> + <!-- Empty placeholder for easier customization. --> + <!-- You can override this target in the ../build.xml file. --> + </target> + <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project." name="compile"/> + <target name="-pre-compile-single"> + <!-- Empty placeholder for easier customization. --> + <!-- You can override this target in the ../build.xml file. --> + </target> + <target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single"> + <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail> + <j2seproject3:force-recompile/> + <j2seproject3:javac excludes="" gensrcdir="${build.generated.sources.dir}" includes="${javac.includes}" sourcepath="${src.dir}"/> + </target> + <target name="-post-compile-single"> + <!-- Empty placeholder for easier customization. --> + <!-- You can override this target in the ../build.xml file. --> + </target> + <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single" name="compile-single"/> + <!-- + ==================== + JAR BUILDING SECTION + ==================== + --> + <target depends="init" name="-pre-pre-jar"> + <dirname file="${dist.jar}" property="dist.jar.dir"/> + <mkdir dir="${dist.jar.dir}"/> + </target> + <target name="-pre-jar"> + <!-- Empty placeholder for easier customization. --> + <!-- You can override this target in the ../build.xml file. --> + </target> + <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive" name="-do-jar-without-manifest" unless="manifest.available-mkdist.available"> + <j2seproject1:jar/> + </target> + <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive+manifest.available" name="-do-jar-with-manifest" unless="manifest.available+main.class-mkdist.available"> + <j2seproject1:jar manifest="${manifest.file}"/> + </target> + <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive+manifest.available+main.class" name="-do-jar-with-mainclass" unless="manifest.available+main.class+mkdist.available"> + <j2seproject1:jar manifest="${manifest.file}"> + <j2seproject1:manifest> + <j2seproject1:attribute name="Main-Class" value="${main.class}"/> + </j2seproject1:manifest> + </j2seproject1:jar> + <echo level="info">To run this application from the command line without Ant, try:</echo> + <property location="${build.classes.dir}" name="build.classes.dir.resolved"/> + <property location="${dist.jar}" name="dist.jar.resolved"/> + <pathconvert property="run.classpath.with.dist.jar"> + <path path="${run.classpath}"/> + <map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/> + </pathconvert> + <echo level="info">java -cp "${run.classpath.with.dist.jar}" ${main.class}</echo> + </target> + <target depends="init" if="do.archive" name="-do-jar-with-libraries-create-manifest" unless="manifest.available"> + <tempfile deleteonexit="true" destdir="${build.dir}" property="tmp.manifest.file"/> + <touch file="${tmp.manifest.file}" verbose="false"/> + </target> + <target depends="init" if="do.archive+manifest.available" name="-do-jar-with-libraries-copy-manifest"> + <tempfile deleteonexit="true" destdir="${build.dir}" property="tmp.manifest.file"/> + <copy file="${manifest.file}" tofile="${tmp.manifest.file}"/> + </target> + <target depends="init,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest" if="do.archive+main.class.available" name="-do-jar-with-libraries-set-main"> + <manifest file="${tmp.manifest.file}" mode="update"> + <attribute name="Main-Class" value="${main.class}"/> + </manifest> + </target> + <target depends="init,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest" if="do.archive+splashscreen.available" name="-do-jar-with-libraries-set-splashscreen"> + <basename file="${application.splash}" property="splashscreen.basename"/> + <mkdir dir="${build.classes.dir}/META-INF"/> + <copy failonerror="false" file="${application.splash}" todir="${build.classes.dir}/META-INF"/> + <manifest file="${tmp.manifest.file}" mode="update"> + <attribute name="SplashScreen-Image" value="META-INF/${splashscreen.basename}"/> + </manifest> + </target> + <target depends="init,-init-macrodef-copylibs,compile,-pre-pre-jar,-pre-jar,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest,-do-jar-with-libraries-set-main,-do-jar-with-libraries-set-splashscreen" if="do.mkdist" name="-do-jar-with-libraries-pack"> + <j2seproject3:copylibs manifest="${tmp.manifest.file}"/> + <echo level="info">To run this application from the command line without Ant, try:</echo> + <property location="${dist.jar}" name="dist.jar.resolved"/> + <echo level="info">java -jar "${dist.jar.resolved}"</echo> + </target> + <target depends="-do-jar-with-libraries-pack" if="do.archive" name="-do-jar-with-libraries-delete-manifest"> + <delete> + <fileset file="${tmp.manifest.file}"/> + </delete> + </target> + <target depends="init,compile,-pre-pre-jar,-pre-jar,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest,-do-jar-with-libraries-set-main,-do-jar-with-libraries-set-splashscreen,-do-jar-with-libraries-pack,-do-jar-with-libraries-delete-manifest" name="-do-jar-with-libraries"/> + <target name="-post-jar"> + <!-- Empty placeholder for easier customization. --> + <!-- You can override this target in the ../build.xml file. --> + </target> + <target depends="init,compile,-pre-jar,-do-jar-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries,-post-jar" description="Build JAR." name="jar"/> + <!-- + ================= + EXECUTION SECTION + ================= + --> + <target depends="init,compile" description="Run a main class." name="run"> + <j2seproject1:java> + <customize> + <arg line="${application.args}"/> + </customize> + </j2seproject1:java> + </target> + <target name="-do-not-recompile"> + <property name="javac.includes.binary" value=""/> + </target> + <target depends="init,compile-single" name="run-single"> + <fail unless="run.class">Must select one file in the IDE or set run.class</fail> + <j2seproject1:java classname="${run.class}"/> + </target> + <target depends="init,compile-test-single" name="run-test-with-main"> + <fail unless="run.class">Must select one file in the IDE or set run.class</fail> + <j2seproject1:java classname="${run.class}" classpath="${run.test.classpath}"/> + </target> + <!-- + ================= + DEBUGGING SECTION + ================= + --> + <target depends="init" if="netbeans.home" name="-debug-start-debugger"> + <j2seproject1:nbjpdastart name="${debug.class}"/> + </target> + <target depends="init" if="netbeans.home" name="-debug-start-debugger-main-test"> + <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${debug.class}"/> + </target> + <target depends="init,compile" name="-debug-start-debuggee"> + <j2seproject3:debug> + <customize> + <arg line="${application.args}"/> + </customize> + </j2seproject3:debug> + </target> + <target depends="init,compile,-debug-start-debugger,-debug-start-debuggee" description="Debug project in IDE." if="netbeans.home" name="debug"/> + <target depends="init" if="netbeans.home" name="-debug-start-debugger-stepinto"> + <j2seproject1:nbjpdastart stopclassname="${main.class}"/> + </target> + <target depends="init,compile,-debug-start-debugger-stepinto,-debug-start-debuggee" if="netbeans.home" name="debug-stepinto"/> + <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-single"> + <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail> + <j2seproject3:debug classname="${debug.class}"/> + </target> + <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single"/> + <target depends="init,compile-test-single" if="netbeans.home" name="-debug-start-debuggee-main-test"> + <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail> + <j2seproject3:debug classname="${debug.class}" classpath="${debug.test.classpath}"/> + </target> + <target depends="init,compile-test-single,-debug-start-debugger-main-test,-debug-start-debuggee-main-test" if="netbeans.home" name="debug-test-with-main"/> + <target depends="init" name="-pre-debug-fix"> + <fail unless="fix.includes">Must set fix.includes</fail> + <property name="javac.includes" value="${fix.includes}.java"/> + </target> + <target depends="init,-pre-debug-fix,compile-single" if="netbeans.home" name="-do-debug-fix"> + <j2seproject1:nbjpdareload/> + </target> + <target depends="init,-pre-debug-fix,-do-debug-fix" if="netbeans.home" name="debug-fix"/> + <!-- + ================= + PROFILING SECTION + ================= + --> + <target depends="profile-init,compile" description="Profile a project in the IDE." if="netbeans.home" name="profile"> + <nbprofiledirect> + <classpath> + <path path="${run.classpath}"/> + </classpath> + </nbprofiledirect> + <profile/> + </target> + <target depends="profile-init,compile-single" description="Profile a selected class in the IDE." if="netbeans.home" name="profile-single"> + <fail unless="profile.class">Must select one file in the IDE or set profile.class</fail> + <nbprofiledirect> + <classpath> + <path path="${run.classpath}"/> + </classpath> + </nbprofiledirect> + <profile classname="${profile.class}"/> + </target> + <!-- + ========================= + APPLET PROFILING SECTION + ========================= + --> + <target depends="profile-init,compile-single" if="netbeans.home" name="profile-applet"> + <nbprofiledirect> + <classpath> + <path path="${run.classpath}"/> + </classpath> + </nbprofiledirect> + <profile classname="sun.applet.AppletViewer"> + <customize> + <arg value="${applet.url}"/> + </customize> + </profile> + </target> + <!-- + ========================= + TESTS PROFILING SECTION + ========================= + --> + <target depends="profile-init,compile-test-single" if="netbeans.home" name="profile-test-single"> + <nbprofiledirect> + <classpath> + <path path="${run.test.classpath}"/> + </classpath> + </nbprofiledirect> + <junit dir="${profiler.info.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" jvm="${profiler.info.jvm}" showoutput="true"> + <env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/> + <jvmarg value="${profiler.info.jvmargs.agent}"/> + <jvmarg line="${profiler.info.jvmargs}"/> + <test name="${profile.class}"/> + <classpath> + <path path="${run.test.classpath}"/> + </classpath> + <syspropertyset> + <propertyref prefix="test-sys-prop."/> + <mapper from="test-sys-prop.*" to="*" type="glob"/> + </syspropertyset> + <formatter type="brief" usefile="false"/> + <formatter type="xml"/> + </junit> + </target> + <!-- + =============== + JAVADOC SECTION + =============== + --> + <target depends="init" if="have.sources" name="-javadoc-build"> + <mkdir dir="${dist.javadoc.dir}"/> + <javadoc additionalparam="${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" failonerror="true" noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" notree="${javadoc.notree}" private="${javadoc.private}" source="${javac.source}" splitindex="${javadoc.splitindex}" use="${javadoc.use}" useexternalfile="true" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}"> + <classpath> + <path path="${javac.classpath}"/> + </classpath> + <fileset dir="${src.dir}" excludes="*.java,${excludes}" includes="${includes}"> + <filename name="**/*.java"/> + </fileset> + <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false"> + <include name="**/*.java"/> + <exclude name="*.java"/> + </fileset> + </javadoc> + <copy todir="${dist.javadoc.dir}"> + <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}"> + <filename name="**/doc-files/**"/> + </fileset> + <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false"> + <include name="**/doc-files/**"/> + </fileset> + </copy> + </target> + <target depends="init,-javadoc-build" if="netbeans.home" name="-javadoc-browse" unless="no.javadoc.preview"> + <nbbrowse file="${dist.javadoc.dir}/index.html"/> + </target> + <target depends="init,-javadoc-build,-javadoc-browse" description="Build Javadoc." name="javadoc"/> + <!-- + ========================= + JUNIT COMPILATION SECTION + ========================= + --> + <target depends="init,compile" if="have.tests" name="-pre-pre-compile-test"> + <mkdir dir="${build.test.classes.dir}"/> + </target> + <target name="-pre-compile-test"> + <!-- Empty placeholder for easier customization. --> + <!-- You can override this target in the ../build.xml file. --> + </target> + <target if="do.depend.true" name="-compile-test-depend"> + <j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/> + </target> + <target depends="init,deps-jar,compile,-pre-pre-compile-test,-pre-compile-test,-compile-test-depend" if="have.tests" name="-do-compile-test"> + <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" processorpath="${javac.test.processorpath}" srcdir="${test.src.dir}"/> + <copy todir="${build.test.classes.dir}"> + <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/> + </copy> + </target> + <target name="-post-compile-test"> + <!-- Empty placeholder for easier customization. --> + <!-- You can override this target in the ../build.xml file. --> + </target> + <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-do-compile-test,-post-compile-test" name="compile-test"/> + <target name="-pre-compile-test-single"> + <!-- Empty placeholder for easier customization. --> + <!-- You can override this target in the ../build.xml file. --> + </target> + <target depends="init,deps-jar,compile,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single"> + <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail> + <j2seproject3:force-recompile destdir="${build.test.classes.dir}"/> + <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}" processorpath="${javac.test.processorpath}" sourcepath="${test.src.dir}" srcdir="${test.src.dir}"/> + <copy todir="${build.test.classes.dir}"> + <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/> + </copy> + </target> + <target name="-post-compile-test-single"> + <!-- Empty placeholder for easier customization. --> + <!-- You can override this target in the ../build.xml file. --> + </target> + <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single,-do-compile-test-single,-post-compile-test-single" name="compile-test-single"/> + <!-- + ======================= + JUNIT EXECUTION SECTION + ======================= + --> + <target depends="init" if="have.tests" name="-pre-test-run"> + <mkdir dir="${build.test.results.dir}"/> + </target> + <target depends="init,compile-test,-pre-test-run" if="have.tests" name="-do-test-run"> + <j2seproject3:junit testincludes="**/*Test.java"/> + </target> + <target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run"> + <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail> + </target> + <target depends="init" if="have.tests" name="test-report"/> + <target depends="init" if="netbeans.home+have.tests" name="-test-browse"/> + <target depends="init,compile-test,-pre-test-run,-do-test-run,test-report,-post-test-run,-test-browse" description="Run unit tests." name="test"/> + <target depends="init" if="have.tests" name="-pre-test-run-single"> + <mkdir dir="${build.test.results.dir}"/> + </target> + <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single"> + <fail unless="test.includes">Must select some files in the IDE or set test.includes</fail> + <j2seproject3:junit excludes="" includes="${test.includes}"/> + </target> + <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single"> + <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail> + </target> + <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/> + <!-- + ======================= + JUNIT DEBUGGING SECTION + ======================= + --> + <target depends="init,compile-test" if="have.tests" name="-debug-start-debuggee-test"> + <fail unless="test.class">Must select one file in the IDE or set test.class</fail> + <property location="${build.test.results.dir}/TEST-${test.class}.xml" name="test.report.file"/> + <delete file="${test.report.file}"/> + <mkdir dir="${build.test.results.dir}"/> + <j2seproject3:debug classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner" classpath="${ant.home}/lib/ant.jar:${ant.home}/lib/ant-junit.jar:${debug.test.classpath}"> + <customize> + <syspropertyset> + <propertyref prefix="test-sys-prop."/> + <mapper from="test-sys-prop.*" to="*" type="glob"/> + </syspropertyset> + <arg value="${test.class}"/> + <arg value="showoutput=true"/> + <arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.BriefJUnitResultFormatter"/> + <arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter,${test.report.file}"/> + </customize> + </j2seproject3:debug> + </target> + <target depends="init,compile-test" if="netbeans.home+have.tests" name="-debug-start-debugger-test"> + <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${test.class}"/> + </target> + <target depends="init,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test" name="debug-test"/> + <target depends="init,-pre-debug-fix,compile-test-single" if="netbeans.home" name="-do-debug-fix-test"> + <j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/> + </target> + <target depends="init,-pre-debug-fix,-do-debug-fix-test" if="netbeans.home" name="debug-fix-test"/> + <!-- + ========================= + APPLET EXECUTION SECTION + ========================= + --> + <target depends="init,compile-single" name="run-applet"> + <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail> + <j2seproject1:java classname="sun.applet.AppletViewer"> + <customize> + <arg value="${applet.url}"/> + </customize> + </j2seproject1:java> + </target> + <!-- + ========================= + APPLET DEBUGGING SECTION + ========================= + --> + <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-applet"> + <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail> + <j2seproject3:debug classname="sun.applet.AppletViewer"> + <customize> + <arg value="${applet.url}"/> + </customize> + </j2seproject3:debug> + </target> + <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-applet" if="netbeans.home" name="debug-applet"/> + <!-- + =============== + CLEANUP SECTION + =============== + --> + <target name="-deps-clean-init" unless="built-clean.properties"> + <property location="${build.dir}/built-clean.properties" name="built-clean.properties"/> + <delete file="${built-clean.properties}" quiet="true"/> + </target> + <target if="already.built.clean.${basedir}" name="-warn-already-built-clean"> + <echo level="warn" message="Cycle detected: EssentialsSigns was already built"/> + </target> + <target depends="init,-deps-clean-init" name="deps-clean" unless="no.deps"> + <mkdir dir="${build.dir}"/> + <touch file="${built-clean.properties}" verbose="false"/> + <property file="${built-clean.properties}" prefix="already.built.clean."/> + <antcall target="-warn-already-built-clean"/> + <propertyfile file="${built-clean.properties}"> + <entry key="${basedir}" value=""/> + </propertyfile> + <antcall target="-maybe-call-dep"> + <param name="call.built.properties" value="${built-clean.properties}"/> + <param location="${project.Essentials}" name="call.subproject"/> + <param location="${project.Essentials}/build.xml" name="call.script"/> + <param name="call.target" value="clean"/> + <param name="transfer.built-clean.properties" value="${built-clean.properties}"/> + </antcall> + </target> + <target depends="init" name="-do-clean"> + <delete dir="${build.dir}"/> + <delete dir="${dist.dir}" followsymlinks="false" includeemptydirs="true"/> + </target> + <target name="-post-clean"> + <!-- Empty placeholder for easier customization. --> + <!-- You can override this target in the ../build.xml file. --> + </target> + <target depends="init,deps-clean,-do-clean,-post-clean" description="Clean build products." name="clean"/> + <target name="-check-call-dep"> + <property file="${call.built.properties}" prefix="already.built."/> + <condition property="should.call.dep"> + <not> + <isset property="already.built.${call.subproject}"/> + </not> + </condition> + </target> + <target depends="-check-call-dep" if="should.call.dep" name="-maybe-call-dep"> + <ant antfile="${call.script}" inheritall="false" target="${call.target}"> + <propertyset> + <propertyref prefix="transfer."/> + <mapper from="transfer.*" to="*" type="glob"/> + </propertyset> + </ant> + </target> +</project> diff --git a/EssentialsSigns/nbproject/genfiles.properties b/EssentialsSigns/nbproject/genfiles.properties new file mode 100644 index 000000000..0b195d8b7 --- /dev/null +++ b/EssentialsSigns/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=4bedf084 +build.xml.script.CRC32=560095e7 +build.xml.stylesheet.CRC32=28e38971@1.47.1.46 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=4bedf084 +nbproject/build-impl.xml.script.CRC32=154412d6 +nbproject/build-impl.xml.stylesheet.CRC32=c12040a1@1.47.1.46 diff --git a/EssentialsSigns/nbproject/project.properties b/EssentialsSigns/nbproject/project.properties new file mode 100644 index 000000000..a926ce71d --- /dev/null +++ b/EssentialsSigns/nbproject/project.properties @@ -0,0 +1,125 @@ +annotation.processing.enabled=true +annotation.processing.enabled.in.editor=false +annotation.processing.run.all.processors=true +annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output +application.title=EssentialsSigns +application.vendor= +auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.expand-tabs=true +auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.indent-shift-width=2 +auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.spaces-per-tab=2 +auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.tab-size=2 +auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.text-limit-width=120 +auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.text-line-wrap=none +auxiliary.org-netbeans-modules-editor-indent.CodeStyle.usedProfile=project +auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineAnnotationArgs=true +auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineArrayInit=true +auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineAssignment=true +auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineBinaryOp=true +auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineCallArgs=true +auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineDisjunctiveCatchTypes=true +auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineFor=true +auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineImplements=true +auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineMethodParams=true +auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineParenthesized=true +auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineTernaryOp=true +auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineThrows=true +auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.alignMultilineTryResources=true +auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.blankLinesAfterClassHeader=0 +auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.blankLinesBeforeClass=2 +auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.classDeclBracePlacement=NEW_LINE +auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.expand-tabs=false +auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.importGroupsOrder=* +auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.indent-shift-width=4 +auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.indentCasesFromSwitch=false +auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.methodDeclBracePlacement=NEW_LINE +auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.otherBracePlacement=NEW_LINE +auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.placeCatchOnNewLine=true +auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.placeElseOnNewLine=true +auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.placeFinallyOnNewLine=true +auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.placeWhileOnNewLine=true +auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.separateImportGroups=false +auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.spaceAfterTypeCast=false +auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.spaces-per-tab=4 +auxiliary.org-netbeans-modules-editor-indent.text.x-java.CodeStyle.project.tab-size=4 +build.classes.dir=${build.dir}/classes +build.classes.excludes=**/*.java,**/*.form +# This directory is removed when the project is cleaned: +build.dir=build +build.generated.dir=${build.dir}/generated +build.generated.sources.dir=${build.dir}/generated-sources +# Only compile against the classpath explicitly listed here: +build.sysclasspath=ignore +build.test.classes.dir=${build.dir}/test/classes +build.test.results.dir=${build.dir}/test/results +# Uncomment to specify the preferred debugger connection transport: +#debug.transport=dt_socket +debug.classpath=\ + ${run.classpath} +debug.test.classpath=\ + ${run.test.classpath} +# This directory is removed when the project is cleaned: +dist.dir=dist +dist.jar=${dist.dir}/EssentialsSigns.jar +dist.javadoc.dir=${dist.dir}/javadoc +endorsed.classpath= +excludes= +file.reference.bukkit.jar=../lib/bukkit.jar +includes=** +jar.archive.disabled=${jnlp.enabled} +jar.compress=false +jar.index=${jnlp.enabled} +javac.classpath=\ + ${file.reference.bukkit.jar}:\ + ${reference.Essentials.jar} +# Space-separated list of extra javac options +javac.compilerargs= +javac.deprecation=false +javac.processorpath=\ + ${javac.classpath} +javac.source=1.6 +javac.target=1.6 +javac.test.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +javac.test.processorpath=\ + ${javac.test.classpath} +javadoc.additionalparam= +javadoc.author=false +javadoc.encoding=${source.encoding} +javadoc.noindex=false +javadoc.nonavbar=false +javadoc.notree=false +javadoc.private=false +javadoc.splitindex=true +javadoc.use=true +javadoc.version=false +javadoc.windowtitle= +jnlp.codebase.type=no.codebase +jnlp.descriptor=application +jnlp.enabled=false +jnlp.mixed.code=default +jnlp.offline-allowed=false +jnlp.signed=false +jnlp.signing= +jnlp.signing.alias= +jnlp.signing.keystore= +main.class= +manifest.file=manifest.mf +meta.inf.dir=${src.dir}/META-INF +mkdist.disabled=false +platform.active=default_platform +project.Essentials=../Essentials +reference.Essentials.jar=${project.Essentials}/dist/Essentials.jar +run.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +# Space-separated list of JVM arguments used when running the project +# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value +# or test-sys-prop.name=value to set system properties for unit tests): +run.jvmargs= +run.test.classpath=\ + ${javac.test.classpath}:\ + ${build.test.classes.dir} +source.encoding=UTF-8 +src.dir=src +test.src.dir=test diff --git a/EssentialsSigns/nbproject/project.xml b/EssentialsSigns/nbproject/project.xml new file mode 100644 index 000000000..ad4b7b064 --- /dev/null +++ b/EssentialsSigns/nbproject/project.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://www.netbeans.org/ns/project/1"> + <type>org.netbeans.modules.java.j2seproject</type> + <configuration> + <data xmlns="http://www.netbeans.org/ns/j2se-project/3"> + <name>EssentialsSigns</name> + <source-roots> + <root id="src.dir"/> + </source-roots> + <test-roots> + <root id="test.src.dir"/> + </test-roots> + </data> + <libraries xmlns="http://www.netbeans.org/ns/ant-project-libraries/1"> + <definitions>../lib/nblibraries.properties</definitions> + </libraries> + <references xmlns="http://www.netbeans.org/ns/ant-project-references/1"> + <reference> + <foreign-project>Essentials</foreign-project> + <artifact-type>jar</artifact-type> + <script>build.xml</script> + <target>jar</target> + <clean-target>clean</clean-target> + <id>jar</id> + </reference> + </references> + </configuration> +</project> diff --git a/Essentials/src/com/earth2me/essentials/signs/EssentialsSign.java b/EssentialsSigns/src/com/earth2me/essentials/signs/EssentialsSign.java index b0df73a42..a6057f6ab 100644 --- a/Essentials/src/com/earth2me/essentials/signs/EssentialsSign.java +++ b/EssentialsSigns/src/com/earth2me/essentials/signs/EssentialsSign.java @@ -2,6 +2,8 @@ package com.earth2me.essentials.signs; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.*; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.IUser; import java.util.HashSet; import java.util.Locale; import java.util.Set; @@ -27,7 +29,7 @@ public class EssentialsSign public final boolean onSignCreate(final SignChangeEvent event, final IEssentials ess) { final ISign sign = new EventSign(event); - final User user = ess.getUser(event.getPlayer()); + final IUser user = ess.getUser(event.getPlayer()); if (!(user.isAuthorized("essentials.signs." + signName.toLowerCase(Locale.ENGLISH) + ".create") || user.isAuthorized("essentials.signs.create." + signName.toLowerCase(Locale.ENGLISH)))) { @@ -47,11 +49,11 @@ public class EssentialsSign } catch (ChargeException ex) { - ess.showError(user, ex, signName); + ess.getCommandHandler().showCommandError(user, signName, ex); } catch (SignException ex) { - ess.showError(user, ex, signName); + ess.getCommandHandler().showCommandError(user, signName, ex); } // Return true, so the player sees the wrong sign. return true; @@ -67,7 +69,7 @@ public class EssentialsSign return _("signFormatTemplate", this.signName); } - private String getUsername(final User user) + private String getUsername(final IUser user) { return user.getName().substring(0, user.getName().length() > 13 ? 13 : user.getName().length()); } @@ -75,7 +77,7 @@ public class EssentialsSign public final boolean onSignInteract(final Block block, final Player player, final IEssentials ess) { final ISign sign = new BlockSign(block); - final User user = ess.getUser(player); + final IUser user = ess.getUser(player); try { return (user.isAuthorized("essentials.signs." + signName.toLowerCase(Locale.ENGLISH) + ".use") @@ -84,12 +86,12 @@ public class EssentialsSign } catch (ChargeException ex) { - ess.showError(user, ex, signName); + ess.getCommandHandler().showCommandError(user,signName, ex); return false; } catch (SignException ex) { - ess.showError(user, ex, signName); + ess.getCommandHandler().showCommandError(user, signName, ex); return false; } } @@ -97,7 +99,7 @@ public class EssentialsSign public final boolean onSignBreak(final Block block, final Player player, final IEssentials ess) { final ISign sign = new BlockSign(block); - final User user = ess.getUser(player); + final IUser user = ess.getUser(player); try { return (user.isAuthorized("essentials.signs." + signName.toLowerCase(Locale.ENGLISH) + ".break") @@ -106,72 +108,72 @@ public class EssentialsSign } catch (SignException ex) { - ess.showError(user, ex, signName); + ess.getCommandHandler().showCommandError(user, signName, ex); return false; } } - protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException, ChargeException + protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException { return true; } - protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException, ChargeException + protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException { return true; } - protected boolean onSignBreak(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException + protected boolean onSignBreak(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException { return true; } public final boolean onBlockPlace(final Block block, final Player player, final IEssentials ess) { - User user = ess.getUser(player); + IUser user = ess.getUser(player); try { return onBlockPlace(block, user, getUsername(user), ess); } catch (ChargeException ex) { - ess.showError(user, ex, signName); + ess.getCommandHandler().showCommandError(user, signName, ex); } catch (SignException ex) { - ess.showError(user, ex, signName); + ess.getCommandHandler().showCommandError(user, signName, ex); } return false; } public final boolean onBlockInteract(final Block block, final Player player, final IEssentials ess) { - User user = ess.getUser(player); + IUser user = ess.getUser(player); try { return onBlockInteract(block, user, getUsername(user), ess); } catch (ChargeException ex) { - ess.showError(user, ex, signName); + ess.getCommandHandler().showCommandError(user, signName, ex); } catch (SignException ex) { - ess.showError(user, ex, signName); + ess.getCommandHandler().showCommandError(user, signName, ex); } return false; } public final boolean onBlockBreak(final Block block, final Player player, final IEssentials ess) { - User user = ess.getUser(player); + IUser user = ess.getUser(player); try { return onBlockBreak(block, user, getUsername(user), ess); } catch (SignException ex) { - ess.showError(user, ex, signName); + ess.getCommandHandler().showCommandError(user, signName, ex); } return false; } @@ -235,17 +237,17 @@ public class EssentialsSign return sign.getLine(0).matches("ยง1\\[.*\\]"); } - protected boolean onBlockPlace(final Block block, final User player, final String username, final IEssentials ess) throws SignException, ChargeException + protected boolean onBlockPlace(final Block block, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException { return true; } - protected boolean onBlockInteract(final Block block, final User player, final String username, final IEssentials ess) throws SignException, ChargeException + protected boolean onBlockInteract(final Block block, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException { return true; } - protected boolean onBlockBreak(final Block block, final User player, final String username, final IEssentials ess) throws SignException + protected boolean onBlockBreak(final Block block, final IUser player, final String username, final IEssentials ess) throws SignException { return true; } @@ -271,7 +273,7 @@ public class EssentialsSign } protected final void validateTrade(final ISign sign, final int amountIndex, final int itemIndex, - final User player, final IEssentials ess) throws SignException + final IUser player, final IEssentials ess) throws SignException { if (sign.getLine(itemIndex).equalsIgnoreCase("exp") || sign.getLine(itemIndex).equalsIgnoreCase("xp")) { @@ -287,7 +289,7 @@ public class EssentialsSign } protected final Trade getTrade(final ISign sign, final int amountIndex, final int itemIndex, - final User player, final IEssentials ess) throws SignException + final IUser player, final IEssentials ess) throws SignException { if (sign.getLine(itemIndex).equalsIgnoreCase("exp") || sign.getLine(itemIndex).equalsIgnoreCase("xp")) { diff --git a/EssentialsSigns/src/com/earth2me/essentials/signs/EssentialsSignsPlugin.java b/EssentialsSigns/src/com/earth2me/essentials/signs/EssentialsSignsPlugin.java new file mode 100644 index 000000000..fd14eba0e --- /dev/null +++ b/EssentialsSigns/src/com/earth2me/essentials/signs/EssentialsSignsPlugin.java @@ -0,0 +1,55 @@ +package com.earth2me.essentials.signs; + +import static com.earth2me.essentials.I18n._; +import com.earth2me.essentials.api.IEssentials; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.bukkit.Bukkit; +import org.bukkit.event.Event; +import org.bukkit.plugin.PluginManager; +import org.bukkit.plugin.java.JavaPlugin; + + +public class EssentialsSignsPlugin extends JavaPlugin +{ + private static final transient Logger LOGGER = Bukkit.getLogger(); + private transient IEssentials ess; + + public void onEnable() + { + final PluginManager pluginManager = getServer().getPluginManager(); + ess = (IEssentials)pluginManager.getPlugin("Essentials"); + if (!this.getDescription().getVersion().equals(ess.getDescription().getVersion())) + { + LOGGER.log(Level.WARNING, _("versionMismatchAll")); + } + if (!ess.isEnabled()) + { + this.setEnabled(false); + return; + } + + final SignBlockListener signBlockListener = new SignBlockListener(ess); + pluginManager.registerEvent(Event.Type.SIGN_CHANGE, signBlockListener, Event.Priority.Highest, this); + pluginManager.registerEvent(Event.Type.BLOCK_PLACE, signBlockListener, Event.Priority.Low, this); + pluginManager.registerEvent(Event.Type.BLOCK_BREAK, signBlockListener, Event.Priority.Highest, this); + pluginManager.registerEvent(Event.Type.BLOCK_IGNITE, signBlockListener, Event.Priority.Low, this); + pluginManager.registerEvent(Event.Type.BLOCK_BURN, signBlockListener, Event.Priority.Low, this); + pluginManager.registerEvent(Event.Type.BLOCK_PISTON_EXTEND, signBlockListener, Event.Priority.Low, this); + pluginManager.registerEvent(Event.Type.BLOCK_PISTON_RETRACT, signBlockListener, Event.Priority.Low, this); + + final SignPlayerListener signPlayerListener = new SignPlayerListener(ess); + pluginManager.registerEvent(Event.Type.PLAYER_INTERACT, signPlayerListener, Event.Priority.Low, this); + + final SignEntityListener signEntityListener = new SignEntityListener(ess); + pluginManager.registerEvent(Event.Type.ENTITY_EXPLODE, signEntityListener, Event.Priority.Low, this); + pluginManager.registerEvent(Event.Type.ENDERMAN_PICKUP, signEntityListener, Event.Priority.Low, this); + + + LOGGER.info(_("loadinfo", this.getDescription().getName(), this.getDescription().getVersion(), "essentials team")); + } + + public void onDisable() + { + } +} diff --git a/Essentials/src/com/earth2me/essentials/signs/SignBalance.java b/EssentialsSigns/src/com/earth2me/essentials/signs/SignBalance.java index 0b7328ba5..2ef64003a 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignBalance.java +++ b/EssentialsSigns/src/com/earth2me/essentials/signs/SignBalance.java @@ -1,8 +1,8 @@ package com.earth2me.essentials.signs; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.IEssentials; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.IUser; public class SignBalance extends EssentialsSign @@ -13,7 +13,7 @@ public class SignBalance extends EssentialsSign } @Override - protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException + protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException { player.sendMessage(_("balance", player.getMoney())); return true; diff --git a/Essentials/src/com/earth2me/essentials/signs/SignBlockListener.java b/EssentialsSigns/src/com/earth2me/essentials/signs/SignBlockListener.java index 2840df298..7cc461782 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignBlockListener.java +++ b/EssentialsSigns/src/com/earth2me/essentials/signs/SignBlockListener.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.signs; -import com.earth2me.essentials.IEssentials; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.IUser; import java.util.logging.Level; import java.util.logging.Logger; import org.bukkit.Material; @@ -16,7 +16,7 @@ public class SignBlockListener extends BlockListener private final transient IEssentials ess; private final static Logger LOGGER = Logger.getLogger("Minecraft"); - public SignBlockListener(IEssentials ess) + public SignBlockListener(final IEssentials ess) { this.ess = ess; } @@ -24,7 +24,7 @@ public class SignBlockListener extends BlockListener @Override public void onBlockBreak(final BlockBreakEvent event) { - if (event.isCancelled() || ess.getSettings().areSignsDisabled()) + if (event.isCancelled()) { return; } @@ -76,11 +76,11 @@ public class SignBlockListener extends BlockListener @Override public void onSignChange(final SignChangeEvent event) { - if (event.isCancelled() || ess.getSettings().areSignsDisabled()) + if (event.isCancelled()) { return; } - User user = ess.getUser(event.getPlayer()); + IUser user = ess.getUser(event.getPlayer()); if (user.isAuthorized("essentials.signs.color")) { for (int i = 0; i < 4; i++) @@ -108,7 +108,7 @@ public class SignBlockListener extends BlockListener @Override public void onBlockPlace(final BlockPlaceEvent event) { - if (event.isCancelled() || ess.getSettings().areSignsDisabled()) + if (event.isCancelled()) { return; } @@ -142,7 +142,7 @@ public class SignBlockListener extends BlockListener @Override public void onBlockBurn(final BlockBurnEvent event) { - if (event.isCancelled() || ess.getSettings().areSignsDisabled()) + if (event.isCancelled()) { return; } @@ -171,7 +171,7 @@ public class SignBlockListener extends BlockListener @Override public void onBlockIgnite(final BlockIgniteEvent event) { - if (event.isCancelled() || ess.getSettings().areSignsDisabled()) + if (event.isCancelled()) { return; } diff --git a/Essentials/src/com/earth2me/essentials/signs/SignBuy.java b/EssentialsSigns/src/com/earth2me/essentials/signs/SignBuy.java index aa4e41426..fd84bd0f3 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignBuy.java +++ b/EssentialsSigns/src/com/earth2me/essentials/signs/SignBuy.java @@ -1,9 +1,9 @@ package com.earth2me.essentials.signs; import com.earth2me.essentials.ChargeException; -import com.earth2me.essentials.IEssentials; +import com.earth2me.essentials.api.IEssentials; import com.earth2me.essentials.Trade; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; public class SignBuy extends EssentialsSign @@ -14,7 +14,7 @@ public class SignBuy extends EssentialsSign } @Override - protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException + protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException { validateTrade(sign, 1, 2, player, ess); validateTrade(sign, 3, ess); @@ -22,7 +22,7 @@ public class SignBuy extends EssentialsSign } @Override - protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException, ChargeException + protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException { final Trade items = getTrade(sign, 1, 2, player, ess); final Trade charge = getTrade(sign, 3, ess); diff --git a/Essentials/src/com/earth2me/essentials/signs/SignDisposal.java b/EssentialsSigns/src/com/earth2me/essentials/signs/SignDisposal.java index f747ac07c..a6c64ca0b 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignDisposal.java +++ b/EssentialsSigns/src/com/earth2me/essentials/signs/SignDisposal.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.signs; -import com.earth2me.essentials.IEssentials; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.IUser; import com.earth2me.essentials.craftbukkit.ShowInventory; @@ -13,7 +13,7 @@ public class SignDisposal extends EssentialsSign } @Override - protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) + protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) { ShowInventory.showEmptyInventory(player.getBase()); return true; diff --git a/Essentials/src/com/earth2me/essentials/signs/SignEnchant.java b/EssentialsSigns/src/com/earth2me/essentials/signs/SignEnchant.java index 5907442d9..9d640c735 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignEnchant.java +++ b/EssentialsSigns/src/com/earth2me/essentials/signs/SignEnchant.java @@ -2,8 +2,8 @@ package com.earth2me.essentials.signs; import com.earth2me.essentials.ChargeException; import com.earth2me.essentials.Enchantments; -import com.earth2me.essentials.IEssentials; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.IUser; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.Trade; import com.earth2me.essentials.craftbukkit.InventoryWorkaround; @@ -21,7 +21,7 @@ public class SignEnchant extends EssentialsSign } @Override - protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException, ChargeException + protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException { final ItemStack stack = sign.getLine(1).equals("*") || sign.getLine(1).equalsIgnoreCase("any") ? null : getItemStack(sign.getLine(1), 1, ess); final String[] enchantLevel = sign.getLine(2).split(":"); @@ -64,7 +64,7 @@ public class SignEnchant extends EssentialsSign } @Override - protected boolean onSignInteract(ISign sign, User player, String username, IEssentials ess) throws SignException, ChargeException + protected boolean onSignInteract(ISign sign, IUser player, String username, IEssentials ess) throws SignException, ChargeException { final ItemStack search = sign.getLine(1).equals("*") || sign.getLine(1).equalsIgnoreCase("any") ? null : getItemStack(sign.getLine(1), 1, ess); int slot = -1; diff --git a/Essentials/src/com/earth2me/essentials/signs/SignEntityListener.java b/EssentialsSigns/src/com/earth2me/essentials/signs/SignEntityListener.java index 09bdbeea5..12a2fc2f8 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignEntityListener.java +++ b/EssentialsSigns/src/com/earth2me/essentials/signs/SignEntityListener.java @@ -1,6 +1,6 @@ package com.earth2me.essentials.signs; -import com.earth2me.essentials.IEssentials; +import com.earth2me.essentials.api.IEssentials; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.event.entity.EndermanPickupEvent; @@ -45,7 +45,7 @@ public class SignEntityListener extends EntityListener @Override public void onEndermanPickup(EndermanPickupEvent event) { - if (event.isCancelled() || ess.getSettings().areSignsDisabled()) + if (event.isCancelled()) { return; } diff --git a/Essentials/src/com/earth2me/essentials/signs/SignException.java b/EssentialsSigns/src/com/earth2me/essentials/signs/SignException.java index 9c9ab44a2..9c9ab44a2 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignException.java +++ b/EssentialsSigns/src/com/earth2me/essentials/signs/SignException.java diff --git a/Essentials/src/com/earth2me/essentials/signs/SignFree.java b/EssentialsSigns/src/com/earth2me/essentials/signs/SignFree.java index 7af7dffd7..0dad2b100 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignFree.java +++ b/EssentialsSigns/src/com/earth2me/essentials/signs/SignFree.java @@ -1,9 +1,9 @@ package com.earth2me.essentials.signs; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.IEssentials; +import com.earth2me.essentials.api.IEssentials; import com.earth2me.essentials.Trade; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import com.earth2me.essentials.craftbukkit.ShowInventory; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; @@ -17,14 +17,14 @@ public class SignFree extends EssentialsSign } @Override - protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException + protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException { getItemStack(sign.getLine(1), 1, ess); return true; } @Override - protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException + protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException { final ItemStack item = getItemStack(sign.getLine(1), 1, ess); if (item.getType() == Material.AIR) diff --git a/Essentials/src/com/earth2me/essentials/signs/SignGameMode.java b/EssentialsSigns/src/com/earth2me/essentials/signs/SignGameMode.java index 37a9fb1b8..05fb7c17f 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignGameMode.java +++ b/EssentialsSigns/src/com/earth2me/essentials/signs/SignGameMode.java @@ -2,9 +2,9 @@ package com.earth2me.essentials.signs; import com.earth2me.essentials.ChargeException; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.IEssentials; +import com.earth2me.essentials.api.IEssentials; import com.earth2me.essentials.Trade; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import java.util.Locale; import org.bukkit.GameMode; @@ -17,14 +17,14 @@ public class SignGameMode extends EssentialsSign } @Override - protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException + protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException { validateTrade(sign, 1, ess); return true; } @Override - protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException, ChargeException + protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException { final Trade charge = getTrade(sign, 1, ess); charge.isAffordableFor(player); diff --git a/Essentials/src/com/earth2me/essentials/signs/SignHeal.java b/EssentialsSigns/src/com/earth2me/essentials/signs/SignHeal.java index be8b7ba1d..3f412f5b4 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignHeal.java +++ b/EssentialsSigns/src/com/earth2me/essentials/signs/SignHeal.java @@ -2,9 +2,9 @@ package com.earth2me.essentials.signs; import com.earth2me.essentials.ChargeException; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.IEssentials; +import com.earth2me.essentials.api.IEssentials; import com.earth2me.essentials.Trade; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; public class SignHeal extends EssentialsSign @@ -15,14 +15,14 @@ public class SignHeal extends EssentialsSign } @Override - protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException + protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException { validateTrade(sign, 1, ess); return true; } @Override - protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException, ChargeException + protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException { final Trade charge = getTrade(sign, 1, ess); charge.isAffordableFor(player); diff --git a/Essentials/src/com/earth2me/essentials/signs/SignKit.java b/EssentialsSigns/src/com/earth2me/essentials/signs/SignKit.java index 32a169592..16f314d5f 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignKit.java +++ b/EssentialsSigns/src/com/earth2me/essentials/signs/SignKit.java @@ -1,6 +1,8 @@ package com.earth2me.essentials.signs; import com.earth2me.essentials.*; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.IUser; import java.util.List; import java.util.Locale; import java.util.Map; @@ -14,7 +16,7 @@ public class SignKit extends EssentialsSign } @Override - protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException + protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException { validateTrade(sign, 3, ess); @@ -45,7 +47,7 @@ public class SignKit extends EssentialsSign } @Override - protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException, ChargeException + protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException { final String kitName = sign.getLine(1).toLowerCase(Locale.ENGLISH); final String group = sign.getLine(2); diff --git a/EssentialsSigns/src/com/earth2me/essentials/signs/SignMail.java b/EssentialsSigns/src/com/earth2me/essentials/signs/SignMail.java new file mode 100644 index 000000000..7845c86a6 --- /dev/null +++ b/EssentialsSigns/src/com/earth2me/essentials/signs/SignMail.java @@ -0,0 +1,41 @@ +package com.earth2me.essentials.signs; + +import static com.earth2me.essentials.I18n._; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.IUser; +import java.util.List; + + +public class SignMail extends EssentialsSign +{ + public SignMail() + { + super("Mail"); + } + + @Override + protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException + { + final List<String> mail; + player.acquireReadLock(); + try + { + mail = player.getData().getMails(); + } + finally + { + player.unlock(); + } + if (mail == null || mail.isEmpty()) + { + player.sendMessage(_("noNewMail")); + return false; + } + for (String s : mail) + { + player.sendMessage(s); + } + player.sendMessage(_("markMailAsRead")); + return true; + } +} diff --git a/Essentials/src/com/earth2me/essentials/signs/SignPlayerListener.java b/EssentialsSigns/src/com/earth2me/essentials/signs/SignPlayerListener.java index 5d7900508..9f1a22896 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignPlayerListener.java +++ b/EssentialsSigns/src/com/earth2me/essentials/signs/SignPlayerListener.java @@ -1,6 +1,6 @@ package com.earth2me.essentials.signs; -import com.earth2me.essentials.IEssentials; +import com.earth2me.essentials.api.IEssentials; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.Sign; @@ -21,7 +21,7 @@ public class SignPlayerListener extends PlayerListener @Override public void onPlayerInteract(PlayerInteractEvent event) { - if (event.isCancelled() || ess.getSettings().areSignsDisabled()) + if (event.isCancelled()) { return; } diff --git a/Essentials/src/com/earth2me/essentials/signs/SignProtection.java b/EssentialsSigns/src/com/earth2me/essentials/signs/SignProtection.java index f64b6f3f1..1ec05ec2d 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignProtection.java +++ b/EssentialsSigns/src/com/earth2me/essentials/signs/SignProtection.java @@ -2,9 +2,9 @@ package com.earth2me.essentials.signs; import com.earth2me.essentials.ChargeException; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.IEssentials; +import com.earth2me.essentials.api.IEssentials; import com.earth2me.essentials.Trade; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import com.earth2me.essentials.Util; import java.util.*; import org.bukkit.Location; @@ -29,7 +29,7 @@ public class SignProtection extends EssentialsSign } @Override - protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException, ChargeException + protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException { sign.setLine(3, "ยง4" + username); if (hasAdjacentBlock(sign.getBlock())) @@ -47,7 +47,7 @@ public class SignProtection extends EssentialsSign } @Override - protected boolean onSignBreak(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException + protected boolean onSignBreak(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException { final SignProtectionState state = checkProtectionSign(sign, player, username); return state == SignProtectionState.OWNER; @@ -73,7 +73,7 @@ public class SignProtection extends EssentialsSign return false; } - private void checkIfSignsAreBroken(final Block block, final User player, final String username, final IEssentials ess) + private void checkIfSignsAreBroken(final Block block, final IUser player, final String username, final IEssentials ess) { final Map<Location, SignProtectionState> signs = getConnectedSigns(block, player, username, false); for (Map.Entry<Location, SignProtectionState> entry : signs.entrySet()) @@ -91,14 +91,14 @@ public class SignProtection extends EssentialsSign } } - private Map<Location, SignProtectionState> getConnectedSigns(final Block block, final User user, final String username, boolean secure) + private Map<Location, SignProtectionState> getConnectedSigns(final Block block, final IUser user, final String username, boolean secure) { final Map<Location, SignProtectionState> signs = new HashMap<Location, SignProtectionState>(); getConnectedSigns(block, signs, user, username, secure ? 4 : 2); return signs; } - private void getConnectedSigns(final Block block, final Map<Location, SignProtectionState> signs, final User user, final String username, final int depth) + private void getConnectedSigns(final Block block, final Map<Location, SignProtectionState> signs, final IUser user, final String username, final int depth) { final Block[] faces = getAdjacentBlocks(block); for (Block b : faces) @@ -124,7 +124,7 @@ public class SignProtection extends EssentialsSign NOT_ALLOWED, ALLOWED, NOSIGN, OWNER } - private SignProtectionState checkProtectionSign(final Block block, final User user, final String username) + private SignProtectionState checkProtectionSign(final Block block, final IUser user, final String username) { if (block.getType() == Material.SIGN_POST || block.getType() == Material.WALL_SIGN) { @@ -137,7 +137,7 @@ public class SignProtection extends EssentialsSign return SignProtectionState.NOSIGN; } - private SignProtectionState checkProtectionSign(final ISign sign, final User user, final String username) + private SignProtectionState checkProtectionSign(final ISign sign, final IUser user, final String username) { if (user == null || username == null) { @@ -179,7 +179,7 @@ public class SignProtection extends EssentialsSign }; } - public SignProtectionState isBlockProtected(final Block block, final User user, final String username, boolean secure) + public SignProtectionState isBlockProtected(final Block block, final IUser user, final String username, boolean secure) { final Map<Location, SignProtectionState> signs = getConnectedSigns(block, user, username, secure); SignProtectionState retstate = SignProtectionState.NOSIGN; @@ -247,7 +247,7 @@ public class SignProtection extends EssentialsSign } @Override - protected boolean onBlockPlace(final Block block, final User player, final String username, final IEssentials ess) throws SignException + protected boolean onBlockPlace(final Block block, final IUser player, final String username, final IEssentials ess) throws SignException { for (Block adjBlock : getAdjacentBlocks(block)) { @@ -265,7 +265,7 @@ public class SignProtection extends EssentialsSign } @Override - protected boolean onBlockInteract(final Block block, final User player, final String username, final IEssentials ess) throws SignException + protected boolean onBlockInteract(final Block block, final IUser player, final String username, final IEssentials ess) throws SignException { final SignProtectionState state = isBlockProtected(block, player, username, false); @@ -286,7 +286,7 @@ public class SignProtection extends EssentialsSign } @Override - protected boolean onBlockBreak(final Block block, final User player, final String username, final IEssentials ess) throws SignException + protected boolean onBlockBreak(final Block block, final IUser player, final String username, final IEssentials ess) throws SignException { final SignProtectionState state = isBlockProtected(block, player, username, false); diff --git a/Essentials/src/com/earth2me/essentials/signs/SignSell.java b/EssentialsSigns/src/com/earth2me/essentials/signs/SignSell.java index 442a503c2..7a5f4969b 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignSell.java +++ b/EssentialsSigns/src/com/earth2me/essentials/signs/SignSell.java @@ -1,9 +1,9 @@ package com.earth2me.essentials.signs; import com.earth2me.essentials.ChargeException; -import com.earth2me.essentials.IEssentials; +import com.earth2me.essentials.api.IEssentials; import com.earth2me.essentials.Trade; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; public class SignSell extends EssentialsSign @@ -14,7 +14,7 @@ public class SignSell extends EssentialsSign } @Override - protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException + protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException { validateTrade(sign, 1, 2, player, ess); validateTrade(sign, 3, ess); @@ -22,7 +22,7 @@ public class SignSell extends EssentialsSign } @Override - protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException, ChargeException + protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException { final Trade charge = getTrade(sign, 1, 2, player, ess); final Trade money = getTrade(sign, 3, ess); diff --git a/Essentials/src/com/earth2me/essentials/signs/SignSpawnmob.java b/EssentialsSigns/src/com/earth2me/essentials/signs/SignSpawnmob.java index 7c4cfcd54..f21d937b3 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignSpawnmob.java +++ b/EssentialsSigns/src/com/earth2me/essentials/signs/SignSpawnmob.java @@ -1,9 +1,9 @@ package com.earth2me.essentials.signs; import com.earth2me.essentials.ChargeException; -import com.earth2me.essentials.IEssentials; +import com.earth2me.essentials.api.IEssentials; import com.earth2me.essentials.Trade; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import com.earth2me.essentials.commands.Commandspawnmob; @@ -15,7 +15,7 @@ public class SignSpawnmob extends EssentialsSign } @Override - protected boolean onSignCreate(ISign sign, User player, String username, IEssentials ess) throws SignException, ChargeException + protected boolean onSignCreate(ISign sign, IUser player, String username, IEssentials ess) throws SignException, ChargeException { validateInteger(sign, 1); validateTrade(sign, 3, ess); @@ -23,7 +23,7 @@ public class SignSpawnmob extends EssentialsSign } @Override - protected boolean onSignInteract(ISign sign, User player, String username, IEssentials ess) throws SignException, ChargeException + protected boolean onSignInteract(ISign sign, IUser player, String username, IEssentials ess) throws SignException, ChargeException { final Trade charge = getTrade(sign, 3, ess); charge.isAffordableFor(player); diff --git a/Essentials/src/com/earth2me/essentials/signs/SignTime.java b/EssentialsSigns/src/com/earth2me/essentials/signs/SignTime.java index 99c579ff4..2d1ab2a87 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignTime.java +++ b/EssentialsSigns/src/com/earth2me/essentials/signs/SignTime.java @@ -2,9 +2,9 @@ package com.earth2me.essentials.signs; import com.earth2me.essentials.ChargeException; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.IEssentials; +import com.earth2me.essentials.api.IEssentials; import com.earth2me.essentials.Trade; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; public class SignTime extends EssentialsSign @@ -15,7 +15,7 @@ public class SignTime extends EssentialsSign } @Override - protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException + protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException { validateTrade(sign, 2, ess); final String timeString = sign.getLine(1); @@ -33,7 +33,7 @@ public class SignTime extends EssentialsSign } @Override - protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException, ChargeException + protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException { final Trade charge = getTrade(sign, 2, ess); charge.isAffordableFor(player); diff --git a/Essentials/src/com/earth2me/essentials/signs/SignTrade.java b/EssentialsSigns/src/com/earth2me/essentials/signs/SignTrade.java index 943a14a83..04db5511c 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignTrade.java +++ b/EssentialsSigns/src/com/earth2me/essentials/signs/SignTrade.java @@ -2,6 +2,8 @@ package com.earth2me.essentials.signs; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.*; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.IUser; import org.bukkit.inventory.ItemStack; //TODO: Sell Enchantment on Trade signs? @@ -14,7 +16,7 @@ public class SignTrade extends EssentialsSign } @Override - protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException, ChargeException + protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException { validateTrade(sign, 1, false, ess); validateTrade(sign, 2, true, ess); @@ -27,7 +29,7 @@ public class SignTrade extends EssentialsSign } @Override - protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException, ChargeException + protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException { if (sign.getLine(3).substring(2).equalsIgnoreCase(username)) { @@ -66,7 +68,7 @@ public class SignTrade extends EssentialsSign return true; } - private Trade rechargeSign(final ISign sign, final IEssentials ess, final User player) throws SignException, ChargeException + private Trade rechargeSign(final ISign sign, final IEssentials ess, final IUser player) throws SignException, ChargeException { final Trade trade = getTrade(sign, 2, false, false, ess); if (trade.getItemStack() != null && player.getItemInHand() != null @@ -90,7 +92,7 @@ public class SignTrade extends EssentialsSign } @Override - protected boolean onSignBreak(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException + protected boolean onSignBreak(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException { if ((sign.getLine(3).length() > 3 && sign.getLine(3).substring(2).equalsIgnoreCase(username)) || player.isAuthorized("essentials.signs.trade.override")) diff --git a/Essentials/src/com/earth2me/essentials/signs/SignWarp.java b/EssentialsSigns/src/com/earth2me/essentials/signs/SignWarp.java index 76e8e730b..3ab254705 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignWarp.java +++ b/EssentialsSigns/src/com/earth2me/essentials/signs/SignWarp.java @@ -1,9 +1,9 @@ package com.earth2me.essentials.signs; import com.earth2me.essentials.ChargeException; -import com.earth2me.essentials.IEssentials; +import com.earth2me.essentials.api.IEssentials; import com.earth2me.essentials.Trade; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; @@ -15,7 +15,7 @@ public class SignWarp extends EssentialsSign } @Override - protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException + protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException { validateTrade(sign, 3, ess); final String warpName = sign.getLine(1); @@ -45,7 +45,7 @@ public class SignWarp extends EssentialsSign } @Override - protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException, ChargeException + protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException { final String warpName = sign.getLine(1); final String group = sign.getLine(2); diff --git a/Essentials/src/com/earth2me/essentials/signs/SignWeather.java b/EssentialsSigns/src/com/earth2me/essentials/signs/SignWeather.java index 559fcc2e3..c674e04a9 100644 --- a/Essentials/src/com/earth2me/essentials/signs/SignWeather.java +++ b/EssentialsSigns/src/com/earth2me/essentials/signs/SignWeather.java @@ -2,9 +2,9 @@ package com.earth2me.essentials.signs; import com.earth2me.essentials.ChargeException; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.IEssentials; +import com.earth2me.essentials.api.IEssentials; import com.earth2me.essentials.Trade; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; public class SignWeather extends EssentialsSign @@ -15,7 +15,7 @@ public class SignWeather extends EssentialsSign } @Override - protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException + protected boolean onSignCreate(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException { validateTrade(sign, 2, ess); final String timeString = sign.getLine(1); @@ -33,7 +33,7 @@ public class SignWeather extends EssentialsSign } @Override - protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException, ChargeException + protected boolean onSignInteract(final ISign sign, final IUser player, final String username, final IEssentials ess) throws SignException, ChargeException { final Trade charge = getTrade(sign, 2, ess); charge.isAffordableFor(player); diff --git a/Essentials/src/com/earth2me/essentials/signs/Signs.java b/EssentialsSigns/src/com/earth2me/essentials/signs/Signs.java index e29d45ad4..e29d45ad4 100644 --- a/Essentials/src/com/earth2me/essentials/signs/Signs.java +++ b/EssentialsSigns/src/com/earth2me/essentials/signs/Signs.java diff --git a/EssentialsSigns/src/plugin.yml b/EssentialsSigns/src/plugin.yml new file mode 100644 index 000000000..515742d25 --- /dev/null +++ b/EssentialsSigns/src/plugin.yml @@ -0,0 +1,9 @@ +# This determines the command prefix when there are conflicts (/name:home, /name:help, etc.) +name: EssentialsSigns +main: com.earth2me.essentials.signs.EssentialsSignsPlugin +# Note to developers: This next line cannot change, or the automatic versioning system will break. +version: TeamCity +website: http://tiny.cc/EssentialsWiki +description: Provides signs, utilizing Essentials. +authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo, ceulemans, Xeology, KHobbits] +depend: [Essentials]
\ No newline at end of file diff --git a/EssentialsSpawn/src/com/earth2me/essentials/spawn/Commandsetspawn.java b/EssentialsSpawn/src/com/earth2me/essentials/spawn/Commandsetspawn.java index c6c89a20d..b9b2a70d5 100644 --- a/EssentialsSpawn/src/com/earth2me/essentials/spawn/Commandsetspawn.java +++ b/EssentialsSpawn/src/com/earth2me/essentials/spawn/Commandsetspawn.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.spawn; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import com.earth2me.essentials.commands.EssentialsCommand; import org.bukkit.Server; @@ -14,7 +14,7 @@ public class Commandsetspawn extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { final String group = args.length > 0 ? getFinalArg(args, 0) : "default"; ((SpawnStorage)module).setSpawn(user.getLocation(), group); diff --git a/EssentialsSpawn/src/com/earth2me/essentials/spawn/Commandspawn.java b/EssentialsSpawn/src/com/earth2me/essentials/spawn/Commandspawn.java index 6335d6c69..5b95a8e66 100644 --- a/EssentialsSpawn/src/com/earth2me/essentials/spawn/Commandspawn.java +++ b/EssentialsSpawn/src/com/earth2me/essentials/spawn/Commandspawn.java @@ -2,7 +2,7 @@ package com.earth2me.essentials.spawn; import static com.earth2me.essentials.I18n._; import com.earth2me.essentials.Trade; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import com.earth2me.essentials.commands.EssentialsCommand; import com.earth2me.essentials.commands.NotEnoughArgumentsException; import org.bukkit.Location; @@ -19,13 +19,13 @@ public class Commandspawn extends EssentialsCommand } @Override - public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception + public void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws Exception { final Trade charge = new Trade(this.getName(), ess); charge.isAffordableFor(user); if (args.length > 0 && user.isAuthorized("essentials.spawn.others")) { - final User otherUser = getPlayer(server, args, 0); + final IUser otherUser = getPlayer(server, args, 0); respawn(otherUser, null); if (!otherUser.equals(user)) { @@ -46,13 +46,13 @@ public class Commandspawn extends EssentialsCommand { throw new NotEnoughArgumentsException(); } - final User user = getPlayer(server, args, 0); + final IUser user = getPlayer(server, args, 0); respawn(user, null); user.sendMessage(_("teleportAtoB", user.getDisplayName(), "spawn")); sender.sendMessage(_("teleporting")); } - private void respawn (final User user, final Trade charge) throws Exception { + private void respawn (final IUser user, final Trade charge) throws Exception { final SpawnStorage spawns = (SpawnStorage)this.module; final Location spawn = spawns.getSpawn(user.getGroup()); user.getTeleport().teleport(spawn, charge, TeleportCause.COMMAND); diff --git a/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawn.java b/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawn.java index c4cd7c727..7eb62238a 100644 --- a/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawn.java +++ b/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawn.java @@ -1,8 +1,10 @@ package com.earth2me.essentials.spawn; +import com.earth2me.essentials.EssentialsCommandHandler; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.IEssentials; -import com.earth2me.essentials.IEssentialsModule; +import com.earth2me.essentials.api.ICommandHandler; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.IEssentialsModule; import java.util.logging.Level; import java.util.logging.Logger; import org.bukkit.Bukkit; @@ -19,6 +21,7 @@ public class EssentialsSpawn extends JavaPlugin private static final Logger LOGGER = Bukkit.getLogger(); private transient IEssentials ess; private transient SpawnStorage spawns; + private transient ICommandHandler commandHandler; public void onEnable() { @@ -36,6 +39,8 @@ public class EssentialsSpawn extends JavaPlugin spawns = new SpawnStorage(ess); ess.addReloadListener(spawns); + + commandHandler = new EssentialsCommandHandler(EssentialsSpawn.class.getClassLoader(), "com.earth2me.essentials.spawn.Command", "essentials.", spawns, ess); final EssentialsSpawnPlayerListener playerListener = new EssentialsSpawnPlayerListener(ess, spawns); pluginManager.registerEvent(Type.PLAYER_RESPAWN, playerListener, ess.getSettings().getRespawnPriority(), this); @@ -52,6 +57,6 @@ public class EssentialsSpawn extends JavaPlugin public boolean onCommand(final CommandSender sender, final Command command, final String commandLabel, final String[] args) { - return ess.onCommandEssentials(sender, command, commandLabel, args, EssentialsSpawn.class.getClassLoader(), "com.earth2me.essentials.spawn.Command", "essentials.", spawns); + return commandHandler.handleCommand(sender, command, commandLabel, args); } } diff --git a/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawnPlayerListener.java b/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawnPlayerListener.java index 530a00faa..4c4a60997 100644 --- a/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawnPlayerListener.java +++ b/EssentialsSpawn/src/com/earth2me/essentials/spawn/EssentialsSpawnPlayerListener.java @@ -1,8 +1,8 @@ package com.earth2me.essentials.spawn; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.IEssentials; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.IUser; import java.util.logging.Level; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -27,7 +27,7 @@ public class EssentialsSpawnPlayerListener extends PlayerListener @Override public void onPlayerRespawn(final PlayerRespawnEvent event) { - final User user = ess.getUser(event.getPlayer()); + final IUser user = ess.getUser(event.getPlayer()); if (ess.getSettings().getRespawnAtHome()) { @@ -52,7 +52,7 @@ public class EssentialsSpawnPlayerListener extends PlayerListener @Override public void onPlayerJoin(final PlayerJoinEvent event) { - final User user = ess.getUser(event.getPlayer()); + final IUser user = ess.getUser(event.getPlayer()); if (!user.isNew() || user.getBedSpawnLocation() != null) { @@ -73,9 +73,9 @@ public class EssentialsSpawnPlayerListener extends PlayerListener private class NewPlayerTeleport implements Runnable { - private final transient User user; + private final transient IUser user; - public NewPlayerTeleport(final User user) + public NewPlayerTeleport(final IUser user) { this.user = user; } diff --git a/EssentialsSpawn/src/com/earth2me/essentials/spawn/SpawnStorage.java b/EssentialsSpawn/src/com/earth2me/essentials/spawn/SpawnStorage.java index 088ee9052..61304fbf4 100644 --- a/EssentialsSpawn/src/com/earth2me/essentials/spawn/SpawnStorage.java +++ b/EssentialsSpawn/src/com/earth2me/essentials/spawn/SpawnStorage.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.spawn; -import com.earth2me.essentials.IEssentials; -import com.earth2me.essentials.IEssentialsModule; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.IEssentialsModule; import com.earth2me.essentials.settings.Spawns; import com.earth2me.essentials.storage.AsyncStorageObjectHolder; import java.io.File; @@ -17,7 +17,7 @@ public class SpawnStorage extends AsyncStorageObjectHolder<Spawns> implements IE public SpawnStorage(final IEssentials ess) { super(ess, Spawns.class); - reloadConfig(); + onReload(); } @Override diff --git a/EssentialsSpawn/src/plugin.yml b/EssentialsSpawn/src/plugin.yml index a91031fbe..c1cd00280 100644 --- a/EssentialsSpawn/src/plugin.yml +++ b/EssentialsSpawn/src/plugin.yml @@ -3,7 +3,7 @@ name: EssentialsSpawn main: com.earth2me.essentials.spawn.EssentialsSpawn # Note to developers: This next line cannot change, or the automatic versioning system will break. version: TeamCity -website: http://www.earth2me.net:8001/ +website: http://tiny.cc/EssentialsWiki description: Provides spawn control commands, utilizing Essentials. authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo, ceulemans, Xeology, KHobbits] depend: [Essentials] diff --git a/EssentialsUpdate/src/plugin.yml b/EssentialsUpdate/src/plugin.yml index b8dbe8e25..45c821265 100644 --- a/EssentialsUpdate/src/plugin.yml +++ b/EssentialsUpdate/src/plugin.yml @@ -4,6 +4,7 @@ main: com.earth2me.essentials.update.EssentialsUpdate # Note to developers: This next line cannot change, or the automatic versioning system will break. version: TeamCity description: This plugin allows to install or update all Essentials plugins +website: http://tiny.cc/EssentialsWiki authors: [snowleo] commands: essentialsupdate: diff --git a/EssentialsXMPP/src/com/earth2me/essentials/xmpp/Commandsetxmpp.java b/EssentialsXMPP/src/com/earth2me/essentials/xmpp/Commandsetxmpp.java index e0bf9827c..2de521baf 100644 --- a/EssentialsXMPP/src/com/earth2me/essentials/xmpp/Commandsetxmpp.java +++ b/EssentialsXMPP/src/com/earth2me/essentials/xmpp/Commandsetxmpp.java @@ -1,6 +1,6 @@ package com.earth2me.essentials.xmpp; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IUser; import com.earth2me.essentials.commands.EssentialsCommand; import com.earth2me.essentials.commands.NotEnoughArgumentsException; import org.bukkit.Server; @@ -14,7 +14,7 @@ public class Commandsetxmpp extends EssentialsCommand } @Override - protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws NotEnoughArgumentsException + protected void run(final Server server, final IUser user, final String commandLabel, final String[] args) throws NotEnoughArgumentsException { if (args.length < 1) { diff --git a/EssentialsXMPP/src/com/earth2me/essentials/xmpp/Commandxmpp.java b/EssentialsXMPP/src/com/earth2me/essentials/xmpp/Commandxmpp.java index e7dd01670..a336bba55 100644 --- a/EssentialsXMPP/src/com/earth2me/essentials/xmpp/Commandxmpp.java +++ b/EssentialsXMPP/src/com/earth2me/essentials/xmpp/Commandxmpp.java @@ -31,7 +31,7 @@ public class Commandxmpp extends EssentialsCommand else { final String message = getFinalArg(args, 1); - final String senderName = sender instanceof Player ? ess.getUser(sender).getDisplayName() : Console.NAME; + final String senderName = sender instanceof Player ? ess.getUser((Player)sender).getDisplayName() : Console.NAME; sender.sendMessage("[" + senderName + ">" + address + "] " + message); if (!EssentialsXMPP.getInstance().sendMessage(address, "[" + senderName + "] " + message)) { diff --git a/EssentialsXMPP/src/com/earth2me/essentials/xmpp/EssentialsXMPP.java b/EssentialsXMPP/src/com/earth2me/essentials/xmpp/EssentialsXMPP.java index bcbbfa17d..cf7fb1814 100644 --- a/EssentialsXMPP/src/com/earth2me/essentials/xmpp/EssentialsXMPP.java +++ b/EssentialsXMPP/src/com/earth2me/essentials/xmpp/EssentialsXMPP.java @@ -1,8 +1,10 @@ package com.earth2me.essentials.xmpp; +import com.earth2me.essentials.EssentialsCommandHandler; import static com.earth2me.essentials.I18n._; -import com.earth2me.essentials.IEssentials; -import com.earth2me.essentials.IUser; +import com.earth2me.essentials.api.ICommandHandler; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.IUser; import java.util.List; import java.util.Locale; import java.util.logging.Level; @@ -23,6 +25,7 @@ public class EssentialsXMPP extends JavaPlugin implements IEssentialsXMPP private transient UserManager users; private transient XMPPManager xmpp; private transient IEssentials ess; + private transient ICommandHandler commandHandler; public static IEssentialsXMPP getInstance() { @@ -56,6 +59,8 @@ public class EssentialsXMPP extends JavaPlugin implements IEssentialsXMPP ess.addReloadListener(users); ess.addReloadListener(xmpp); + + commandHandler = new EssentialsCommandHandler(EssentialsXMPP.class.getClassLoader(), "com.earth2me.essentials.xmpp.Command", "essentials.", ess); LOGGER.info(_("loadinfo", this.getDescription().getName(), this.getDescription().getVersion(), "essentials team")); } @@ -73,7 +78,7 @@ public class EssentialsXMPP extends JavaPlugin implements IEssentialsXMPP @Override public boolean onCommand(final CommandSender sender, final Command command, final String commandLabel, final String[] args) { - return ess.onCommandEssentials(sender, command, commandLabel, args, EssentialsXMPP.class.getClassLoader(), "com.earth2me.essentials.xmpp.Command", "essentials.", null); + return commandHandler.handleCommand(sender, command, commandLabel, args); } @Override diff --git a/EssentialsXMPP/src/com/earth2me/essentials/xmpp/EssentialsXMPPPlayerListener.java b/EssentialsXMPP/src/com/earth2me/essentials/xmpp/EssentialsXMPPPlayerListener.java index 47966aee0..1bf672515 100644 --- a/EssentialsXMPP/src/com/earth2me/essentials/xmpp/EssentialsXMPPPlayerListener.java +++ b/EssentialsXMPP/src/com/earth2me/essentials/xmpp/EssentialsXMPPPlayerListener.java @@ -1,7 +1,7 @@ package com.earth2me.essentials.xmpp; -import com.earth2me.essentials.IEssentials; -import com.earth2me.essentials.User; +import com.earth2me.essentials.api.IEssentials; +import com.earth2me.essentials.api.IUser; import org.bukkit.event.player.PlayerChatEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerListener; @@ -21,21 +21,21 @@ class EssentialsXMPPPlayerListener extends PlayerListener @Override public void onPlayerJoin(final PlayerJoinEvent event) { - final User user = ess.getUser(event.getPlayer()); + final IUser user = ess.getUser(event.getPlayer()); sendMessageToSpyUsers("Player " + user.getDisplayName() + " joined the game"); } @Override public void onPlayerChat(final PlayerChatEvent event) { - final User user = ess.getUser(event.getPlayer()); + final IUser user = ess.getUser(event.getPlayer()); sendMessageToSpyUsers(String.format(event.getFormat(), user.getDisplayName(), event.getMessage())); } @Override public void onPlayerQuit(final PlayerQuitEvent event) { - final User user = ess.getUser(event.getPlayer()); + final IUser user = ess.getUser(event.getPlayer()); sendMessageToSpyUsers("Player " + user.getDisplayName() + " left the game"); } diff --git a/EssentialsXMPP/src/com/earth2me/essentials/xmpp/IEssentialsXMPP.java b/EssentialsXMPP/src/com/earth2me/essentials/xmpp/IEssentialsXMPP.java index 0635ca131..83851d055 100644 --- a/EssentialsXMPP/src/com/earth2me/essentials/xmpp/IEssentialsXMPP.java +++ b/EssentialsXMPP/src/com/earth2me/essentials/xmpp/IEssentialsXMPP.java @@ -1,6 +1,6 @@ package com.earth2me.essentials.xmpp; -import com.earth2me.essentials.IUser; +import com.earth2me.essentials.api.IUser; import java.util.List; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; diff --git a/EssentialsXMPP/src/com/earth2me/essentials/xmpp/UserManager.java b/EssentialsXMPP/src/com/earth2me/essentials/xmpp/UserManager.java index 85ef50949..c8df2fcb3 100644 --- a/EssentialsXMPP/src/com/earth2me/essentials/xmpp/UserManager.java +++ b/EssentialsXMPP/src/com/earth2me/essentials/xmpp/UserManager.java @@ -1,12 +1,12 @@ package com.earth2me.essentials.xmpp; import com.earth2me.essentials.EssentialsConf; -import com.earth2me.essentials.IConf; +import com.earth2me.essentials.api.IReload; import java.io.File; import java.util.*; -public class UserManager implements IConf +public class UserManager implements IReload { private final transient EssentialsConf users; private final transient List<String> spyusers = new ArrayList<String>(); @@ -16,7 +16,7 @@ public class UserManager implements IConf public UserManager(final File folder) { users = new EssentialsConf(new File(folder, "users.yml")); - reloadConfig(); + onReload(); } public final boolean isSpy(final String username) @@ -65,11 +65,11 @@ public class UserManager implements IConf userdata.put(SPY, spy); users.setProperty(username, userdata); users.save(); - reloadConfig(); + onReload(); } @Override - public final void reloadConfig() + public final void onReload() { users.load(); spyusers.clear(); diff --git a/EssentialsXMPP/src/com/earth2me/essentials/xmpp/XMPPManager.java b/EssentialsXMPP/src/com/earth2me/essentials/xmpp/XMPPManager.java index 72bdb113d..95d4c4620 100644 --- a/EssentialsXMPP/src/com/earth2me/essentials/xmpp/XMPPManager.java +++ b/EssentialsXMPP/src/com/earth2me/essentials/xmpp/XMPPManager.java @@ -2,8 +2,8 @@ package com.earth2me.essentials.xmpp; import com.earth2me.essentials.Console; import com.earth2me.essentials.EssentialsConf; -import com.earth2me.essentials.IConf; -import com.earth2me.essentials.IUser; +import com.earth2me.essentials.api.IReload; +import com.earth2me.essentials.api.IUser; import java.io.File; import java.util.*; import java.util.logging.Handler; @@ -18,7 +18,7 @@ import org.jivesoftware.smack.packet.Presence; import org.jivesoftware.smack.util.StringUtils; -public class XMPPManager extends Handler implements MessageListener, ChatManagerListener, IConf +public class XMPPManager extends Handler implements MessageListener, ChatManagerListener, IReload { private static final Logger LOGGER = Logger.getLogger("Minecraft"); private final transient EssentialsConf config; @@ -39,7 +39,7 @@ public class XMPPManager extends Handler implements MessageListener, ChatManager this.parent = parent; config = new EssentialsConf(new File(parent.getDataFolder(), "config.yml")); config.setTemplateName("/config.yml", EssentialsXMPP.class); - reloadConfig(); + onReload(); } public boolean sendMessage(final String address, final String message) @@ -166,7 +166,7 @@ public class XMPPManager extends Handler implements MessageListener, ChatManager } @Override - public final void reloadConfig() + public final void onReload() { LOGGER.removeHandler(this); config.load(); diff --git a/EssentialsXMPP/src/plugin.yml b/EssentialsXMPP/src/plugin.yml index a193ba95f..e152024fd 100644 --- a/EssentialsXMPP/src/plugin.yml +++ b/EssentialsXMPP/src/plugin.yml @@ -3,7 +3,7 @@ name: EssentialsXMPP main: com.earth2me.essentials.xmpp.EssentialsXMPP # Note to developers: This next line cannot change, or the automatic versioning system will break. version: TeamCity -website: http://www.earth2me.net:8001/ +website: http://tiny.cc/EssentialsWiki description: Provides xmpp communication. authors: - snowleo @@ -18,6 +18,7 @@ <ant dir="EssentialsProtect" antfile="build.xml"/> <ant dir="EssentialsGeoIP" antfile="build.xml"/> <ant dir="EssentialsXMPP" antfile="build.xml"/> + <ant dir="EssentialsSigns" antfile="build.xml"/> </target> <target name="collect" depends="buildRest"> <mkdir dir="jars"/> |