summaryrefslogtreecommitdiffstats
path: root/EssentialsUpdate/src/net/ess3/update/UpdateProcess.java
diff options
context:
space:
mode:
Diffstat (limited to 'EssentialsUpdate/src/net/ess3/update/UpdateProcess.java')
-rw-r--r--EssentialsUpdate/src/net/ess3/update/UpdateProcess.java199
1 files changed, 199 insertions, 0 deletions
diff --git a/EssentialsUpdate/src/net/ess3/update/UpdateProcess.java b/EssentialsUpdate/src/net/ess3/update/UpdateProcess.java
new file mode 100644
index 000000000..f96cdd18f
--- /dev/null
+++ b/EssentialsUpdate/src/net/ess3/update/UpdateProcess.java
@@ -0,0 +1,199 @@
+package net.ess3.update;
+
+import net.ess3.update.states.InstallationFinishedEvent;
+import net.ess3.update.states.StateMachine;
+import net.ess3.update.tasks.SelfUpdate;
+import java.util.logging.Level;
+import org.bukkit.Bukkit;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.EventPriority;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerChatEvent;
+import org.bukkit.event.player.PlayerJoinEvent;
+import org.bukkit.plugin.Plugin;
+
+// TODO: This whole thing should make use of the conversations api
+public class UpdateProcess implements Listener
+{
+ private transient Player currentPlayer;
+ private final transient Plugin plugin;
+ private final transient UpdateCheck updateCheck;
+ private transient StateMachine stateMachine;
+
+ public UpdateProcess(final Plugin plugin, final UpdateCheck updateCheck)
+ {
+ super();
+ this.plugin = plugin;
+ this.updateCheck = updateCheck;
+ }
+
+ public void registerEvents()
+ {
+ plugin.getServer().getPluginManager().registerEvents(this, plugin);
+ }
+
+ public boolean selfUpdate()
+ {
+ if (new Version(plugin.getDescription().getVersion()).compareTo(updateCheck.getNewVersion()) < 0)
+ {
+ if (currentPlayer != null)
+ {
+ currentPlayer.sendMessage("A newer version of EssentialsUpdate is found. Downloading new file and reloading server.");
+ }
+ Bukkit.getLogger().log(Level.INFO, "A newer version of EssentialsUpdate is found. Downloading new file and reloading server.");
+ new SelfUpdate(new AbstractWorkListener(plugin, updateCheck.getNewVersionInfo())
+ {
+ @Override
+ public void onWorkAbort(final String message)
+ {
+ if (message != null && !message.isEmpty()
+ && UpdateProcess.this.currentPlayer != null
+ && UpdateProcess.this.currentPlayer.isOnline())
+ {
+ UpdateProcess.this.currentPlayer.sendMessage(message);
+ }
+ if (message != null && !message.isEmpty())
+ {
+ Bukkit.getLogger().log(Level.SEVERE, message);
+ }
+ UpdateProcess.this.currentPlayer = null;
+ }
+
+ @Override
+ public void onWorkDone(final String message)
+ {
+ if (message != null && !message.isEmpty()
+ && UpdateProcess.this.currentPlayer != null
+ && UpdateProcess.this.currentPlayer.isOnline())
+ {
+ UpdateProcess.this.currentPlayer.sendMessage(message);
+ }
+ if (message != null && !message.isEmpty())
+ {
+ Bukkit.getLogger().log(Level.INFO, message);
+ }
+ UpdateProcess.this.currentPlayer = null;
+ }
+ }).start();
+ return true;
+ }
+ if (updateCheck.getResult() == UpdateCheck.CheckResult.NEW_ESS_BUKKIT)
+ {
+ final String message = "Please update bukkit to version " + updateCheck.getNewBukkitVersion() + " before updating Essentials.";
+ if (currentPlayer != null)
+ {
+ currentPlayer.sendMessage(message);
+ }
+ Bukkit.getLogger().log(Level.INFO, message);
+ currentPlayer = null;
+ return true;
+ }
+ return false;
+ }
+
+ @EventHandler
+ public void onInstallationFinished(final InstallationFinishedEvent event)
+ {
+ UpdateProcess.this.currentPlayer = null;
+ }
+
+ @EventHandler(priority = EventPriority.LOWEST)
+ public void onPlayerChat(final PlayerChatEvent event)
+ {
+ if (event.getPlayer() == currentPlayer)
+ {
+ final StateMachine.MachineResult result = stateMachine.reactOnMessage(event.getMessage());
+ if (result == StateMachine.MachineResult.ABORT)
+ {
+ currentPlayer.sendMessage("Installation wizard aborted. You can restart it using /essentialsupdate.");
+ currentPlayer = null;
+ }
+ if (result == StateMachine.MachineResult.DONE)
+ {
+ startWork();
+ }
+ event.setCancelled(true);
+ return;
+ }
+ }
+
+ @EventHandler
+ public void onPlayerJoin(final PlayerJoinEvent event)
+ {
+ final Player player = event.getPlayer();
+ if (currentPlayer != null && currentPlayer.getName().equals(player.getName()))
+ {
+ currentPlayer = player;
+ player.sendMessage("You quit the game, while the installation wizard was running.");
+ player.sendMessage("The installation wizard will now resume.");
+ player.sendMessage("You can exit the wizard by typing quit into the chat.");
+ stateMachine.resumeInstallation(player);
+ }
+ if (player.hasPermission("essentials.update") && !updateCheck.isEssentialsInstalled())
+ {
+ player.sendMessage("Hello " + player.getDisplayName());
+ player.sendMessage("Please type /essentialsupdate into the chat to start the installation of Essentials.");
+ }
+ if (player.hasPermission("essentials.update"))
+ {
+ final UpdateCheck.CheckResult result = updateCheck.getResult();
+ switch (result)
+ {
+ case NEW_ESS:
+ player.sendMessage("The new version " + updateCheck.getNewVersion().toString() + " for Essentials is available. Please type /essentialsupdate to update.");
+ break;
+ case NEW_BUKKIT:
+ player.sendMessage("Your bukkit version is not the recommended build for Essentials, please update to version " + updateCheck.getNewBukkitVersion() + ".");
+ break;
+ case NEW_ESS_BUKKIT:
+ player.sendMessage("There is a new version " + updateCheck.getNewVersion().toString() + " of Essentials for Bukkit " + updateCheck.getNewBukkitVersion());
+ break;
+ default:
+ }
+ }
+ }
+
+ public void onCommand(final CommandSender sender)
+ {
+ if (sender instanceof Player && sender.hasPermission("essentials.update"))
+ {
+ if (currentPlayer == null)
+ {
+ currentPlayer = (Player)sender;
+ if (selfUpdate())
+ {
+ return;
+ }
+ stateMachine = new StateMachine(plugin, currentPlayer, updateCheck);
+ final StateMachine.MachineResult result = stateMachine.askQuestion();
+ if (result == StateMachine.MachineResult.DONE)
+ {
+ startWork();
+ }
+ }
+ if (!currentPlayer.equals(sender))
+ {
+ sender.sendMessage("The player " + currentPlayer.getDisplayName() + " is already using the wizard.");
+ }
+ }
+ else
+ {
+ sender.sendMessage("Please run the command as op from in game.");
+ }
+ }
+
+ private void startWork()
+ {
+ currentPlayer.sendMessage("Installation wizard done. Starting installation.");
+ Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ stateMachine.startWork();
+ }
+ });
+ }
+}