package de.oppermann.bastian.spleef.commands; import java.util.ArrayList; import java.util.List; import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; import de.oppermann.bastian.spleef.SpleefMain; import de.oppermann.bastian.spleef.util.CraftBukkitUtil; import de.oppermann.bastian.spleef.util.EpicSpleefVersion; import de.oppermann.bastian.spleef.util.Language; import de.oppermann.bastian.spleef.util.UpdateChecker; import de.oppermann.bastian.spleef.util.command.AbstractArgument; import de.oppermann.bastian.spleef.util.command.SpleefCommand.CommandHelp; import de.oppermann.bastian.spleef.util.command.SpleefCommand.CommandResult; public class UpdateArgument extends AbstractArgument { private static EpicSpleefVersion[] lastQuery = new EpicSpleefVersion[0]; static { new BukkitRunnable() { @Override public void run() { EpicSpleefVersion[] versions = UpdateChecker.queryVersions(); synchronized (lastQuery) { lastQuery = versions; } } }.runTaskAsynchronously(SpleefMain.getInstance()); } /** * Class constructor. */ public UpdateArgument() { super(new String[]{Language.COMMAND_UPDATE.toString()}, -1, "spleef.update", null, Language.COMMAND_UPDATE_DESCRIPTION.toString()); } /* * (non-Javadoc) * @see de.oppermann.bastian.spleef.util.command.AbstractArgument#executeForPlayer(org.bukkit.entity.Player, org.bukkit.command.Command, java.lang.String[]) */ @Override public CommandResult executeForPlayer(Player player, Command cmd, String[] args) { if (!player.hasPermission(getPermission())) { return CommandResult.NO_PERMISSION; } final Player PLAYER = player; final String[] ARGS = args; if (args.length == 2) { // list all versions if (args[1].equalsIgnoreCase(Language.COMMAND_UPDATE_ARGUMENT_LISTALLVERSIONS.toString())) { Bukkit.getScheduler().runTaskAsynchronously(SpleefMain.getInstance(), new Runnable() { @Override public void run() { EpicSpleefVersion[] versions = UpdateChecker.queryVersions(); synchronized (lastQuery) { lastQuery = versions; } listVersions(PLAYER, versions); } }); return CommandResult.SUCCESS; } if (args[1].equalsIgnoreCase(Language.COMMAND_UPDATE_ARGUMENT_LISTUPDATES.toString())) { Bukkit.getScheduler().runTaskAsynchronously(SpleefMain.getInstance(), new Runnable() { @Override public void run() { EpicSpleefVersion[] versions = UpdateChecker.getUpdates(); listVersions(PLAYER, versions); } }); return CommandResult.SUCCESS; } } if (args.length == 2 || args.length == 3) { if (args[1].equalsIgnoreCase(Language.COMMAND_UPDATE_ARGUMENT_INSTALL.toString())) { download(true, ARGS, PLAYER); return CommandResult.SUCCESS; } if (args[1].equalsIgnoreCase(Language.COMMAND_UPDATE_ARGUMENT_DOWNLOAD.toString())) { download(false, ARGS, PLAYER); return CommandResult.SUCCESS; } } return CommandResult.ERROR; // should never happen } private void listVersions(Player player, EpicSpleefVersion[] versions) { if (versions.length == 0) { player.sendMessage(Language.UPDATE_NO_UPDATES.toString()); return; } player.sendMessage(Language.UPDATE_VERSIONLIST_HEAD.toString()); for (EpicSpleefVersion version : versions) { String text = Language.UPDATE_VERSIONLIST_VALUE.toString().replace("%pluginVersion%", version.getVersionName().replace(".jar", "")).replace("%gameVersion%", version.getVersionGameVersion()); text = text.replace("\"", "\\\""); String simpleVersion = version.getVersionName().replace("EpicSpleef-", "").replace("-SNAPSHOT", "").replace("-BETA", "").replace(".jar", ""); String suggestCommand = "/spleef " + Language.COMMAND_UPDATE + " " + Language.COMMAND_UPDATE_ARGUMENT_INSTALL + " " + simpleVersion; // TODO custom /spleef command suggestCommand = suggestCommand.replace("\"", "\\\""); String popup = Language.UPDATE_VERSIONLIST_POPUP.toString().replace("\"", "\\\"").replace("%pluginVersion%", version.getVersionName().replace(".jar", "")).replace("%gameVersion%", version.getVersionGameVersion()); final String JSON = "{\"text\":\"\",\"extra\":[{\"text\":\"" + text + "\",\"clickEvent\":{\"action\":\"suggest_command\",\"value\":\"" + suggestCommand + "\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"" + popup + "\"}]}}}]}"; if (!CraftBukkitUtil.sendJSONText(player, JSON)) { player.sendMessage(Language.UPDATE_VERSIONLIST_VALUE.toString().replace("%pluginVersion%", version.getVersionName().replace(".jar", "")).replace("%gameVersion%", version.getVersionGameVersion())); } } player.sendMessage(Language.UPDATE_VERSIONLIST_BOTTOM.toString()); } private void download(boolean install, String[] args, Player player) { final Player PLAYER = player; final String[] ARGS = args; final boolean INSTALL = install; new BukkitRunnable() { @Override public void run() { EpicSpleefVersion toInstall = null; if (ARGS.length == 2) { toInstall = UpdateChecker.getNewestVersion(SpleefMain.getInstance().getConfig().getBoolean("auto-update.unsafeUpdates", false)); if (toInstall == null) { if (SpleefMain.getInstance().getConfig().getBoolean("auto-update.unsafeUpdates", false)) { PLAYER.sendMessage(Language.UPDATE_NO_NEW_VERSION.toString()); } else { EpicSpleefVersion unsafeUpdate = UpdateChecker.getNewestVersion(true); if (unsafeUpdate == null) { PLAYER.sendMessage(Language.UPDATE_NO_NEW_VERSION.toString()); } else { String simpleVersion = unsafeUpdate.getVersionName().replace("EpicSpleef-", "").replace("-SNAPSHOT", "").replace("-BETA", "").replace(".jar", ""); String suggestCommand = "/spleef " + Language.COMMAND_UPDATE + " " + Language.COMMAND_UPDATE_ARGUMENT_INSTALL + " " + simpleVersion; // TODO custom /spleef command suggestCommand = suggestCommand.replace("\"", "\\\""); PLAYER.sendMessage(Language.UPDATE_NO_NEW_VERSION_BUT_UNSAFE.toString().replace("%updateCommand%", suggestCommand).replace("%gameVersion%", unsafeUpdate.getVersionGameVersion())); } } return; } } if (ARGS.length == 3) { EpicSpleefVersion[] versions = UpdateChecker.queryVersions(); synchronized (lastQuery) { lastQuery = versions; } for (EpicSpleefVersion version : versions) { String simpleVersion = version.getVersionName().replace("EpicSpleef-", "").replace("-SNAPSHOT", "").replace("-BETA", "").replace(".jar", ""); if (simpleVersion.equals(ARGS[2])) { toInstall = version; continue; } } if (toInstall == null) { PLAYER.sendMessage(Language.UPDATE_UNKNOWN_VERSION.toString()); return; } } // download version and maybe install UpdateChecker.downloadFile(toInstall, INSTALL, PLAYER); } }.runTaskAsynchronously(SpleefMain.getInstance()); } /* * (non-Javadoc) * @see de.oppermann.bastian.spleef.util.command.AbstractArgument#executeForServer(org.bukkit.command.CommandSender, org.bukkit.command.Command, java.lang.String[]) */ @Override public CommandResult executeForServer(CommandSender sender, Command cmd, String[] args) { return CommandResult.ONLY_PLAYER; // the console can't join an arena } /* * (non-Javadoc) * @see de.oppermann.bastian.spleef.util.command.AbstractArgument#onTabComplete(org.bukkit.entity.Player, java.lang.String[]) */ @Override public List<String> onTabComplete(Player sender, String[] args) { ArrayList<String> list = new ArrayList<>(); if (args.length == 1) { list.add(Language.COMMAND_UPDATE.toString()); } if (args.length == 2) { list.add(Language.COMMAND_UPDATE_ARGUMENT_DOWNLOAD.toString()); list.add(Language.COMMAND_UPDATE_ARGUMENT_LISTALLVERSIONS.toString()); list.add(Language.COMMAND_UPDATE_ARGUMENT_LISTUPDATES.toString()); list.add(Language.COMMAND_UPDATE_ARGUMENT_INSTALL.toString()); } if (args.length == 3) { if (args[1].equalsIgnoreCase(Language.COMMAND_UPDATE_ARGUMENT_INSTALL.toString())) { synchronized (lastQuery) { if (lastQuery != null) { for (EpicSpleefVersion version : lastQuery) { String simpleVersion = version.getVersionName().replace("EpicSpleef-", "").replace("-SNAPSHOT", "").replace("-BETA", "").replace(".jar", ""); list.add(simpleVersion); } } } } } return list; } /* * (non-Javadoc) * @see de.oppermann.bastian.spleef.util.command.AbstractArgument#getCommandHelp() */ @Override public CommandHelp getCommandHelp() { return new CommandHelp("/%cmd% " + Language.COMMAND_UPDATE + " <" + Language.COMMAND_UPDATE_ARGUMENT_INSTALL + "/" + Language.COMMAND_UPDATE_ARGUMENT_LISTUPDATES + "/" + Language.COMMAND_UPDATE_ARGUMENT_LISTALLVERSIONS + "/" + Language.COMMAND_UPDATE_ARGUMENT_DOWNLOAD + ">", getDescription()); } }