mirror of
https://github.com/sirjonasxx/G-Earth.git
synced 2024-11-23 08:50:52 +01:00
g-python shell part2
This commit is contained in:
parent
dccf2a573d
commit
c708471e50
@ -36,7 +36,7 @@
|
||||
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
|
||||
<addClasspath>true</addClasspath>
|
||||
<classpathPrefix>lib/</classpathPrefix>
|
||||
<mainClass>gearth.J11Main</mainClass>
|
||||
<mainClass>gearth.Main</mainClass>
|
||||
<useUniqueVersions>false</useUniqueVersions>
|
||||
</manifest>
|
||||
</archive>
|
||||
@ -58,7 +58,7 @@
|
||||
<outputDirectory>${project.build.directory}/bin</outputDirectory>
|
||||
<archive>
|
||||
<manifest>
|
||||
<mainClass>gearth.J11Main</mainClass>
|
||||
<mainClass>gearth.Main</mainClass>
|
||||
</manifest>
|
||||
</archive>
|
||||
<descriptorRefs>
|
||||
|
@ -1,7 +0,0 @@
|
||||
package gearth;
|
||||
|
||||
public class J11Main {
|
||||
public static void main(String[] args) {
|
||||
Main.main(args);
|
||||
}
|
||||
}
|
@ -1,22 +1,27 @@
|
||||
package gearth;
|
||||
|
||||
import gearth.misc.AdminValidator;
|
||||
import gearth.ui.GEarthController;
|
||||
import javafx.application.Application;
|
||||
import javafx.application.Platform;
|
||||
import javafx.fxml.FXMLLoader;
|
||||
import javafx.scene.Parent;
|
||||
import javafx.scene.Scene;
|
||||
import javafx.scene.control.*;
|
||||
import javafx.scene.control.Alert;
|
||||
import javafx.scene.control.ButtonType;
|
||||
import javafx.scene.control.Hyperlink;
|
||||
import javafx.scene.control.Label;
|
||||
import javafx.scene.image.Image;
|
||||
import javafx.scene.layout.FlowPane;
|
||||
import javafx.scene.layout.Region;
|
||||
import javafx.scene.web.WebView;
|
||||
import javafx.stage.Stage;
|
||||
import gearth.ui.GEarthController;
|
||||
import org.json.JSONObject;
|
||||
import org.jsoup.Jsoup;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
// run as root issue Invalid MIT-MAGIC-COOKIE-1 key fix: https://stackoverflow.com/questions/48139447/invalid-mit-magic-cookie-1-key
|
||||
|
||||
@ -30,25 +35,19 @@ public class Main extends Application {
|
||||
public void start(Stage primaryStage) throws Exception{
|
||||
main = this;
|
||||
|
||||
FXMLLoader loader = new FXMLLoader(getClass().getResource("/gearth/ui/G-Earth.fxml"));
|
||||
FXMLLoader loader = new FXMLLoader(getClass().getResource("ui/G-Earth.fxml"));
|
||||
Parent root = loader.load();
|
||||
GEarthController companion = loader.getController();
|
||||
companion.setStage(primaryStage);
|
||||
|
||||
primaryStage.getIcons().add(new Image(getClass().getResourceAsStream("/gearth/G-EarthLogoSmaller.png")));
|
||||
primaryStage.getIcons().add(new Image(getClass().getResourceAsStream("G-EarthLogoSmaller.png")));
|
||||
|
||||
// TODO fix
|
||||
primaryStage.setResizable(false);
|
||||
// primaryStage.setResizable(true);
|
||||
// primaryStage.onShownProperty().addListener(e -> {
|
||||
// Platform.runLater(() -> primaryStage.setResizable(false));
|
||||
// });
|
||||
|
||||
//primaryStage.initStyle(StageStyle.UNDECORATED);
|
||||
primaryStage.setTitle("G-Earth " + version);
|
||||
primaryStage.setScene(new Scene(root, 650, 295));
|
||||
primaryStage.show();
|
||||
primaryStage.getScene().getStylesheets().add(getClass().getResource("/gearth/ui/bootstrap3.css").toExternalForm());
|
||||
primaryStage.getScene().getStylesheets().add(getClass().getResource("ui/bootstrap3.css").toExternalForm());
|
||||
|
||||
primaryStage.setOnCloseRequest( event -> {
|
||||
companion.exit();
|
||||
@ -64,10 +63,6 @@ public class Main extends Application {
|
||||
Alert alert = new Alert(Alert.AlertType.ERROR, "G-Earth needs admin privileges in order to work properly, please restart G-Earth with admin permissions unless you know what you're doing", ButtonType.OK);
|
||||
alert.getDialogPane().setMinHeight(Region.USE_PREF_SIZE);
|
||||
alert.setResizable(false);
|
||||
// alert.setResizable(true);
|
||||
// alert.onShownProperty().addListener(e -> {
|
||||
// Platform.runLater(() -> alert.setResizable(false));
|
||||
// });
|
||||
alert.show();
|
||||
});
|
||||
|
||||
@ -103,11 +98,6 @@ public class Main extends Application {
|
||||
webView.setPrefSize(500, 200);
|
||||
|
||||
alert.setResizable(false);
|
||||
// alert.setResizable(true);
|
||||
// alert.onShownProperty().addListener(e -> {
|
||||
// Platform.runLater(() -> alert.setResizable(false));
|
||||
// });
|
||||
|
||||
alert.getDialogPane().setMinHeight(Region.USE_PREF_SIZE);
|
||||
alert.getDialogPane().setContent(fp);
|
||||
if (isForcedUpdate) {
|
||||
|
@ -6,9 +6,7 @@ import javafx.application.Platform;
|
||||
import javafx.scene.control.Alert;
|
||||
import javafx.scene.control.ButtonType;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* Created by Jonas on 16/10/18.
|
||||
@ -16,15 +14,24 @@ import java.util.Random;
|
||||
public class Authenticator {
|
||||
|
||||
private static Map<String, String> cookies = new HashMap<>();
|
||||
private static Set<String> perma_cookies = new HashSet<>();
|
||||
|
||||
public static String generateCookieForExtension(String filename) {
|
||||
String cookie = getRandomCookie();
|
||||
cookies.put(filename, cookie);
|
||||
|
||||
return cookie;
|
||||
}
|
||||
public static String generatePermanentCookie() {
|
||||
String cookie = getRandomCookie();
|
||||
perma_cookies.add(cookie);
|
||||
return cookie;
|
||||
}
|
||||
|
||||
public static boolean evaluate(NetworkExtension extension) {
|
||||
if (extension.getCookie() != null && perma_cookies.contains(extension.getCookie())) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (extension.isInstalledExtension()) {
|
||||
return claimSession(extension.getFileName(), extension.getCookie());
|
||||
}
|
||||
|
@ -10,20 +10,25 @@ import javafx.scene.control.Label;
|
||||
import javafx.scene.layout.FlowPane;
|
||||
import javafx.scene.layout.Region;
|
||||
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.*;
|
||||
import java.net.URI;
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class GPythonShell {
|
||||
|
||||
private final String extensionName;
|
||||
private final int port;
|
||||
private final String cookie;
|
||||
|
||||
public GPythonShell(String extensionName, String cookie) {
|
||||
public GPythonShell(String extensionName, int port, String cookie) {
|
||||
this.extensionName = extensionName;
|
||||
this.port = port;
|
||||
this.cookie = cookie;
|
||||
}
|
||||
|
||||
@ -43,6 +48,41 @@ public class GPythonShell {
|
||||
List<String> sysargs = enterCommandAndAwait(out, in, "import sys; sys.argv");
|
||||
String kernelName = extractKernelName(sysargs);
|
||||
|
||||
InputStream initScriptResource = getClass().getResourceAsStream("init_script.py");
|
||||
List<String> initScript = new BufferedReader(new InputStreamReader(initScriptResource,
|
||||
StandardCharsets.UTF_8)).lines().collect(Collectors.toList());
|
||||
|
||||
for (String line : initScript) {
|
||||
line = line.replace("$G_PYTHON_SHELL_TITLE$", extensionName)
|
||||
.replace("$G_EARTH_PORT$", "" + port)
|
||||
.replace("$COOKIE$", cookie);
|
||||
enterCommandAndAwait(out, in, line);
|
||||
}
|
||||
|
||||
ProcessBuilder qtConsoleBuilder = new ProcessBuilder("python", "-m", "jupyter", "qtconsole",
|
||||
"--ConsoleWidget.include_other_output", "True",
|
||||
"--ConsoleWidget.gui_completion", "'droplist'",
|
||||
// "--ConsoleWidget.other_output_prefix", "'[G-Earth]'",
|
||||
// "--JupyterWidget.in_prompt", "'>>>: '",
|
||||
// "--JupyterWidget.out_prompt", "''",
|
||||
"--KernelManager.autorestart", "False",
|
||||
"--JupyterConsoleApp.confirm_exit", "False",
|
||||
"--JupyterConsoleApp.existing", kernelName);
|
||||
Process qtConsole = qtConsoleBuilder.start();
|
||||
|
||||
new Thread(() -> {
|
||||
try {
|
||||
qtConsole.waitFor();
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
try {
|
||||
enterCommandAndAwait(out, in, "ext.stop()");
|
||||
enterCommand(out, "exit()");
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}).start();
|
||||
|
||||
onLaunch.launched(false);
|
||||
}
|
||||
@ -123,7 +163,7 @@ public class GPythonShell {
|
||||
|
||||
for (int i = 0; i < params.size() - 1; i++) {
|
||||
if (params.get(i).equals("-f")) {
|
||||
return params.get(i+1);
|
||||
return "'" + params.get(i+1) + "'";
|
||||
}
|
||||
}
|
||||
return null;
|
||||
@ -155,8 +195,8 @@ public class GPythonShell {
|
||||
return extensionName;
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws IOException {
|
||||
GPythonShell shell = new GPythonShell("test", "cookie");
|
||||
public static void main(String[] args) {
|
||||
GPythonShell shell = new GPythonShell("test", 9092, "cookie");
|
||||
shell.launch((b) -> {
|
||||
System.out.println("launched");
|
||||
});
|
||||
|
@ -18,8 +18,8 @@ public class BoxButton extends StackPane {
|
||||
|
||||
//paths zijn relatief aan deze classpath
|
||||
public BoxButton(String imageName, String imageOnHoverName) {
|
||||
this.image = new Image(getClass().getResourceAsStream("/gearth/ui/buttons/files/" + imageName));
|
||||
this.imageOnHover = new Image(getClass().getResourceAsStream("/gearth/ui/buttons/files/" + imageOnHoverName));
|
||||
this.image = new Image(getClass().getResourceAsStream("files/" + imageName));
|
||||
this.imageOnHover = new Image(getClass().getResourceAsStream("files/" + imageOnHoverName));
|
||||
this.imageView = new ImageView();
|
||||
|
||||
setCursor(Cursor.DEFAULT);
|
||||
|
@ -33,10 +33,10 @@ public class PauseResumeButton extends StackPane{
|
||||
public PauseResumeButton(boolean isPaused) {
|
||||
this.isPaused[0] = isPaused;
|
||||
|
||||
this.imagePause = new Image(getClass().getResourceAsStream("/gearth/ui/buttons/files/ButtonPause.png"));
|
||||
this.imagePauseOnHover = new Image(getClass().getResourceAsStream("/gearth/ui/buttons/files/ButtonPauseHover.png"));
|
||||
this.imageResume = new Image(getClass().getResourceAsStream("/gearth/ui/buttons/files/ButtonResume.png"));
|
||||
this.imageResumeOnHover = new Image(getClass().getResourceAsStream("/gearth/ui/buttons/files/ButtonResumeHover.png"));
|
||||
this.imagePause = new Image(getClass().getResourceAsStream("files/ButtonPause.png"));
|
||||
this.imagePauseOnHover = new Image(getClass().getResourceAsStream("files/ButtonPauseHover.png"));
|
||||
this.imageResume = new Image(getClass().getResourceAsStream("files/ButtonResume.png"));
|
||||
this.imageResumeOnHover = new Image(getClass().getResourceAsStream("files/ButtonResumeHover.png"));
|
||||
this.imageView = new ImageView();
|
||||
|
||||
setCursor(Cursor.DEFAULT);
|
||||
|
@ -6,6 +6,7 @@ import gearth.services.extensionhandler.ExtensionHandler;
|
||||
import gearth.services.extensionhandler.extensions.ExtensionListener;
|
||||
import gearth.services.extensionhandler.extensions.GEarthExtension;
|
||||
import gearth.services.extensionhandler.extensions.implementations.network.NetworkExtensionsProducer;
|
||||
import gearth.services.extensionhandler.extensions.implementations.network.authentication.Authenticator;
|
||||
import gearth.services.extensionhandler.extensions.implementations.network.executer.ExecutionInfo;
|
||||
import gearth.services.extensionhandler.extensions.implementations.network.executer.ExtensionRunner;
|
||||
import gearth.services.extensionhandler.extensions.implementations.network.executer.ExtensionRunnerFactory;
|
||||
@ -117,11 +118,16 @@ public class ExtensionsController extends SubForm {
|
||||
}
|
||||
|
||||
|
||||
private volatile int gpytonShellCounter = 1;
|
||||
private volatile boolean pythonShellLaunching = false;
|
||||
public void gpythonBtnClicked(ActionEvent actionEvent) {
|
||||
pythonShellLaunching = true;
|
||||
Platform.runLater(() -> btn_gpython.setDisable(true));
|
||||
GPythonShell shell = new GPythonShell("test", "cookie");
|
||||
GPythonShell shell = new GPythonShell(
|
||||
"Scripting shell " + gpytonShellCounter++,
|
||||
networkExtensionsProducer.getPort(),
|
||||
Authenticator.generatePermanentCookie()
|
||||
);
|
||||
shell.launch((b) -> {
|
||||
pythonShellLaunching = false;
|
||||
Platform.runLater(this::updateGPythonStatus);
|
||||
|
@ -0,0 +1,42 @@
|
||||
from time import sleep
|
||||
|
||||
from g_python.gextension import Extension
|
||||
from g_python.hmessage import Direction, HMessage
|
||||
from g_python.hpacket import HPacket
|
||||
from g_python import hparsers
|
||||
from g_python import htools
|
||||
|
||||
extension_info = {"title": "$G_PYTHON_SHELL_TITLE$", "description": "G-Python scripting console", "version": "1.0", "author": ""}
|
||||
|
||||
ext = Extension(extension_info, ["--port", "$G_EARTH_PORT$", "--auth-token", "$COOKIE$"], {"can_leave": False})
|
||||
ext.start()
|
||||
|
||||
|
||||
def is_closed(): return ext.is_closed()
|
||||
|
||||
|
||||
def send_to_client(packet): return ext.send_to_client(packet)
|
||||
|
||||
|
||||
def send_to_server(packet): return ext.send_to_server(packet)
|
||||
|
||||
|
||||
def on_event(event_name: str, func): return ext.on_event(event_name, func)
|
||||
|
||||
|
||||
def intercept(direction: Direction, callback, id=-1): return ext.intercept(direction, callback, id)
|
||||
|
||||
|
||||
def start(): return ext.start()
|
||||
|
||||
|
||||
def stop(): return ext.stop()
|
||||
|
||||
|
||||
def write_to_console(text, color='black', mention_title=True): return ext.write_to_console(text, color, mention_title)
|
||||
|
||||
|
||||
def request_flags(): return ext.request_flags()
|
||||
|
||||
|
||||
HPacket.default_extension = ext
|
Loading…
Reference in New Issue
Block a user