diff --git a/.gitignore b/.gitignore index 5435a47..8f231aa 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,4 @@ out/ bin/ **/target/ -*.iml +*.iml \ No newline at end of file diff --git a/Extensions/AdminOnConnect/pom.xml b/Extensions/AdminOnConnect/pom.xml index 7a5eab6..2706564 100644 --- a/Extensions/AdminOnConnect/pom.xml +++ b/Extensions/AdminOnConnect/pom.xml @@ -13,7 +13,7 @@ G-Earth G-Earth-Parent - 0.0.1-beta + 0.2 @@ -30,53 +30,6 @@ - - org.apache.maven.plugins - maven-compiler-plugin - 3.7.0 - - 1.8 - 1.8 - - - - - maven-resources-plugin - 2.6 - - - copy-resources - validate - - copy-resources - - - ${project.build.directory} - - - src/main/resources - - - - - - - - - maven-dependency-plugin - - - package - - copy-dependencies - - - ${project.build.directory}/bin/lib - - - - - org.apache.maven.plugins maven-jar-plugin @@ -93,7 +46,34 @@ true - ${artifactId} + ${project.artifactId} + + + + + + maven-assembly-plugin + 2.5 + + + package + + single + + + + + ${project.build.directory}/bin + + + extensions.adminonconnect.AdminOnConnect + + + + jar-with-dependencies + + ${project.artifactId} + false @@ -102,8 +82,8 @@ G-Earth - G-Earth-UI - 0.0.1-beta + G-Earth + 0.2 diff --git a/Extensions/BlockReplacePackets/pom.xml b/Extensions/BlockReplacePackets/pom.xml index 1eb4c34..bc0b31a 100644 --- a/Extensions/BlockReplacePackets/pom.xml +++ b/Extensions/BlockReplacePackets/pom.xml @@ -13,7 +13,7 @@ G-Earth G-Earth-Parent - 0.0.1-beta + 0.2 @@ -30,53 +30,6 @@ - - org.apache.maven.plugins - maven-compiler-plugin - 3.7.0 - - 1.8 - 1.8 - - - - - maven-resources-plugin - 2.6 - - - copy-resources - validate - - copy-resources - - - ${project.build.directory} - - - src/main/resources - - - - - - - - - maven-dependency-plugin - - - package - - copy-dependencies - - - ${project.build.directory}/bin/lib - - - - - org.apache.maven.plugins maven-jar-plugin @@ -93,12 +46,13 @@ true - ${artifactId} + ${project.artifactId} maven-assembly-plugin + 2.5 package @@ -108,7 +62,7 @@ - ${project.parent.basedir}/bin + ${project.build.directory}/bin extensions.blockreplacepackets.BlockAndReplacePackets @@ -117,7 +71,7 @@ jar-with-dependencies - BlockAndReplacePackets + ${project.artifactId} false @@ -127,8 +81,8 @@ G-Earth - G-Earth-UI - 0.0.1-beta + G-Earth + 0.2 diff --git a/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/BlockAndReplacePackets.java b/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/BlockAndReplacePackets.java index fb0361e..1eda9b0 100644 --- a/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/BlockAndReplacePackets.java +++ b/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/BlockAndReplacePackets.java @@ -1,23 +1,38 @@ package extensions.blockreplacepackets; +import extensions.blockreplacepackets.rules.BlockReplaceRule; +import extensions.blockreplacepackets.rules.RuleFactory; +import gearth.extensions.Extension; +import gearth.protocol.HMessage; +import gearth.protocol.HPacket; import gearth.ui.GEarthController; +import javafx.application.Platform; +import javafx.beans.InvalidationListener; +import javafx.beans.Observable; +import javafx.event.ActionEvent; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.ComboBox; +import javafx.scene.control.ScrollPane; import javafx.scene.control.TextField; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.VBox; import javafx.stage.Stage; import gearth.extensions.ExtensionForm; import gearth.extensions.ExtensionInfo; +import java.util.ArrayList; +import java.util.List; + /** * Created by Jonas on 22/09/18. */ @ExtensionInfo( - Title = "iManipulate", + Title = "G-Manipulate", Description = "Block &/ replace packets", Version = "0.1", Author = "sirjonasxx" @@ -26,32 +41,179 @@ public class BlockAndReplacePackets extends ExtensionForm { public TextField txt_replacement; public ComboBox cmb_type; - public TextField txt_id; public Button btn_add; + public volatile ComboBox cmb_side; + public TextField txt_value; + public ScrollPane scrollpane; + public VBox vbox; + public GridPane header; + + List rules = new ArrayList<>(); public static void main(String[] args) { - ExtensionForm.args = args; - launch(args); + runExtensionForm(args, BlockAndReplacePackets.class); } //initialize javaFX elements public void initialize() { - cmb_type.getItems().addAll("Block OUT", "Block IN", "Replace OUT", "Replace IN"); + cmb_type.getItems().addAll("Block packet", "Replace packet", "Replace integer", "Replace string", "Replace substring"); cmb_type.getSelectionModel().selectFirst(); + + cmb_side.getItems().addAll("Incoming", "Outgoing"); + cmb_side.getSelectionModel().selectFirst(); + + cmb_side.getSelectionModel().selectedItemProperty().addListener(observable -> Platform.runLater(this::refreshOptions)); + cmb_type.getSelectionModel().selectedItemProperty().addListener(observable -> Platform.runLater(this::refreshOptions)); + txt_replacement.textProperty().addListener(event -> Platform.runLater(this::refreshOptions)); + txt_value.textProperty().addListener(event -> Platform.runLater(this::refreshOptions)); + + refreshOptions(); + cmb_type.requestFocus(); + + } + + private void refreshOptions() { + txt_replacement.setDisable(cmb_type.getSelectionModel().getSelectedItem().startsWith("Block")); + if (cmb_side.getItems().size() == 2 && !cmb_type.getSelectionModel().getSelectedItem().endsWith("packet")) { + cmb_side.getItems().add("All"); + } + else if (cmb_side.getItems().size() == 3 && cmb_type.getSelectionModel().getSelectedItem().endsWith("packet")) { + if (cmb_side.getSelectionModel().getSelectedItem() != null && cmb_side.getSelectionModel().getSelectedItem().equals("All")) { + cmb_side.getSelectionModel().selectFirst(); + } + cmb_side.getItems().remove(2); + } + + boolean isValid = false; + String val = txt_value.getText(); + String repl = txt_replacement.getText(); + String type = cmb_type.getSelectionModel().getSelectedItem(); + String side = cmb_side.getSelectionModel().getSelectedItem(); + + if (side == null) { + isValid = false; + } + else if (type.equals("Block packet")) { + try { + int v = Integer.parseInt(val); + isValid = (v < (Short.MAX_VALUE * 2 + 2) && v > 0); + } + catch (Exception e) { + isValid = false; + } + } + else { + if (type.endsWith("packet")) { + try { + int v = Integer.parseInt(val); + isValid = (v < (Short.MAX_VALUE * 2 + 2) && v > 0); + if (isValid) { + HPacket packet = new HPacket(repl); + isValid = !packet.isCorrupted(); + } + } + catch (Exception e) { + isValid = false; + } + } + else if (type.endsWith("string")) { + isValid = !val.equals("") && !repl.equals("") && !val.equals(repl); + } + else if (type.endsWith("integer")) { + try { + int v1 = Integer.parseInt(val); + int v2 = Integer.parseInt(repl); + isValid = (v1 != v2); + } + catch (Exception e) { + isValid = false; + } + } + } + + btn_add.setDisable(!isValid); + + String[] spl = type.split(" "); + if (repl.equals("") && spl[0].equals("Replace")) { + if (spl[1].equals("packet")) { + txt_replacement.setPromptText("Enter a packet here"); + } + else if (spl[1].equals("integer")) { + txt_replacement.setPromptText("Enter an integer here"); + } + else if (spl[1].endsWith("string")) { + txt_replacement.setPromptText("Enter a string here"); + } + } + else { + txt_replacement.setPromptText(""); + } + + if (val.equals("")) { + if (spl[1].equals("packet")) { + txt_value.setPromptText("Enter the headerID"); + } + else if (spl[1].equals("integer")) { + txt_value.setPromptText("Enter an integer"); + } + else if (spl[1].endsWith("string")) { + txt_value.setPromptText("Enter a string"); + } + } + else { + txt_value.setPromptText(""); + } + } + + private void clearInput() { + txt_value.clear(); + txt_replacement.clear(); + refreshOptions(); + cmb_type.requestFocus(); } @Override protected void initExtension() { + Extension.MessageListener messageListener = message -> { + for (BlockReplaceRule rule : rules) { + rule.appendRuleToMessage(message); + } + }; + intercept(HMessage.Side.TOSERVER, messageListener); + intercept(HMessage.Side.TOCLIENT, messageListener); } @Override - public void setStageData(Stage primaryStage) throws Exception { + public ExtensionForm launchForm(Stage primaryStage) throws Exception { FXMLLoader loader = new FXMLLoader(BlockAndReplacePackets.class.getResource("blockreplace.fxml")); Parent root = loader.load(); primaryStage.setTitle("Packet blocker &/ replacer"); - primaryStage.setScene(new Scene(root, 580, 262)); - primaryStage.getScene().getStylesheets().add(GEarthController.class.getResource("bootstrap3.css").toExternalForm()); + primaryStage.setScene(new Scene(root)); + primaryStage.setResizable(false); + primaryStage.getScene().getStylesheets().add(GEarthController.class.getResource("/gearth/ui/bootstrap3.css").toExternalForm()); + + return loader.getController(); + } + + @Override + protected void onShow() { + Platform.runLater(() -> cmb_type.requestFocus()); + } + + public void click_btnAddRule(ActionEvent actionEvent) { + BlockReplaceRule rule = RuleFactory.getRule(cmb_type.getSelectionModel().getSelectedItem(), cmb_side.getSelectionModel().getSelectedItem(), txt_value.getText(), txt_replacement.getText()); + rules.add(rule); + rule.onDelete(observable -> rules.remove(rule)); + new RuleContainer(rule, vbox); + + + clearInput(); + } + + @Override + protected boolean canDelete() { + return false; } } diff --git a/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/RuleContainer.java b/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/RuleContainer.java new file mode 100644 index 0000000..9826502 --- /dev/null +++ b/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/RuleContainer.java @@ -0,0 +1,91 @@ +package extensions.blockreplacepackets; + +import extensions.blockreplacepackets.rules.BlockReplaceRule; +import gearth.ui.buttons.DeleteButton; +import gearth.ui.scheduler.ScheduleItem; +import javafx.beans.InvalidationListener; +import javafx.beans.Observable; +import javafx.event.EventHandler; +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.control.Label; +import javafx.scene.input.MouseEvent; +import javafx.scene.layout.ColumnConstraints; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.RowConstraints; +import javafx.scene.layout.VBox; +import javafx.scene.text.Font; + +/** + * Created by Jeunez on 6/11/2018. + */ +public class RuleContainer extends GridPane { + + public static final int[] columnWidths = {12, 14, 18, 33, 15, 6}; + + VBox parent; + BlockReplaceRule item; + + RuleContainer(BlockReplaceRule item, VBox parent) { + super(); + + this.parent = parent; + this.item = item; + + setGridLinesVisible(true); + VBox.setMargin(this, new Insets(2, -2, -2, -2)); + + setPrefWidth(parent.getWidth()); + setPrefHeight(23); + initialize(); + } + + private void initialize() { + + RowConstraints rowConstraints = new RowConstraints(23); + getRowConstraints().addAll(rowConstraints); + + for (int i = 0; i < columnWidths.length; i++) { + ColumnConstraints columnConstraints = new ColumnConstraints(20); + columnConstraints.setPercentWidth(columnWidths[i]); + getColumnConstraints().add(columnConstraints); + } + + Label optionLabel = initNewLabelColumn(item.option().name()); + Label typeLabel = initNewLabelColumn(item.type().name()); + Label valueLabel = initNewLabelColumn(item.value()); + Label replacementLabel = initNewLabelColumn(item.replacement()); + Label destinationLabel = initNewLabelColumn(item.side().name()); + + add(optionLabel, 0, 0); + add(typeLabel, 1, 0); + add(valueLabel, 2, 0); + add(replacementLabel, 3, 0); + add(destinationLabel, 4, 0); + + DeleteButton deleteButton = new DeleteButton(); + deleteButton.setAlignment(Pos.CENTER); + deleteButton.show(); + + RuleContainer thiss = this; + item.onDelete(observable -> parent.getChildren().remove(thiss)); + deleteButton.addEventHandler(MouseEvent.MOUSE_CLICKED, event -> item.delete()); + + add(deleteButton, 5, 0); + + + parent.getChildren().add(this); + } + + private Label initNewLabelColumn(String text) { + Label label = new Label(); +// label.setMaxWidth(Double.MAX_VALUE); +// label.setMinHeight(Double.MAX_VALUE); +// label.setAlignment(Pos.CENTER); + label.setFont(new Font(12)); + GridPane.setMargin(label, new Insets(0, 0, 0, 5)); + label.setText(text); + return label; + } + +} diff --git a/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/blockreplace.fxml b/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/blockreplace.fxml index 893f2a8..fb7940c 100644 --- a/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/blockreplace.fxml +++ b/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/blockreplace.fxml @@ -4,73 +4,144 @@ - - + - + - - - - - + + + + + + + + + + + + + + + + + + + - - - - - + - - - - - + + + + - + - - + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + + + + + + + + + diff --git a/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/BlockPacketRule.java b/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/BlockPacketRule.java new file mode 100644 index 0000000..3083cbb --- /dev/null +++ b/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/BlockPacketRule.java @@ -0,0 +1,54 @@ +package extensions.blockreplacepackets.rules; + +import gearth.protocol.HMessage; +import gearth.protocol.HPacket; + +/** + * Created by Jonas on 6/11/2018. + */ +public class BlockPacketRule extends BlockReplaceRule{ + + private int headerId; + private Side side; + + BlockPacketRule(Side side, int headerId) { + this.headerId = headerId; + this.side = side; + } + + @Override + public void appendRuleToMessage(HMessage message) { + if (side == Side.ALL + || (message.getDestination() == HMessage.Side.TOSERVER && side == Side.OUTGOING) + || (message.getDestination() == HMessage.Side.TOCLIENT && side ==Side.INCOMING)) { + if (message.getPacket().headerId() == headerId) { + message.setBlocked(true); + } + } + } + + @Override + public Option option() { + return Option.BLOCK; + } + + @Override + public Type type() { + return Type.PACKET; + } + + @Override + public Side side() { + return side; + } + + @Override + public String value() { + return headerId+""; + } + + @Override + public String replacement() { + return "/"; + } +} diff --git a/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/BlockReplaceRule.java b/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/BlockReplaceRule.java new file mode 100644 index 0000000..d1cc521 --- /dev/null +++ b/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/BlockReplaceRule.java @@ -0,0 +1,52 @@ +package extensions.blockreplacepackets.rules; + +import gearth.protocol.HMessage; +import javafx.beans.InvalidationListener; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by Jonas on 6/11/2018. + */ +public abstract class BlockReplaceRule { + + public enum Option { + BLOCK, + REPLACE + } + + public enum Type { + PACKET, + INTEGER, + STRING, + SUBSTRING + } + + public enum Side { + INCOMING, + OUTGOING, + ALL + } + + + public abstract void appendRuleToMessage(HMessage message); + + public abstract Option option(); + public abstract Type type(); + public abstract Side side(); + + public abstract String value(); + public abstract String replacement(); + + private List onDeleteListeners = new ArrayList<>(); + public void onDelete(InvalidationListener listener) { + onDeleteListeners.add(listener); + } + public void delete() { + for (int i = onDeleteListeners.size() - 1; i >= 0; i--) { + onDeleteListeners.get(i).invalidated(null); + } + } + +} diff --git a/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/ReplaceIntegerRule.java b/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/ReplaceIntegerRule.java new file mode 100644 index 0000000..fd06854 --- /dev/null +++ b/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/ReplaceIntegerRule.java @@ -0,0 +1,53 @@ +package extensions.blockreplacepackets.rules; + +import gearth.protocol.HMessage; + +/** + * Created by Jonas on 6/11/2018. + */ +public class ReplaceIntegerRule extends BlockReplaceRule { + + Side side; + int value; + int replacement; + + ReplaceIntegerRule(Side side, int value, int replacement) { + this.side = side; + this.value = value; + this.replacement = replacement; + } + + @Override + public void appendRuleToMessage(HMessage message) { + if (side == Side.ALL + || (message.getDestination() == HMessage.Side.TOSERVER && side == Side.OUTGOING) + || (message.getDestination() == HMessage.Side.TOCLIENT && side ==Side.INCOMING)) { + message.getPacket().replaceAllIntegers(value, replacement); + } + } + + @Override + public Option option() { + return Option.REPLACE; + } + + @Override + public Type type() { + return Type.INTEGER; + } + + @Override + public Side side() { + return side; + } + + @Override + public String value() { + return value+""; + } + + @Override + public String replacement() { + return replacement+""; + } +} diff --git a/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/ReplacePacketRule.java b/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/ReplacePacketRule.java new file mode 100644 index 0000000..bd49b13 --- /dev/null +++ b/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/ReplacePacketRule.java @@ -0,0 +1,57 @@ +package extensions.blockreplacepackets.rules; + +import gearth.protocol.HMessage; +import gearth.protocol.HPacket; + +/** + * Created by Jeunez on 6/11/2018. + */ +public class ReplacePacketRule extends BlockReplaceRule { + + private Side side; + private int headerId; + private HPacket replacement; + + ReplacePacketRule(Side side, int headerId, HPacket replacement) { + this.side = side; + this.headerId = headerId; + this.replacement = replacement; + } + + @Override + public void appendRuleToMessage(HMessage message) { + if (side == Side.ALL + || (message.getDestination() == HMessage.Side.TOSERVER && side == Side.OUTGOING) + || (message.getDestination() == HMessage.Side.TOCLIENT && side ==Side.INCOMING)) { + if (message.getPacket().headerId() == headerId) { + message.getPacket().constructFromString(replacement.stringify()); + message.getPacket().overrideEditedField(true); + } + } + } + + @Override + public Option option() { + return Option.REPLACE; + } + + @Override + public Type type() { + return Type.PACKET; + } + + @Override + public Side side() { + return side; + } + + @Override + public String value() { + return headerId+""; + } + + @Override + public String replacement() { + return replacement.toString(); + } +} diff --git a/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/ReplaceStringRule.java b/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/ReplaceStringRule.java new file mode 100644 index 0000000..c783e88 --- /dev/null +++ b/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/ReplaceStringRule.java @@ -0,0 +1,53 @@ +package extensions.blockreplacepackets.rules; + +import gearth.protocol.HMessage; + +/** + * Created by Jonas on 6/11/2018. + */ +public class ReplaceStringRule extends BlockReplaceRule { + + private Side side; + private String value; + private String replacement; + + ReplaceStringRule(Side side, String value, String replacement) { + this.side = side; + this.value = value; + this.replacement = replacement; + } + + @Override + public void appendRuleToMessage(HMessage message) { + if (side == Side.ALL + || (message.getDestination() == HMessage.Side.TOSERVER && side == Side.OUTGOING) + || (message.getDestination() == HMessage.Side.TOCLIENT && side ==Side.INCOMING)) { + message.getPacket().replaceAllStrings(value, replacement); + } + } + + @Override + public Option option() { + return Option.REPLACE; + } + + @Override + public Type type() { + return Type.STRING; + } + + @Override + public Side side() { + return side; + } + + @Override + public String value() { + return value; + } + + @Override + public String replacement() { + return replacement; + } +} diff --git a/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/ReplaceSubstringRule.java b/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/ReplaceSubstringRule.java new file mode 100644 index 0000000..f2ed9e6 --- /dev/null +++ b/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/ReplaceSubstringRule.java @@ -0,0 +1,53 @@ +package extensions.blockreplacepackets.rules; + +import gearth.protocol.HMessage; + +/** + * Created by Jonas on 6/11/2018. + */ +public class ReplaceSubstringRule extends BlockReplaceRule { + + private Side side; + private String value; + private String replacement; + + ReplaceSubstringRule(Side side, String value, String replacement) { + this.side = side; + this.value = value; + this.replacement = replacement; + } + + @Override + public void appendRuleToMessage(HMessage message) { + if (side == Side.ALL + || (message.getDestination() == HMessage.Side.TOSERVER && side == Side.OUTGOING) + || (message.getDestination() == HMessage.Side.TOCLIENT && side ==Side.INCOMING)) { + message.getPacket().replaceAllSubstrings(value, replacement); + } + } + + @Override + public Option option() { + return Option.REPLACE; + } + + @Override + public Type type() { + return Type.SUBSTRING; + } + + @Override + public Side side() { + return side; + } + + @Override + public String value() { + return value; + } + + @Override + public String replacement() { + return replacement; + } +} diff --git a/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/RuleFactory.java b/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/RuleFactory.java new file mode 100644 index 0000000..051bc28 --- /dev/null +++ b/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/RuleFactory.java @@ -0,0 +1,35 @@ +package extensions.blockreplacepackets.rules; + +import gearth.protocol.HPacket; + +/** + * Created by Jonas on 6/11/2018. + */ +public class RuleFactory { + + public static BlockReplaceRule getRule(String type, String side, String value, String replacement) { + BlockReplaceRule.Option rOption = BlockReplaceRule.Option.valueOf(type.split(" ")[0].toUpperCase()); + BlockReplaceRule.Type rType = BlockReplaceRule.Type.valueOf(type.split(" ")[1].toUpperCase()); + BlockReplaceRule.Side rSide = BlockReplaceRule.Side.valueOf(side.toUpperCase()); + + if (rOption == BlockReplaceRule.Option.BLOCK) { + return new BlockPacketRule(rSide, Integer.parseInt(value)); + } + if (rOption == BlockReplaceRule.Option.REPLACE) { + if (rType == BlockReplaceRule.Type.INTEGER) { + return new ReplaceIntegerRule(rSide, Integer.parseInt(value), Integer.parseInt(replacement)); + } + if (rType == BlockReplaceRule.Type.PACKET) { + return new ReplacePacketRule(rSide, Integer.parseInt(value), new HPacket(replacement)); + } + if (rType == BlockReplaceRule.Type.STRING) { + return new ReplaceStringRule(rSide, value, replacement); + } + if (rType == BlockReplaceRule.Type.SUBSTRING) { + return new ReplaceSubstringRule(rSide, value, replacement); + } + } + return null; + } + +} diff --git a/Extensions/SpeechColorizer/pom.xml b/Extensions/SpeechColorizer/pom.xml index 54ae551..405e87c 100644 --- a/Extensions/SpeechColorizer/pom.xml +++ b/Extensions/SpeechColorizer/pom.xml @@ -13,7 +13,7 @@ G-Earth G-Earth-Parent - 0.0.1-beta + 0.2 @@ -30,53 +30,6 @@ - - org.apache.maven.plugins - maven-compiler-plugin - 3.7.0 - - 1.8 - 1.8 - - - - - maven-resources-plugin - 2.6 - - - copy-resources - validate - - copy-resources - - - ${project.build.directory} - - - src/main/resources - - - - - - - - - maven-dependency-plugin - - - package - - copy-dependencies - - - ${project.build.directory}/bin/lib - - - - - org.apache.maven.plugins maven-jar-plugin @@ -93,12 +46,13 @@ true - ${artifactId} + ${project.artifactId} maven-assembly-plugin + 2.5 package @@ -108,7 +62,7 @@ - ${project.parent.basedir}/target/bin + ${project.build.directory}/bin extensions.speechcolorizer.SpeechColorizer @@ -117,6 +71,8 @@ jar-with-dependencies + ${project.artifactId} + false @@ -125,8 +81,8 @@ G-Earth - G-Earth-UI - 0.0.1-beta + G-Earth + 0.2 diff --git a/Extensions/SpeechColorizer/src/main/java/extensions/speechcolorizer/SpeechColorizer.java b/Extensions/SpeechColorizer/src/main/java/extensions/speechcolorizer/SpeechColorizer.java index f01feb7..ce9f769 100644 --- a/Extensions/SpeechColorizer/src/main/java/extensions/speechcolorizer/SpeechColorizer.java +++ b/Extensions/SpeechColorizer/src/main/java/extensions/speechcolorizer/SpeechColorizer.java @@ -12,8 +12,7 @@ import java.util.Random; */ /** - * - getTitle(), getDescription(), getVersion() and getAuthor() must be implemented - * + * This is an example extension and is not included in a G-Earth release */ @ExtensionInfo( diff --git a/G-Earth-UI/src/main/java/gearth/Main.java b/G-Earth-UI/src/main/java/gearth/Main.java deleted file mode 100644 index 06c87c7..0000000 --- a/G-Earth-UI/src/main/java/gearth/Main.java +++ /dev/null @@ -1,43 +0,0 @@ -package gearth; - -import javafx.application.Application; -import javafx.application.Platform; -import javafx.fxml.FXMLLoader; -import javafx.scene.Parent; -import javafx.scene.Scene; -import javafx.stage.Stage; -import gearth.ui.GEarthController; - -// run as root issue Invalid MIT-MAGIC-COOKIE-1 key fix: https://stackoverflow.com/questions/48139447/invalid-mit-magic-cookie-1-key - -public class Main extends Application { - - @Override - public void start(Stage primaryStage) throws Exception{ - FXMLLoader loader = new FXMLLoader(GEarthController.class.getResource("G-Earth.fxml")); - Parent root = loader.load(); - - GEarthController companion = loader.getController(); - companion.setStage(primaryStage); - - primaryStage.setResizable(false); - //primaryStage.initStyle(StageStyle.UNDECORATED); - primaryStage.setTitle("G-Earth"); - primaryStage.setScene(new Scene(root, 620, 295)); - primaryStage.show(); - primaryStage.getScene().getStylesheets().add(GEarthController.class.getResource("bootstrap3.css").toExternalForm()); - - primaryStage.setOnCloseRequest( event -> { - companion.abort(); - Platform.exit(); - }); - - } - - public static String[] args; - - public static void main(String[] args) { - Main.args = args; - launch(args); - } -} diff --git a/G-Earth-UI/src/main/java/gearth/extensions/ExtensionForm.java b/G-Earth-UI/src/main/java/gearth/extensions/ExtensionForm.java deleted file mode 100644 index 75d04fd..0000000 --- a/G-Earth-UI/src/main/java/gearth/extensions/ExtensionForm.java +++ /dev/null @@ -1,114 +0,0 @@ -package gearth.extensions; - -import javafx.application.Application; -import javafx.application.Platform; -import javafx.stage.Stage; -import gearth.protocol.HMessage; -import gearth.protocol.HPacket; - -/** - * Created by Jonas on 22/09/18. - */ -public abstract class ExtensionForm extends Application { - - private Extension extension = null; - protected static String[] args; - private volatile Stage primaryStage = null; - - @Override - public void start(Stage primaryStage) throws Exception { - Platform.setImplicitExit(false); - setStageData(primaryStage); - this.primaryStage = primaryStage; - primaryStage.setOnCloseRequest(event -> { - event.consume(); - Platform.runLater(primaryStage::hide); - }); - ExtensionForm thiss = this; - - ExtensionInfo extInfo = getClass().getAnnotation(ExtensionInfo.class); - - Thread t = new Thread(() -> { - extension = new Extension(args) { - @Override - protected void init() { - thiss.initExtension(); - } - - @Override - protected void onClick() { - thiss.onClick(); - } - - @Override - protected void onStartConnection() { - thiss.onStartConnection(); - } - - @Override - protected void onEndConnection() { - thiss.onEndConnection(); - } - - @Override - ExtensionInfo getInfoAnnotations() { - return extInfo; - } - }; - extension.run(); -// Platform.runLater(primaryStage::close); - //when the extension has ended, close this process - Platform.exit(); - }); - t.start(); - } - - public abstract void setStageData(Stage primaryStage) throws Exception; - - - //wrap extension methods - protected boolean requestFlags(Extension.FlagsCheckListener flagRequestCallback){ - return extension.requestFlags(flagRequestCallback); - } - protected void writeToConsole(String s) { - extension.writeToConsole(s); - } - protected void intercept(HMessage.Side side, Extension.MessageListener messageListener) { - extension.intercept(side, messageListener); - } - protected void intercept(HMessage.Side side, int headerId, Extension.MessageListener messageListener){ - extension.intercept(side, headerId, messageListener); - } - protected boolean sendToServer(HPacket packet){ - return extension.sendToServer(packet); - } - protected boolean sendToClient(HPacket packet){ - return extension.sendToClient(packet); - } - - - /** - * Gets called when a connection has been established with G-Earth. - * This does not imply a connection with Habbo is setup. - */ - protected void initExtension(){} - - /** - * The application got doubleclicked from the G-Earth interface. Doing something here is optional - */ - private void onClick(){ - Platform.runLater(() -> { - primaryStage.show(); - }); - } - - /** - * A connection with Habbo has been started - */ - protected void onStartConnection(){} - - /** - * A connection with Habbo has ended - */ - protected void onEndConnection(){} -} diff --git a/G-Earth-UI/src/main/java/gearth/ui/G-Earth.fxml b/G-Earth-UI/src/main/java/gearth/ui/G-Earth.fxml deleted file mode 100644 index 0541f2f..0000000 --- a/G-Earth-UI/src/main/java/gearth/ui/G-Earth.fxml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/G-Earth-UI/src/main/java/gearth/ui/connection/Connection.fxml b/G-Earth-UI/src/main/java/gearth/ui/connection/Connection.fxml deleted file mode 100644 index 8c15eb6..0000000 --- a/G-Earth-UI/src/main/java/gearth/ui/connection/Connection.fxml +++ /dev/null @@ -1,207 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/G-Earth-UI/src/main/java/gearth/ui/extensions/Extensions.fxml b/G-Earth-UI/src/main/java/gearth/ui/extensions/Extensions.fxml deleted file mode 100644 index 6cba7b5..0000000 --- a/G-Earth-UI/src/main/java/gearth/ui/extensions/Extensions.fxml +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/G-Earth-UI/src/main/java/gearth/ui/logger/Logger.fxml b/G-Earth-UI/src/main/java/gearth/ui/logger/Logger.fxml deleted file mode 100644 index d903d11..0000000 --- a/G-Earth-UI/src/main/java/gearth/ui/logger/Logger.fxml +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/G-Earth-UI/src/main/java/gearth/ui/scheduler/Scheduler.fxml b/G-Earth-UI/src/main/java/gearth/ui/scheduler/Scheduler.fxml deleted file mode 100644 index 447e01c..0000000 --- a/G-Earth-UI/src/main/java/gearth/ui/scheduler/Scheduler.fxml +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/G-Earth-UI/src/main/java/gearth/ui/tools/Tools.fxml b/G-Earth-UI/src/main/java/gearth/ui/tools/Tools.fxml deleted file mode 100644 index 98848fa..0000000 --- a/G-Earth-UI/src/main/java/gearth/ui/tools/Tools.fxml +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/G-Earth-UI/pom.xml b/G-Earth/pom.xml similarity index 51% rename from G-Earth-UI/pom.xml rename to G-Earth/pom.xml index 2643b90..23961fe 100644 --- a/G-Earth-UI/pom.xml +++ b/G-Earth/pom.xml @@ -4,80 +4,21 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - G-Earth-UI + G-Earth jar - 0.0.1-beta + 0.2 G-Earth G-Earth-Parent - 0.0.1-beta + 0.2 - - - - false - src/main/java - - **/*.fxml - **/*.css - **/*.png - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.7.0 - - 1.8 - 1.8 - - - - - maven-dependency-plugin - - - package - - copy-dependencies - - - ${project.build.directory}/bin/lib - - - - - - - maven-resources-plugin - 2.6 - - - copy-resources - validate - - copy-resources - - - ${project.build.directory} - - - src/main/resources - - - - - - @@ -100,6 +41,7 @@ maven-assembly-plugin + 2.5 package @@ -109,7 +51,7 @@ - ${project.parent.basedir}/bin + ${project.build.directory}/bin gearth.Main @@ -136,5 +78,10 @@ richtextfx 0.9.1 + + org.jsoup + jsoup + 1.11.2 + \ No newline at end of file diff --git a/G-Earth-UI/src/META-INF/MANIFEST.MF b/G-Earth/src/META-INF/MANIFEST.MF similarity index 100% rename from G-Earth-UI/src/META-INF/MANIFEST.MF rename to G-Earth/src/META-INF/MANIFEST.MF diff --git a/G-Earth/src/main/java/gearth/Main.java b/G-Earth/src/main/java/gearth/Main.java new file mode 100644 index 0000000..6e2f28e --- /dev/null +++ b/G-Earth/src/main/java/gearth/Main.java @@ -0,0 +1,124 @@ +package gearth; + +import gearth.misc.AdminValidator; +import javafx.application.Application; +import javafx.application.Platform; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.fxml.FXMLLoader; +import javafx.scene.Parent; +import javafx.scene.Scene; +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 org.omg.CORBA.Environment; + +import java.io.IOException; + +// run as root issue Invalid MIT-MAGIC-COOKIE-1 key fix: https://stackoverflow.com/questions/48139447/invalid-mit-magic-cookie-1-key + +public class Main extends Application { + + public static Application main; + public static String version = "0.2"; + private static String gitApi = "https://api.github.com/repos/sirjonasxx/G-Earth/releases/latest"; + + @Override + public void start(Stage primaryStage) throws Exception{ + main = this; + + FXMLLoader loader = new FXMLLoader(getClass().getResource("/gearth/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.setResizable(false); + //primaryStage.initStyle(StageStyle.UNDECORATED); + primaryStage.setTitle("G-Earth " + version); + primaryStage.setScene(new Scene(root, 620, 295)); + primaryStage.show(); + primaryStage.getScene().getStylesheets().add(getClass().getResource("/gearth/ui/bootstrap3.css").toExternalForm()); + + primaryStage.setOnCloseRequest( event -> { + companion.abort(); + Platform.exit(); + + // Platform.exit doesn't seem to be enough on Windows? + System.exit(0); + }); + + new Thread(() -> { + if (!AdminValidator.isAdmin()) { + Platform.runLater(() -> { + 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.show(); + }); + + } + }).start(); + + new Thread(() -> { + try { + String s = Jsoup.connect(gitApi).ignoreContentType(true).get().body().toString(); + s = s.substring(6, s.length() - 7); + JSONObject object = new JSONObject(s); + String gitv = (String)object.get("tag_name"); + if (!gitv.equals(version)) { + Platform.runLater(() -> { + Alert alert = new Alert(Alert.AlertType.INFORMATION, "G-Earth is outdated!", ButtonType.OK); + + FlowPane fp = new FlowPane(); + Label lbl = new Label("A new version of G-Earth has been found ("+gitv+")" + System.lineSeparator()+ System.lineSeparator() + "Update to the latest version:"); + Hyperlink link = new Hyperlink("https://github.com/sirjonasxx/G-Earth/releases"); + fp.getChildren().addAll( lbl, link); + link.setOnAction(event -> { + Main.main.getHostServices().showDocument(link.getText()); + event.consume(); + }); + + + + WebView webView = new WebView(); + webView.getEngine().loadContent("A new version of G-Earth has been found ("+gitv+")

Update to the latest version:
https://github.com/sirjonasxx/G-Earth/releases"); + webView.setPrefSize(500, 200); + alert.getDialogPane().setMinHeight(Region.USE_PREF_SIZE); + alert.getDialogPane().setContent(fp); + alert.show(); + }); + } + + } catch (IOException e) { +// e.printStackTrace(); + } + }).start(); + + } + + public static String[] args; + + public static void main(String[] args) { + Main.args = args; + launch(args); + } + + public static boolean hasFlag(String flag) { + for(String s : args) { + if (s.equals(flag)) { + return true; + } + } + return false; + } +} diff --git a/G-Earth-UI/src/main/java/gearth/extensions/Extension.java b/G-Earth/src/main/java/gearth/extensions/Extension.java similarity index 93% rename from G-Earth-UI/src/main/java/gearth/extensions/Extension.java rename to G-Earth/src/main/java/gearth/extensions/Extension.java index b4dc3e0..f720a01 100644 --- a/G-Earth-UI/src/main/java/gearth/extensions/Extension.java +++ b/G-Earth/src/main/java/gearth/extensions/Extension.java @@ -23,13 +23,14 @@ public abstract class Extension { void act(String[] args); } - protected static final boolean CANLEAVE = true; // can you disconnect the ext - protected static final boolean CANDELETE = true; // can you delete the ext (will be false for some built-in extensions) + protected boolean canLeave; // can you disconnect the ext + protected boolean canDelete; // can you delete the ext (will be false for some built-in extensions) private String[] args; private boolean isCorrupted = false; private static final String[] PORT_FLAG = {"--port", "-p"}; private static final String[] FILE_FLAG = {"--filename", "-f"}; + private static final String[] COOKIE_FLAG = {"--auth-token", "-c"}; // don't add a cookie or filename when debugging private OutputStream out = null; private final Map> incomingMessageListeners = new HashMap<>(); @@ -52,6 +53,9 @@ public abstract class Extension { * @param args arguments */ public Extension(String[] args) { + canLeave = canLeave(); + canDelete = canDelete(); + //obtain port this.args = args; @@ -81,6 +85,7 @@ public abstract class Extension { int port = Integer.parseInt(getArgument(args, PORT_FLAG)); String file = getArgument(args, FILE_FLAG); + String cookie = getArgument(args, COOKIE_FLAG); Socket gEarthExtensionServer = null; try { @@ -123,8 +128,9 @@ public abstract class Extension { .appendBoolean(isOnClickMethodUsed()) .appendBoolean(file != null) .appendString(file == null ? "": file) - .appendBoolean(CANLEAVE) - .appendBoolean(CANDELETE); + .appendString(cookie == null ? "" : cookie) + .appendBoolean(canLeave) + .appendBoolean(canDelete); writeToStream(response.toBytes()); } else if (packet.headerId() == Extensions.OUTGOING_MESSAGES_IDS.CONNECTIONSTART) { @@ -183,10 +189,10 @@ public abstract class Extension { } for(MessageListener listener : correctListeners) { - habboMessage.getPacket().setReadIndex(6); + habboMessage.getPacket().resetReadIndex(); listener.act(habboMessage); } - habboMessage.getPacket().setReadIndex(6); + habboMessage.getPacket().resetReadIndex(); HPacket response = new HPacket(Extensions.INCOMING_MESSAGES_IDS.MANIPULATEDPACKET); response.appendLongString(habboMessage.stringify()); @@ -345,6 +351,14 @@ public abstract class Extension { */ protected void onEndConnection(){} + protected boolean canLeave() { + return true; + } + + protected boolean canDelete() { + return true; + } + ExtensionInfo getInfoAnnotations() { return getClass().getAnnotation(ExtensionInfo.class); diff --git a/G-Earth/src/main/java/gearth/extensions/ExtensionForm.java b/G-Earth/src/main/java/gearth/extensions/ExtensionForm.java new file mode 100644 index 0000000..e24a816 --- /dev/null +++ b/G-Earth/src/main/java/gearth/extensions/ExtensionForm.java @@ -0,0 +1,85 @@ +package gearth.extensions; + +import javafx.application.Application; +import javafx.application.Platform; +import javafx.stage.Stage; +import gearth.protocol.HMessage; +import gearth.protocol.HPacket; + +import java.util.concurrent.Semaphore; + +/** + * Created by Jonas on 22/09/18. + */ +public abstract class ExtensionForm { + + volatile Extension extension; + volatile Stage primaryStage; + + protected static void runExtensionForm(String[] args, Class extension) { + ExtensionFormLauncher launcher = new ExtensionFormLauncher(); + launcher.trigger(extension, args); + } + + + public abstract ExtensionForm launchForm(Stage primaryStage) throws Exception; + + //wrap extension methods + protected boolean requestFlags(Extension.FlagsCheckListener flagRequestCallback){ + return extension.requestFlags(flagRequestCallback); + } + protected void writeToConsole(String s) { + extension.writeToConsole(s); + } + protected void intercept(HMessage.Side side, Extension.MessageListener messageListener) { + extension.intercept(side, messageListener); + } + protected void intercept(HMessage.Side side, int headerId, Extension.MessageListener messageListener){ + extension.intercept(side, headerId, messageListener); + } + protected boolean sendToServer(HPacket packet){ + return extension.sendToServer(packet); + } + protected boolean sendToClient(HPacket packet){ + return extension.sendToClient(packet); + } + + protected void onShow(){}; + protected void onHide(){}; + + /** + * Gets called when a connection has been established with G-Earth. + * This does not imply a connection with Habbo is setup. + */ + protected void initExtension(){} + + /** + * The application got doubleclicked from the G-Earth interface. Doing something here is optional + */ + protected void onClick(){ + Platform.runLater(() -> { + primaryStage.show(); + primaryStage.requestFocus(); + primaryStage.toFront(); + onShow(); + }); + } + + /** + * A connection with Habbo has been started + */ + protected void onStartConnection(){} + + /** + * A connection with Habbo has ended + */ + protected void onEndConnection(){} + + protected boolean canLeave() { + return true; + } + + protected boolean canDelete() { + return true; + } +} diff --git a/G-Earth/src/main/java/gearth/extensions/ExtensionFormLauncher.java b/G-Earth/src/main/java/gearth/extensions/ExtensionFormLauncher.java new file mode 100644 index 0000000..b0c7253 --- /dev/null +++ b/G-Earth/src/main/java/gearth/extensions/ExtensionFormLauncher.java @@ -0,0 +1,83 @@ +package gearth.extensions; + +import javafx.application.Application; +import javafx.application.Platform; +import javafx.stage.Stage; + +/** + * Created by Jeunez on 6/11/2018. + */ +public class ExtensionFormLauncher extends Application{ + + private static Class extension; + private static String[] args; + + @Override + public void start(Stage primaryStage) throws Exception { + ExtensionInfo extInfo = extension.getAnnotation(ExtensionInfo.class); + + ExtensionForm creator = extension.newInstance(); + ExtensionForm extensionForm = creator.launchForm(primaryStage); + + extensionForm.extension = new Extension(args) { + @Override + protected void init() { + extensionForm.initExtension(); + } + + @Override + protected void onClick() { + extensionForm.onClick(); + } + + @Override + protected void onStartConnection() { + extensionForm.onStartConnection(); + } + + @Override + protected void onEndConnection() { + extensionForm.onEndConnection(); + } + + @Override + ExtensionInfo getInfoAnnotations() { + return extInfo; + } + + @Override + protected boolean canLeave() { + return extensionForm.canLeave(); + } + + @Override + protected boolean canDelete() { + return extensionForm.canDelete(); + } + }; + extensionForm.primaryStage = primaryStage; + Thread t = new Thread(() -> { + extensionForm.extension.run(); + //when the extension has ended, close this process + System.exit(0); + }); + t.start(); + + Platform.setImplicitExit(false); + + primaryStage.setOnCloseRequest(event -> { + event.consume(); + Platform.runLater(() -> { + primaryStage.hide(); + extensionForm.onHide(); + }); + }); + } + + public static void trigger( Class extension, String[] args) { + ExtensionFormLauncher.extension = extension; + ExtensionFormLauncher.args = args; + launch(args); + } + +} diff --git a/G-Earth-UI/src/main/java/gearth/extensions/ExtensionInfo.java b/G-Earth/src/main/java/gearth/extensions/ExtensionInfo.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/extensions/ExtensionInfo.java rename to G-Earth/src/main/java/gearth/extensions/ExtensionInfo.java diff --git a/G-Earth-UI/src/main/java/gearth/extensions/extra/Inspector.java b/G-Earth/src/main/java/gearth/extensions/extra/Inspector.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/extensions/extra/Inspector.java rename to G-Earth/src/main/java/gearth/extensions/extra/Inspector.java diff --git a/G-Earth/src/main/java/gearth/misc/AdminValidator.java b/G-Earth/src/main/java/gearth/misc/AdminValidator.java new file mode 100644 index 0000000..ca31aab --- /dev/null +++ b/G-Earth/src/main/java/gearth/misc/AdminValidator.java @@ -0,0 +1,37 @@ +package gearth.misc; + +import java.io.PrintStream; +import java.util.prefs.Preferences; + +/** + * Created by Jonas on 5/11/2018. + */ +public class AdminValidator { + + //https://stackoverflow.com/questions/4350356/detect-if-java-application-was-run-as-a-windows-admin + + private static Boolean isAdmin = null; + + public static boolean isAdmin() { + if (isAdmin == null) { + Preferences prefs = Preferences.systemRoot(); + PrintStream systemErr = System.err; + synchronized(systemErr){ // better synchroize to avoid problems with other threads that access System.err + System.setErr(null); + try{ + prefs.put("foo", "bar"); // SecurityException on Windows + prefs.remove("foo"); + prefs.flush(); // BackingStoreException on Linux + isAdmin = true; + }catch(Exception e){ + isAdmin = false; + }finally{ + System.setErr(systemErr); + } + } + } + + return isAdmin; + } + +} diff --git a/G-Earth-UI/src/main/java/gearth/misc/Cacher.java b/G-Earth/src/main/java/gearth/misc/Cacher.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/misc/Cacher.java rename to G-Earth/src/main/java/gearth/misc/Cacher.java diff --git a/G-Earth-UI/src/main/java/gearth/misc/ConfirmationDialog.java b/G-Earth/src/main/java/gearth/misc/ConfirmationDialog.java similarity index 79% rename from G-Earth-UI/src/main/java/gearth/misc/ConfirmationDialog.java rename to G-Earth/src/main/java/gearth/misc/ConfirmationDialog.java index 3f9e7c6..1287a4b 100644 --- a/G-Earth-UI/src/main/java/gearth/misc/ConfirmationDialog.java +++ b/G-Earth/src/main/java/gearth/misc/ConfirmationDialog.java @@ -7,14 +7,17 @@ import javafx.scene.control.ButtonType; import javafx.scene.control.CheckBox; import javafx.scene.control.DialogPane; +import java.util.HashSet; +import java.util.Set; + /** * Created by Jonas on 27/09/18. */ public class ConfirmationDialog { - public static boolean showDialog = true; + private static Set ignoreDialogs = new HashSet<>(); - public static Alert createAlertWithOptOut(Alert.AlertType type, String title, String headerText, + public static Alert createAlertWithOptOut(Alert.AlertType type, String dialogKey, String title, String headerText, String message, String optOutMessage, /*Callback optOutAction,*/ ButtonType... buttonTypes) { Alert alert = new Alert(type); @@ -29,7 +32,11 @@ public class ConfirmationDialog { protected Node createDetailsButton() { CheckBox optOut = new CheckBox(); optOut.setText(optOutMessage); - optOut.setOnAction(event -> showDialog = !optOut.isSelected()); + optOut.setOnAction(event -> { + if (optOut.isSelected()) { + ignoreDialogs.add(dialogKey); + } + }); return optOut; } }); @@ -46,5 +53,8 @@ public class ConfirmationDialog { return alert; } + public static boolean showDialog(String dialogKey) { + return !ignoreDialogs.contains(dialogKey); + } } diff --git a/G-Earth-UI/src/main/java/gearth/misc/OSValidator.java b/G-Earth/src/main/java/gearth/misc/OSValidator.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/misc/OSValidator.java rename to G-Earth/src/main/java/gearth/misc/OSValidator.java diff --git a/G-Earth-UI/src/main/java/gearth/misc/StringifyAble.java b/G-Earth/src/main/java/gearth/misc/StringifyAble.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/misc/StringifyAble.java rename to G-Earth/src/main/java/gearth/misc/StringifyAble.java diff --git a/G-Earth-UI/src/main/java/gearth/protocol/HConnection.java b/G-Earth/src/main/java/gearth/protocol/HConnection.java similarity index 93% rename from G-Earth-UI/src/main/java/gearth/protocol/HConnection.java rename to G-Earth/src/main/java/gearth/protocol/HConnection.java index a3c9763..9c93d08 100644 --- a/G-Earth-UI/src/main/java/gearth/protocol/HConnection.java +++ b/G-Earth/src/main/java/gearth/protocol/HConnection.java @@ -111,6 +111,7 @@ public class HConnection { private volatile boolean autoDetectHost = false; private volatile String clientHostAndPort = ""; + private volatile String hotelVersion = ""; public State getState() { @@ -249,33 +250,33 @@ public class HConnection { if (DEBUG) System.out.println(habbo_server.getLocalAddress().getHostAddress() + ": " + habbo_server.getLocalPort()); final boolean[] aborted = new boolean[1]; - Rc4Obtainer rc4Obtainer = new Rc4Obtainer(this); + OutgoingHandler outgoingHandler = new OutgoingHandler(habbo_server_out, trafficListeners); + rc4Obtainer.setOutgoingHandler(outgoingHandler); + + IncomingHandler incomingHandler = new IncomingHandler(client_out, trafficListeners); + rc4Obtainer.setIncomingHandler(incomingHandler); + + outgoingHandler.addOnDatastreamConfirmedListener(hotelVersion -> { + this.hotelVersion = hotelVersion; + incomingHandler.setAsDataStream(); + clientHostAndPort = client.getLocalAddress().getHostAddress() + ":" + client.getPort(); + if (DEBUG) System.out.println(clientHostAndPort); + setState(State.CONNECTED); + onConnect(); + outHandler = outgoingHandler; + inHandler = incomingHandler; + }); + // wachten op data van client new Thread(() -> { try { - OutgoingHandler handler = new OutgoingHandler(habbo_server_out, trafficListeners); - rc4Obtainer.setOutgoingHandler(handler); - while (!client.isClosed() && (state == State.WAITING_FOR_CLIENT || state == State.CONNECTED)) { byte[] buffer; while (client_in.available() > 0) { client_in.read(buffer = new byte[client_in.available()]); - - handler.act(buffer); - if (!datastream[0] && handler.isDataStream()) { - clientHostAndPort = client.getLocalAddress().getHostAddress() + ":" + client.getPort(); - if (DEBUG) System.out.println(clientHostAndPort); - datastream[0] = true; - setState(State.CONNECTED); - onConnect(); - - outHandler = handler; - //client_outputStream = client_out; - //server_outputStream = habbo_server_out; - } - + outgoingHandler.act(buffer); } Thread.sleep(1); @@ -307,18 +308,11 @@ public class HConnection { // wachten op data van server new Thread(() -> { try { - IncomingHandler handler = new IncomingHandler(client_out, trafficListeners); - rc4Obtainer.setIncomingHandler(handler); - while (!habbo_server.isClosed() && (state == State.CONNECTED || state == State.WAITING_FOR_CLIENT)) { byte[] buffer; while (habbo_server_in.available() > 0) { habbo_server_in.read(buffer = new byte[habbo_server_in.available()]); - if (!handler.isDataStream() && datastream[0]) { - handler.setAsDataStream(); - inHandler = handler; - } - handler.act(buffer); + incomingHandler.act(buffer); } Thread.sleep(1); } @@ -434,6 +428,7 @@ public class HConnection { if (state != this.state) { if (state != State.CONNECTED) { clientHostAndPort = ""; + hotelVersion = ""; } State buffer = this.state; @@ -510,4 +505,7 @@ public class HConnection { return clientHostAndPort; } + public String getHotelVersion() { + return hotelVersion; + } } diff --git a/G-Earth-UI/src/main/java/gearth/protocol/HMessage.java b/G-Earth/src/main/java/gearth/protocol/HMessage.java similarity index 87% rename from G-Earth-UI/src/main/java/gearth/protocol/HMessage.java rename to G-Earth/src/main/java/gearth/protocol/HMessage.java index a64a8d1..dbf1406 100644 --- a/G-Earth-UI/src/main/java/gearth/protocol/HMessage.java +++ b/G-Earth/src/main/java/gearth/protocol/HMessage.java @@ -19,6 +19,10 @@ public class HMessage implements StringifyAble { constructFromString(fromString); } + public HMessage(HMessage message) { + constructFromHMessage(message); + } + public HMessage(HPacket packet, Side side, int index) { this.side = side; this.hPacket = packet; @@ -66,6 +70,13 @@ public class HMessage implements StringifyAble { this.hPacket = p; } + public void constructFromHMessage(HMessage message) { + this.isBlocked = message.isBlocked(); + this.index = message.getIndex(); + this.side = message.getDestination(); + this.hPacket = new HPacket(message.getPacket()); + } + @Override public boolean equals(Object obj) { if (!(obj instanceof HMessage)) return false; diff --git a/G-Earth-UI/src/main/java/gearth/protocol/HPacket.java b/G-Earth/src/main/java/gearth/protocol/HPacket.java similarity index 92% rename from G-Earth-UI/src/main/java/gearth/protocol/HPacket.java rename to G-Earth/src/main/java/gearth/protocol/HPacket.java index f87dc87..f7a8ed7 100644 --- a/G-Earth-UI/src/main/java/gearth/protocol/HPacket.java +++ b/G-Earth/src/main/java/gearth/protocol/HPacket.java @@ -17,6 +17,10 @@ public class HPacket implements StringifyAble { public HPacket(byte[] packet) { packetInBytes = packet.clone(); } + public HPacket(HPacket packet) { + packetInBytes = packet.packetInBytes.clone(); + isEdited = packet.isEdited; + } public HPacket(String packet) { packetInBytes = fromStringToBytes(fromExpressionToString(packet)); } @@ -442,20 +446,85 @@ public class HPacket implements StringifyAble { return this; } + private boolean canReadString(int index) { + if (index < packetInBytes.length - 1) { + int l = readUshort(index); + if (index + 1 + l < packetInBytes.length) { + return true; + } + } + return false; + } + //returns if done r not - public boolean replaceFirstString(String oldS, String newS) { + public HPacket replaceFirstString(String oldS, String newS) { + return replaceXStrings(oldS, newS, 1); + } + public HPacket replaceXStrings(String oldS, String newS, int amount) { + if (amount == 0) return this; + int i = 6; while (i < packetInBytes.length - 1 - oldS.length()) { if (readUshort(i) == oldS.length() && readString(i).equals(oldS)) { replaceString(i, newS); - return true; + i += 1 + newS.length(); + amount -= 1; + if (amount == 0) { + return this; + } } i++; } - return false; + return this; } - public HPacket replaceAllString(String oldS, String newS) { - while (replaceFirstString(oldS, newS)) {} + public HPacket replaceAllStrings(String oldS, String newS) { + return replaceXStrings(oldS, newS, -1); + } + + public HPacket replaceFirstSubstring(String oldS, String newS) { + return replaceXSubstrings(oldS, newS, 1); + } + public HPacket replaceXSubstrings(String oldS, String newS, int amount) { + if (amount == 0) { + return this; + } + + int max = packetInBytes.length; + int i = packetInBytes.length - 2 - oldS.length(); + while (i >= 6) { + if (canReadString(i)) { + String s = readString(i); + System.out.println(s.contains(oldS)); + if (s.contains(oldS) && i + 2 + s.length() <= max) { + String replacement = s.replaceAll(oldS, newS); + + replaceString(i, replacement); + i -= (1 + oldS.length()); + amount -= 1; + if (amount == 0) { + return this; + } + + max = i; + } + } + i--; + } + return this; + } + public HPacket replaceAllSubstrings(String oldS, String newS) { + return replaceXSubstrings(oldS, newS, -1); + } + + public HPacket replaceAllIntegers(int val, int replacement) { + int i = 6; + while (i < packetInBytes.length - 3) { + if (readInteger(i) == val) { + replaceInt(i, replacement); + i += 3; + } + i++; + } return this; } @@ -547,6 +616,9 @@ public class HPacket implements StringifyAble { isEdited = remember; } + public void overrideEditedField(boolean edited) { + isEdited = edited; + } /** * returns "" if not found or not sure enough @@ -841,9 +913,6 @@ public class HPacket implements StringifyAble { } public static void main(String[] args) { - HPacket packet = new HPacket("{l}{u:1442}"); - - System.out.println(packet.structureEquals("s,b")); } } \ No newline at end of file diff --git a/G-Earth-UI/src/main/java/gearth/protocol/StateChangeListener.java b/G-Earth/src/main/java/gearth/protocol/StateChangeListener.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/protocol/StateChangeListener.java rename to G-Earth/src/main/java/gearth/protocol/StateChangeListener.java diff --git a/G-Earth-UI/src/main/java/gearth/protocol/TrafficListener.java b/G-Earth/src/main/java/gearth/protocol/TrafficListener.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/protocol/TrafficListener.java rename to G-Earth/src/main/java/gearth/protocol/TrafficListener.java diff --git a/G-Earth-UI/src/main/java/gearth/protocol/crypto/RC4.java b/G-Earth/src/main/java/gearth/protocol/crypto/RC4.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/protocol/crypto/RC4.java rename to G-Earth/src/main/java/gearth/protocol/crypto/RC4.java diff --git a/G-Earth-UI/src/main/java/gearth/protocol/hostreplacer/HostReplacer.java b/G-Earth/src/main/java/gearth/protocol/hostreplacer/HostReplacer.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/protocol/hostreplacer/HostReplacer.java rename to G-Earth/src/main/java/gearth/protocol/hostreplacer/HostReplacer.java diff --git a/G-Earth-UI/src/main/java/gearth/protocol/hostreplacer/HostReplacerFactory.java b/G-Earth/src/main/java/gearth/protocol/hostreplacer/HostReplacerFactory.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/protocol/hostreplacer/HostReplacerFactory.java rename to G-Earth/src/main/java/gearth/protocol/hostreplacer/HostReplacerFactory.java diff --git a/G-Earth-UI/src/main/java/gearth/protocol/hostreplacer/UnixHostReplacer.java b/G-Earth/src/main/java/gearth/protocol/hostreplacer/UnixHostReplacer.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/protocol/hostreplacer/UnixHostReplacer.java rename to G-Earth/src/main/java/gearth/protocol/hostreplacer/UnixHostReplacer.java diff --git a/G-Earth-UI/src/main/java/gearth/protocol/hostreplacer/WindowsHostReplacer.java b/G-Earth/src/main/java/gearth/protocol/hostreplacer/WindowsHostReplacer.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/protocol/hostreplacer/WindowsHostReplacer.java rename to G-Earth/src/main/java/gearth/protocol/hostreplacer/WindowsHostReplacer.java diff --git a/G-Earth-UI/src/main/java/gearth/protocol/memory/Rc4Obtainer.java b/G-Earth/src/main/java/gearth/protocol/memory/Rc4Obtainer.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/protocol/memory/Rc4Obtainer.java rename to G-Earth/src/main/java/gearth/protocol/memory/Rc4Obtainer.java diff --git a/G-Earth-UI/src/main/java/gearth/protocol/memory/habboclient/HabboClient.java b/G-Earth/src/main/java/gearth/protocol/memory/habboclient/HabboClient.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/protocol/memory/habboclient/HabboClient.java rename to G-Earth/src/main/java/gearth/protocol/memory/habboclient/HabboClient.java diff --git a/G-Earth-UI/src/main/java/gearth/protocol/memory/habboclient/HabboClientFactory.java b/G-Earth/src/main/java/gearth/protocol/memory/habboclient/HabboClientFactory.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/protocol/memory/habboclient/HabboClientFactory.java rename to G-Earth/src/main/java/gearth/protocol/memory/habboclient/HabboClientFactory.java diff --git a/G-Earth-UI/src/main/java/gearth/protocol/memory/habboclient/linux/LinuxHabboClient.java b/G-Earth/src/main/java/gearth/protocol/memory/habboclient/linux/LinuxHabboClient.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/protocol/memory/habboclient/linux/LinuxHabboClient.java rename to G-Earth/src/main/java/gearth/protocol/memory/habboclient/linux/LinuxHabboClient.java diff --git a/G-Earth-UI/src/main/java/gearth/protocol/memory/habboclient/linux/LinuxMemorySnippet.java b/G-Earth/src/main/java/gearth/protocol/memory/habboclient/linux/LinuxMemorySnippet.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/protocol/memory/habboclient/linux/LinuxMemorySnippet.java rename to G-Earth/src/main/java/gearth/protocol/memory/habboclient/linux/LinuxMemorySnippet.java diff --git a/G-Earth-UI/src/main/java/gearth/protocol/memory/habboclient/windows/WindowsHabboClient.java b/G-Earth/src/main/java/gearth/protocol/memory/habboclient/windows/WindowsHabboClient.java similarity index 92% rename from G-Earth-UI/src/main/java/gearth/protocol/memory/habboclient/windows/WindowsHabboClient.java rename to G-Earth/src/main/java/gearth/protocol/memory/habboclient/windows/WindowsHabboClient.java index 4bb41bd..dcd4d42 100644 --- a/G-Earth-UI/src/main/java/gearth/protocol/memory/habboclient/windows/WindowsHabboClient.java +++ b/G-Earth/src/main/java/gearth/protocol/memory/habboclient/windows/WindowsHabboClient.java @@ -4,6 +4,7 @@ import gearth.misc.Cacher; import gearth.protocol.HConnection; import gearth.protocol.HMessage; import gearth.protocol.memory.habboclient.HabboClient; +import org.json.JSONArray; import org.json.JSONObject; import java.io.BufferedReader; @@ -60,7 +61,12 @@ public class WindowsHabboClient extends HabboClient { } assert revisionList != null; - List cachedOffsets = revisionList.getJSONArray(production).toList(); + JSONArray cachedOffsets; + if (revisionList.has(production)) + cachedOffsets = (JSONArray) revisionList.get(production); + else + cachedOffsets = null; + StringJoiner joiner = new StringJoiner(" "); if (useCache) { @@ -86,7 +92,7 @@ public class WindowsHabboClient extends HabboClient { ArrayList possibleData = new ArrayList<>(); if (cachedOffsets == null) { - cachedOffsets = new ArrayList<>(); + cachedOffsets = new JSONArray(); } @@ -94,8 +100,8 @@ public class WindowsHabboClient extends HabboClient { while((line = reader.readLine()) != null) { if (line.length() > 1) { if (!useCache && (count++ % 2 == 0)) { - if (!cachedOffsets.contains(line)) { - cachedOffsets.add(line); + if (!cachedOffsets.toList().contains(line)) { + cachedOffsets.put(line); } } else diff --git a/G-Earth-UI/src/main/java/gearth/protocol/packethandler/BufferListener.java b/G-Earth/src/main/java/gearth/protocol/packethandler/BufferListener.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/protocol/packethandler/BufferListener.java rename to G-Earth/src/main/java/gearth/protocol/packethandler/BufferListener.java diff --git a/G-Earth-UI/src/main/java/gearth/protocol/packethandler/Handler.java b/G-Earth/src/main/java/gearth/protocol/packethandler/Handler.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/protocol/packethandler/Handler.java rename to G-Earth/src/main/java/gearth/protocol/packethandler/Handler.java diff --git a/G-Earth-UI/src/main/java/gearth/protocol/packethandler/IncomingHandler.java b/G-Earth/src/main/java/gearth/protocol/packethandler/IncomingHandler.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/protocol/packethandler/IncomingHandler.java rename to G-Earth/src/main/java/gearth/protocol/packethandler/IncomingHandler.java diff --git a/G-Earth-UI/src/main/java/gearth/protocol/packethandler/OutgoingHandler.java b/G-Earth/src/main/java/gearth/protocol/packethandler/OutgoingHandler.java similarity index 65% rename from G-Earth-UI/src/main/java/gearth/protocol/packethandler/OutgoingHandler.java rename to G-Earth/src/main/java/gearth/protocol/packethandler/OutgoingHandler.java index e98d314..ff65bcc 100644 --- a/G-Earth-UI/src/main/java/gearth/protocol/packethandler/OutgoingHandler.java +++ b/G-Earth/src/main/java/gearth/protocol/packethandler/OutgoingHandler.java @@ -5,6 +5,8 @@ import gearth.protocol.HPacket; import java.io.IOException; import java.io.OutputStream; +import java.util.ArrayList; +import java.util.List; public class OutgoingHandler extends Handler { @@ -12,10 +14,24 @@ public class OutgoingHandler extends Handler { super(outputStream, listeners); } + private List onDatastreamConfirmedListeners = new ArrayList<>(); + public void addOnDatastreamConfirmedListener(OnDatastreamConfirmedListener listener) { + onDatastreamConfirmedListeners.add(listener); + } + public interface OnDatastreamConfirmedListener { + void confirm(String hotelVersion); + } + private void dataStreamCheck(byte[] buffer) { if (!isDataStream) { HPacket hpacket = new HPacket(buffer); isDataStream = (hpacket.getBytesLength() > 6 && hpacket.length() < 100); + if (isDataStream) { + String version = hpacket.readString(); + for (OnDatastreamConfirmedListener listener : onDatastreamConfirmedListeners) { + listener.confirm(version); + } + } } } diff --git a/G-Earth-UI/src/main/java/gearth/protocol/packethandler/PayloadBuffer.java b/G-Earth/src/main/java/gearth/protocol/packethandler/PayloadBuffer.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/protocol/packethandler/PayloadBuffer.java rename to G-Earth/src/main/java/gearth/protocol/packethandler/PayloadBuffer.java diff --git a/G-Earth-UI/src/main/java/gearth/ui/GEarthController.java b/G-Earth/src/main/java/gearth/ui/GEarthController.java similarity index 93% rename from G-Earth-UI/src/main/java/gearth/ui/GEarthController.java rename to G-Earth/src/main/java/gearth/ui/GEarthController.java index 00b9e7c..27ceb3f 100644 --- a/G-Earth-UI/src/main/java/gearth/ui/GEarthController.java +++ b/G-Earth/src/main/java/gearth/ui/GEarthController.java @@ -1,5 +1,6 @@ package gearth.ui; +import gearth.ui.logger.loggerdisplays.PacketLoggerFactory; import javafx.scene.control.Tab; import javafx.scene.control.TabPane; import javafx.scene.layout.Pane; @@ -17,6 +18,7 @@ import gearth.ui.tools.Tools; public class GEarthController { public Tab tab_Settings; + public Tab tab_Logger; public TabPane tabBar; private Stage stage = null; private volatile HConnection hConnection; @@ -48,6 +50,10 @@ public class GEarthController { tabBar.getTabs().remove(tab_Settings); + if (PacketLoggerFactory.usesUIlogger()) { + tabBar.getTabs().remove(tab_Logger); + } + //custom header bar // final Point[] startpos = {null}; diff --git a/G-Earth-UI/src/main/java/gearth/ui/SubForm.java b/G-Earth/src/main/java/gearth/ui/SubForm.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/SubForm.java rename to G-Earth/src/main/java/gearth/ui/SubForm.java diff --git a/G-Earth/src/main/java/gearth/ui/UiLoggerController.java b/G-Earth/src/main/java/gearth/ui/UiLoggerController.java new file mode 100644 index 0000000..8ae1a11 --- /dev/null +++ b/G-Earth/src/main/java/gearth/ui/UiLoggerController.java @@ -0,0 +1,178 @@ +package gearth.ui; + +import gearth.protocol.HPacket; +import gearth.ui.logger.loggerdisplays.PacketLogger; +import javafx.application.Platform; +import javafx.event.ActionEvent; +import javafx.fxml.Initializable; +import javafx.scene.control.CheckMenuItem; +import javafx.scene.control.Label; +import javafx.scene.layout.BorderPane; +import javafx.scene.layout.FlowPane; +import org.fxmisc.flowless.VirtualizedScrollPane; +import org.fxmisc.richtext.StyleClassedTextArea; +import org.fxmisc.richtext.model.StyleSpansBuilder; + +import java.net.URL; +import java.util.*; + +public class UiLoggerController implements Initializable { + public FlowPane flowPane; + public BorderPane borderPane; + public Label lblViewIncoming; + public Label lblViewOutgoing; + public CheckMenuItem chkViewIncoming; + public CheckMenuItem chkViewOutgoing; + public CheckMenuItem chkDisplayStructure; + public Label lblAutoScrolll; + public CheckMenuItem chkAutoscroll; + public CheckMenuItem chkSkipBigPackets; + + private StyleClassedTextArea area; + + private boolean viewIncoming = true; + private boolean viewOutgoing = true; + private boolean displayStructure = true; + private boolean autoScroll = true; + private boolean skiphugepackets = true; + + + private volatile boolean initialized = false; + private final List appendLater = new ArrayList<>(); + + @Override + public void initialize(URL arg0, ResourceBundle arg1) { + area = new StyleClassedTextArea(); + area.getStyleClass().add("dark"); + area.setWrapText(true); + + VirtualizedScrollPane vsPane = new VirtualizedScrollPane<>(area); + borderPane.setCenter(vsPane); + + synchronized (appendLater) { + initialized = true; + if (!appendLater.isEmpty()) { + appendLog(appendLater); + appendLater.clear(); + } + } + + + } + + public void appendMessage(HPacket packet, int types) { + boolean isBlocked = (types & PacketLogger.MESSAGE_TYPE.BLOCKED.getValue()) != 0; + boolean isReplaced = (types & PacketLogger.MESSAGE_TYPE.REPLACED.getValue()) != 0; + boolean isIncoming = (types & PacketLogger.MESSAGE_TYPE.INCOMING.getValue()) != 0; + + if (isIncoming && !viewIncoming) return; + if (!isIncoming && !viewOutgoing) return; + + ArrayList elements = new ArrayList<>(); + + String expr = packet.toExpression(); + + if (isBlocked) elements.add(new Element("[Blocked]\n", "blocked")); + else if (isReplaced) elements.add(new Element("[Replaced]\n", "replaced")); + + if (isIncoming) { + // handle skipped eventually + elements.add(new Element("Incoming[", "incoming")); + elements.add(new Element(String.valueOf(packet.headerId()), "")); + elements.add(new Element("]", "incoming")); + + elements.add(new Element(" <- ", "")); + if (skiphugepackets && packet.length() > 8000) { + elements.add(new Element("", "skipped")); + } + else { + elements.add(new Element(packet.toString(), "incoming")); + } + } else { + elements.add(new Element("Outgoing[", "outgoing")); + elements.add(new Element(String.valueOf(packet.headerId()), "")); + elements.add(new Element("]", "outgoing")); + + elements.add(new Element(" -> ", "")); + + if (skiphugepackets && packet.length() > 8000) { + elements.add(new Element("", "skipped")); + } + else { + elements.add(new Element(packet.toString(), "outgoing")); + } + } + if (!expr.equals("") && displayStructure && (!skiphugepackets || packet.length() <= 8000)) + elements.add(new Element("\n" + expr, "structure")); + + elements.add(new Element("\n--------------------\n", "")); + + synchronized (appendLater) { + if (initialized) { + appendLog(elements); + } + else { + appendLater.addAll(elements); + } + } + + } + + private synchronized void appendLog(List elements) { + Platform.runLater(() -> { + StringBuilder sb = new StringBuilder(); + StyleSpansBuilder> styleSpansBuilder = new StyleSpansBuilder<>(0); + + for (Element element : elements) { + sb.append(element.text); + styleSpansBuilder.add(Collections.singleton(element.className), element.text.length()); + } + + int oldLen = area.getLength(); + area.appendText(sb.toString()); +// System.out.println(sb.toString()); + area.setStyleSpans(oldLen, styleSpansBuilder.create()); + + if (autoScroll) { + area.moveTo(area.getLength()); + area.requestFollowCaret(); + } + }); + } + + public void toggleViewIncoming() { + viewIncoming = !viewIncoming; + lblViewIncoming.setText("View Incoming: " + (viewIncoming ? "True" : "False")); +// chkViewIncoming.setSelected(viewIncoming); + } + + public void toggleViewOutgoing() { + viewOutgoing = !viewOutgoing; + lblViewOutgoing.setText("View Outgoing: " + (viewOutgoing ? "True" : "False")); +// chkViewOutgoing.setSelected(viewOutgoing); + } + + public void toggleDisplayStructure() { + displayStructure = !displayStructure; +// chkDisplayStructure.setSelected(displayStructure); + } + + public void toggleAutoscroll(ActionEvent actionEvent) { + autoScroll = !autoScroll; + lblAutoScrolll.setText("Autoscroll: " + (autoScroll ? "True" : "False")); + } + + public void toggleSkipPackets(ActionEvent actionEvent) { + skiphugepackets = !skiphugepackets; + } +} + +class Element { + final String text; + final String className; + + Element(String text, String className) { + this.text = text; + this.className = className; + } +} \ No newline at end of file diff --git a/G-Earth-UI/src/main/java/gearth/ui/buttons/BoxButton.java b/G-Earth/src/main/java/gearth/ui/buttons/BoxButton.java similarity index 89% rename from G-Earth-UI/src/main/java/gearth/ui/buttons/BoxButton.java rename to G-Earth/src/main/java/gearth/ui/buttons/BoxButton.java index 0afd90c..d7f69a9 100644 --- a/G-Earth-UI/src/main/java/gearth/ui/buttons/BoxButton.java +++ b/G-Earth/src/main/java/gearth/ui/buttons/BoxButton.java @@ -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("files/" + imageName)); - this.imageOnHover = new Image(getClass().getResourceAsStream("files/" + imageOnHoverName)); + this.image = new Image(getClass().getResourceAsStream("/gearth/ui/buttons/files/" + imageName)); + this.imageOnHover = new Image(getClass().getResourceAsStream("/gearth/ui/buttons/files/" + imageOnHoverName)); this.imageView = new ImageView(); setCursor(Cursor.DEFAULT); diff --git a/G-Earth-UI/src/main/java/gearth/ui/buttons/DeleteButton.java b/G-Earth/src/main/java/gearth/ui/buttons/DeleteButton.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/buttons/DeleteButton.java rename to G-Earth/src/main/java/gearth/ui/buttons/DeleteButton.java diff --git a/G-Earth-UI/src/main/java/gearth/ui/buttons/EditButton.java b/G-Earth/src/main/java/gearth/ui/buttons/EditButton.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/buttons/EditButton.java rename to G-Earth/src/main/java/gearth/ui/buttons/EditButton.java diff --git a/G-Earth-UI/src/main/java/gearth/ui/buttons/ExitButton.java b/G-Earth/src/main/java/gearth/ui/buttons/ExitButton.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/buttons/ExitButton.java rename to G-Earth/src/main/java/gearth/ui/buttons/ExitButton.java diff --git a/G-Earth-UI/src/main/java/gearth/ui/buttons/FireButton.java b/G-Earth/src/main/java/gearth/ui/buttons/FireButton.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/buttons/FireButton.java rename to G-Earth/src/main/java/gearth/ui/buttons/FireButton.java diff --git a/G-Earth-UI/src/main/java/gearth/ui/buttons/PauseResumeButton.java b/G-Earth/src/main/java/gearth/ui/buttons/PauseResumeButton.java similarity index 92% rename from G-Earth-UI/src/main/java/gearth/ui/buttons/PauseResumeButton.java rename to G-Earth/src/main/java/gearth/ui/buttons/PauseResumeButton.java index 9f50777..4416aed 100644 --- a/G-Earth-UI/src/main/java/gearth/ui/buttons/PauseResumeButton.java +++ b/G-Earth/src/main/java/gearth/ui/buttons/PauseResumeButton.java @@ -8,7 +8,6 @@ import javafx.scene.image.ImageView; import javafx.scene.input.MouseEvent; import javafx.scene.layout.StackPane; -import java.io.File; import java.util.ArrayList; import java.util.List; @@ -32,10 +31,10 @@ public class PauseResumeButton extends StackPane{ public PauseResumeButton(boolean isPaused) { this.isPaused[0] = isPaused; - 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.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.imageView = new ImageView(); setCursor(Cursor.DEFAULT); diff --git a/G-Earth-UI/src/main/java/gearth/ui/buttons/ReloadButton.java b/G-Earth/src/main/java/gearth/ui/buttons/ReloadButton.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/buttons/ReloadButton.java rename to G-Earth/src/main/java/gearth/ui/buttons/ReloadButton.java diff --git a/G-Earth-UI/src/main/java/gearth/ui/buttons/SimpleClickButton.java b/G-Earth/src/main/java/gearth/ui/buttons/SimpleClickButton.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/buttons/SimpleClickButton.java rename to G-Earth/src/main/java/gearth/ui/buttons/SimpleClickButton.java diff --git a/G-Earth-UI/src/main/java/gearth/ui/connection/Connection.java b/G-Earth/src/main/java/gearth/ui/connection/Connection.java similarity index 97% rename from G-Earth-UI/src/main/java/gearth/ui/connection/Connection.java rename to G-Earth/src/main/java/gearth/ui/connection/Connection.java index 254075b..768ab02 100644 --- a/G-Earth-UI/src/main/java/gearth/ui/connection/Connection.java +++ b/G-Earth/src/main/java/gearth/ui/connection/Connection.java @@ -21,6 +21,7 @@ public class Connection extends SubForm { public TextField outHost; public TextField outPort; public CheckBox cbx_autodetect; + public TextField txtfield_hotelversion; private boolean isBusy = false; @@ -75,6 +76,7 @@ public class Connection extends SubForm { public void onParentSet(){ getHConnection().addStateChangeListener((oldState, newState) -> Platform.runLater(() -> { + txtfield_hotelversion.setText(getHConnection().getHotelVersion()); if (newState == HConnection.State.NOT_CONNECTED) { updateInputUI(); lblState.setText("Not connected"); diff --git a/G-Earth-UI/src/main/java/gearth/ui/extensions/ExtensionItemContainer.java b/G-Earth/src/main/java/gearth/ui/extensions/ExtensionItemContainer.java similarity index 95% rename from G-Earth-UI/src/main/java/gearth/ui/extensions/ExtensionItemContainer.java rename to G-Earth/src/main/java/gearth/ui/extensions/ExtensionItemContainer.java index f1dd7da..7474c49 100644 --- a/G-Earth-UI/src/main/java/gearth/ui/extensions/ExtensionItemContainer.java +++ b/G-Earth/src/main/java/gearth/ui/extensions/ExtensionItemContainer.java @@ -79,10 +79,8 @@ public class ExtensionItemContainer extends GridPane { Tooltip delete = new Tooltip("Close connection with this extension"); Tooltip.install(exitButton,delete); exitButton.show(); - exitButton.addEventHandler(MouseEvent.MOUSE_CLICKED, event -> item.isRemoveClickTrigger()); clickButton = new SimpleClickButton(); clickButton.show(); - clickButton.addEventHandler(MouseEvent.MOUSE_CLICKED, event -> item.isClickTrigger()); buttonsBox = new HBox(clickButton, exitButton); @@ -101,12 +99,14 @@ public class ExtensionItemContainer extends GridPane { Tooltip.install(deleteButton, uninstall); deleteButton.show(); GridPane this2 = this; + + final String uninstallKey = "uninstallExtension"; deleteButton.addEventHandler(MouseEvent.MOUSE_CLICKED, event -> { boolean delet_dis = true; - if (ConfirmationDialog.showDialog) { - Alert alert = ConfirmationDialog.createAlertWithOptOut(Alert.AlertType.CONFIRMATION, - "Confirmation Dialog", null, + if (ConfirmationDialog.showDialog(uninstallKey)) { + Alert alert = ConfirmationDialog.createAlertWithOptOut(Alert.AlertType.CONFIRMATION, uninstallKey + ,"Confirmation Dialog", null, "Are you sure want to uninstall this extension?", "Do not ask again", ButtonType.YES, ButtonType.NO ); diff --git a/G-Earth-UI/src/main/java/gearth/ui/extensions/ExtensionItemContainerProducer.java b/G-Earth/src/main/java/gearth/ui/extensions/ExtensionItemContainerProducer.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/extensions/ExtensionItemContainerProducer.java rename to G-Earth/src/main/java/gearth/ui/extensions/ExtensionItemContainerProducer.java diff --git a/G-Earth-UI/src/main/java/gearth/ui/extensions/Extensions.java b/G-Earth/src/main/java/gearth/ui/extensions/Extensions.java similarity index 84% rename from G-Earth-UI/src/main/java/gearth/ui/extensions/Extensions.java rename to G-Earth/src/main/java/gearth/ui/extensions/Extensions.java index 4ae1b15..074236e 100644 --- a/G-Earth-UI/src/main/java/gearth/ui/extensions/Extensions.java +++ b/G-Earth/src/main/java/gearth/ui/extensions/Extensions.java @@ -148,13 +148,17 @@ public class Extensions extends SubForm { getHConnection().addStateChangeListener((oldState, newState) -> { if (newState == HConnection.State.CONNECTED) { - for (GEarthExtension extension : gEarthExtensions) { - extension.sendMessage(new HPacket(OUTGOING_MESSAGES_IDS.CONNECTIONSTART)); + synchronized (gEarthExtensions) { + for (GEarthExtension extension : gEarthExtensions) { + extension.sendMessage(new HPacket(OUTGOING_MESSAGES_IDS.CONNECTIONSTART)); + } } } if (oldState == HConnection.State.CONNECTED) { - for (GEarthExtension extension : gEarthExtensions) { - extension.sendMessage(new HPacket(OUTGOING_MESSAGES_IDS.CONNECTIONEND)); + synchronized (getHConnection()) { + for (GEarthExtension extension : gEarthExtensions) { + extension.sendMessage(new HPacket(OUTGOING_MESSAGES_IDS.CONNECTIONEND)); + } } } }); @@ -165,60 +169,71 @@ public class Extensions extends SubForm { collection = new HashSet<>(gEarthExtensions); } - String stringified = message.stringify(); HPacket manipulatePacketRequest = new HPacket(OUTGOING_MESSAGES_IDS.PACKETINTERCEPT); manipulatePacketRequest.appendLongString(stringified); + HMessage result = new HMessage(message); + boolean[] isblock = new boolean[1]; + synchronized (collection) { + for (GEarthExtension extension : collection) { + GEarthExtension.ReceiveMessageListener respondCallback = new GEarthExtension.ReceiveMessageListener() { + @Override + public void act(HPacket packet) { + if (packet.headerId() == INCOMING_MESSAGES_IDS.MANIPULATEDPACKET) { + String stringifiedresponse = packet.readLongString(6); + HMessage responseMessage = new HMessage(stringifiedresponse); + if (responseMessage.getDestination() == message.getDestination() && responseMessage.getIndex() == message.getIndex()) { + synchronized (result) { + if (!message.equals(responseMessage)) { + result.constructFromString(stringifiedresponse); + } + if (responseMessage.isBlocked()) { + isblock[0] = true; + } + synchronized (collection) { + collection.remove(extension); + } - for (GEarthExtension extension : collection) { - GEarthExtension.ReceiveMessageListener respondCallback = new GEarthExtension.ReceiveMessageListener() { - @Override - public void act(HPacket packet) { - if (packet.headerId() == INCOMING_MESSAGES_IDS.MANIPULATEDPACKET) { - String stringifiedresponse = packet.readLongString(6); - HMessage responseMessage = new HMessage(stringifiedresponse); - if (responseMessage.getDestination() == message.getDestination() && responseMessage.getIndex() == message.getIndex()) { - if (!message.equals(responseMessage)) { - message.constructFromString(stringifiedresponse); + extension.removeOnReceiveMessageListener(this); + } } - if (responseMessage.isBlocked()) { - isblock[0] = true; - } - synchronized (collection) { - collection.remove(extension); - } - - extension.removeOnReceiveMessageListener(this); } - } - } - }; - extension.addOnReceiveMessageListener(respondCallback); - extension.sendMessage(manipulatePacketRequest); + } + }; + extension.addOnReceiveMessageListener(respondCallback); + extension.sendMessage(manipulatePacketRequest); + } } //block untill all extensions have responded List willdelete = new ArrayList<>(); - while (!collection.isEmpty()) { - + while (true) { synchronized (collection) { - for (GEarthExtension extension : collection) { - synchronized (gEarthExtensions) { + if (collection.isEmpty()) { + break; + } + + synchronized (gEarthExtensions) { + for (GEarthExtension extension : collection) { if (!gEarthExtensions.contains(extension)) willdelete.add(extension); } } + for (int i = willdelete.size() - 1; i >= 0; i--) { collection.remove(willdelete.get(i)); willdelete.remove(i); } } + try {Thread.sleep(1);} catch (InterruptedException e) {e.printStackTrace();} } + message.constructFromHMessage(result); + if (isblock[0]) { message.setBlocked(true); } @@ -259,14 +274,16 @@ public class Extensions extends SubForm { } } }; - messageListeners.put(extension, receiveMessageListener); + synchronized (messageListeners) { + messageListeners.put(extension, receiveMessageListener); + } extension.addOnReceiveMessageListener(receiveMessageListener); extension.sendMessage(new HPacket(OUTGOING_MESSAGES_IDS.INIT)); if (getHConnection().getState() == HConnection.State.CONNECTED) { extension.sendMessage(new HPacket(OUTGOING_MESSAGES_IDS.CONNECTIONSTART)); } - Platform.runLater(() -> producer.extensionConnected(extension)); + extension.onRemoveClick(observable -> { try { extension.getConnection().close(); @@ -275,6 +292,8 @@ public class Extensions extends SubForm { } }); extension.onClick(observable -> extension.sendMessage(new HPacket(OUTGOING_MESSAGES_IDS.ONDOUBLECLICK))); + + Platform.runLater(() -> producer.extensionConnected(extension)); } @Override @@ -283,8 +302,10 @@ public class Extensions extends SubForm { gEarthExtensions.remove(extension); } + synchronized (messageListeners) { extension.removeOnReceiveMessageListener(messageListeners.get(extension)); - messageListeners.remove(extension); + messageListeners.remove(extension); + } Platform.runLater(extension::delete); } }); diff --git a/G-Earth-UI/src/main/java/gearth/ui/extensions/GEarthExtension.java b/G-Earth/src/main/java/gearth/ui/extensions/GEarthExtension.java similarity index 73% rename from G-Earth-UI/src/main/java/gearth/ui/extensions/GEarthExtension.java rename to G-Earth/src/main/java/gearth/ui/extensions/GEarthExtension.java index 5dd240f..1d0d7a8 100644 --- a/G-Earth-UI/src/main/java/gearth/ui/extensions/GEarthExtension.java +++ b/G-Earth/src/main/java/gearth/ui/extensions/GEarthExtension.java @@ -6,6 +6,7 @@ import gearth.protocol.HPacket; import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; +import gearth.ui.extensions.authentication.Authenticator; import java.net.Socket; import java.util.ArrayList; import java.util.List; @@ -26,6 +27,7 @@ public class GEarthExtension { private boolean isInstalledExtension; // <- extension is in the extensions directory private String fileName; + private String cookie; private Socket connection; @@ -60,7 +62,14 @@ public class GEarthExtension { connection, onDisconnectedCallback ); - callback.act(gEarthExtension); + + if (Authenticator.evaluate(gEarthExtension)) { + callback.act(gEarthExtension); + } + else { + gEarthExtension.closeConnection(); //you shall not pass... + } + break; } } @@ -79,6 +88,7 @@ public class GEarthExtension { this.isInstalledExtension = extensionInfo.readBoolean(); this.fileName = extensionInfo.readString(); + this.cookie = extensionInfo.readString(); this.leaveButtonVisible = extensionInfo.readBoolean(); this.deleteButtonVisible = extensionInfo.readBoolean(); @@ -103,9 +113,11 @@ public class GEarthExtension { HPacket packet = new HPacket(headerandbody); packet.fixLength(); - for (int i = receiveMessageListeners.size() - 1; i >= 0; i--) { - receiveMessageListeners.get(i).act(packet); - packet.setReadIndex(6); + synchronized (receiveMessageListeners) { + for (int i = receiveMessageListeners.size() - 1; i >= 0; i--) { + receiveMessageListeners.get(i).act(packet); + packet.setReadIndex(6); + } } } @@ -149,6 +161,9 @@ public class GEarthExtension { public String getFileName() { return fileName; } + public String getCookie() { + return cookie; + } public boolean isDeleteButtonVisible() { return deleteButtonVisible; } @@ -181,12 +196,16 @@ public class GEarthExtension { } - private List receiveMessageListeners = new ArrayList<>(); + private final List receiveMessageListeners = new ArrayList<>(); public void addOnReceiveMessageListener(ReceiveMessageListener receiveMessageListener) { - receiveMessageListeners.add(receiveMessageListener); + synchronized (receiveMessageListeners) { + receiveMessageListeners.add(receiveMessageListener); + } } public void removeOnReceiveMessageListener(ReceiveMessageListener receiveMessageListener) { - receiveMessageListeners.remove(receiveMessageListener); + synchronized (receiveMessageListeners) { + receiveMessageListeners.remove(receiveMessageListener); + } } public interface ReceiveMessageListener { @@ -200,33 +219,45 @@ public class GEarthExtension { } - private List onRemoveClickListener = new ArrayList<>(); + private final List onRemoveClickListener = new ArrayList<>(); public void onRemoveClick(InvalidationListener listener) { - onRemoveClickListener.add(listener); + synchronized (onRemoveClickListener) { + onRemoveClickListener.add(listener); + } } public void isRemoveClickTrigger() { - for (int i = onRemoveClickListener.size() - 1; i >= 0; i--) { - onRemoveClickListener.get(i).invalidated(null); + synchronized (onRemoveClickListener) { + for (int i = onRemoveClickListener.size() - 1; i >= 0; i--) { + onRemoveClickListener.get(i).invalidated(null); + } } } - private List onClickListener = new ArrayList<>(); + private final List onClickListener = new ArrayList<>(); public void onClick(InvalidationListener listener) { - onClickListener.add(listener); + synchronized (onClickListener) { + onClickListener.add(listener); + } } public void isClickTrigger() { - for (int i = onClickListener.size() - 1; i >= 0; i--) { - onClickListener.get(i).invalidated(null); + synchronized (onClickListener) { + for (int i = onClickListener.size() - 1; i >= 0; i--) { + onClickListener.get(i).invalidated(null); + } } } - private List onDeleteListeners = new ArrayList<>(); + private final List onDeleteListeners = new ArrayList<>(); public void onDelete(InvalidationListener listener) { - onDeleteListeners.add(listener); + synchronized (onDeleteListeners) { + onDeleteListeners.add(listener); + } } public void delete() { - for (int i = onDeleteListeners.size() - 1; i >= 0; i--) { - onDeleteListeners.get(i).invalidated(null); + synchronized (onDeleteListeners) { + for (int i = onDeleteListeners.size() - 1; i >= 0; i--) { + onDeleteListeners.get(i).invalidated(null); + } } } } \ No newline at end of file diff --git a/G-Earth-UI/src/main/java/gearth/ui/extensions/GEarthExtensionsRegistrer.java b/G-Earth/src/main/java/gearth/ui/extensions/GEarthExtensionsRegistrer.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/extensions/GEarthExtensionsRegistrer.java rename to G-Earth/src/main/java/gearth/ui/extensions/GEarthExtensionsRegistrer.java diff --git a/G-Earth/src/main/java/gearth/ui/extensions/authentication/Authenticator.java b/G-Earth/src/main/java/gearth/ui/extensions/authentication/Authenticator.java new file mode 100644 index 0000000..d0fc38b --- /dev/null +++ b/G-Earth/src/main/java/gearth/ui/extensions/authentication/Authenticator.java @@ -0,0 +1,101 @@ +package gearth.ui.extensions.authentication; + +import gearth.extensions.Extension; +import gearth.misc.ConfirmationDialog; +import gearth.ui.extensions.GEarthExtension; +import gearth.ui.extensions.executer.ExtensionRunner; +import gearth.ui.extensions.executer.ExtensionRunnerFactory; +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; + +/** + * Created by Jonas on 16/10/18. + */ +public class Authenticator { + + private static Map cookies = new HashMap<>(); + + public static String generateCookieForExtension(String filename) { + String cookie = getRandomCookie(); + cookies.put(filename, cookie); + + return cookie; + } + + public static boolean evaluate(GEarthExtension extension) { + if (extension.isInstalledExtension()) { + return claimSession(extension.getFileName(), extension.getCookie()); + } + else { + return askForPermission(extension); + } + } + + /** + * authenticator: authenticate an extension and remove the cookie + * @param filename + * @param cookie + * @return if the extension is authenticated + */ + private static boolean claimSession(String filename, String cookie) { + if (cookies.containsKey(filename) && cookies.get(filename).equals(cookie)) { + cookies.remove(filename); + return true; + } + return false; + } + + private static volatile boolean rememberOption = false; + //for not-installed extensions, popup a dialog + private static boolean askForPermission(GEarthExtension extension) { + boolean[] allowConnection = {true}; + + final String connectExtensionKey = "allow_extension_connection"; + + if (ConfirmationDialog.showDialog(connectExtensionKey)) { + boolean[] done = {false}; + Platform.runLater(() -> { + Alert alert = ConfirmationDialog.createAlertWithOptOut(Alert.AlertType.WARNING, connectExtensionKey + ,"Confirmation Dialog", null, + "Extension \""+extension.getTitle()+"\" tries to connect but isn't known to G-Earth, accept this connection?", "Remember my choice", + ButtonType.YES, ButtonType.NO + ); + + if (!(alert.showAndWait().filter(t -> t == ButtonType.YES).isPresent())) { + allowConnection[0] = false; + } + done[0] = true; + if (!ConfirmationDialog.showDialog(connectExtensionKey)) { + rememberOption = allowConnection[0]; + } + }); + + while (!done[0]) { + try { + Thread.sleep(1); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + return allowConnection[0]; + } + + return rememberOption; + } + + private static String getRandomCookie() { + StringBuilder builder = new StringBuilder(); + Random r = new Random(); + for (int i = 0; i < 40; i++) { + builder.append(r.nextInt(40)); + } + + return builder.toString(); + } +} diff --git a/G-Earth-UI/src/main/java/gearth/ui/extensions/executer/ExecutionInfo.java b/G-Earth/src/main/java/gearth/ui/extensions/executer/ExecutionInfo.java similarity index 97% rename from G-Earth-UI/src/main/java/gearth/ui/extensions/executer/ExecutionInfo.java rename to G-Earth/src/main/java/gearth/ui/extensions/executer/ExecutionInfo.java index 9d0f241..43db6b1 100644 --- a/G-Earth-UI/src/main/java/gearth/ui/extensions/executer/ExecutionInfo.java +++ b/G-Earth/src/main/java/gearth/ui/extensions/executer/ExecutionInfo.java @@ -25,7 +25,7 @@ public class ExecutionInfo { for(String type : extensionTypeToExecutionCommand.keySet()) { extensionTypeToExecutionCommand.put( type, - extensionTypeToExecutionCommand.get(type) + " -p {port} -f {filename}" + extensionTypeToExecutionCommand.get(type) + " -p {port} -f {filename} -c {cookie}" ); } diff --git a/G-Earth-UI/src/main/java/gearth/ui/extensions/executer/ExtensionRunner.java b/G-Earth/src/main/java/gearth/ui/extensions/executer/ExtensionRunner.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/extensions/executer/ExtensionRunner.java rename to G-Earth/src/main/java/gearth/ui/extensions/executer/ExtensionRunner.java diff --git a/G-Earth-UI/src/main/java/gearth/ui/extensions/executer/ExtensionRunnerFactory.java b/G-Earth/src/main/java/gearth/ui/extensions/executer/ExtensionRunnerFactory.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/extensions/executer/ExtensionRunnerFactory.java rename to G-Earth/src/main/java/gearth/ui/extensions/executer/ExtensionRunnerFactory.java diff --git a/G-Earth-UI/src/main/java/gearth/ui/extensions/executer/NormalExtensionRunner.java b/G-Earth/src/main/java/gearth/ui/extensions/executer/NormalExtensionRunner.java similarity index 91% rename from G-Earth-UI/src/main/java/gearth/ui/extensions/executer/NormalExtensionRunner.java rename to G-Earth/src/main/java/gearth/ui/extensions/executer/NormalExtensionRunner.java index 4a5e91f..918991f 100644 --- a/G-Earth-UI/src/main/java/gearth/ui/extensions/executer/NormalExtensionRunner.java +++ b/G-Earth/src/main/java/gearth/ui/extensions/executer/NormalExtensionRunner.java @@ -1,6 +1,7 @@ package gearth.ui.extensions.executer; import gearth.Main; +import gearth.ui.extensions.authentication.Authenticator; import java.io.File; import java.io.IOException; @@ -70,11 +71,13 @@ public class NormalExtensionRunner implements ExtensionRunner { public void tryRunExtension(String path, int port) { try { + String filename = Paths.get(path).getFileName().toString(); Runtime.getRuntime().exec( ExecutionInfo.getExecutionCommand(getFileExtension(path)) .replace("{path}", path) .replace("{port}", port+"") - .replace("{filename}", Paths.get(path).getFileName().toString()) + .replace("{filename}", filename) + .replace("{cookie}", Authenticator.generateCookieForExtension(filename)) ); } catch (IOException e) { e.printStackTrace(); @@ -119,7 +122,7 @@ public class NormalExtensionRunner implements ExtensionRunner { private String getRandomString() { StringBuilder builder = new StringBuilder(); Random r = new Random(); - for (int i = 0; i < 10; i++) { + for (int i = 0; i < 12; i++) { builder.append(r.nextInt(10)); } diff --git a/G-Earth/src/main/java/gearth/ui/info/Info.java b/G-Earth/src/main/java/gearth/ui/info/Info.java new file mode 100644 index 0000000..ebf6693 --- /dev/null +++ b/G-Earth/src/main/java/gearth/ui/info/Info.java @@ -0,0 +1,73 @@ +package gearth.ui.info; + +import gearth.Main; +import javafx.event.ActionEvent; +import javafx.scene.control.Hyperlink; +import gearth.ui.SubForm; +import javafx.scene.control.Label; +import javafx.scene.control.Tooltip; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; + +/** + * Created by Jonas on 06/04/18. + */ +public class Info extends SubForm { + public ImageView img_logo; + public Hyperlink link_sng; + public Hyperlink link_darkbox; + public Hyperlink link_d_harble; + public Hyperlink link_g_gearth; + public Hyperlink link_g_tanji; + public Hyperlink link_d_bonnie; + public Label version; + + // this is a TEMPORARY info tab + + private void activateHyperlink(Hyperlink link) { + link.setOnAction((ActionEvent event) -> { + Hyperlink h = (Hyperlink) event.getTarget(); + String s = h.getTooltip().getText(); + Main.main.getHostServices().showDocument(s); + event.consume(); + }); + } + + public void initialize() { + version.setText(version.getText().replace("$version", Main.version)); + + img_logo.setImage(new Image("/gearth/G-EarthLogo.png")); + + link_sng.setTooltip(new Tooltip("https://www.sngforum.info")); + link_darkbox.setTooltip(new Tooltip("https://darkbox.nl")); + link_g_gearth.setTooltip(new Tooltip("https://github.com/sirjonasxx/G-Earth")); + link_g_tanji.setTooltip(new Tooltip("https://github.com/ArachisH/Tanji")); + link_d_harble.setTooltip(new Tooltip("https://discord.gg/Vyc2gFC")); + link_d_bonnie.setTooltip(new Tooltip("https://discord.gg/KZa3rXD")); + + activateHyperlink(link_d_harble); + activateHyperlink(link_d_bonnie); + activateHyperlink(link_g_gearth); + activateHyperlink(link_g_tanji); + activateHyperlink(link_sng); + activateHyperlink(link_darkbox); + +// String[] lines = { +// "G-Earth 0.1.1", +// "Linux Habbo Packet Manipulator", +// "", +// "Made by:", +// "sirjonasxx", +// "", +// "Contributors:", +// "XePeleato (Windows & Mac support)", +// "Scott Stamp", +// "LittleJ", +// "ArachisH", +// "", +// "Check out:", +// "sngforum.info", +// "darkbox.nl" +// }; + } +} diff --git a/G-Earth-UI/src/main/java/gearth/ui/injection/Injection.java b/G-Earth/src/main/java/gearth/ui/injection/Injection.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/injection/Injection.java rename to G-Earth/src/main/java/gearth/ui/injection/Injection.java diff --git a/G-Earth-UI/src/main/java/gearth/ui/logger/Logger.java b/G-Earth/src/main/java/gearth/ui/logger/Logger.java similarity index 99% rename from G-Earth-UI/src/main/java/gearth/ui/logger/Logger.java rename to G-Earth/src/main/java/gearth/ui/logger/Logger.java index 30f4909..9d9ec12 100644 --- a/G-Earth-UI/src/main/java/gearth/ui/logger/Logger.java +++ b/G-Earth/src/main/java/gearth/ui/logger/Logger.java @@ -1,5 +1,6 @@ package gearth.ui.logger; +import gearth.ui.logger.loggerdisplays.UiLogger; import javafx.application.Platform; import javafx.event.ActionEvent; import javafx.scene.control.Button; diff --git a/G-Earth-UI/src/main/java/gearth/ui/logger/loggerdisplays/LinuxTerminalLogger.java b/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/LinuxTerminalLogger.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/logger/loggerdisplays/LinuxTerminalLogger.java rename to G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/LinuxTerminalLogger.java diff --git a/G-Earth-UI/src/main/java/gearth/ui/logger/loggerdisplays/PacketLogger.java b/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/PacketLogger.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/logger/loggerdisplays/PacketLogger.java rename to G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/PacketLogger.java diff --git a/G-Earth-UI/src/main/java/gearth/ui/logger/loggerdisplays/PacketLoggerFactory.java b/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/PacketLoggerFactory.java similarity index 63% rename from G-Earth-UI/src/main/java/gearth/ui/logger/loggerdisplays/PacketLoggerFactory.java rename to G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/PacketLoggerFactory.java index 0c810eb..2cd44d1 100644 --- a/G-Earth-UI/src/main/java/gearth/ui/logger/loggerdisplays/PacketLoggerFactory.java +++ b/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/PacketLoggerFactory.java @@ -1,5 +1,6 @@ package gearth.ui.logger.loggerdisplays; +import gearth.Main; import gearth.misc.OSValidator; /** @@ -7,13 +8,18 @@ import gearth.misc.OSValidator; */ public class PacketLoggerFactory { + public static boolean usesUIlogger() { + return (!Main.hasFlag("-t")); + } + public static PacketLogger get() { + if (usesUIlogger()) { + return new UiLogger(); + } + if (OSValidator.isUnix()) { return new LinuxTerminalLogger(); } -// if (System.getenv("XDG_CURRENT_DESKTOP") != null && System.getenv("XDG_CURRENT_DESKTOP").toLowerCase().contains("gnome")) { -// return new GnomeTerminalLogger(); -// } return new SimpleTerminalLogger(); } diff --git a/G-Earth-UI/src/main/java/gearth/ui/logger/loggerdisplays/SimpleTerminalLogger.java b/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/SimpleTerminalLogger.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/logger/loggerdisplays/SimpleTerminalLogger.java rename to G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/SimpleTerminalLogger.java diff --git a/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/UiLogger.java b/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/UiLogger.java new file mode 100644 index 0000000..aea5c64 --- /dev/null +++ b/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/UiLogger.java @@ -0,0 +1,111 @@ +package gearth.ui.logger.loggerdisplays; + +import gearth.protocol.HPacket; +import gearth.ui.UiLoggerController; +import javafx.event.Event; +import javafx.fxml.FXMLLoader; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.stage.Modality; +import javafx.stage.Stage; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class UiLogger implements PacketLogger { + private Stage stage; + private UiLoggerController controller = null; + + @Override + public void start() { + FXMLLoader loader = new FXMLLoader(getClass().getResource("/gearth/ui/logger/uilogger/UiLogger.fxml")); + + try { + Parent root = loader.load(); + synchronized (appendLater) { + controller = loader.getController(); + for (Elem elem : appendLater) { + controller.appendMessage(elem.packet, elem.types); + } + appendLater.clear(); + } + + stage = new Stage(); + stage.setTitle("G-Earth | Packet Logger"); + stage.initModality(Modality.NONE); + + Scene scene = new Scene(root); + scene.getStylesheets().add("/gearth/ui/bootstrap3.css"); + scene.getStylesheets().add("/gearth/ui/logger/uilogger/logger.css"); + +// scene.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler() { +// final KeyCombination keyCombIncoming = new KeyCodeCombination(KeyCode.I, +// KeyCombination.CONTROL_DOWN); +// final KeyCombination keyCombOutgoing = new KeyCodeCombination(KeyCode.O, +// KeyCombination.CONTROL_DOWN); +// +// public void handle(KeyEvent ke) { +// if (keyCombIncoming.match(ke)) { +// controller.toggleViewIncoming(); +// ke.consume(); +// } else if (keyCombOutgoing.match(ke)) { +// controller.toggleViewOutgoing(); +// ke.consume(); +// } +// } +// }); + + stage.setScene(scene); + +// ScenicView.show(scene); + + // don't let the user close this window on their own + stage.setOnCloseRequest(Event::consume); + + stage.show(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void stop() { + if (stage != null) + stage.close(); + } + + @Override + public void appendSplitLine() { + // don't use this, we can't discern incoming/outgoing + //Platform.runLater(() -> controller.appendSplitLine()); + } + + private class Elem { + HPacket packet; + int types; + Elem(HPacket packet, int types) { + this.packet = packet; + this.types = types; + } + } + + private final List appendLater = new ArrayList<>(); + + @Override + public void appendMessage(HPacket packet, int types) { + synchronized (appendLater) { + if (controller == null) { + appendLater.add(new Elem(packet, types)); + } + else { + controller.appendMessage(packet, types); + } + } + } + + @Override + public void appendStructure(HPacket packet) { + + } +} diff --git a/G-Earth-UI/src/main/java/gearth/ui/scheduler/Interval.java b/G-Earth/src/main/java/gearth/ui/scheduler/Interval.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/scheduler/Interval.java rename to G-Earth/src/main/java/gearth/ui/scheduler/Interval.java diff --git a/G-Earth-UI/src/main/java/gearth/ui/scheduler/ScheduleItem.java b/G-Earth/src/main/java/gearth/ui/scheduler/ScheduleItem.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/scheduler/ScheduleItem.java rename to G-Earth/src/main/java/gearth/ui/scheduler/ScheduleItem.java diff --git a/G-Earth-UI/src/main/java/gearth/ui/scheduler/ScheduleItemContainer.java b/G-Earth/src/main/java/gearth/ui/scheduler/ScheduleItemContainer.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/scheduler/ScheduleItemContainer.java rename to G-Earth/src/main/java/gearth/ui/scheduler/ScheduleItemContainer.java diff --git a/G-Earth-UI/src/main/java/gearth/ui/scheduler/Scheduler.java b/G-Earth/src/main/java/gearth/ui/scheduler/Scheduler.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/scheduler/Scheduler.java rename to G-Earth/src/main/java/gearth/ui/scheduler/Scheduler.java diff --git a/G-Earth-UI/src/main/java/gearth/ui/settings/Settings.java b/G-Earth/src/main/java/gearth/ui/settings/Settings.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/settings/Settings.java rename to G-Earth/src/main/java/gearth/ui/settings/Settings.java diff --git a/G-Earth-UI/src/main/java/gearth/ui/tools/Tools.java b/G-Earth/src/main/java/gearth/ui/tools/Tools.java similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/tools/Tools.java rename to G-Earth/src/main/java/gearth/ui/tools/Tools.java diff --git a/G-Earth/src/main/resources/gearth/G-EarthLogo.ico b/G-Earth/src/main/resources/gearth/G-EarthLogo.ico new file mode 100644 index 0000000..61583a8 Binary files /dev/null and b/G-Earth/src/main/resources/gearth/G-EarthLogo.ico differ diff --git a/G-Earth/src/main/resources/gearth/G-EarthLogo.png b/G-Earth/src/main/resources/gearth/G-EarthLogo.png new file mode 100644 index 0000000..93fd6bc Binary files /dev/null and b/G-Earth/src/main/resources/gearth/G-EarthLogo.png differ diff --git a/G-Earth/src/main/resources/gearth/G-EarthLogoSmaller.png b/G-Earth/src/main/resources/gearth/G-EarthLogoSmaller.png new file mode 100644 index 0000000..a6a0196 Binary files /dev/null and b/G-Earth/src/main/resources/gearth/G-EarthLogoSmaller.png differ diff --git a/G-Earth/src/main/resources/gearth/ui/G-Earth.fxml b/G-Earth/src/main/resources/gearth/ui/G-Earth.fxml new file mode 100644 index 0000000..26bf3a3 --- /dev/null +++ b/G-Earth/src/main/resources/gearth/ui/G-Earth.fxml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/G-Earth-UI/src/main/java/gearth/ui/bootstrap3.css b/G-Earth/src/main/resources/gearth/ui/bootstrap3.css similarity index 99% rename from G-Earth-UI/src/main/java/gearth/ui/bootstrap3.css rename to G-Earth/src/main/resources/gearth/ui/bootstrap3.css index a79da42..e09e83b 100644 --- a/G-Earth-UI/src/main/java/gearth/ui/bootstrap3.css +++ b/G-Earth/src/main/resources/gearth/ui/bootstrap3.css @@ -152,7 +152,7 @@ VBox > .split-menu-button.last > .arrow-button { .font-menu-button, .split-menu-button > .label,.split-menu-button > .arrow-button { -fx-border-color: #cccccc; - -fx-text-fill: #333333; + -fx-text-fill: #000000; } /*just for the special split menu button*/ .split-menu-button > .label { @@ -342,7 +342,7 @@ VBox > .split-menu-button.last > .arrow-button { } .menu-item:focused > * { - -fx-text-fill: #262626; + -fx-text-fill: #000000; } .menu-item:focused .arrow { -fx-background-color: #333333; diff --git a/G-Earth-UI/src/main/java/gearth/ui/buttons/files/ButtonDelete.png b/G-Earth/src/main/resources/gearth/ui/buttons/files/ButtonDelete.png similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/buttons/files/ButtonDelete.png rename to G-Earth/src/main/resources/gearth/ui/buttons/files/ButtonDelete.png diff --git a/G-Earth-UI/src/main/java/gearth/ui/buttons/files/ButtonDeleteHover.png b/G-Earth/src/main/resources/gearth/ui/buttons/files/ButtonDeleteHover.png similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/buttons/files/ButtonDeleteHover.png rename to G-Earth/src/main/resources/gearth/ui/buttons/files/ButtonDeleteHover.png diff --git a/G-Earth-UI/src/main/java/gearth/ui/buttons/files/ButtonEdit.png b/G-Earth/src/main/resources/gearth/ui/buttons/files/ButtonEdit.png similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/buttons/files/ButtonEdit.png rename to G-Earth/src/main/resources/gearth/ui/buttons/files/ButtonEdit.png diff --git a/G-Earth-UI/src/main/java/gearth/ui/buttons/files/ButtonEditHover.png b/G-Earth/src/main/resources/gearth/ui/buttons/files/ButtonEditHover.png similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/buttons/files/ButtonEditHover.png rename to G-Earth/src/main/resources/gearth/ui/buttons/files/ButtonEditHover.png diff --git a/G-Earth-UI/src/main/java/gearth/ui/buttons/files/ButtonExit.png b/G-Earth/src/main/resources/gearth/ui/buttons/files/ButtonExit.png similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/buttons/files/ButtonExit.png rename to G-Earth/src/main/resources/gearth/ui/buttons/files/ButtonExit.png diff --git a/G-Earth-UI/src/main/java/gearth/ui/buttons/files/ButtonExitHover.png b/G-Earth/src/main/resources/gearth/ui/buttons/files/ButtonExitHover.png similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/buttons/files/ButtonExitHover.png rename to G-Earth/src/main/resources/gearth/ui/buttons/files/ButtonExitHover.png diff --git a/G-Earth-UI/src/main/java/gearth/ui/buttons/files/ButtonFire.png b/G-Earth/src/main/resources/gearth/ui/buttons/files/ButtonFire.png similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/buttons/files/ButtonFire.png rename to G-Earth/src/main/resources/gearth/ui/buttons/files/ButtonFire.png diff --git a/G-Earth-UI/src/main/java/gearth/ui/buttons/files/ButtonFireHover.png b/G-Earth/src/main/resources/gearth/ui/buttons/files/ButtonFireHover.png similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/buttons/files/ButtonFireHover.png rename to G-Earth/src/main/resources/gearth/ui/buttons/files/ButtonFireHover.png diff --git a/G-Earth-UI/src/main/java/gearth/ui/buttons/files/ButtonPause.png b/G-Earth/src/main/resources/gearth/ui/buttons/files/ButtonPause.png similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/buttons/files/ButtonPause.png rename to G-Earth/src/main/resources/gearth/ui/buttons/files/ButtonPause.png diff --git a/G-Earth-UI/src/main/java/gearth/ui/buttons/files/ButtonPauseHover.png b/G-Earth/src/main/resources/gearth/ui/buttons/files/ButtonPauseHover.png similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/buttons/files/ButtonPauseHover.png rename to G-Earth/src/main/resources/gearth/ui/buttons/files/ButtonPauseHover.png diff --git a/G-Earth-UI/src/main/java/gearth/ui/buttons/files/ButtonReload.png b/G-Earth/src/main/resources/gearth/ui/buttons/files/ButtonReload.png similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/buttons/files/ButtonReload.png rename to G-Earth/src/main/resources/gearth/ui/buttons/files/ButtonReload.png diff --git a/G-Earth-UI/src/main/java/gearth/ui/buttons/files/ButtonReloadHover.png b/G-Earth/src/main/resources/gearth/ui/buttons/files/ButtonReloadHover.png similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/buttons/files/ButtonReloadHover.png rename to G-Earth/src/main/resources/gearth/ui/buttons/files/ButtonReloadHover.png diff --git a/G-Earth-UI/src/main/java/gearth/ui/buttons/files/ButtonResume.png b/G-Earth/src/main/resources/gearth/ui/buttons/files/ButtonResume.png similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/buttons/files/ButtonResume.png rename to G-Earth/src/main/resources/gearth/ui/buttons/files/ButtonResume.png diff --git a/G-Earth-UI/src/main/java/gearth/ui/buttons/files/ButtonResumeHover.png b/G-Earth/src/main/resources/gearth/ui/buttons/files/ButtonResumeHover.png similarity index 100% rename from G-Earth-UI/src/main/java/gearth/ui/buttons/files/ButtonResumeHover.png rename to G-Earth/src/main/resources/gearth/ui/buttons/files/ButtonResumeHover.png diff --git a/G-Earth/src/main/resources/gearth/ui/connection/Connection.fxml b/G-Earth/src/main/resources/gearth/ui/connection/Connection.fxml new file mode 100644 index 0000000..8f5303d --- /dev/null +++ b/G-Earth/src/main/resources/gearth/ui/connection/Connection.fxml @@ -0,0 +1,215 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/G-Earth/src/main/resources/gearth/ui/extensions/Extensions.fxml b/G-Earth/src/main/resources/gearth/ui/extensions/Extensions.fxml new file mode 100644 index 0000000..67b21a0 --- /dev/null +++ b/G-Earth/src/main/resources/gearth/ui/extensions/Extensions.fxml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/G-Earth/src/main/resources/gearth/ui/logger/Logger.fxml b/G-Earth/src/main/resources/gearth/ui/logger/Logger.fxml new file mode 100644 index 0000000..fb7846e --- /dev/null +++ b/G-Earth/src/main/resources/gearth/ui/logger/Logger.fxml @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/G-Earth/src/main/resources/gearth/ui/logger/uilogger/UiLogger.fxml b/G-Earth/src/main/resources/gearth/ui/logger/uilogger/UiLogger.fxml new file mode 100644 index 0000000..e5419fa --- /dev/null +++ b/G-Earth/src/main/resources/gearth/ui/logger/uilogger/UiLogger.fxml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/G-Earth/src/main/resources/gearth/ui/logger/uilogger/logger.css b/G-Earth/src/main/resources/gearth/ui/logger/uilogger/logger.css new file mode 100644 index 0000000..a389cda --- /dev/null +++ b/G-Earth/src/main/resources/gearth/ui/logger/uilogger/logger.css @@ -0,0 +1,43 @@ +/* packet logger css */ +.text { + -fx-fill: #a9a9a9; +} + +.blocked, .replaced { + -fx-fill: #ffff00; +} + +.incoming { + -fx-fill: #b22222; +} + +.outgoing { + -fx-fill: #0066cc; +} + +.structure, .skipped { + -fx-fill: cyan; +} + +.dark { + -fx-background-color: #000000; +} + +.caret { + -fx-stroke: #ffffff; +} + +.label { + -fx-text-fill: #000000 !important; +} + +.menu-bar .text, .menu .text { + -fx-text-fill: #000000 !important; + -fx-fill: #000000 !important; + -fx-padding: -2 0 -2 0 !important; +} + +.scroll-bar:vertical { + -fx-pref-width: 16.5; + -fx-padding: 1; +} diff --git a/G-Earth/src/main/resources/gearth/ui/scheduler/Scheduler.fxml b/G-Earth/src/main/resources/gearth/ui/scheduler/Scheduler.fxml new file mode 100644 index 0000000..5769bc3 --- /dev/null +++ b/G-Earth/src/main/resources/gearth/ui/scheduler/Scheduler.fxml @@ -0,0 +1,172 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/G-Earth-UI/src/main/java/gearth/ui/settings/Settings.fxml b/G-Earth/src/main/resources/gearth/ui/settings/Settings.fxml similarity index 65% rename from G-Earth-UI/src/main/java/gearth/ui/settings/Settings.fxml rename to G-Earth/src/main/resources/gearth/ui/settings/Settings.fxml index f55c5a5..1bef685 100644 --- a/G-Earth-UI/src/main/java/gearth/ui/settings/Settings.fxml +++ b/G-Earth/src/main/resources/gearth/ui/settings/Settings.fxml @@ -3,12 +3,14 @@ - + - - + + - + \ No newline at end of file diff --git a/G-Earth/src/main/resources/gearth/ui/tools/Tools.fxml b/G-Earth/src/main/resources/gearth/ui/tools/Tools.fxml new file mode 100644 index 0000000..e933629 --- /dev/null +++ b/G-Earth/src/main/resources/gearth/ui/tools/Tools.fxml @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pom.xml b/pom.xml index ff1cce7..3ec3519 100644 --- a/pom.xml +++ b/pom.xml @@ -7,23 +7,77 @@ G-Earth G-Earth-Parent pom - 0.0.1-beta + 0.2 1.8 1.8 - G-Earth + G-Earth-Parent https://github.com/sirjonasxx/G-Earth - + Cross Platform Habbo packetlogger/manipulator - G-Earth-UI + G-Earth Extensions/AdminOnConnect Extensions/BlockReplacePackets Extensions/SpeechColorizer + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.7.0 + + 1.8 + 1.8 + + + + + + maven-dependency-plugin + + + package + + copy-dependencies + + + ${project.build.directory}/bin/lib + + + + + + + maven-resources-plugin + 2.6 + + + copy-resources + validate + + copy-resources + + + ${project.build.directory} + + + src/main/resources + + + + + + + + + \ No newline at end of file