packet info explorer built in extension

This commit is contained in:
sirjonasxx 2021-04-27 04:15:35 +02:00
parent 87a0b1a1f1
commit 45c530c58d
3 changed files with 312 additions and 0 deletions

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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>