package com.earth2me.essentials.update; import java.io.File; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginManager; public class UpdateCheck { private transient CheckResult result = CheckResult.UNKNOWN; private transient Version currentVersion; private transient Version newVersion = null; private transient int bukkitResult = 0; private transient UpdateFile updateFile; private final static int CHECK_INTERVAL = 20 * 60 * 60 * 6; private final transient Plugin plugin; private transient boolean essentialsInstalled; public UpdateCheck(Plugin plugin) { this.plugin = plugin; updateFile = new UpdateFile(plugin); checkForEssentials(); } private void checkForEssentials() { PluginManager pm = plugin.getServer().getPluginManager(); Plugin essentials = pm.getPlugin("Essentials"); if (essentials == null) { essentialsInstalled = false; if (new File(plugin.getDataFolder().getParentFile(), "Essentials.jar").exists()) { Bukkit.getLogger().severe("Essentials.jar found, but not recognized by Bukkit. Broken download?"); } } else { essentialsInstalled = true; currentVersion = new Version(essentials.getDescription().getVersion()); } } public void scheduleUpdateTask() { plugin.getServer().getScheduler().scheduleAsyncRepeatingTask(plugin, new Runnable() { @Override public void run() { updateFile = new UpdateFile(plugin); checkForUpdates(); } }, CHECK_INTERVAL, CHECK_INTERVAL); } public boolean isEssentialsInstalled() { return essentialsInstalled; } public CheckResult getResult() { return result; } int getNewBukkitVersion() { return bukkitResult; } VersionInfo getNewVersionInfo() { return updateFile.getVersions().get(newVersion); } public enum CheckResult { NEW_ESS, NEW_ESS_BUKKIT, NEW_BUKKIT, OK, UNKNOWN } public void checkForUpdates() { if (currentVersion == null) { return; } final Map versions = updateFile.getVersions(); final int bukkitVersion = getBukkitVersion(); Version higher = null; Version found = null; Version lower = null; int bukkitHigher = 0; int bukkitLower = 0; for (Entry entry : versions.entrySet()) { final int minBukkit = entry.getValue().getMinBukkit(); final int maxBukkit = entry.getValue().getMaxBukkit(); if (minBukkit == 0 || maxBukkit == 0) { continue; } if (bukkitVersion <= maxBukkit) { if (bukkitVersion < minBukkit) { if (higher == null || higher.compareTo(entry.getKey()) < 0) { higher = entry.getKey(); bukkitHigher = minBukkit; } } else { if (found == null || found.compareTo(entry.getKey()) < 0) { found = entry.getKey(); } } } else { if (lower == null || lower.compareTo(entry.getKey()) < 0) { lower = entry.getKey(); bukkitLower = minBukkit; } } } if (found != null) { if (found.compareTo(currentVersion) > 0) { result = CheckResult.NEW_ESS; newVersion = found; } else { result = CheckResult.OK; } } else if (higher != null) { if (higher.compareTo(currentVersion) > 0) { newVersion = higher; result = CheckResult.NEW_ESS_BUKKIT; bukkitResult = bukkitHigher; } else if (higher.compareTo(currentVersion) < 0) { result = CheckResult.UNKNOWN; } else { result = CheckResult.NEW_BUKKIT; bukkitResult = bukkitHigher; } } else if (lower != null) { if (lower.compareTo(currentVersion) > 0) { result = CheckResult.NEW_ESS_BUKKIT; newVersion = lower; bukkitResult = bukkitLower; } else if (lower.compareTo(currentVersion) < 0) { result = CheckResult.UNKNOWN; } else { result = CheckResult.NEW_BUKKIT; bukkitResult = bukkitLower; } } } private int getBukkitVersion() { final Matcher versionMatch = Pattern.compile("git-Bukkit-([0-9]+).([0-9]+).([0-9]+)-[0-9]+-[0-9a-z]+-b([0-9]+)jnks.*").matcher(plugin.getServer().getVersion()); if (versionMatch.matches()) { return Integer.parseInt(versionMatch.group(4)); } throw new NumberFormatException("Bukkit Version changed!"); } public Version getNewVersion() { return newVersion; } }