package org.bukkit.craftbukkit.updater; import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; public class AutoUpdater { public static final String WARN_CONSOLE = "warn-console"; public static final String WARN_OPERATORS = "warn-ops"; private final BukkitDLUpdaterService service; private final List<String> onUpdate = new ArrayList<String>(); private final List<String> onBroken = new ArrayList<String>(); private final Logger log; private final String channel; private boolean enabled; private ArtifactDetails current = null; private ArtifactDetails latest = null; private boolean suggestChannels = true; public AutoUpdater(BukkitDLUpdaterService service, Logger log, String channel) { this.service = service; this.log = log; this.channel = channel; } public String getChannel() { return channel; } public boolean isEnabled() { return enabled; } public void setEnabled(boolean isEnabled) { this.enabled = isEnabled; } public boolean shouldSuggestChannels() { return suggestChannels; } public void setSuggestChannels(boolean suggestChannels) { this.suggestChannels = suggestChannels; } public List<String> getOnBroken() { return onBroken; } public List<String> getOnUpdate() { return onUpdate; } public boolean isUpdateAvailable() { if((latest == null) || (current == null) || (!isEnabled())) { return false; } else { return latest.getCreated().after(current.getCreated()); } } public ArtifactDetails getCurrent() { return current; } public ArtifactDetails getLatest() { return latest; } public void check(final String currentSlug) { if(!isEnabled()) return; new Thread() { @Override public void run() { current = service.getArtifact(currentSlug, "information about this CraftBukkit version; perhaps you are running a custom one?"); latest = service.getArtifact("latest-" + channel, "latest artifact information"); if(isUpdateAvailable()) { if((current.isBroken()) && (onBroken.contains(WARN_CONSOLE))) { log.severe("----- Bukkit Auto Updater -----"); log.severe("Your version of CraftBukkit is known to be broken. It is strongly advised that you update to a more recent version ASAP."); log.severe("Known issues with your version:"); for(String line : current.getBrokenReason().split("\n")) { log.severe("> " + line); } log.severe("Newer version " + latest.getVersion() + " (build #" + latest.getBuildNumber() + ") was released on " + latest.getCreated() + "."); log.severe("Details: " + latest.getHtmlUrl()); log.severe("Download: " + latest.getFile().getUrl()); log.severe("----- ------------------- -----"); } else if(onUpdate.contains(WARN_CONSOLE)) { log.warning("----- Bukkit Auto Updater -----"); log.warning("Your version of CraftBukkit is out of date. Version " + latest.getVersion() + " (build #" + latest.getBuildNumber() + ") was released on " + latest.getCreated() + "."); log.warning("Details: " + latest.getHtmlUrl()); log.warning("Download: " + latest.getFile().getUrl()); log.warning("----- ------------------- -----"); } } else if((current != null) && (current.isBroken()) && (onBroken.contains(WARN_CONSOLE))) { log.severe("----- Bukkit Auto Updater -----"); log.severe("Your version of CraftBukkit is known to be broken. It is strongly advised that you update to a more recent version ASAP."); log.severe("Known issues with your version:"); for(String line : current.getBrokenReason().split("\n")) { log.severe("> " + line); } log.severe("Unfortunately, there is not yet a newer version suitable for your server. We would advise you wait an hour or two, or try out a dev build."); log.severe("----- ------------------- -----"); } else if((current != null) && (shouldSuggestChannels())) { ArtifactDetails.ChannelDetails prefChan = service.getChannel(channel, "preferred channel details"); if((prefChan != null) && (current.getChannel().getPriority() < prefChan.getPriority())) { log.info("----- Bukkit Auto Updater -----"); log.info("It appears that you're running a " + current.getChannel().getName() + ", when you've specified in bukkit.yml that you prefer to run " + prefChan.getName() + "s."); log.info("If you would like to be kept informed about new " + current.getChannel().getName() + " releases, it is recommended that you change 'preferred-channel' in your bukkit.yml to '" + current.getChannel().getSlug() + "'."); log.info("With that set, you will be told whenever a new version is available for download, so that you can always keep up to date and secure with the latest fixes."); log.info("If you would like to disable this warning, simply set 'suggest-channels' to false in bukkit.yml."); log.info("----- ------------------- -----"); } } } }.start(); } }