diff --git a/src/yugecin/opsudance/OpsuDance.java b/src/yugecin/opsudance/OpsuDance.java index 369ba2e9..c476dad0 100644 --- a/src/yugecin/opsudance/OpsuDance.java +++ b/src/yugecin/opsudance/OpsuDance.java @@ -18,26 +18,58 @@ package yugecin.opsudance; import com.google.inject.Inject; +import itdelatrisu.opsu.Options; +import itdelatrisu.opsu.Utils; +import itdelatrisu.opsu.db.DBController; +import itdelatrisu.opsu.downloads.DownloadList; +import itdelatrisu.opsu.downloads.Updater; import org.lwjgl.LWJGLException; +import org.newdawn.slick.util.Log; import yugecin.opsudance.core.DisplayContainer; import yugecin.opsudance.errorhandling.ErrorHandler; import yugecin.opsudance.states.EmptyState; +import java.io.File; +import java.io.IOException; +import java.net.InetAddress; +import java.net.ServerSocket; +import java.net.UnknownHostException; + import static yugecin.opsudance.kernel.Entrypoint.sout; +/* + * loosely based on itdelatrisu.opsu.Opsu + */ public class OpsuDance { private final DisplayContainer container; + private ServerSocket singleInstanceSocket; + @Inject public OpsuDance(DisplayContainer container) { this.container = container; } - public void start() { + public void start(String[] args) { sout("initialized"); + + checkRunningDirectory(); + Options.parseOptions(); + ensureSingleInstance(); + sout("prechecks done and options parsed"); + + initDatabase(); + initUpdater(args); + sout("database & updater initialized"); + container.switchStateNow(EmptyState.class); + while (rungame()); + + closeSingleInstanceSocket(); + DBController.closeConnections(); + DownloadList.get().cancelAllDownloads(); } private boolean rungame() { @@ -57,4 +89,84 @@ public class OpsuDance { return caughtException != null && ErrorHandler.error("update/render error", caughtException, container).show().shouldIgnoreAndContinue(); } + private void initDatabase() { + try { + DBController.init(); + } catch (UnsatisfiedLinkError e) { + errorAndExit("Could not initialize database.", e); + } + } + + private void initUpdater(String[] args) { + // check if just updated + if (args.length >= 2) + Updater.get().setUpdateInfo(args[0], args[1]); + + // check for updates + if (Options.isUpdaterDisabled()) { + return; + } + new Thread() { + @Override + public void run() { + try { + Updater.get().checkForUpdates(); + } catch (IOException e) { + Log.warn("updatecheck failed.", e); + } + } + }.start(); + } + + private void checkRunningDirectory() { + if (!Utils.isJarRunning()) { + return; + } + File runningDir = Utils.getRunningDirectory(); + if (runningDir == null) { + return; + } + if (runningDir.getAbsolutePath().indexOf('!') == -1) { + return; + } + errorAndExit("Cannot run from a path that contains a '!'. Please move or rename the jar and try again."); + } + + private void ensureSingleInstance() { + if (Options.noSingleInstance()) { + return; + } + try { + singleInstanceSocket = new ServerSocket(Options.getPort(), 1, InetAddress.getLocalHost()); + } catch (UnknownHostException e) { + // shouldn't happen + } catch (IOException e) { + errorAndExit(String.format( + "Could not launch. Either opsu! is already running or a different program uses port %d.\n" + + "You can change the port opsu! uses by editing the 'Port' field in the .opsu.cfg configuration file.\n" + + "If that still does not resolve the problem, you can set 'NoSingleInstance' to 'true', but this is not recommended.", Options.getPort()), e); + } + } + + private void closeSingleInstanceSocket() { + if (singleInstanceSocket == null) { + return; + } + try { + singleInstanceSocket.close(); + } catch (IOException e) { + Log.error("Single instance socket was not closed!", e); + } + } + + private void errorAndExit(String errstr) { + ErrorHandler.error(errstr, new Throwable()).preventContinue().show(); + System.exit(1); + } + + private void errorAndExit(String errstr, Throwable cause) { + ErrorHandler.error(errstr, cause).preventContinue().show(); + System.exit(1); + } + } diff --git a/src/yugecin/opsudance/kernel/Entrypoint.java b/src/yugecin/opsudance/kernel/Entrypoint.java index d330666a..13914a6f 100644 --- a/src/yugecin/opsudance/kernel/Entrypoint.java +++ b/src/yugecin/opsudance/kernel/Entrypoint.java @@ -25,7 +25,7 @@ public class Entrypoint { public static void main(String[] args) { sout("launched"); - InstanceContainerImpl.initialize().provide(OpsuDance.class).start(); + InstanceContainerImpl.initialize().provide(OpsuDance.class).start(args); } public static long runtime() {