mirror of
https://github.com/sirjonasxx/G-Earth.git
synced 2025-02-17 03:32:36 +01:00
packet info explorer built in extension
This commit is contained in:
parent
87a0b1a1f1
commit
45c530c58d
@ -4,6 +4,7 @@ import gearth.extensions.InternalExtensionFormBuilder;
|
||||
import gearth.services.extensionhandler.extensions.extensionproducers.ExtensionProducer;
|
||||
import gearth.services.extensionhandler.extensions.extensionproducers.ExtensionProducerObserver;
|
||||
import gearth.services.internal_extensions.blockreplacepackets.BlockAndReplacePackets;
|
||||
import gearth.services.internal_extensions.packetinfoexplorer.PacketInfoExplorer;
|
||||
|
||||
public class SimpleExtensionProducer implements ExtensionProducer {
|
||||
|
||||
@ -15,5 +16,8 @@ public class SimpleExtensionProducer implements ExtensionProducer {
|
||||
|
||||
new InternalExtensionFormBuilder<BlockAndReplacePackets>()
|
||||
.launch(BlockAndReplacePackets.class, observer);
|
||||
|
||||
new InternalExtensionFormBuilder<PacketInfoExplorer>()
|
||||
.launch(PacketInfoExplorer.class, observer);
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,192 @@
|
||||
package gearth.services.internal_extensions.packetinfoexplorer;
|
||||
|
||||
import gearth.Main;
|
||||
import gearth.extensions.ExtensionForm;
|
||||
import gearth.extensions.ExtensionInfo;
|
||||
import gearth.misc.packet_info.PacketInfo;
|
||||
import gearth.misc.packet_info.PacketInfoManager;
|
||||
import gearth.protocol.HMessage;
|
||||
import gearth.ui.GEarthController;
|
||||
import javafx.application.Platform;
|
||||
import javafx.beans.InvalidationListener;
|
||||
import javafx.beans.Observable;
|
||||
import javafx.beans.property.IntegerProperty;
|
||||
import javafx.beans.property.SimpleIntegerProperty;
|
||||
import javafx.fxml.FXMLLoader;
|
||||
import javafx.scene.Parent;
|
||||
import javafx.scene.Scene;
|
||||
import javafx.scene.control.*;
|
||||
import javafx.scene.control.TextField;
|
||||
import javafx.scene.control.cell.PropertyValueFactory;
|
||||
import javafx.scene.image.Image;
|
||||
import javafx.scene.layout.GridPane;
|
||||
import javafx.stage.Stage;
|
||||
|
||||
import java.awt.*;
|
||||
import java.util.*;
|
||||
import java.util.List;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@ExtensionInfo(
|
||||
Title = "Packet Info",
|
||||
Description = "Packet info explorer",
|
||||
Version = "0.1",
|
||||
Author = "sirjonasxx"
|
||||
)
|
||||
public class PacketInfoExplorer extends ExtensionForm {
|
||||
public TextField txt_filterHeaderId;
|
||||
public TextField txt_filterNameHash;
|
||||
public GridPane source_grid;
|
||||
public CheckBox chk_toClient;
|
||||
public CheckBox chk_toServer;
|
||||
|
||||
private Map<String, CheckBox> chk_sources = new HashMap<>();
|
||||
|
||||
private List<PacketInfo> packetInfoList = new ArrayList<>();
|
||||
|
||||
private TableView<PacketInfo> tableView;
|
||||
public GridPane grid;
|
||||
|
||||
@Override
|
||||
public ExtensionForm launchForm(Stage primaryStage) throws Exception {
|
||||
FXMLLoader loader = new FXMLLoader(PacketInfoExplorer.class.getResource("PacketInfoExplorer.fxml"));
|
||||
Parent root = loader.load();
|
||||
|
||||
primaryStage.setTitle("Packet info explorer");
|
||||
primaryStage.setScene(new Scene(root));
|
||||
primaryStage.setMinWidth(430);
|
||||
primaryStage.setMinHeight(260);
|
||||
primaryStage.getScene().getStylesheets().add(GEarthController.class.getResource("/gearth/ui/bootstrap3.css").toExternalForm());
|
||||
primaryStage.getIcons().add(new Image(Main.class.getResourceAsStream("G-EarthLogoSmaller.png")));
|
||||
|
||||
return loader.getController();
|
||||
}
|
||||
|
||||
public void initialize() {
|
||||
Platform.runLater( () -> grid.requestFocus() );
|
||||
|
||||
tableView = new TableView<>();
|
||||
tableView.setTableMenuButtonVisible(true);
|
||||
tableView.setStyle("-fx-focus-color: white;");
|
||||
|
||||
tableView.focusedProperty().addListener(observable -> {
|
||||
if (tableView.isFocused()) {
|
||||
grid.requestFocus();
|
||||
}
|
||||
});
|
||||
|
||||
TableColumn<PacketInfo, Integer> headerIdColumn = new TableColumn<>("Header ID");
|
||||
headerIdColumn.setCellValueFactory(new PropertyValueFactory<>("headerId"));
|
||||
|
||||
TableColumn<PacketInfo, HMessage.Direction> directionColumn = new TableColumn<>("Direction");
|
||||
directionColumn.setCellValueFactory(new PropertyValueFactory<>("destination"));
|
||||
directionColumn.setPrefWidth(96);
|
||||
|
||||
TableColumn<PacketInfo, String> packetNameColumn = new TableColumn<>("Name");
|
||||
packetNameColumn.setCellValueFactory(new PropertyValueFactory<>("name"));
|
||||
packetNameColumn.setPrefWidth(220);
|
||||
|
||||
TableColumn<PacketInfo, String> packetHashColumn = new TableColumn<>("Hash");
|
||||
packetHashColumn.setVisible(false);
|
||||
packetHashColumn.setCellValueFactory(new PropertyValueFactory<>("hash"));
|
||||
packetHashColumn.setPrefWidth(220);
|
||||
|
||||
TableColumn<PacketInfo, String> structureColumn = new TableColumn<>("Structure");
|
||||
structureColumn.setCellValueFactory(new PropertyValueFactory<>("structure"));
|
||||
structureColumn.setPrefWidth(115);
|
||||
|
||||
TableColumn<PacketInfo, String> sourceColumn = new TableColumn<>("Source");
|
||||
sourceColumn.setCellValueFactory(new PropertyValueFactory<>("source"));
|
||||
|
||||
tableView.getColumns().addAll(Arrays.asList(headerIdColumn, directionColumn, packetNameColumn,
|
||||
packetHashColumn, structureColumn, sourceColumn));
|
||||
|
||||
grid.add(tableView, 0, 1);
|
||||
|
||||
InvalidationListener filterValues = observable -> updateTableValues();
|
||||
txt_filterHeaderId.textProperty().addListener(filterValues);
|
||||
txt_filterNameHash.textProperty().addListener(filterValues);
|
||||
chk_toClient.selectedProperty().addListener(filterValues);
|
||||
chk_toClient.selectedProperty().addListener(filterValues);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initExtension() {
|
||||
onConnect((host, port, hotelversion, clientIdentifier, clientType, packetInfoManager) -> {
|
||||
setPacketInfoManager(packetInfoManager);
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onEndConnection() {
|
||||
setPacketInfoManager(PacketInfoManager.EMPTY);
|
||||
}
|
||||
|
||||
private void setPacketInfoManager(PacketInfoManager packetInfoManager) {
|
||||
packetInfoList = packetInfoManager.getPacketInfoList();
|
||||
packetInfoList.sort(Comparator.comparingInt(PacketInfo::getHeaderId));
|
||||
|
||||
Platform.runLater(() -> {
|
||||
source_grid.getChildren().clear();
|
||||
chk_sources.clear();
|
||||
for (PacketInfo packetInfo : packetInfoList) {
|
||||
if (!chk_sources.containsKey(packetInfo.getSource())) {
|
||||
CheckBox checkBox = new CheckBox(packetInfo.getSource());
|
||||
checkBox.setSelected(true);
|
||||
checkBox.selectedProperty().addListener(observable -> updateTableValues());
|
||||
source_grid.add(checkBox, 0, chk_sources.size());
|
||||
chk_sources.put(packetInfo.getSource(), checkBox);
|
||||
}
|
||||
}
|
||||
|
||||
primaryStage.setTitle("Packet info explorer | " + packetInfoList.size() + " packets");
|
||||
|
||||
updateTableValues();
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
private void updateTableValues() {
|
||||
tableView.getItems().clear();
|
||||
|
||||
IntegerProperty doHeaderIdFilter = new SimpleIntegerProperty(-1);
|
||||
if (!txt_filterHeaderId.getText().equals("")) {
|
||||
try {
|
||||
doHeaderIdFilter.setValue(Integer.parseInt(txt_filterHeaderId.getText()));
|
||||
}
|
||||
catch (Exception ignore) {}
|
||||
}
|
||||
|
||||
|
||||
List<PacketInfo> allPacketInfos = packetInfoList.stream()
|
||||
.filter(packetInfo -> {
|
||||
if (doHeaderIdFilter.get() != -1 && packetInfo.getHeaderId() != doHeaderIdFilter.get()) return false;
|
||||
String filterNameHashLower = txt_filterNameHash.getText().toLowerCase();
|
||||
if (!filterNameHashLower.equals("")
|
||||
&& (packetInfo.getName() == null || !packetInfo.getName().toLowerCase().contains(filterNameHashLower))
|
||||
&& (packetInfo.getHash() == null || !packetInfo.getHash().toLowerCase().contains(filterNameHashLower))) {
|
||||
return false;
|
||||
}
|
||||
if ((!chk_toClient.isSelected() && packetInfo.getDestination() == HMessage.Direction.TOCLIENT)
|
||||
|| (!chk_toServer.isSelected() && packetInfo.getDestination() == HMessage.Direction.TOSERVER)) {
|
||||
return false;
|
||||
}
|
||||
if (!chk_sources.get(packetInfo.getSource()).isSelected()) return false;
|
||||
return true;
|
||||
}).collect(Collectors.toList());
|
||||
|
||||
|
||||
tableView.getItems().addAll(allPacketInfos);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canLeave() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean canDelete() {
|
||||
return false;
|
||||
}
|
||||
}
|
@ -0,0 +1,116 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import javafx.geometry.*?>
|
||||
<?import javafx.scene.control.*?>
|
||||
<?import javafx.scene.layout.*?>
|
||||
|
||||
<GridPane fx:id="grid" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="442.0" prefWidth="620.0" style="-fx-background-color: white;" xmlns="http://javafx.com/javafx/10.0.2-internal" xmlns:fx="http://javafx.com/fxml/1" fx:controller="gearth.services.internal_extensions.packetinfoexplorer.PacketInfoExplorer">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints maxHeight="80.0" minHeight="80.0" prefHeight="80.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints maxHeight="1.7976931348623157E308" minHeight="10.0" prefHeight="360.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<GridPane style="-fx-border-width: 1px 0 0 0; -fx-border-color: #bbb;">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" maxWidth="105.0" minWidth="105.0" prefWidth="105.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="245.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" maxWidth="100.0" minWidth="100.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" maxWidth="100.0" minWidth="100.0" prefWidth="100.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<GridPane>
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints maxHeight="30.0" minHeight="30.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints maxHeight="20.0" minHeight="20.0" prefHeight="20.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<padding>
|
||||
<Insets left="10.0" right="10.0" />
|
||||
</padding>
|
||||
<children>
|
||||
<Label maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" text="Filter headerId:" textFill="#000000d3" />
|
||||
<TextField fx:id="txt_filterHeaderId" GridPane.rowIndex="1" />
|
||||
</children>
|
||||
</GridPane>
|
||||
<GridPane style="-fx-border-color: #bbb; -fx-border-width: 0 0 0 1px;" GridPane.columnIndex="1">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints maxHeight="30.0" minHeight="30.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints maxHeight="20.0" minHeight="20.0" prefHeight="20.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<padding>
|
||||
<Insets left="10.0" right="10.0" />
|
||||
</padding>
|
||||
<children>
|
||||
<TextField fx:id="txt_filterNameHash" GridPane.rowIndex="1" />
|
||||
<Label maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" text="Filter name or hash:" textFill="#000000d3" />
|
||||
</children>
|
||||
</GridPane>
|
||||
<GridPane prefHeight="100.0" prefWidth="101.0" style="-fx-border-color: #bbb; -fx-border-width: 0 0 0 1px;" GridPane.columnIndex="3">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints maxHeight="30.0" minHeight="30.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints maxHeight="78.0" minHeight="10.0" prefHeight="70.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<GridPane fx:id="source_grid" GridPane.rowIndex="1">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
</GridPane>
|
||||
<Label maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" text="Filter source:" textFill="#000000d3" />
|
||||
</children>
|
||||
<padding>
|
||||
<Insets left="5.0" right="5.0" />
|
||||
</padding>
|
||||
</GridPane>
|
||||
<GridPane style="-fx-border-width: 0 0 0 1px; -fx-border-color: #bbb;" GridPane.columnIndex="2">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints maxHeight="30.0" minHeight="30.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<GridPane GridPane.rowIndex="1">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<CheckBox fx:id="chk_toClient" mnemonicParsing="false" selected="true" text="TOCLIENT" />
|
||||
<CheckBox fx:id="chk_toServer" layoutX="10.0" layoutY="17.0" mnemonicParsing="false" selected="true" text="TOSERVER" GridPane.rowIndex="1" />
|
||||
</children>
|
||||
</GridPane>
|
||||
<Label maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" text="Filter direction:" textFill="#000000d3" />
|
||||
</children>
|
||||
<padding>
|
||||
<Insets left="5.0" right="5.0" />
|
||||
</padding>
|
||||
</GridPane>
|
||||
</children>
|
||||
</GridPane>
|
||||
</children>
|
||||
</GridPane>
|
Loading…
x
Reference in New Issue
Block a user