package in.twizmwaz.cardinal; import in.twizmwaz.cardinal.chat.ChatConstant; import in.twizmwaz.cardinal.chat.LocalizedChatMessage; import in.twizmwaz.cardinal.util.ChatUtil; import in.twizmwaz.cardinal.util.Config; import in.twizmwaz.cardinal.util.GitUtil; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; public class UpdateHandler { private static UpdateHandler handler; public static final String localGitRevision; static { handler = new UpdateHandler(); String version = GameHandler.getGameHandler().getPlugin().getDescription().getVersion(); localGitRevision = version.substring(version.length() - 7, version.length()); } private boolean update; public UpdateHandler() { handler = this; Bukkit.getScheduler().runTaskTimerAsynchronously(Cardinal.getInstance(), new Runnable() { @Override public void run() { if (Config.autoUpdate && System.currentTimeMillis() - lastUpdate > TimeUnit.HOURS.toMillis(24)) { Bukkit.getScheduler().runTaskAsynchronously(Cardinal.getInstance(), UpdateHandler.getUpdateHandler().getUpdateTask(Bukkit.getConsoleSender())); } } }, 600L, 3600*20L); // Runs after 30s, every hour } public static UpdateHandler getUpdateHandler() { return handler; } /** * @return Returns true/false if an there is a new update in the update.txt file on github */ public boolean checkUpdates() { String revision = GitUtil.getLatestGitRevision(); if (revision != null && !revision.startsWith(localGitRevision)) { update = true; } return update; } public NotificationTask getNotificationTask(CommandSender sender) { return new NotificationTask(sender); } public class NotificationTask implements Runnable { private final CommandSender sender; public NotificationTask(CommandSender sender) { this.sender = sender; } @Override public void run() { if (UpdateHandler.getUpdateHandler().checkUpdates()) sender.sendMessage(ChatColor.GOLD + ChatConstant.UI_UPDATE_AVAILABLE.asMessage().getMessage(ChatUtil.getLocale(sender))); else sender.sendMessage(ChatColor.GOLD + ChatConstant.UI_LATEST_VERSION.asMessage().getMessage(ChatUtil.getLocale(sender))); } } public static long lastUpdate = 0L; public UpdateTask getUpdateTask(CommandSender sender) { lastUpdate = System.currentTimeMillis() - 10000L; return new UpdateTask(sender); } private static final AtomicBoolean lock = new AtomicBoolean(false); private static String downloadedRevision = ""; public class UpdateTask implements Runnable { private final CommandSender sender; public UpdateTask(CommandSender sender) { this.sender = sender; } @Override public void run() { sender.sendMessage(new LocalizedChatMessage(ChatConstant.GENERIC_CHECKING_UPDATES).getMessage(ChatUtil.getLocale(sender))); String last = GitUtil.getLatestGitRevision(); if (last != null && last.startsWith(UpdateHandler.localGitRevision)) { sender.sendMessage(ChatColor.GOLD + ChatConstant.UI_LATEST_VERSION.asMessage().getMessage(ChatUtil.getLocale(sender))); } else if (downloadedRevision.equals(last)) { sender.sendMessage(new LocalizedChatMessage(ChatConstant.GENERIC_ALREADY_DOWNLOADED).getMessage(ChatUtil.getLocale(sender))); } else { sender.sendMessage(new LocalizedChatMessage(ChatConstant.GENERIC_DOWNLOAD_STARTING).getMessage(ChatUtil.getLocale(sender))); try { while (!lock.compareAndSet(false, true)) { try { Thread.sleep(1L); } catch (InterruptedException e) { } } try { File to = new File(Bukkit.getServer().getUpdateFolderFile(), Cardinal.getInstance().getPluginFileName()); File tmp = new File(to.getPath() + ".update"); if (!tmp.exists()) { Bukkit.getServer().getUpdateFolderFile().mkdirs(); tmp.createNewFile(); } URL url = new URL("http://ci.twizmwaz.in/job/Cardinal/lastSuccessfulBuild/artifact/target/CardinalPGM-1.0-SNAPSHOT.jar"); InputStream is = url.openStream(); OutputStream os = new FileOutputStream(tmp); byte[] buffer = new byte[4096]; int fetched; while ((fetched = is.read(buffer)) != -1) os.write(buffer, 0, fetched); is.close(); os.flush(); os.close(); if (to.exists()) to.delete(); tmp.renameTo(to); sender.sendMessage(new LocalizedChatMessage(ChatConstant.GENERIC_DOWNLOAD_READY, ChatColor.GREEN + "Cardinal" + ChatColor.WHITE).getMessage(ChatUtil.getLocale(sender))); downloadedRevision = last; } catch (Exception e) { sender.sendMessage(new LocalizedChatMessage(ChatConstant.GENERIC_DOWNLOAD_FAILED, ChatColor.GREEN + "Cardinal" + ChatColor.WHITE).getMessage(ChatUtil.getLocale(sender))); } lock.set(false); } catch (Throwable t) { } } } } }