package xyz.brysonsteck.serverfordummies import kotlinx.coroutines.* import kotlinx.coroutines.javafx.JavaFx import java.io.File import java.io.IOException import java.awt.Checkbox import java.util.Properties import java.net.URL import javafx.beans.value.ChangeListener import javafx.beans.value.ObservableValue import javafx.concurrent.Task import javafx.beans.property.BooleanProperty import javafx.collections.FXCollections import javafx.fxml.FXML import javafx.geometry.Insets import javafx.scene.control.Button import javafx.scene.control.ChoiceBox import javafx.scene.control.Label import javafx.scene.control.TextField import javafx.scene.control.Spinner import javafx.scene.control.TitledPane import javafx.scene.control.ButtonBar import javafx.scene.control.CheckBox import javafx.scene.control.ProgressBar import javafx.scene.layout.Border import javafx.scene.layout.BorderStroke import javafx.scene.layout.GridPane import javafx.scene.layout.Pane import javafx.scene.layout.HBox import javafx.scene.layout.VBox import javafx.scene.text.TextAlignment import javafx.scene.text.Text import javafx.scene.Scene import javafx.scene.input.MouseEvent import javafx.stage.FileChooser import javafx.stage.FileChooser.ExtensionFilter import javafx.stage.DirectoryChooser import javafx.stage.Modality import javafx.stage.Stage import javafx.event.EventHandler import Download class PrimaryController { @FXML lateinit private var currentDirectoryLabel: Label @FXML lateinit private var worldNameField: TextField @FXML lateinit private var seedField: TextField @FXML lateinit private var portSpinner: Spinner @FXML lateinit private var difficultyBox: ChoiceBox @FXML lateinit private var gamemodeBox: ChoiceBox @FXML lateinit private var worldTypeBox: ChoiceBox @FXML lateinit private var worldSettingsPane: HBox @FXML lateinit private var parentPane: Pane @FXML lateinit private var buttonBar: ButtonBar @FXML lateinit private var flightCheckbox: CheckBox @FXML lateinit private var netherCheckbox: CheckBox @FXML lateinit private var structuresCheckbox: CheckBox @FXML lateinit private var pvpCheckbox: CheckBox @FXML lateinit private var whitelistCheckbox: CheckBox @FXML lateinit private var cmdBlocksCheckbox: CheckBox @FXML lateinit private var playerCountCheckbox: CheckBox @FXML lateinit private var maxPlayersSpinner: Spinner @FXML lateinit private var maxSizeSpinner: Spinner @FXML lateinit private var memorySpinner: Spinner @FXML lateinit private var spawnSpinner: Spinner @FXML lateinit private var simulationSpinner: Spinner @FXML lateinit private var renderSpinner: Spinner @FXML lateinit private var maxTickSpinner: Spinner @FXML lateinit private var statusBar: Label @FXML lateinit private var progressBar: ProgressBar @FXML private fun onDirectoryButtonClick() { val dirChooser = DirectoryChooser() dirChooser.title = "Open a server directory" dirChooser.initialDirectory = File(System.getProperty("user.home")) val result = dirChooser.showDialog(null) if (result != null) { currentDirectoryLabel.text = result.absolutePath val real = loadServerDir(result.absolutePath) parentPane.isDisable = false worldSettingsPane.isDisable = false buttonBar.isDisable = false } } @FXML private fun onWorldNameChange() { } @FXML private fun onSeedChange() { } @FXML private fun onPortChange() { } @FXML private fun onCheckboxClick() { } @FXML private fun onSpinnerChange() { } @FXML private fun onBuild() { GlobalScope.launch(Dispatchers.Default) { withContext(Dispatchers.JavaFx){statusBar.text = "Downloading a file..."} progressBar.isVisible = true val download = Download(URL("https://brysonsteck.xyz/pub/a-really-big-file")) download.start() while (download.status() == Download.Status.DOWNLOADING) { var prog = (download.downloaded.toDouble() / download.contentLength.toDouble()) // for whatever reason I need to print something to the screen in order for it to work print("") if (prog >= 0.01) { withContext(Dispatchers.JavaFx) {progressBar.progress = prog} } Thread.sleep(300) } progressBar.isVisible = false withContext(Dispatchers.JavaFx){statusBar.text = "Ready."} } } @FXML private fun onStart() { } private fun createDialog() { val dialog = Stage(); dialog.initModality(Modality.APPLICATION_MODAL); val dialogScene = Scene(App().loadFXML("dialog"), 300.0, 200.0); dialog.setScene(dialogScene); dialog.show(); } private fun loadServerDir(dir: String): Boolean { createDialog() var directory = dir var hasServer = false if (!File(directory).isDirectory) { return false; } if (directory[directory.length-1] != File.separatorChar) directory += File.separatorChar val hasDummy = File(directory + "ServerForDummies").isDirectory for (i in 20 downTo 8) { for (j in 15 downTo 0) { var spigotFile: String = "" if (j == 0) spigotFile += "spigot-1.$i.jar" else spigotFile += "spigot-1.$i.$j.jar"; hasServer = File(directory + spigotFile).isFile || File(directory + "server.jar").isFile if (hasServer) break; } } val hasProperties = File(directory + File.separator + "server.properties").isFile if (hasDummy && hasServer) { // read jproperties println("read jproperties") } else if (hasDummy && !hasServer && hasProperties) { // just needs to be built println("build") } else if (!hasDummy && hasServer) { // server created externally println("server made externally") } else { // assume clean directory println("none") } return true; } }