From 964813dfe7cce1ff12a3dc9a60066a0fbe8532ab Mon Sep 17 00:00:00 2001 From: sirjonasxx <36828922+sirjonasxx@users.noreply.github.com> Date: Thu, 22 Apr 2021 02:58:50 +0200 Subject: [PATCH 01/33] add something --- .../src/main/java/gearth/protocol/HConnection.java | 13 ++++++++++--- .../java/gearth/protocol/connection/HProxy.java | 10 +++++----- .../connection/proxy/flash/FlashProxyProvider.java | 4 ++-- .../connection/proxy/unity/UnityCommunicator.java | 4 ++-- .../flash/OnDatastreamConfirmedListener.java | 2 +- .../flash/OutgoingFlashPacketHandler.java | 6 +++--- .../services/extensionhandler/ExtensionHandler.java | 4 +++- .../extensions/GEarthExtension.java | 3 ++- .../implementations/network/NetworkExtension.java | 6 ++++-- .../implementations/simple/ExampleExtension.java | 3 ++- 10 files changed, 34 insertions(+), 21 deletions(-) diff --git a/G-Earth/src/main/java/gearth/protocol/HConnection.java b/G-Earth/src/main/java/gearth/protocol/HConnection.java index 511494d..fb0361c 100644 --- a/G-Earth/src/main/java/gearth/protocol/HConnection.java +++ b/G-Earth/src/main/java/gearth/protocol/HConnection.java @@ -1,10 +1,10 @@ package gearth.protocol; import gearth.misc.listenerpattern.Observable; +import gearth.protocol.connection.HClient; import gearth.protocol.connection.HProxy; import gearth.protocol.connection.HState; import gearth.protocol.connection.proxy.ProxyProvider; -import gearth.protocol.connection.proxy.flash.FlashProxyProvider; import gearth.protocol.connection.proxy.ProxyProviderFactory; import gearth.protocol.connection.proxy.flash.unix.LinuxRawIpFlashProxyProvider; import gearth.protocol.connection.proxy.unity.UnityProxyProvider; @@ -172,11 +172,18 @@ public class HConnection { return proxy.getHotelVersion(); } - public String getClientType() { + public String getClientIdentifier() { if (proxy == null) { return ""; } - return proxy.getClientType(); + return proxy.getClientIdentifier(); + } + + public HClient getClientType() { + if (proxy == null) { + return null; + } + return proxy.gethClient(); } public boolean isRawIpMode() { diff --git a/G-Earth/src/main/java/gearth/protocol/connection/HProxy.java b/G-Earth/src/main/java/gearth/protocol/connection/HProxy.java index 530556d..2a78e33 100644 --- a/G-Earth/src/main/java/gearth/protocol/connection/HProxy.java +++ b/G-Earth/src/main/java/gearth/protocol/connection/HProxy.java @@ -21,7 +21,7 @@ public class HProxy { private volatile PacketHandler outHandler = null; //connection with server (only initialized when verified habbo connection) private volatile String hotelVersion = ""; - private volatile String clientType = ""; + private volatile String clientIdentifier = ""; private volatile AsyncPacketSender asyncPacketSender = null; public HProxy(HClient hClient, String input_domain, String actual_domain, int actual_port, int intercept_port, String intercept_host) { @@ -37,16 +37,16 @@ public class HProxy { this.proxy_server = socket; } - public void verifyProxy(PacketHandler incomingHandler, PacketHandler outgoingHandler, String hotelVersion, String clientType) { + public void verifyProxy(PacketHandler incomingHandler, PacketHandler outgoingHandler, String hotelVersion, String clientIdentifier) { this.inHandler = incomingHandler; this.outHandler = outgoingHandler; this.hotelVersion = hotelVersion; - this.clientType = clientType; + this.clientIdentifier = clientIdentifier; this.asyncPacketSender = new AsyncPacketSender(this); } - public String getClientType() { - return clientType; + public String getClientIdentifier() { + return clientIdentifier; } public int getActual_port() { diff --git a/G-Earth/src/main/java/gearth/protocol/connection/proxy/flash/FlashProxyProvider.java b/G-Earth/src/main/java/gearth/protocol/connection/proxy/flash/FlashProxyProvider.java index b06c431..1a8ec33 100644 --- a/G-Earth/src/main/java/gearth/protocol/connection/proxy/flash/FlashProxyProvider.java +++ b/G-Earth/src/main/java/gearth/protocol/connection/proxy/flash/FlashProxyProvider.java @@ -51,9 +51,9 @@ public abstract class FlashProxyProvider implements ProxyProvider { Semaphore abort = new Semaphore(0); - outgoingHandler.addOnDatastreamConfirmedListener((hotelVersion, clientType) -> { + outgoingHandler.addOnDatastreamConfirmedListener((hotelVersion, clientIdentifier) -> { incomingHandler.setAsDataStream(); - proxy.verifyProxy(incomingHandler, outgoingHandler, hotelVersion, clientType); + proxy.verifyProxy(incomingHandler, outgoingHandler, hotelVersion, clientIdentifier); proxySetter.setProxy(proxy); datastream[0] = true; abortSemaphore = abort; diff --git a/G-Earth/src/main/java/gearth/protocol/connection/proxy/unity/UnityCommunicator.java b/G-Earth/src/main/java/gearth/protocol/connection/proxy/unity/UnityCommunicator.java index c59ef92..36cd806 100644 --- a/G-Earth/src/main/java/gearth/protocol/connection/proxy/unity/UnityCommunicator.java +++ b/G-Earth/src/main/java/gearth/protocol/connection/proxy/unity/UnityCommunicator.java @@ -59,12 +59,12 @@ public class UnityCommunicator { if (maybe.getBytesLength() > 6 && maybe.headerId() == 4000) { hProxy = new HProxy(HClient.UNITY, "", "", -1, -1, ""); String ignore = maybe.readString(); - String clientType = maybe.readString(); + String clientIdentifier = maybe.readString(); hProxy.verifyProxy( new UnityPacketHandler(hConnection.getExtensionHandler(), hConnection.getTrafficObservables(), session, HMessage.Direction.TOCLIENT), new UnityPacketHandler(hConnection.getExtensionHandler(), hConnection.getTrafficObservables(), session, HMessage.Direction.TOSERVER), revision, - clientType + clientIdentifier ); proxySetter.setProxy(hProxy); stateSetter.setState(HState.CONNECTED); diff --git a/G-Earth/src/main/java/gearth/protocol/packethandler/flash/OnDatastreamConfirmedListener.java b/G-Earth/src/main/java/gearth/protocol/packethandler/flash/OnDatastreamConfirmedListener.java index 6e13dab..f7ed253 100644 --- a/G-Earth/src/main/java/gearth/protocol/packethandler/flash/OnDatastreamConfirmedListener.java +++ b/G-Earth/src/main/java/gearth/protocol/packethandler/flash/OnDatastreamConfirmedListener.java @@ -2,6 +2,6 @@ package gearth.protocol.packethandler.flash; public interface OnDatastreamConfirmedListener { - void confirm(String hotelVersion, String clientType); + void confirm(String hotelVersion, String clientIdentifier); } diff --git a/G-Earth/src/main/java/gearth/protocol/packethandler/flash/OutgoingFlashPacketHandler.java b/G-Earth/src/main/java/gearth/protocol/packethandler/flash/OutgoingFlashPacketHandler.java index a2775e6..84ddf7b 100644 --- a/G-Earth/src/main/java/gearth/protocol/packethandler/flash/OutgoingFlashPacketHandler.java +++ b/G-Earth/src/main/java/gearth/protocol/packethandler/flash/OutgoingFlashPacketHandler.java @@ -26,9 +26,9 @@ public class OutgoingFlashPacketHandler extends FlashPacketHandler { HPacket hpacket = new HPacket(buffer); isDataStream = (hpacket.getBytesLength() > 6 && hpacket.length() < 100); if (isDataStream) { - String version = hpacket.readString(); - String clientType = hpacket.readString(); - datastreamConfirmedObservable.fireEvent(l -> l.confirm(version, clientType)); + String hotelVersion = hpacket.readString(); + String clientIdentifier = hpacket.readString(); + datastreamConfirmedObservable.fireEvent(l -> l.confirm(hotelVersion, clientIdentifier)); } } } diff --git a/G-Earth/src/main/java/gearth/services/extensionhandler/ExtensionHandler.java b/G-Earth/src/main/java/gearth/services/extensionhandler/ExtensionHandler.java index 3d12d3a..0472701 100644 --- a/G-Earth/src/main/java/gearth/services/extensionhandler/ExtensionHandler.java +++ b/G-Earth/src/main/java/gearth/services/extensionhandler/ExtensionHandler.java @@ -48,13 +48,14 @@ public class ExtensionHandler { hConnection.getStateObservable().addListener((oldState, newState) -> { if (newState == HState.CONNECTED) { - HarbleAPIFetcher.fetch(hConnection.getHotelVersion(), hConnection.getClientType()); + HarbleAPIFetcher.fetch(hConnection.getHotelVersion(), hConnection.getClientIdentifier()); synchronized (gEarthExtensions) { for (GEarthExtension extension : gEarthExtensions) { extension.connectionStart( hConnection.getDomain(), hConnection.getServerPort(), hConnection.getHotelVersion(), + hConnection.getClientIdentifier(), hConnection.getClientType(), HarbleAPIFetcher.HARBLEAPI == null ? "null" : HarbleAPIFetcher.HARBLEAPI.getPath() ); @@ -244,6 +245,7 @@ public class ExtensionHandler { hConnection.getDomain(), hConnection.getServerPort(), hConnection.getHotelVersion(), + hConnection.getClientIdentifier(), hConnection.getClientType(), HarbleAPIFetcher.HARBLEAPI == null ? "null" : HarbleAPIFetcher.HARBLEAPI.getPath() ); diff --git a/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/GEarthExtension.java b/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/GEarthExtension.java index ce52885..dd4724e 100644 --- a/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/GEarthExtension.java +++ b/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/GEarthExtension.java @@ -4,6 +4,7 @@ import gearth.misc.listenerpattern.Observable; import gearth.misc.listenerpattern.SynchronizedObservable; import gearth.protocol.HMessage; import gearth.protocol.HPacket; +import gearth.protocol.connection.HClient; import gearth.services.extensionhandler.extensions.listeners.OmRemoveClickListener; import gearth.services.extensionhandler.extensions.listeners.OnClickListener; import gearth.services.extensionhandler.extensions.listeners.OnDeleteListener; @@ -38,7 +39,7 @@ public abstract class GEarthExtension { public abstract void doubleclick(); public abstract void packetIntercept(HMessage hMessage); public abstract void provideFlags(String[] flags); - public abstract void connectionStart(String host, int port, String hotelVersion, String clientType, String harbleMessagesPath); + public abstract void connectionStart(String host, int port, String hotelVersion, String clientIdentifier, HClient clientType, String harbleMessagesPath); public abstract void connectionEnd(); public abstract void init(); public abstract void close(); diff --git a/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/implementations/network/NetworkExtension.java b/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/implementations/network/NetworkExtension.java index 707a3d2..ad9ce0d 100644 --- a/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/implementations/network/NetworkExtension.java +++ b/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/implementations/network/NetworkExtension.java @@ -1,6 +1,7 @@ package gearth.services.extensionhandler.extensions.implementations.network; import gearth.protocol.HMessage; +import gearth.protocol.connection.HClient; import gearth.services.extensionhandler.extensions.GEarthExtension; import gearth.protocol.HPacket; @@ -190,14 +191,15 @@ public class NetworkExtension extends GEarthExtension { } @Override - public void connectionStart(String host, int port, String hotelVersion, String clientType, String harbleMessagesPath) { + public void connectionStart(String host, int port, String hotelVersion, String clientIdentifier, HClient clientType, String harbleMessagesPath) { sendMessage( new HPacket(NetworkExtensionInfo.OUTGOING_MESSAGES_IDS.CONNECTIONSTART) .appendString(host) .appendInt(port) .appendString(hotelVersion) .appendString(harbleMessagesPath) - .appendString(clientType) + .appendString(clientIdentifier) + .appendString(clientType.name()) ); } diff --git a/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/implementations/simple/ExampleExtension.java b/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/implementations/simple/ExampleExtension.java index 909deae..a9967c1 100644 --- a/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/implementations/simple/ExampleExtension.java +++ b/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/implementations/simple/ExampleExtension.java @@ -2,6 +2,7 @@ package gearth.services.extensionhandler.extensions.implementations.simple; import gearth.protocol.HMessage; import gearth.protocol.HPacket; +import gearth.protocol.connection.HClient; import gearth.services.extensionhandler.extensions.GEarthExtension; public class ExampleExtension extends GEarthExtension { @@ -83,7 +84,7 @@ public class ExampleExtension extends GEarthExtension { } @Override - public void connectionStart(String host, int port, String hotelVersion, String clientType, String harbleMessagesPath) { + public void connectionStart(String host, int port, String hotelVersion, String clientIdentifier, HClient clientType, String harbleMessagesPath) { // a new habbo client has connected System.out.println("Connected to " + host); } From e51dcbaff858c251e13ef5a5ce555b953d62b161 Mon Sep 17 00:00:00 2001 From: sirjonasxx <36828922+sirjonasxx@users.noreply.github.com> Date: Fri, 23 Apr 2021 00:17:02 +0200 Subject: [PATCH 02/33] beginnings of a new hash/name system --- .../extensions/extra/harble/HashSupport.java | 18 +- .../misc/harble_api/HarbleAPIFetcher.java | 28 +-- ...{HarbleAPI.java => PacketInfoManager.java} | 10 +- .../gearth/misc/packet_info/PacketInfo.java | 43 +++++ .../misc/packet_info/PacketInfoManager.java | 159 ++++++++++++++++++ .../providers/PacketInfoProvider.java | 40 +++++ .../providers/RemotePacketInfoProvider.java | 41 +++++ .../HarblePacketInfoProvider.java | 35 ++++ .../SulekPacketInfoProvider.java | 32 ++++ .../UnityPacketInfoProvider.java | 33 ++++ .../main/java/gearth/protocol/HPacket.java | 5 +- .../uilogger/UiLoggerController.java | 8 +- 12 files changed, 406 insertions(+), 46 deletions(-) rename G-Earth/src/main/java/gearth/misc/harble_api/{HarbleAPI.java => PacketInfoManager.java} (96%) create mode 100644 G-Earth/src/main/java/gearth/misc/packet_info/PacketInfo.java create mode 100644 G-Earth/src/main/java/gearth/misc/packet_info/PacketInfoManager.java create mode 100644 G-Earth/src/main/java/gearth/misc/packet_info/providers/PacketInfoProvider.java create mode 100644 G-Earth/src/main/java/gearth/misc/packet_info/providers/RemotePacketInfoProvider.java create mode 100644 G-Earth/src/main/java/gearth/misc/packet_info/providers/implementations/HarblePacketInfoProvider.java create mode 100644 G-Earth/src/main/java/gearth/misc/packet_info/providers/implementations/SulekPacketInfoProvider.java create mode 100644 G-Earth/src/main/java/gearth/misc/packet_info/providers/implementations/UnityPacketInfoProvider.java diff --git a/G-Earth/src/main/java/gearth/extensions/extra/harble/HashSupport.java b/G-Earth/src/main/java/gearth/extensions/extra/harble/HashSupport.java index c4dd705..40368cc 100644 --- a/G-Earth/src/main/java/gearth/extensions/extra/harble/HashSupport.java +++ b/G-Earth/src/main/java/gearth/extensions/extra/harble/HashSupport.java @@ -2,7 +2,7 @@ package gearth.extensions.extra.harble; import gearth.extensions.Extension; import gearth.extensions.IExtension; -import gearth.misc.harble_api.HarbleAPI; +import gearth.misc.harble_api.PacketInfoManager; import gearth.protocol.HMessage; import gearth.protocol.HPacket; @@ -20,7 +20,7 @@ public class HashSupport { private final Object lock = new Object(); - private HarbleAPI harbleAPI = new HarbleAPI(""); //empty + private PacketInfoManager packetInfoManager = new PacketInfoManager(""); //empty private Map> incomingMessageListeners = new HashMap<>(); private Map> outgoingMessageListeners = new HashMap<>(); @@ -31,13 +31,13 @@ public class HashSupport { extension.onConnect((host, port, hotelversion, clientType, cachePath) -> { // synchronized (lock) { - harbleAPI = new HarbleAPI(new File(cachePath)); + packetInfoManager = new PacketInfoManager(new File(cachePath)); // } }); extension.intercept(HMessage.Direction.TOSERVER, message -> { // synchronized (lock) { - HarbleAPI.HarbleMessage haMessage = harbleAPI.getHarbleMessageFromHeaderId(HMessage.Direction.TOSERVER, message.getPacket().headerId()); + PacketInfoManager.HarbleMessage haMessage = packetInfoManager.getHarbleMessageFromHeaderId(HMessage.Direction.TOSERVER, message.getPacket().headerId()); if (haMessage != null) { List listeners_hash = outgoingMessageListeners.get(haMessage.getHash()); List listeners_name = outgoingMessageListeners.get(haMessage.getName()); @@ -58,7 +58,7 @@ public class HashSupport { }); extension.intercept(HMessage.Direction.TOCLIENT, message -> { // synchronized (lock) { - HarbleAPI.HarbleMessage haMessage = harbleAPI.getHarbleMessageFromHeaderId(HMessage.Direction.TOCLIENT, message.getPacket().headerId()); + PacketInfoManager.HarbleMessage haMessage = packetInfoManager.getHarbleMessageFromHeaderId(HMessage.Direction.TOCLIENT, message.getPacket().headerId()); if (haMessage != null) { List listeners_hash = incomingMessageListeners.get(haMessage.getHash()); List listeners_name = incomingMessageListeners.get(haMessage.getName()); @@ -91,12 +91,12 @@ public class HashSupport { private boolean send(HMessage.Direction direction, String hashOrName, Object... objects) { int headerId; - HarbleAPI.HarbleMessage fromname = harbleAPI.getHarbleMessageFromName(direction, hashOrName); + PacketInfoManager.HarbleMessage fromname = packetInfoManager.getHarbleMessageFromName(direction, hashOrName); if (fromname != null) { headerId = fromname.getHeaderId(); } else { - List possibilities = harbleAPI.getHarbleMessagesFromHash(direction, hashOrName); + List possibilities = packetInfoManager.getHarbleMessagesFromHash(direction, hashOrName); if (possibilities.size() == 0) return false; headerId = possibilities.get(0).getHeaderId(); } @@ -129,7 +129,7 @@ public class HashSupport { return send(HMessage.Direction.TOSERVER, hashOrName, objects); } - public HarbleAPI getHarbleAPI() { - return harbleAPI; + public PacketInfoManager getPacketInfoManager() { + return packetInfoManager; } } diff --git a/G-Earth/src/main/java/gearth/misc/harble_api/HarbleAPIFetcher.java b/G-Earth/src/main/java/gearth/misc/harble_api/HarbleAPIFetcher.java index 4c54684..47a5e46 100644 --- a/G-Earth/src/main/java/gearth/misc/harble_api/HarbleAPIFetcher.java +++ b/G-Earth/src/main/java/gearth/misc/harble_api/HarbleAPIFetcher.java @@ -2,7 +2,6 @@ package gearth.misc.harble_api; import gearth.Main; import gearth.misc.Cacher; -import gearth.protocol.HMessage; import org.jsoup.Connection; import org.jsoup.Jsoup; @@ -10,39 +9,20 @@ import java.io.File; import java.io.IOException; import java.net.URISyntaxException; -/** - * Created by Jonas on 10/11/2018. - */ -/** - * Ok the usage of this class is pretty shitty so I'm just gonna add some documentation here - * - * What this class does is fetching the revision (if needed) from the API, this is the only class with communication with the - * actual API. Then the result (if any) gets cached. - * - * The method "fetch(xxx);" needs to be called exactly once at the moment a new connection has been made. - * - * However, at that same moment the Extension class needs to send the "startConnection" signal to the extensions, and we want to make sure - * that the cached revision is already available at the moment the extensions get initialized with a new connection. That's why the - * fetch() method here only gets called by the extension class as that's the only way to ensure this method gets called BEFORE the extensions - * start. (bc im lazy and dont wanna rewrite code too) - * - * - * the "HARBLEAPI" object contains the latest fetched object and is ensured to be up-to-date with the current connection - */ public class HarbleAPIFetcher { public static final String CACHE_PREFIX = "HARBLE_API-"; public static final String HARBLE_API_URL = "https://api.harble.net/messages/$hotelversion$.json"; //latest fetched - public static HarbleAPI HARBLEAPI = null; + public static PacketInfoManager HARBLEAPI = null; public synchronized static void fetch(String hotelversion, String clientType) { // if unity if (clientType.toLowerCase().contains("unity")) { try { - HARBLEAPI = new HarbleAPI( + HARBLEAPI = new PacketInfoManager( new File(new File(Main.class.getProtectionDomain().getCodeSource().getLocation().toURI()) .getParentFile(), "messages.json" ) @@ -56,7 +36,7 @@ public class HarbleAPIFetcher { String cacheName = CACHE_PREFIX + hotelversion; if (Cacher.cacheFileExists(cacheName)) { - HARBLEAPI = new HarbleAPI(hotelversion); + HARBLEAPI = new PacketInfoManager(hotelversion); } else { Connection connection = Jsoup.connect(HARBLE_API_URL.replace("$hotelversion$", hotelversion)).ignoreContentType(true); @@ -66,7 +46,7 @@ public class HarbleAPIFetcher { if (response.statusCode() == 200) { String messagesBodyJson = response.body(); Cacher.updateCache(messagesBodyJson, cacheName); - HARBLEAPI = new HarbleAPI(hotelversion); + HARBLEAPI = new PacketInfoManager(hotelversion); } else { HARBLEAPI = null; diff --git a/G-Earth/src/main/java/gearth/misc/harble_api/HarbleAPI.java b/G-Earth/src/main/java/gearth/misc/harble_api/PacketInfoManager.java similarity index 96% rename from G-Earth/src/main/java/gearth/misc/harble_api/HarbleAPI.java rename to G-Earth/src/main/java/gearth/misc/harble_api/PacketInfoManager.java index 8333483..59164b9 100644 --- a/G-Earth/src/main/java/gearth/misc/harble_api/HarbleAPI.java +++ b/G-Earth/src/main/java/gearth/misc/harble_api/PacketInfoManager.java @@ -16,7 +16,7 @@ import java.util.Map; /** * Created by Jonas on 10/11/2018. */ -public class HarbleAPI { +public class PacketInfoManager { public class HarbleMessage { private HMessage.Direction destination; @@ -78,15 +78,15 @@ public class HarbleAPI { * @param hotelversion */ - public static HarbleAPI get(String hotelversion) { - HarbleAPI wannabe = new HarbleAPI(hotelversion); + public static PacketInfoManager get(String hotelversion) { + PacketInfoManager wannabe = new PacketInfoManager(hotelversion); if (!wannabe.success) { return null; } return wannabe; } - public HarbleAPI(String hotelversion) { + public PacketInfoManager(String hotelversion) { String possibleCachedMessagesPath = HarbleAPIFetcher.CACHE_PREFIX + hotelversion; if (Cacher.cacheFileExists(possibleCachedMessagesPath)) { JSONObject object = Cacher.getCacheContents(possibleCachedMessagesPath); @@ -96,7 +96,7 @@ public class HarbleAPI { } } - public HarbleAPI(File f) { + public PacketInfoManager(File f) { if (f.exists() && !f.isDirectory()) { try { String contents = String.join("\n", Files.readAllLines(f.toPath())); diff --git a/G-Earth/src/main/java/gearth/misc/packet_info/PacketInfo.java b/G-Earth/src/main/java/gearth/misc/packet_info/PacketInfo.java new file mode 100644 index 0000000..7e2206d --- /dev/null +++ b/G-Earth/src/main/java/gearth/misc/packet_info/PacketInfo.java @@ -0,0 +1,43 @@ +package gearth.misc.packet_info; + +import gearth.protocol.HMessage; + +public class PacketInfo { + private final HMessage.Direction destination; + private final int headerId; + private final String hash; + private final String name; + private final String structure; + + public PacketInfo(HMessage.Direction destination, int headerId, String hash, String name, String structure) { + this.destination = destination; + this.headerId = headerId; + this.hash = hash; + this.name = name; + this.structure = structure; + } + + public String getName() { + return name; + } + + public String getHash() { + return hash; + } + + public int getHeaderId() { + return headerId; + } + + public HMessage.Direction getDestination() { + return destination; + } + + public String getStructure() { + return structure; + } + + public String toString() { + return headerId + ": " + "[" + name + "][" + structure + "]"; + } +} \ No newline at end of file diff --git a/G-Earth/src/main/java/gearth/misc/packet_info/PacketInfoManager.java b/G-Earth/src/main/java/gearth/misc/packet_info/PacketInfoManager.java new file mode 100644 index 0000000..dc40baa --- /dev/null +++ b/G-Earth/src/main/java/gearth/misc/packet_info/PacketInfoManager.java @@ -0,0 +1,159 @@ +package gearth.misc.packet_info; + +import gearth.misc.Cacher; +import gearth.misc.harble_api.HarbleAPIFetcher; +import gearth.misc.packet_info.providers.RemotePacketInfoProvider; +import gearth.misc.packet_info.providers.implementations.HarblePacketInfoProvider; +import gearth.misc.packet_info.providers.implementations.SulekPacketInfoProvider; +import gearth.misc.packet_info.providers.implementations.UnityPacketInfoProvider; +import gearth.protocol.HMessage; +import gearth.protocol.connection.HClient; +import org.json.JSONArray; +import org.json.JSONObject; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.util.*; +import java.util.concurrent.Semaphore; + +public class PacketInfoManager { + + private Map> headerIdToMessage_incoming = new HashMap<>(); + private Map> headerIdToMessage_outgoing = new HashMap<>(); + + private Map> hashToMessage_incoming = new HashMap<>(); + private Map> hashToMessage_outgoing = new HashMap<>(); + + private Map> nameToMessage_incoming = new HashMap<>(); + private Map> nameToMessage_outgoing = new HashMap<>(); + + public PacketInfoManager(List packetInfoList) { + for (PacketInfo packetInfo : packetInfoList) { + addMessage(packetInfo); + } + } + + private void addMessage(PacketInfo packetInfo) { + Map> headerIdToMessage = + packetInfo.getDestination() == HMessage.Direction.TOCLIENT + ? headerIdToMessage_incoming : + headerIdToMessage_outgoing; + + Map> hashToMessage = + packetInfo.getDestination() == HMessage.Direction.TOCLIENT + ? hashToMessage_incoming + : hashToMessage_outgoing; + + Map> nameToMessage = + packetInfo.getDestination() == HMessage.Direction.TOCLIENT + ? nameToMessage_incoming + : nameToMessage_outgoing; + + headerIdToMessage.computeIfAbsent(packetInfo.getHeaderId(), k -> new ArrayList<>()); + + headerIdToMessage.get(packetInfo.getHeaderId()).add(packetInfo); + if (packetInfo.getHash() != null) { + hashToMessage.computeIfAbsent(packetInfo.getHash(), k -> new ArrayList<>()); + hashToMessage.get(packetInfo.getHash()).add(packetInfo); + } + if (packetInfo.getName() != null) { + nameToMessage.computeIfAbsent(packetInfo.getName(), k -> new ArrayList<>()); + nameToMessage.get(packetInfo.getName()).add(packetInfo); + } + + } + + public PacketInfo getPacketInfoFromHeaderId(HMessage.Direction direction, int headerId) { + Map> headerIdToMessage = + (direction == HMessage.Direction.TOSERVER + ? headerIdToMessage_outgoing + : headerIdToMessage_incoming); + + if (headerIdToMessage.get(headerId) == null) return null; + return headerIdToMessage.get(headerId).get(0); + } + + public PacketInfo getHarbleMessagesFromHash(HMessage.Direction direction, String hash) { + Map> hashToMessage = + (direction == HMessage.Direction.TOSERVER + ? hashToMessage_outgoing + : hashToMessage_incoming); + + if (hashToMessage.get(hash) == null) return null; + return hashToMessage.get(hash).get(0); + } + + public PacketInfo getHarbleMessageFromName(HMessage.Direction direction, String name) { + Map> nameToMessage = + (direction == HMessage.Direction.TOSERVER + ? nameToMessage_outgoing + : nameToMessage_incoming); + + if (nameToMessage.get(name) == null) return null; + return nameToMessage.get(name).get(0); + } + + + public List getAllPacketInfoFromHeaderId(HMessage.Direction direction, int headerId) { + Map> headerIdToMessage = + (direction == HMessage.Direction.TOSERVER + ? headerIdToMessage_outgoing + : headerIdToMessage_incoming); + + return headerIdToMessage.get(headerId) == null ? new ArrayList<>() : headerIdToMessage.get(headerId); + } + + public List getAllHarbleMessagesFromHash(HMessage.Direction direction, String hash) { + Map> hashToMessage = + (direction == HMessage.Direction.TOSERVER + ? hashToMessage_outgoing + : hashToMessage_incoming); + + return hashToMessage.get(hash) == null ? new ArrayList<>() : hashToMessage.get(hash); + } + + public List getAllHarbleMessageFromName(HMessage.Direction direction, String name) { + Map> nameToMessage = + (direction == HMessage.Direction.TOSERVER + ? nameToMessage_outgoing + : nameToMessage_incoming); + + return nameToMessage.get(name) == null ? new ArrayList<>() : nameToMessage.get(name); + } + + + public static PacketInfoManager fromHotelVersion(String hotelversion, HClient clientType) { + List result = new ArrayList<>(); + + if (clientType == HClient.UNITY) { + result.addAll(new UnityPacketInfoProvider(hotelversion).provide()); + } + else if (clientType == HClient.FLASH) { + try { + List providers = new ArrayList<>(); + providers.add(new HarblePacketInfoProvider(hotelversion)); + providers.add(new SulekPacketInfoProvider(hotelversion)); + + Semaphore blockUntilComplete = new Semaphore(providers.size()); + blockUntilComplete.acquire(providers.size()); + + List synchronizedResult = Collections.synchronizedList(result); + for (RemotePacketInfoProvider provider : providers) { + new Thread(() -> { + synchronizedResult.addAll(provider.provide()); + blockUntilComplete.release(); + }).start(); + } + + blockUntilComplete.acquire(providers.size()); + + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + + return new PacketInfoManager(result); + } +} diff --git a/G-Earth/src/main/java/gearth/misc/packet_info/providers/PacketInfoProvider.java b/G-Earth/src/main/java/gearth/misc/packet_info/providers/PacketInfoProvider.java new file mode 100644 index 0000000..ff14eeb --- /dev/null +++ b/G-Earth/src/main/java/gearth/misc/packet_info/providers/PacketInfoProvider.java @@ -0,0 +1,40 @@ +package gearth.misc.packet_info.providers; + +import gearth.misc.Cacher; +import gearth.misc.packet_info.PacketInfo; +import org.json.JSONObject; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.List; + +public abstract class PacketInfoProvider { + + protected final String hotelVersion; + + public PacketInfoProvider(String hotelVersion) { + this.hotelVersion = hotelVersion; + } + + protected abstract File getFile(); + + public List provide() { + File file = getFile(); + if (file == null || !file.exists() || file.isDirectory()) return new ArrayList<>(); + + try { + String contents = String.join("\n", Files.readAllLines(file.toPath())); + JSONObject object = new JSONObject(contents); + return parsePacketInfo(object); + } catch (IOException e) { + e.printStackTrace(); + } + + return new ArrayList<>(); + } + + protected abstract List parsePacketInfo(JSONObject jsonObject); + +} diff --git a/G-Earth/src/main/java/gearth/misc/packet_info/providers/RemotePacketInfoProvider.java b/G-Earth/src/main/java/gearth/misc/packet_info/providers/RemotePacketInfoProvider.java new file mode 100644 index 0000000..790f69a --- /dev/null +++ b/G-Earth/src/main/java/gearth/misc/packet_info/providers/RemotePacketInfoProvider.java @@ -0,0 +1,41 @@ +package gearth.misc.packet_info.providers; + +import gearth.misc.Cacher; +import gearth.misc.harble_api.PacketInfoManager; +import org.jsoup.Connection; +import org.jsoup.Jsoup; + +import java.io.File; +import java.io.IOException; + +public abstract class RemotePacketInfoProvider extends PacketInfoProvider { + public RemotePacketInfoProvider(String hotelVersion) { + super(hotelVersion); + } + + protected abstract String getRemoteUrl(); + protected abstract String getCacheName(); + + @Override + protected File getFile() { + File f = new File(Cacher.getCacheDir(), getCacheName()); + if (!f.exists()) { + Connection connection = Jsoup.connect(getRemoteUrl()).ignoreContentType(true); + try { + connection.timeout(3000); + Connection.Response response = connection.execute(); + if (response.statusCode() == 200) { + String messagesBodyJson = response.body(); + Cacher.updateCache(messagesBodyJson, getCacheName()); + } + else { + return null; + } + } catch (IOException e) { + return null; + } + } + + return new File(Cacher.getCacheDir(), getCacheName()); + } +} diff --git a/G-Earth/src/main/java/gearth/misc/packet_info/providers/implementations/HarblePacketInfoProvider.java b/G-Earth/src/main/java/gearth/misc/packet_info/providers/implementations/HarblePacketInfoProvider.java new file mode 100644 index 0000000..995deb1 --- /dev/null +++ b/G-Earth/src/main/java/gearth/misc/packet_info/providers/implementations/HarblePacketInfoProvider.java @@ -0,0 +1,35 @@ +package gearth.misc.packet_info.providers.implementations; + +import gearth.misc.Cacher; +import gearth.misc.packet_info.PacketInfo; +import gearth.misc.packet_info.providers.PacketInfoProvider; +import gearth.misc.packet_info.providers.RemotePacketInfoProvider; +import org.json.JSONObject; + +import java.io.File; +import java.util.List; + +public class HarblePacketInfoProvider extends RemotePacketInfoProvider { + + public static final String CACHE_PREFIX = "HARBLE_API-"; + public static final String HARBLE_API_URL = "https://api.harble.net/messages/$hotelversion$.json"; + + public HarblePacketInfoProvider(String hotelVersion) { + super(hotelVersion); + } + + @Override + protected String getRemoteUrl() { + return HARBLE_API_URL.replace("$hotelversion$", hotelVersion); + } + + @Override + protected String getCacheName() { + return CACHE_PREFIX + hotelVersion; + } + + @Override + protected List parsePacketInfo(JSONObject jsonObject) { + return null; + } +} diff --git a/G-Earth/src/main/java/gearth/misc/packet_info/providers/implementations/SulekPacketInfoProvider.java b/G-Earth/src/main/java/gearth/misc/packet_info/providers/implementations/SulekPacketInfoProvider.java new file mode 100644 index 0000000..7e5e0f4 --- /dev/null +++ b/G-Earth/src/main/java/gearth/misc/packet_info/providers/implementations/SulekPacketInfoProvider.java @@ -0,0 +1,32 @@ +package gearth.misc.packet_info.providers.implementations; + +import gearth.misc.packet_info.PacketInfo; +import gearth.misc.packet_info.providers.RemotePacketInfoProvider; +import org.json.JSONObject; + +import java.util.List; + +public class SulekPacketInfoProvider extends RemotePacketInfoProvider { + + public static final String CACHE_PREFIX = "SULEK_API-"; + public static final String SULEK_API_URL = "https://api.sulek.dev/releases/$hotelversion$/messages"; + + public SulekPacketInfoProvider(String hotelVersion) { + super(hotelVersion); + } + + @Override + protected String getRemoteUrl() { + return SULEK_API_URL.replace("$hotelversion$", hotelVersion); + } + + @Override + protected String getCacheName() { + return CACHE_PREFIX + hotelVersion; + } + + @Override + protected List parsePacketInfo(JSONObject jsonObject) { + return null; + } +} diff --git a/G-Earth/src/main/java/gearth/misc/packet_info/providers/implementations/UnityPacketInfoProvider.java b/G-Earth/src/main/java/gearth/misc/packet_info/providers/implementations/UnityPacketInfoProvider.java new file mode 100644 index 0000000..b287dd3 --- /dev/null +++ b/G-Earth/src/main/java/gearth/misc/packet_info/providers/implementations/UnityPacketInfoProvider.java @@ -0,0 +1,33 @@ +package gearth.misc.packet_info.providers.implementations; + +import gearth.Main; +import gearth.misc.packet_info.PacketInfo; +import gearth.misc.packet_info.providers.PacketInfoProvider; +import org.json.JSONObject; + +import java.io.File; +import java.net.URISyntaxException; +import java.util.List; + +public class UnityPacketInfoProvider extends PacketInfoProvider { + + public UnityPacketInfoProvider(String hotelVersion) { + super(hotelVersion); + } + + @Override + protected File getFile() { + try { + return new File(new File(Main.class.getProtectionDomain().getCodeSource().getLocation().toURI()) + .getParentFile(), "messages.json"); + } catch (URISyntaxException e) { + e.printStackTrace(); + return null; + } + } + + @Override + protected List parsePacketInfo(JSONObject jsonObject) { + return null; + } +} diff --git a/G-Earth/src/main/java/gearth/protocol/HPacket.java b/G-Earth/src/main/java/gearth/protocol/HPacket.java index 16b3205..2fd4e56 100644 --- a/G-Earth/src/main/java/gearth/protocol/HPacket.java +++ b/G-Earth/src/main/java/gearth/protocol/HPacket.java @@ -1,12 +1,11 @@ package gearth.protocol; import gearth.misc.StringifyAble; -import gearth.misc.harble_api.HarbleAPI; +import gearth.misc.harble_api.PacketInfoManager; import gearth.misc.harble_api.HarbleAPIFetcher; import gearth.misc.packetrepresentation.InvalidPacketException; import gearth.misc.packetrepresentation.PacketStringUtils; -import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; @@ -581,7 +580,7 @@ public class HPacket implements StringifyAble { } private String getHarbleStructure(HMessage.Direction direction) { - HarbleAPI.HarbleMessage msg; + PacketInfoManager.HarbleMessage msg; if (HarbleAPIFetcher.HARBLEAPI != null && ((msg = HarbleAPIFetcher.HARBLEAPI.getHarbleMessageFromHeaderId(direction, headerId())) != null)) { if (msg.getStructure() != null && structureEquals(msg.getStructure())) { diff --git a/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/uilogger/UiLoggerController.java b/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/uilogger/UiLoggerController.java index 1422f47..2b03342 100644 --- a/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/uilogger/UiLoggerController.java +++ b/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/uilogger/UiLoggerController.java @@ -1,13 +1,11 @@ package gearth.ui.logger.loggerdisplays.uilogger; -import gearth.misc.harble_api.HarbleAPI; +import gearth.misc.harble_api.PacketInfoManager; import gearth.misc.harble_api.HarbleAPIFetcher; import gearth.protocol.HMessage; import gearth.protocol.HPacket; import gearth.ui.logger.loggerdisplays.PacketLogger; import javafx.application.Platform; -import javafx.beans.InvalidationListener; -import javafx.beans.Observable; import javafx.event.ActionEvent; import javafx.fxml.Initializable; import javafx.scene.control.CheckMenuItem; @@ -96,8 +94,8 @@ public class UiLoggerController implements Initializable { lblHarbleAPI.setText("Messages: " + (HarbleAPIFetcher.HARBLEAPI == null ? "False" : "True")); if ((viewMessageName || viewMessageHash) && HarbleAPIFetcher.HARBLEAPI != null) { - HarbleAPI api = HarbleAPIFetcher.HARBLEAPI; - HarbleAPI.HarbleMessage message = api.getHarbleMessageFromHeaderId( + PacketInfoManager api = HarbleAPIFetcher.HARBLEAPI; + PacketInfoManager.HarbleMessage message = api.getHarbleMessageFromHeaderId( (isIncoming ? HMessage.Direction.TOCLIENT : HMessage.Direction.TOSERVER), packet.headerId() ); From 9698348503217517c0713234b7433f7846fec2f9 Mon Sep 17 00:00:00 2001 From: sirjonasxx <36828922+sirjonasxx@users.noreply.github.com> Date: Fri, 23 Apr 2021 00:47:33 +0200 Subject: [PATCH 03/33] parsers --- .../misc/packet_info/PacketInfoManager.java | 2 + .../HarblePacketInfoProvider.java | 45 ++++++++++++++++++- .../SulekPacketInfoProvider.java | 33 +++++++++++++- .../UnityPacketInfoProvider.java | 33 +++++++++++++- 4 files changed, 110 insertions(+), 3 deletions(-) diff --git a/G-Earth/src/main/java/gearth/misc/packet_info/PacketInfoManager.java b/G-Earth/src/main/java/gearth/misc/packet_info/PacketInfoManager.java index dc40baa..94d6ec3 100644 --- a/G-Earth/src/main/java/gearth/misc/packet_info/PacketInfoManager.java +++ b/G-Earth/src/main/java/gearth/misc/packet_info/PacketInfoManager.java @@ -35,6 +35,8 @@ public class PacketInfoManager { } private void addMessage(PacketInfo packetInfo) { + if (packetInfo.getHash() == null && packetInfo.getName() == null) return; + Map> headerIdToMessage = packetInfo.getDestination() == HMessage.Direction.TOCLIENT ? headerIdToMessage_incoming : diff --git a/G-Earth/src/main/java/gearth/misc/packet_info/providers/implementations/HarblePacketInfoProvider.java b/G-Earth/src/main/java/gearth/misc/packet_info/providers/implementations/HarblePacketInfoProvider.java index 995deb1..26d0e62 100644 --- a/G-Earth/src/main/java/gearth/misc/packet_info/providers/implementations/HarblePacketInfoProvider.java +++ b/G-Earth/src/main/java/gearth/misc/packet_info/providers/implementations/HarblePacketInfoProvider.java @@ -4,9 +4,12 @@ import gearth.misc.Cacher; import gearth.misc.packet_info.PacketInfo; import gearth.misc.packet_info.providers.PacketInfoProvider; import gearth.misc.packet_info.providers.RemotePacketInfoProvider; +import gearth.protocol.HMessage; +import org.json.JSONArray; import org.json.JSONObject; import java.io.File; +import java.util.ArrayList; import java.util.List; public class HarblePacketInfoProvider extends RemotePacketInfoProvider { @@ -28,8 +31,48 @@ public class HarblePacketInfoProvider extends RemotePacketInfoProvider { return CACHE_PREFIX + hotelVersion; } + private PacketInfo jsonToPacketInfo(JSONObject object, HMessage.Direction destination) { + String name; + String hash; + String structure; + try { name = object.getString("Name"); } + catch (Exception e) { name = null; } + try { hash = object.getString("Hash"); } + catch (Exception e) { hash = null; } + try { structure = object.getString("Structure"); + } catch (Exception e) { structure = null; } + + int headerId; + try {headerId = object.getInt("Id"); } + catch (Exception e) { headerId = Integer.parseInt(object.getString("Id")); } + + return new PacketInfo(destination, headerId, hash, name, structure); + } + @Override protected List parsePacketInfo(JSONObject jsonObject) { - return null; + List packetInfos = new ArrayList<>(); + + try { + JSONArray incoming = jsonObject.getJSONArray("Incoming"); + JSONArray outgoing = jsonObject.getJSONArray("Outgoing"); + + if (incoming != null && outgoing != null) { + for (int i = 0; i < incoming.length(); i++) { + JSONObject jsonInfo = incoming.getJSONObject(i); + PacketInfo packetInfo = jsonToPacketInfo(jsonInfo, HMessage.Direction.TOCLIENT); + packetInfos.add(packetInfo); + } + for (int i = 0; i < outgoing.length(); i++) { + JSONObject jsonInfo = outgoing.getJSONObject(i); + PacketInfo packetInfo = jsonToPacketInfo(jsonInfo, HMessage.Direction.TOSERVER); + packetInfos.add(packetInfo); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + + return packetInfos; } } diff --git a/G-Earth/src/main/java/gearth/misc/packet_info/providers/implementations/SulekPacketInfoProvider.java b/G-Earth/src/main/java/gearth/misc/packet_info/providers/implementations/SulekPacketInfoProvider.java index 7e5e0f4..9336c9c 100644 --- a/G-Earth/src/main/java/gearth/misc/packet_info/providers/implementations/SulekPacketInfoProvider.java +++ b/G-Earth/src/main/java/gearth/misc/packet_info/providers/implementations/SulekPacketInfoProvider.java @@ -2,8 +2,11 @@ package gearth.misc.packet_info.providers.implementations; import gearth.misc.packet_info.PacketInfo; import gearth.misc.packet_info.providers.RemotePacketInfoProvider; +import gearth.protocol.HMessage; +import org.json.JSONArray; import org.json.JSONObject; +import java.util.ArrayList; import java.util.List; public class SulekPacketInfoProvider extends RemotePacketInfoProvider { @@ -25,8 +28,36 @@ public class SulekPacketInfoProvider extends RemotePacketInfoProvider { return CACHE_PREFIX + hotelVersion; } + private PacketInfo jsonToPacketInfo(JSONObject object, HMessage.Direction destination) { + int headerId = object.getInt("id"); + String name = object.getString("name") + .replaceAll("(((Message)?Composer)|((Message)?Event))$", ""); + + return new PacketInfo(destination, headerId, null, name, null); + } + @Override protected List parsePacketInfo(JSONObject jsonObject) { - return null; + List packetInfos = new ArrayList<>(); + + try { + JSONArray incoming = jsonObject.getJSONObject("messages").getJSONArray("incoming"); + JSONArray outgoing = jsonObject.getJSONObject("messages").getJSONArray("outgoing"); + + for (int i = 0; i < incoming.length(); i++) { + JSONObject jsonInfo = incoming.getJSONObject(i); + PacketInfo packetInfo = jsonToPacketInfo(jsonInfo, HMessage.Direction.TOCLIENT); + packetInfos.add(packetInfo); + } + for (int i = 0; i < outgoing.length(); i++) { + JSONObject jsonInfo = outgoing.getJSONObject(i); + PacketInfo packetInfo = jsonToPacketInfo(jsonInfo, HMessage.Direction.TOSERVER); + packetInfos.add(packetInfo); + } + } catch (Exception e) { + e.printStackTrace(); + } + + return packetInfos; } } diff --git a/G-Earth/src/main/java/gearth/misc/packet_info/providers/implementations/UnityPacketInfoProvider.java b/G-Earth/src/main/java/gearth/misc/packet_info/providers/implementations/UnityPacketInfoProvider.java index b287dd3..672baa9 100644 --- a/G-Earth/src/main/java/gearth/misc/packet_info/providers/implementations/UnityPacketInfoProvider.java +++ b/G-Earth/src/main/java/gearth/misc/packet_info/providers/implementations/UnityPacketInfoProvider.java @@ -3,10 +3,13 @@ package gearth.misc.packet_info.providers.implementations; import gearth.Main; import gearth.misc.packet_info.PacketInfo; import gearth.misc.packet_info.providers.PacketInfoProvider; +import gearth.protocol.HMessage; +import org.json.JSONArray; import org.json.JSONObject; import java.io.File; import java.net.URISyntaxException; +import java.util.ArrayList; import java.util.List; public class UnityPacketInfoProvider extends PacketInfoProvider { @@ -26,8 +29,36 @@ public class UnityPacketInfoProvider extends PacketInfoProvider { } } + private PacketInfo jsonToPacketInfo(JSONObject object, HMessage.Direction destination) { + String name = object.getString("Name"); + int headerId = object.getInt("Id"); + return new PacketInfo(destination, headerId, null, name, null); + } + @Override protected List parsePacketInfo(JSONObject jsonObject) { - return null; + List packetInfos = new ArrayList<>(); + + try { + JSONArray incoming = jsonObject.getJSONArray("Incoming"); + JSONArray outgoing = jsonObject.getJSONArray("Outgoing"); + + if (incoming != null && outgoing != null) { + for (int i = 0; i < incoming.length(); i++) { + JSONObject jsonInfo = incoming.getJSONObject(i); + PacketInfo packetInfo = jsonToPacketInfo(jsonInfo, HMessage.Direction.TOCLIENT); + packetInfos.add(packetInfo); + } + for (int i = 0; i < outgoing.length(); i++) { + JSONObject jsonInfo = outgoing.getJSONObject(i); + PacketInfo packetInfo = jsonToPacketInfo(jsonInfo, HMessage.Direction.TOSERVER); + packetInfos.add(packetInfo); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + + return packetInfos; } } From 0975d66379d8b93c5790498c6aed92b65d89eb49 Mon Sep 17 00:00:00 2001 From: sirjonasxx <36828922+sirjonasxx@users.noreply.github.com> Date: Fri, 23 Apr 2021 02:00:53 +0200 Subject: [PATCH 04/33] integrate into extensions and packetlogger --- .../java/gearth/extensions/Extension.java | 15 +- .../extensions/OnConnectionListener.java | 5 +- .../extensions/extra/harble/ChatConsole.java | 28 ++- .../extensions/extra/harble/HashSupport.java | 135 ----------- .../extra/harble/PacketInfoSupport.java | 118 +++++++++ .../misc/harble_api/HarbleAPIFetcher.java | 60 ----- .../misc/harble_api/PacketInfoManager.java | 224 ------------------ .../misc/packet_info/PacketInfoManager.java | 93 +++++--- .../providers/RemotePacketInfoProvider.java | 1 - .../java/gearth/protocol/HConnection.java | 8 + .../main/java/gearth/protocol/HPacket.java | 73 +++--- .../gearth/protocol/connection/HProxy.java | 8 + .../extensionhandler/ExtensionHandler.java | 6 +- .../extensions/GEarthExtension.java | 3 +- .../network/NetworkExtension.java | 21 +- .../simple/ExampleExtension.java | 3 +- .../gearth/ui/logger/LoggerController.java | 2 +- .../logger/loggerdisplays/PacketLogger.java | 3 +- .../loggerdisplays/SimpleTerminalLogger.java | 3 +- .../loggerdisplays/uilogger/UiLogger.java | 25 +- .../uilogger/UiLoggerController.java | 30 ++- 21 files changed, 308 insertions(+), 556 deletions(-) delete mode 100644 G-Earth/src/main/java/gearth/extensions/extra/harble/HashSupport.java create mode 100644 G-Earth/src/main/java/gearth/extensions/extra/harble/PacketInfoSupport.java delete mode 100644 G-Earth/src/main/java/gearth/misc/harble_api/HarbleAPIFetcher.java delete mode 100644 G-Earth/src/main/java/gearth/misc/harble_api/PacketInfoManager.java diff --git a/G-Earth/src/main/java/gearth/extensions/Extension.java b/G-Earth/src/main/java/gearth/extensions/Extension.java index c987633..254e7a5 100644 --- a/G-Earth/src/main/java/gearth/extensions/Extension.java +++ b/G-Earth/src/main/java/gearth/extensions/Extension.java @@ -1,8 +1,10 @@ package gearth.extensions; import gearth.misc.listenerpattern.Observable; +import gearth.misc.packet_info.PacketInfoManager; import gearth.protocol.HMessage; import gearth.protocol.HPacket; +import gearth.protocol.connection.HClient; import gearth.services.Constants; import gearth.services.extensionhandler.extensions.implementations.network.NetworkExtensionInfo; @@ -140,10 +142,15 @@ public abstract class Extension implements IExtension { String host = packet.readString(); int connectionPort = packet.readInteger(); String hotelVersion = packet.readString(); - String harbleMessagesPath = packet.readString(); - String clientType = packet.readString(); - Constants.UNITY_PACKETS = clientType.toLowerCase().contains("unity"); - onConnectionObservable.fireEvent(l -> l.onConnection(host, connectionPort, hotelVersion, clientType, harbleMessagesPath)); + String clientIdentifier = packet.readString(); + HClient clientType = HClient.valueOf(packet.readString()); + PacketInfoManager packetInfoManager = PacketInfoManager.readFromPacket(packet); + + Constants.UNITY_PACKETS = clientType == HClient.UNITY; + onConnectionObservable.fireEvent(l -> l.onConnection( + host, connectionPort, hotelVersion, + clientIdentifier, clientType, packetInfoManager) + ); onStartConnection(); } else if (packet.headerId() == NetworkExtensionInfo.OUTGOING_MESSAGES_IDS.CONNECTIONEND) { diff --git a/G-Earth/src/main/java/gearth/extensions/OnConnectionListener.java b/G-Earth/src/main/java/gearth/extensions/OnConnectionListener.java index cbb63b0..9d10291 100644 --- a/G-Earth/src/main/java/gearth/extensions/OnConnectionListener.java +++ b/G-Earth/src/main/java/gearth/extensions/OnConnectionListener.java @@ -1,5 +1,8 @@ package gearth.extensions; +import gearth.misc.packet_info.PacketInfoManager; +import gearth.protocol.connection.HClient; + public interface OnConnectionListener { - void onConnection(String host, int port, String hotelversion, String clientType, String harbleMessagesPath); + void onConnection(String host, int port, String hotelversion, String clientIdentifier, HClient clientType, PacketInfoManager packetInfoManager); } diff --git a/G-Earth/src/main/java/gearth/extensions/extra/harble/ChatConsole.java b/G-Earth/src/main/java/gearth/extensions/extra/harble/ChatConsole.java index ddc339a..5411670 100644 --- a/G-Earth/src/main/java/gearth/extensions/extra/harble/ChatConsole.java +++ b/G-Earth/src/main/java/gearth/extensions/extra/harble/ChatConsole.java @@ -4,8 +4,10 @@ import gearth.extensions.ExtensionInfo; import gearth.extensions.IExtension; import gearth.extensions.OnConnectionListener; import gearth.misc.listenerpattern.Observable; +import gearth.misc.packet_info.PacketInfoManager; import gearth.protocol.HMessage; import gearth.protocol.HPacket; +import gearth.protocol.connection.HClient; /** * Created by Jonas on 3/12/2018. @@ -18,31 +20,33 @@ public class ChatConsole { private volatile int chatid; private volatile String name; - private volatile HashSupport hashSupport; + private volatile PacketInfoSupport packetInfoSupport; private volatile String infoMessage; private volatile boolean firstTime = true; private volatile Observable chatInputObservable = new Observable<>(); - public ChatConsole(final HashSupport hashSupport, IExtension extension) { - this(hashSupport, extension, null); + public ChatConsole(final PacketInfoSupport packetInfoSupport, IExtension extension) { + this(packetInfoSupport, extension, null); } /** * infomessage will be used as response for :info and for initialize - * @param hashSupport + * @param packetInfoSupport * @param extension * @param infoMessage */ - public ChatConsole(final HashSupport hashSupport, IExtension extension, String infoMessage) { - this.hashSupport = hashSupport; + public ChatConsole(final PacketInfoSupport packetInfoSupport, IExtension extension, String infoMessage) { + this.packetInfoSupport = packetInfoSupport; this.name = extension.getClass().getAnnotation(ExtensionInfo.class).Title(); chatid = (this.name.hashCode() % 300000000) + 300000000; this.infoMessage = infoMessage; final boolean[] doOncePerConnection = {false}; - extension.onConnect((s, i, s1, ct, h1) -> doOncePerConnection[0] = true); + extension.onConnect((host, port, hotelversion, clientIdentifier, clientType, packetInfoManager) -> + doOncePerConnection[0] = true + ); extension.intercept(HMessage.Direction.TOSERVER, hMessage -> { // if the first packet on init is not 4000, the extension was already running, so we open the chat instantly @@ -55,7 +59,7 @@ public class ChatConsole { } }); - hashSupport.intercept(HMessage.Direction.TOCLIENT, "FriendListFragment", hMessage -> { + packetInfoSupport.intercept(HMessage.Direction.TOCLIENT, "FriendListFragment", hMessage -> { if (doOncePerConnection[0]) { doOncePerConnection[0] = false; @@ -71,7 +75,7 @@ public class ChatConsole { } }); - hashSupport.intercept(HMessage.Direction.TOSERVER, "SendMsg", hMessage -> { + packetInfoSupport.intercept(HMessage.Direction.TOSERVER, "SendMsg", hMessage -> { HPacket packet = hMessage.getPacket(); if (packet.readInteger() == chatid) { hMessage.setBlocked(true); @@ -87,7 +91,7 @@ public class ChatConsole { } private void createChat() { - hashSupport.sendToClient("FriendListUpdate", + packetInfoSupport.sendToClient("FriendListUpdate", 0, 1, 0, chatid, " [G-Earth] - " + name, 1, true, false, "ha-1015-64.hd-209-30.cc-260-64.ch-235-64.sh-305-64.lg-285-64", 0, "", 0, true, false, true, "" @@ -100,10 +104,10 @@ public class ChatConsole { public void writeOutput(String string, boolean asInvite) { if (asInvite) { - hashSupport.sendToClient("RoomInvite", chatid, string); + packetInfoSupport.sendToClient("RoomInvite", chatid, string); } else { - hashSupport.sendToClient("NewConsole", chatid, string, 0, ""); + packetInfoSupport.sendToClient("NewConsole", chatid, string, 0, ""); } } diff --git a/G-Earth/src/main/java/gearth/extensions/extra/harble/HashSupport.java b/G-Earth/src/main/java/gearth/extensions/extra/harble/HashSupport.java deleted file mode 100644 index 40368cc..0000000 --- a/G-Earth/src/main/java/gearth/extensions/extra/harble/HashSupport.java +++ /dev/null @@ -1,135 +0,0 @@ -package gearth.extensions.extra.harble; - -import gearth.extensions.Extension; -import gearth.extensions.IExtension; -import gearth.misc.harble_api.PacketInfoManager; -import gearth.protocol.HMessage; -import gearth.protocol.HPacket; - -import java.io.File; -import java.security.InvalidParameterException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Created by Jonas on 10/11/2018. - */ -public class HashSupport { - - private final Object lock = new Object(); - - private PacketInfoManager packetInfoManager = new PacketInfoManager(""); //empty - private Map> incomingMessageListeners = new HashMap<>(); - private Map> outgoingMessageListeners = new HashMap<>(); - - private IExtension extension; - - public HashSupport(IExtension extension) { - this.extension = extension; - - extension.onConnect((host, port, hotelversion, clientType, cachePath) -> { -// synchronized (lock) { - packetInfoManager = new PacketInfoManager(new File(cachePath)); -// } - }); - - extension.intercept(HMessage.Direction.TOSERVER, message -> { -// synchronized (lock) { - PacketInfoManager.HarbleMessage haMessage = packetInfoManager.getHarbleMessageFromHeaderId(HMessage.Direction.TOSERVER, message.getPacket().headerId()); - if (haMessage != null) { - List listeners_hash = outgoingMessageListeners.get(haMessage.getHash()); - List listeners_name = outgoingMessageListeners.get(haMessage.getName()); - if (listeners_hash != null) { - for (Extension.MessageListener listener : listeners_hash) { - listener.act(message); - message.getPacket().resetReadIndex(); - } - } - if (listeners_name != null) { - for (Extension.MessageListener listener : listeners_name) { - listener.act(message); - message.getPacket().resetReadIndex(); - } - } - } -// } - }); - extension.intercept(HMessage.Direction.TOCLIENT, message -> { -// synchronized (lock) { - PacketInfoManager.HarbleMessage haMessage = packetInfoManager.getHarbleMessageFromHeaderId(HMessage.Direction.TOCLIENT, message.getPacket().headerId()); - if (haMessage != null) { - List listeners_hash = incomingMessageListeners.get(haMessage.getHash()); - List listeners_name = incomingMessageListeners.get(haMessage.getName()); - if (listeners_hash != null) { - for (Extension.MessageListener listener : listeners_hash) { - listener.act(message); - message.getPacket().resetReadIndex(); - } - } - if (listeners_name != null) { - for (Extension.MessageListener listener : listeners_name) { - listener.act(message); - message.getPacket().resetReadIndex(); - } - } - } -// } - }); - } - - public void intercept(HMessage.Direction direction, String hashOrName, Extension.MessageListener messageListener) { - Map> messageListeners = - (direction == HMessage.Direction.TOSERVER - ? outgoingMessageListeners - : incomingMessageListeners); - - messageListeners.computeIfAbsent(hashOrName, k -> new ArrayList<>()); - messageListeners.get(hashOrName).add(messageListener); - } - - private boolean send(HMessage.Direction direction, String hashOrName, Object... objects) { - int headerId; - PacketInfoManager.HarbleMessage fromname = packetInfoManager.getHarbleMessageFromName(direction, hashOrName); - if (fromname != null) { - headerId = fromname.getHeaderId(); - } - else { - List possibilities = packetInfoManager.getHarbleMessagesFromHash(direction, hashOrName); - if (possibilities.size() == 0) return false; - headerId = possibilities.get(0).getHeaderId(); - } - - try { - HPacket packetToSend = new HPacket(headerId, objects); - - return (direction == HMessage.Direction.TOCLIENT - ? extension.sendToClient(packetToSend) - : extension.sendToServer(packetToSend)); - } - catch (InvalidParameterException e) { - return false; - } - } - - /** - * - * @return if no errors occurred (invalid hash/invalid parameters/connection error) - */ - public boolean sendToClient(String hashOrName, Object... objects) { - return send(HMessage.Direction.TOCLIENT, hashOrName, objects); - } - - /** - * - * @return if no errors occurred (invalid hash/invalid parameters/connection error) - */ - public boolean sendToServer(String hashOrName, Object... objects) { - return send(HMessage.Direction.TOSERVER, hashOrName, objects); - } - - public PacketInfoManager getPacketInfoManager() { - return packetInfoManager; - } -} diff --git a/G-Earth/src/main/java/gearth/extensions/extra/harble/PacketInfoSupport.java b/G-Earth/src/main/java/gearth/extensions/extra/harble/PacketInfoSupport.java new file mode 100644 index 0000000..217893e --- /dev/null +++ b/G-Earth/src/main/java/gearth/extensions/extra/harble/PacketInfoSupport.java @@ -0,0 +1,118 @@ +package gearth.extensions.extra.harble; + +import gearth.extensions.Extension; +import gearth.extensions.IExtension; +import gearth.extensions.OnConnectionListener; +import gearth.misc.packet_info.PacketInfo; +import gearth.misc.packet_info.PacketInfoManager; +import gearth.protocol.HMessage; +import gearth.protocol.HPacket; +import gearth.protocol.connection.HClient; + +import java.security.InvalidParameterException; +import java.util.*; + +/** + * Created by Jonas on 10/11/2018. + */ +public class PacketInfoSupport { + + private final Object lock = new Object(); + + private PacketInfoManager packetInfoManager = new PacketInfoManager(new ArrayList<>()); //empty + private Map> incomingMessageListeners = new HashMap<>(); + private Map> outgoingMessageListeners = new HashMap<>(); + + private IExtension extension; + + public PacketInfoSupport(IExtension extension) { + this.extension = extension; + + extension.onConnect((host, port, hotelversion, clientIdentifier, clientType, packetInfoManager) -> + this.packetInfoManager = packetInfoManager + ); + + extension.intercept(HMessage.Direction.TOSERVER, message -> onReceivePacket(HMessage.Direction.TOSERVER, message)); + extension.intercept(HMessage.Direction.TOCLIENT, message -> onReceivePacket(HMessage.Direction.TOCLIENT, message)); + } + + private void onReceivePacket(HMessage.Direction direction, HMessage message) { + Set callbacks = new HashSet<>(); + Map> messageListeners = + (direction == HMessage.Direction.TOSERVER + ? outgoingMessageListeners + : incomingMessageListeners); + + List packetInfos = packetInfoManager.getAllPacketInfoFromHeaderId(HMessage.Direction.TOCLIENT, message.getPacket().headerId()); + + for (PacketInfo packetInfo : packetInfos) { + List listeners_hash = messageListeners.get(packetInfo.getHash()); + List listeners_name = messageListeners.get(packetInfo.getName()); + if (listeners_hash != null) { + callbacks.addAll(listeners_hash); + } + if (listeners_name != null) { + callbacks.addAll(listeners_name); + } + } + + for (Extension.MessageListener listener : callbacks) { + listener.act(message); + message.getPacket().resetReadIndex(); + } + } + + public void intercept(HMessage.Direction direction, String hashOrName, Extension.MessageListener messageListener) { + Map> messageListeners = + (direction == HMessage.Direction.TOSERVER + ? outgoingMessageListeners + : incomingMessageListeners); + + messageListeners.computeIfAbsent(hashOrName, k -> new ArrayList<>()); + messageListeners.get(hashOrName).add(messageListener); + } + + private boolean send(HMessage.Direction direction, String hashOrName, Object... objects) { + int headerId; + PacketInfo fromname = packetInfoManager.getPacketInfoFromName(direction, hashOrName); + if (fromname != null) { + headerId = fromname.getHeaderId(); + } + else { + PacketInfo fromHash = packetInfoManager.getPacketInfoFromHash(direction, hashOrName); + if (fromHash == null) return false; + headerId = fromHash.getHeaderId(); + } + + try { + HPacket packetToSend = new HPacket(headerId, objects); + + return (direction == HMessage.Direction.TOCLIENT + ? extension.sendToClient(packetToSend) + : extension.sendToServer(packetToSend)); + } + catch (InvalidParameterException e) { + return false; + } + } + + /** + * + * @return if no errors occurred (invalid hash/invalid parameters/connection error) + */ + public boolean sendToClient(String hashOrName, Object... objects) { + return send(HMessage.Direction.TOCLIENT, hashOrName, objects); + } + + /** + * + * @return if no errors occurred (invalid hash/invalid parameters/connection error) + */ + public boolean sendToServer(String hashOrName, Object... objects) { + return send(HMessage.Direction.TOSERVER, hashOrName, objects); + } + + public PacketInfoManager getPacketInfoManager() { + return packetInfoManager; + } +} diff --git a/G-Earth/src/main/java/gearth/misc/harble_api/HarbleAPIFetcher.java b/G-Earth/src/main/java/gearth/misc/harble_api/HarbleAPIFetcher.java deleted file mode 100644 index 47a5e46..0000000 --- a/G-Earth/src/main/java/gearth/misc/harble_api/HarbleAPIFetcher.java +++ /dev/null @@ -1,60 +0,0 @@ -package gearth.misc.harble_api; - -import gearth.Main; -import gearth.misc.Cacher; -import org.jsoup.Connection; -import org.jsoup.Jsoup; - -import java.io.File; -import java.io.IOException; -import java.net.URISyntaxException; - - -public class HarbleAPIFetcher { - - public static final String CACHE_PREFIX = "HARBLE_API-"; - public static final String HARBLE_API_URL = "https://api.harble.net/messages/$hotelversion$.json"; - - //latest fetched - public static PacketInfoManager HARBLEAPI = null; - - public synchronized static void fetch(String hotelversion, String clientType) { - // if unity - if (clientType.toLowerCase().contains("unity")) { - try { - HARBLEAPI = new PacketInfoManager( - new File(new File(Main.class.getProtectionDomain().getCodeSource().getLocation().toURI()) - .getParentFile(), "messages.json" - ) - ); - } catch (URISyntaxException e) { - HARBLEAPI = null; - } - return; - } - - String cacheName = CACHE_PREFIX + hotelversion; - - if (Cacher.cacheFileExists(cacheName)) { - HARBLEAPI = new PacketInfoManager(hotelversion); - } - else { - Connection connection = Jsoup.connect(HARBLE_API_URL.replace("$hotelversion$", hotelversion)).ignoreContentType(true); - try { - connection.timeout(3000); - Connection.Response response = connection.execute(); - if (response.statusCode() == 200) { - String messagesBodyJson = response.body(); - Cacher.updateCache(messagesBodyJson, cacheName); - HARBLEAPI = new PacketInfoManager(hotelversion); - } - else { - HARBLEAPI = null; - } - } catch (IOException e) { - HARBLEAPI = null; - } - - } - } -} \ No newline at end of file diff --git a/G-Earth/src/main/java/gearth/misc/harble_api/PacketInfoManager.java b/G-Earth/src/main/java/gearth/misc/harble_api/PacketInfoManager.java deleted file mode 100644 index 59164b9..0000000 --- a/G-Earth/src/main/java/gearth/misc/harble_api/PacketInfoManager.java +++ /dev/null @@ -1,224 +0,0 @@ -package gearth.misc.harble_api; - -import gearth.misc.Cacher; -import gearth.protocol.HMessage; -import org.json.JSONArray; -import org.json.JSONObject; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Created by Jonas on 10/11/2018. - */ -public class PacketInfoManager { - - public class HarbleMessage { - private HMessage.Direction destination; - private int headerId; - private String hash; - private String name; - private String structure; - - //name can be NULL - public HarbleMessage(HMessage.Direction destination, int headerId, String hash, String name, String structure) { - this.destination = destination; - this.headerId = headerId; - this.hash = hash; - this.name = (name == null || name.equals("null") ? null : name); - this.structure = (structure == null || structure.equals("null") ? null : structure); - } - - public String getName() { - return name; - } - - public int getHeaderId() { - return headerId; - } - - public HMessage.Direction getDestination() { - return destination; - } - - public String getHash() { - return hash; - } - - public String getStructure() { - return structure; - } - - public String toString() { - String s = (headerId + ": " + "[" + hash + "][" + name + "][" + structure + "]"); - return s; - } - } - - private Map headerIdToMessage_incoming = new HashMap<>(); - private Map headerIdToMessage_outgoing = new HashMap<>(); - - private Map> hashToMessage_incoming = new HashMap<>(); - private Map> hashToMessage_outgoing = new HashMap<>(); - - private Map nameToMessage_incoming = new HashMap<>(); - private Map nameToMessage_outgoing = new HashMap<>(); - - private boolean success = false; - private String fullPath = null; - - /** - * cache file must be generated first within G-Earth, inb4 20 extensions requesting it at the same time - * - * @param hotelversion - */ - - public static PacketInfoManager get(String hotelversion) { - PacketInfoManager wannabe = new PacketInfoManager(hotelversion); - if (!wannabe.success) { - return null; - } - return wannabe; - } - - public PacketInfoManager(String hotelversion) { - String possibleCachedMessagesPath = HarbleAPIFetcher.CACHE_PREFIX + hotelversion; - if (Cacher.cacheFileExists(possibleCachedMessagesPath)) { - JSONObject object = Cacher.getCacheContents(possibleCachedMessagesPath); - success = true; - fullPath = Cacher.getCacheDir() + File.separator + possibleCachedMessagesPath; - parse(object); - } - } - - public PacketInfoManager(File f) { - if (f.exists() && !f.isDirectory()) { - try { - String contents = String.join("\n", Files.readAllLines(f.toPath())); - JSONObject object = new JSONObject(contents); - success = true; - fullPath = f.getAbsolutePath(); - parse(object); - - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - private void addMessage(HMessage.Direction direction, JSONObject object) { - String name; - String hash; - try { name = object.getString("Name"); } - catch (Exception e) { name = null; } - try { hash = object.getString("Hash"); } - catch (Exception e) { hash = null; } - - - int headerId = object.getInt("Id"); - - String structure; - try { - structure = object.getString("Structure"); - } catch (Exception e) { - structure = null; - } - - - HarbleMessage message = new HarbleMessage(direction, headerId, hash, name, structure); - - - Map headerIdToMessage = - message.getDestination() == HMessage.Direction.TOCLIENT - ? headerIdToMessage_incoming : - headerIdToMessage_outgoing; - - Map> hashToMessage = - message.getDestination() == HMessage.Direction.TOCLIENT - ? hashToMessage_incoming - : hashToMessage_outgoing; - - Map nameToMessag = - message.getDestination() == HMessage.Direction.TOCLIENT - ? nameToMessage_incoming - : nameToMessage_outgoing; - - headerIdToMessage.put(message.getHeaderId(), message); - hashToMessage.computeIfAbsent(message.getHash(), k -> new ArrayList<>()); - hashToMessage.get(message.getHash()).add(message); - if (message.getName() != null && !message.getName().equals("null")) { - nameToMessag.put(message.getName(), message); - } - } - - private void parse(JSONObject object) { - try { - JSONArray incoming = object.getJSONArray("Incoming"); - JSONArray outgoing = object.getJSONArray("Outgoing"); - - if (incoming != null && outgoing != null) { - for (int i = 0; i < incoming.length(); i++) { - try { - JSONObject message = incoming.getJSONObject(i); - addMessage(HMessage.Direction.TOCLIENT, message); - } - catch (Exception e){ - e.printStackTrace(); - } - } - for (int i = 0; i < outgoing.length(); i++) { - try{ - JSONObject message = outgoing.getJSONObject(i); - addMessage(HMessage.Direction.TOSERVER, message); - } - catch (Exception e){ - e.printStackTrace(); - } - } - } - } catch (Exception e) { - success = false; - } - } - - public HarbleMessage getHarbleMessageFromHeaderId(HMessage.Direction direction, int headerId) { - Map headerIdToMessage = - (direction == HMessage.Direction.TOSERVER - ? headerIdToMessage_outgoing - : headerIdToMessage_incoming); - - return headerIdToMessage.get(headerId); - } - - public List getHarbleMessagesFromHash(HMessage.Direction direction, String hash) { - Map> hashToMessage = - (direction == HMessage.Direction.TOSERVER - ? hashToMessage_outgoing - : hashToMessage_incoming); - - List result = hashToMessage.get(hash); - return result == null ? new ArrayList<>() : result; - } - - public HarbleMessage getHarbleMessageFromName(HMessage.Direction direction, String name) { - Map nameToMessage = - (direction == HMessage.Direction.TOSERVER - ? nameToMessage_outgoing - : nameToMessage_incoming); - - return nameToMessage.get(name); - } - - public String getPath() { - if (success) { - return fullPath; - } - return "null"; - } - -} diff --git a/G-Earth/src/main/java/gearth/misc/packet_info/PacketInfoManager.java b/G-Earth/src/main/java/gearth/misc/packet_info/PacketInfoManager.java index 94d6ec3..115c8eb 100644 --- a/G-Earth/src/main/java/gearth/misc/packet_info/PacketInfoManager.java +++ b/G-Earth/src/main/java/gearth/misc/packet_info/PacketInfoManager.java @@ -1,13 +1,14 @@ package gearth.misc.packet_info; import gearth.misc.Cacher; -import gearth.misc.harble_api.HarbleAPIFetcher; import gearth.misc.packet_info.providers.RemotePacketInfoProvider; import gearth.misc.packet_info.providers.implementations.HarblePacketInfoProvider; import gearth.misc.packet_info.providers.implementations.SulekPacketInfoProvider; import gearth.misc.packet_info.providers.implementations.UnityPacketInfoProvider; import gearth.protocol.HMessage; +import gearth.protocol.HPacket; import gearth.protocol.connection.HClient; +import org.fxmisc.undo.impl.ChangeQueue; import org.json.JSONArray; import org.json.JSONObject; @@ -28,7 +29,10 @@ public class PacketInfoManager { private Map> nameToMessage_incoming = new HashMap<>(); private Map> nameToMessage_outgoing = new HashMap<>(); + private List packetInfoList; + public PacketInfoManager(List packetInfoList) { + this.packetInfoList = packetInfoList; for (PacketInfo packetInfo : packetInfoList) { addMessage(packetInfo); } @@ -66,37 +70,6 @@ public class PacketInfoManager { } - public PacketInfo getPacketInfoFromHeaderId(HMessage.Direction direction, int headerId) { - Map> headerIdToMessage = - (direction == HMessage.Direction.TOSERVER - ? headerIdToMessage_outgoing - : headerIdToMessage_incoming); - - if (headerIdToMessage.get(headerId) == null) return null; - return headerIdToMessage.get(headerId).get(0); - } - - public PacketInfo getHarbleMessagesFromHash(HMessage.Direction direction, String hash) { - Map> hashToMessage = - (direction == HMessage.Direction.TOSERVER - ? hashToMessage_outgoing - : hashToMessage_incoming); - - if (hashToMessage.get(hash) == null) return null; - return hashToMessage.get(hash).get(0); - } - - public PacketInfo getHarbleMessageFromName(HMessage.Direction direction, String name) { - Map> nameToMessage = - (direction == HMessage.Direction.TOSERVER - ? nameToMessage_outgoing - : nameToMessage_incoming); - - if (nameToMessage.get(name) == null) return null; - return nameToMessage.get(name).get(0); - } - - public List getAllPacketInfoFromHeaderId(HMessage.Direction direction, int headerId) { Map> headerIdToMessage = (direction == HMessage.Direction.TOSERVER @@ -106,7 +79,7 @@ public class PacketInfoManager { return headerIdToMessage.get(headerId) == null ? new ArrayList<>() : headerIdToMessage.get(headerId); } - public List getAllHarbleMessagesFromHash(HMessage.Direction direction, String hash) { + public List getAllPacketInfoFromHash(HMessage.Direction direction, String hash) { Map> hashToMessage = (direction == HMessage.Direction.TOSERVER ? hashToMessage_outgoing @@ -115,7 +88,7 @@ public class PacketInfoManager { return hashToMessage.get(hash) == null ? new ArrayList<>() : hashToMessage.get(hash); } - public List getAllHarbleMessageFromName(HMessage.Direction direction, String name) { + public List getAllPacketInfoFromName(HMessage.Direction direction, String name) { Map> nameToMessage = (direction == HMessage.Direction.TOSERVER ? nameToMessage_outgoing @@ -124,6 +97,24 @@ public class PacketInfoManager { return nameToMessage.get(name) == null ? new ArrayList<>() : nameToMessage.get(name); } + public PacketInfo getPacketInfoFromHeaderId(HMessage.Direction direction, int headerId) { + List all = getAllPacketInfoFromHeaderId(direction, headerId); + return all.size() == 0 ? null : all.get(0); + } + + public PacketInfo getPacketInfoFromHash(HMessage.Direction direction, String hash) { + List all = getAllPacketInfoFromHash(direction, hash); + return all.size() == 0 ? null : all.get(0); + } + + public PacketInfo getPacketInfoFromName(HMessage.Direction direction, String name) { + List all = getAllPacketInfoFromName(direction, name); + return all.size() == 0 ? null : all.get(0); + } + + public List getPacketInfoList() { + return packetInfoList; + } public static PacketInfoManager fromHotelVersion(String hotelversion, HClient clientType) { List result = new ArrayList<>(); @@ -158,4 +149,38 @@ public class PacketInfoManager { return new PacketInfoManager(result); } + + public static PacketInfoManager readFromPacket(HPacket hPacket) { + List packetInfoList = new ArrayList<>(); + int size = hPacket.readInteger(); + + for (int i = 0; i < size; i++) { + int headerId = hPacket.readInteger(); + String hash = hPacket.readString(); + String name = hPacket.readString(); + String structure = hPacket.readString(); + boolean isOutgoing = hPacket.readBoolean(); + + packetInfoList.add(new PacketInfo( + isOutgoing ? HMessage.Direction.TOSERVER : HMessage.Direction.TOCLIENT, + headerId, + hash.equals("NULL") ? null : hash, + name.equals("NULL") ? null : name, + structure.equals("NULL") ? null : structure + )); + } + + return new PacketInfoManager(packetInfoList); + } + + public void appendToPacket(HPacket hPacket) { + hPacket.appendInt(packetInfoList.size()); + for (PacketInfo packetInfo : packetInfoList) { + hPacket.appendInt(packetInfo.getHeaderId()); + hPacket.appendString(packetInfo.getHash() == null ? "NULL" : packetInfo.getHash()); + hPacket.appendString(packetInfo.getName() == null ? "NULL" : packetInfo.getName()); + hPacket.appendString(packetInfo.getStructure() == null ? "NULL" : packetInfo.getStructure()); + hPacket.appendBoolean(packetInfo.getDestination() == HMessage.Direction.TOSERVER); + } + } } diff --git a/G-Earth/src/main/java/gearth/misc/packet_info/providers/RemotePacketInfoProvider.java b/G-Earth/src/main/java/gearth/misc/packet_info/providers/RemotePacketInfoProvider.java index 790f69a..bd8a2f4 100644 --- a/G-Earth/src/main/java/gearth/misc/packet_info/providers/RemotePacketInfoProvider.java +++ b/G-Earth/src/main/java/gearth/misc/packet_info/providers/RemotePacketInfoProvider.java @@ -1,7 +1,6 @@ package gearth.misc.packet_info.providers; import gearth.misc.Cacher; -import gearth.misc.harble_api.PacketInfoManager; import org.jsoup.Connection; import org.jsoup.Jsoup; diff --git a/G-Earth/src/main/java/gearth/protocol/HConnection.java b/G-Earth/src/main/java/gearth/protocol/HConnection.java index fb0361c..a6d1887 100644 --- a/G-Earth/src/main/java/gearth/protocol/HConnection.java +++ b/G-Earth/src/main/java/gearth/protocol/HConnection.java @@ -1,6 +1,7 @@ package gearth.protocol; import gearth.misc.listenerpattern.Observable; +import gearth.misc.packet_info.PacketInfoManager; import gearth.protocol.connection.HClient; import gearth.protocol.connection.HProxy; import gearth.protocol.connection.HState; @@ -186,6 +187,13 @@ public class HConnection { return proxy.gethClient(); } + public PacketInfoManager getPacketInfoManager() { + if (proxy == null) { + return null; + } + return proxy.getPacketInfoManager(); + } + public boolean isRawIpMode() { return proxyProvider != null && proxyProvider instanceof LinuxRawIpFlashProxyProvider; // WindowsRawIpProxyProvider extends LinuxRawIpProxyProvider diff --git a/G-Earth/src/main/java/gearth/protocol/HPacket.java b/G-Earth/src/main/java/gearth/protocol/HPacket.java index 2fd4e56..e76d55e 100644 --- a/G-Earth/src/main/java/gearth/protocol/HPacket.java +++ b/G-Earth/src/main/java/gearth/protocol/HPacket.java @@ -1,8 +1,6 @@ package gearth.protocol; import gearth.misc.StringifyAble; -import gearth.misc.harble_api.PacketInfoManager; -import gearth.misc.harble_api.HarbleAPIFetcher; import gearth.misc.packetrepresentation.InvalidPacketException; import gearth.misc.packetrepresentation.PacketStringUtils; @@ -579,44 +577,49 @@ public class HPacket implements StringifyAble { isEdited = edited; } - private String getHarbleStructure(HMessage.Direction direction) { - PacketInfoManager.HarbleMessage msg; - if (HarbleAPIFetcher.HARBLEAPI != null && - ((msg = HarbleAPIFetcher.HARBLEAPI.getHarbleMessageFromHeaderId(direction, headerId())) != null)) { - if (msg.getStructure() != null && structureEquals(msg.getStructure())) { - return msg.getStructure(); - } - } +// private String getHarbleStructure(HMessage.Direction direction) { +// PacketInfoManager.HarbleMessage msg; +// if (HarbleAPIFetcher.HARBLEAPI != null && +// ((msg = HarbleAPIFetcher.HARBLEAPI.getHarbleMessageFromHeaderId(direction, headerId())) != null)) { +// if (msg.getStructure() != null && structureEquals(msg.getStructure())) { +// return msg.getStructure(); +// } +// } +// +// return null; +// } - return null; - } +// public String toExpression(HMessage.Direction direction) { +// if (isCorrupted()) return ""; +// +// String structure = getHarbleStructure(direction); +// if (structure != null) { +// return PacketStringUtils.toExpressionFromGivenStructure(this, structure); +// } +// +// return PacketStringUtils.predictedExpression(this); +// } - public String toExpression(HMessage.Direction direction) { - if (isCorrupted()) return ""; +// /** +// * returns "" if not found or not sure enough +// */ +// public String toExpression() { +// if (isCorrupted()) return ""; +// +// String structure1 = getHarbleStructure(HMessage.Direction.TOCLIENT); +// String structure2 = getHarbleStructure(HMessage.Direction.TOSERVER); +// if (structure1 != null && structure2 == null) { +// return PacketStringUtils.toExpressionFromGivenStructure(this, structure1); +// } +// else if (structure1 == null && structure2 != null) { +// return PacketStringUtils.toExpressionFromGivenStructure(this, structure2); +// } +// +// return PacketStringUtils.predictedExpression(this); +// } - String structure = getHarbleStructure(direction); - if (structure != null) { - return PacketStringUtils.toExpressionFromGivenStructure(this, structure); - } - - return PacketStringUtils.predictedExpression(this); - } - - /** - * returns "" if not found or not sure enough - */ public String toExpression() { if (isCorrupted()) return ""; - - String structure1 = getHarbleStructure(HMessage.Direction.TOCLIENT); - String structure2 = getHarbleStructure(HMessage.Direction.TOSERVER); - if (structure1 != null && structure2 == null) { - return PacketStringUtils.toExpressionFromGivenStructure(this, structure1); - } - else if (structure1 == null && structure2 != null) { - return PacketStringUtils.toExpressionFromGivenStructure(this, structure2); - } - return PacketStringUtils.predictedExpression(this); } diff --git a/G-Earth/src/main/java/gearth/protocol/connection/HProxy.java b/G-Earth/src/main/java/gearth/protocol/connection/HProxy.java index 2a78e33..4e1b4db 100644 --- a/G-Earth/src/main/java/gearth/protocol/connection/HProxy.java +++ b/G-Earth/src/main/java/gearth/protocol/connection/HProxy.java @@ -1,5 +1,6 @@ package gearth.protocol.connection; +import gearth.misc.packet_info.PacketInfoManager; import gearth.protocol.packethandler.PacketHandler; import java.net.ServerSocket; @@ -22,6 +23,8 @@ public class HProxy { private volatile String hotelVersion = ""; private volatile String clientIdentifier = ""; + private volatile PacketInfoManager packetInfoManager = null; + private volatile AsyncPacketSender asyncPacketSender = null; public HProxy(HClient hClient, String input_domain, String actual_domain, int actual_port, int intercept_port, String intercept_host) { @@ -42,6 +45,7 @@ public class HProxy { this.outHandler = outgoingHandler; this.hotelVersion = hotelVersion; this.clientIdentifier = clientIdentifier; + this.packetInfoManager = PacketInfoManager.fromHotelVersion(hotelVersion, hClient); this.asyncPacketSender = new AsyncPacketSender(this); } @@ -92,4 +96,8 @@ public class HProxy { public HClient gethClient() { return hClient; } + + public PacketInfoManager getPacketInfoManager() { + return packetInfoManager; + } } diff --git a/G-Earth/src/main/java/gearth/services/extensionhandler/ExtensionHandler.java b/G-Earth/src/main/java/gearth/services/extensionhandler/ExtensionHandler.java index 0472701..bad48ba 100644 --- a/G-Earth/src/main/java/gearth/services/extensionhandler/ExtensionHandler.java +++ b/G-Earth/src/main/java/gearth/services/extensionhandler/ExtensionHandler.java @@ -1,7 +1,6 @@ package gearth.services.extensionhandler; import gearth.Main; -import gearth.misc.harble_api.HarbleAPIFetcher; import gearth.misc.listenerpattern.Observable; import gearth.protocol.HConnection; import gearth.protocol.HMessage; @@ -48,7 +47,6 @@ public class ExtensionHandler { hConnection.getStateObservable().addListener((oldState, newState) -> { if (newState == HState.CONNECTED) { - HarbleAPIFetcher.fetch(hConnection.getHotelVersion(), hConnection.getClientIdentifier()); synchronized (gEarthExtensions) { for (GEarthExtension extension : gEarthExtensions) { extension.connectionStart( @@ -57,7 +55,7 @@ public class ExtensionHandler { hConnection.getHotelVersion(), hConnection.getClientIdentifier(), hConnection.getClientType(), - HarbleAPIFetcher.HARBLEAPI == null ? "null" : HarbleAPIFetcher.HARBLEAPI.getPath() + hConnection.getPacketInfoManager() ); } } @@ -247,7 +245,7 @@ public class ExtensionHandler { hConnection.getHotelVersion(), hConnection.getClientIdentifier(), hConnection.getClientType(), - HarbleAPIFetcher.HARBLEAPI == null ? "null" : HarbleAPIFetcher.HARBLEAPI.getPath() + hConnection.getPacketInfoManager() ); } diff --git a/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/GEarthExtension.java b/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/GEarthExtension.java index dd4724e..adaf8c9 100644 --- a/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/GEarthExtension.java +++ b/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/GEarthExtension.java @@ -2,6 +2,7 @@ package gearth.services.extensionhandler.extensions; import gearth.misc.listenerpattern.Observable; import gearth.misc.listenerpattern.SynchronizedObservable; +import gearth.misc.packet_info.PacketInfoManager; import gearth.protocol.HMessage; import gearth.protocol.HPacket; import gearth.protocol.connection.HClient; @@ -39,7 +40,7 @@ public abstract class GEarthExtension { public abstract void doubleclick(); public abstract void packetIntercept(HMessage hMessage); public abstract void provideFlags(String[] flags); - public abstract void connectionStart(String host, int port, String hotelVersion, String clientIdentifier, HClient clientType, String harbleMessagesPath); + public abstract void connectionStart(String host, int port, String hotelVersion, String clientIdentifier, HClient clientType, PacketInfoManager packetInfoManager); public abstract void connectionEnd(); public abstract void init(); public abstract void close(); diff --git a/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/implementations/network/NetworkExtension.java b/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/implementations/network/NetworkExtension.java index ad9ce0d..723f822 100644 --- a/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/implementations/network/NetworkExtension.java +++ b/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/implementations/network/NetworkExtension.java @@ -1,5 +1,6 @@ package gearth.services.extensionhandler.extensions.implementations.network; +import gearth.misc.packet_info.PacketInfoManager; import gearth.protocol.HMessage; import gearth.protocol.connection.HClient; import gearth.services.extensionhandler.extensions.GEarthExtension; @@ -191,16 +192,16 @@ public class NetworkExtension extends GEarthExtension { } @Override - public void connectionStart(String host, int port, String hotelVersion, String clientIdentifier, HClient clientType, String harbleMessagesPath) { - sendMessage( - new HPacket(NetworkExtensionInfo.OUTGOING_MESSAGES_IDS.CONNECTIONSTART) - .appendString(host) - .appendInt(port) - .appendString(hotelVersion) - .appendString(harbleMessagesPath) - .appendString(clientIdentifier) - .appendString(clientType.name()) - ); + public void connectionStart(String host, int port, String hotelVersion, String clientIdentifier, HClient clientType, PacketInfoManager packetInfoManager) { + HPacket connectionStartPacket = new HPacket(NetworkExtensionInfo.OUTGOING_MESSAGES_IDS.CONNECTIONSTART) + .appendString(host) + .appendInt(port) + .appendString(hotelVersion) + .appendString(clientIdentifier) + .appendString(clientType.name()); + + packetInfoManager.appendToPacket(connectionStartPacket); + sendMessage(connectionStartPacket); } @Override diff --git a/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/implementations/simple/ExampleExtension.java b/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/implementations/simple/ExampleExtension.java index a9967c1..c580eeb 100644 --- a/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/implementations/simple/ExampleExtension.java +++ b/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/implementations/simple/ExampleExtension.java @@ -1,5 +1,6 @@ package gearth.services.extensionhandler.extensions.implementations.simple; +import gearth.misc.packet_info.PacketInfoManager; import gearth.protocol.HMessage; import gearth.protocol.HPacket; import gearth.protocol.connection.HClient; @@ -84,7 +85,7 @@ public class ExampleExtension extends GEarthExtension { } @Override - public void connectionStart(String host, int port, String hotelVersion, String clientIdentifier, HClient clientType, String harbleMessagesPath) { + public void connectionStart(String host, int port, String hotelVersion, String clientIdentifier, HClient clientType, PacketInfoManager packetInfoManager) { // a new habbo client has connected System.out.println("Connected to " + host); } diff --git a/G-Earth/src/main/java/gearth/ui/logger/LoggerController.java b/G-Earth/src/main/java/gearth/ui/logger/LoggerController.java index 1f76d32..cda87d3 100644 --- a/G-Earth/src/main/java/gearth/ui/logger/LoggerController.java +++ b/G-Earth/src/main/java/gearth/ui/logger/LoggerController.java @@ -42,7 +42,7 @@ public class LoggerController extends SubForm { } if (newState == HState.CONNECTED) { miniLogText(Color.GREEN, "Connected to "+getHConnection().getDomain() + ":" + getHConnection().getServerPort()); - packetLogger.start(); + packetLogger.start(getHConnection()); } if (newState == HState.NOT_CONNECTED) { miniLogText(Color.RED, "End of connection"); diff --git a/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/PacketLogger.java b/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/PacketLogger.java index 31dfc58..4ff2006 100644 --- a/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/PacketLogger.java +++ b/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/PacketLogger.java @@ -1,5 +1,6 @@ package gearth.ui.logger.loggerdisplays; +import gearth.protocol.HConnection; import gearth.protocol.HPacket; /** @@ -27,7 +28,7 @@ public interface PacketLogger { } } - void start(); + void start(HConnection hConnection); void stop(); void appendSplitLine(); diff --git a/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/SimpleTerminalLogger.java b/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/SimpleTerminalLogger.java index 70e5ccd..08cfb12 100644 --- a/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/SimpleTerminalLogger.java +++ b/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/SimpleTerminalLogger.java @@ -1,5 +1,6 @@ package gearth.ui.logger.loggerdisplays; +import gearth.protocol.HConnection; import gearth.protocol.HPacket; /** @@ -7,7 +8,7 @@ import gearth.protocol.HPacket; */ class SimpleTerminalLogger implements PacketLogger { @Override - public void start() { + public void start(HConnection hConnection) { // System.out.println("-- START OF SESSION --"); } diff --git a/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/uilogger/UiLogger.java b/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/uilogger/UiLogger.java index 84eadef..67e46e3 100644 --- a/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/uilogger/UiLogger.java +++ b/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/uilogger/UiLogger.java @@ -1,5 +1,6 @@ package gearth.ui.logger.loggerdisplays.uilogger; +import gearth.protocol.HConnection; import gearth.protocol.HPacket; import gearth.ui.logger.loggerdisplays.PacketLogger; import javafx.event.ActionEvent; @@ -18,9 +19,10 @@ import java.util.List; public class UiLogger implements PacketLogger { private Stage stage; private UiLoggerController controller = null; + private HConnection hConnection = null; @Override - public void start() { + public void start(HConnection hConnection) { FXMLLoader loader = new FXMLLoader(getClass().getResource("/gearth/ui/logger/uilogger/UiLogger.fxml")); try { @@ -41,30 +43,13 @@ public class UiLogger implements PacketLogger { Scene scene = new Scene(root); scene.getStylesheets().add("/gearth/ui/bootstrap3.css"); scene.getStylesheets().add("/gearth/ui/logger/uilogger/logger.css"); - UiLoggerController controller = (UiLoggerController) loader.getController(); + UiLoggerController controller = loader.getController(); controller.setStage(stage); + controller.setPacketInfoManager(hConnection.getPacketInfoManager()); -// 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); diff --git a/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/uilogger/UiLoggerController.java b/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/uilogger/UiLoggerController.java index 2b03342..c2567fc 100644 --- a/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/uilogger/UiLoggerController.java +++ b/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/uilogger/UiLoggerController.java @@ -1,8 +1,8 @@ package gearth.ui.logger.loggerdisplays.uilogger; -import gearth.misc.harble_api.PacketInfoManager; -import gearth.misc.harble_api.HarbleAPIFetcher; -import gearth.protocol.HMessage; + import gearth.misc.packet_info.PacketInfo; + import gearth.misc.packet_info.PacketInfoManager; + import gearth.protocol.HMessage; import gearth.protocol.HPacket; import gearth.ui.logger.loggerdisplays.PacketLogger; import javafx.application.Platform; @@ -38,6 +38,7 @@ public class UiLoggerController implements Initializable { private StyleClassedTextArea area; private Stage stage; + private PacketInfoManager packetInfoManager; private boolean viewIncoming = true; private boolean viewOutgoing = true; @@ -92,19 +93,21 @@ public class UiLoggerController implements Initializable { ArrayList elements = new ArrayList<>(); - lblHarbleAPI.setText("Messages: " + (HarbleAPIFetcher.HARBLEAPI == null ? "False" : "True")); - if ((viewMessageName || viewMessageHash) && HarbleAPIFetcher.HARBLEAPI != null) { - PacketInfoManager api = HarbleAPIFetcher.HARBLEAPI; - PacketInfoManager.HarbleMessage message = api.getHarbleMessageFromHeaderId( + + boolean packetInfoAvailable = packetInfoManager.getPacketInfoList().size() > 0; + lblHarbleAPI.setText("Packet info: " + (packetInfoAvailable ? "True" : "False")); + + if ((viewMessageName || viewMessageHash) && packetInfoAvailable) { + PacketInfo message = packetInfoManager.getPacketInfoFromHeaderId( (isIncoming ? HMessage.Direction.TOCLIENT : HMessage.Direction.TOSERVER), packet.headerId() ); - if ( message != null && !(viewMessageName && !viewMessageHash && message.getName() == null)) { + if (message != null && !(viewMessageName && !viewMessageHash && message.getName() == null)) { if (viewMessageName && message.getName() != null) { elements.add(new Element("["+message.getName()+"]", "messageinfo")); } - if (viewMessageHash) { + if (viewMessageHash && message.getHash() != null) { elements.add(new Element("["+message.getHash()+"]", "messageinfo")); } elements.add(new Element("\n", "")); @@ -134,7 +137,7 @@ public class UiLoggerController implements Initializable { elements.add(new Element(" -> ", "")); - if (skiphugepackets && packet.length() > 8000) { + if (skiphugepackets && packet.length() > 4000) { elements.add(new Element("", "skipped")); } else { @@ -143,7 +146,8 @@ public class UiLoggerController implements Initializable { } if (packet.length() <= 2000) { - String expr = packet.toExpression(isIncoming ? HMessage.Direction.TOCLIENT : HMessage.Direction.TOSERVER); +// String expr = packet.toExpression(isIncoming ? HMessage.Direction.TOCLIENT : HMessage.Direction.TOSERVER); + String expr = packet.toExpression(); String cleaned = cleanTextContent(expr); if (cleaned.equals(expr)) { if (!expr.equals("") && displayStructure) @@ -192,6 +196,10 @@ public class UiLoggerController implements Initializable { this.stage = stage; } + public void setPacketInfoManager(PacketInfoManager packetInfoManager) { + this.packetInfoManager = packetInfoManager; + } + public void toggleViewIncoming() { viewIncoming = !viewIncoming; lblViewIncoming.setText("View Incoming: " + (viewIncoming ? "True" : "False")); From e60d9165cf462805bcf7dfbf81b8db5024afb639 Mon Sep 17 00:00:00 2001 From: sirjonasxx <36828922+sirjonasxx@users.noreply.github.com> Date: Fri, 23 Apr 2021 02:34:16 +0200 Subject: [PATCH 05/33] further improvements --- .../HarblePacketInfoProvider.java | 5 +++- .../uilogger/UiLoggerController.java | 30 ++++++++++++------- .../gearth/ui/logger/uilogger/UiLogger.fxml | 16 ++++------ 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/G-Earth/src/main/java/gearth/misc/packet_info/providers/implementations/HarblePacketInfoProvider.java b/G-Earth/src/main/java/gearth/misc/packet_info/providers/implementations/HarblePacketInfoProvider.java index 26d0e62..b8c4b9f 100644 --- a/G-Earth/src/main/java/gearth/misc/packet_info/providers/implementations/HarblePacketInfoProvider.java +++ b/G-Earth/src/main/java/gearth/misc/packet_info/providers/implementations/HarblePacketInfoProvider.java @@ -35,7 +35,10 @@ public class HarblePacketInfoProvider extends RemotePacketInfoProvider { String name; String hash; String structure; - try { name = object.getString("Name"); } + try { + name = object.getString("Name") + .replaceAll("Composer$", ""); + } catch (Exception e) { name = null; } try { hash = object.getString("Hash"); } catch (Exception e) { hash = null; } diff --git a/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/uilogger/UiLoggerController.java b/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/uilogger/UiLoggerController.java index c2567fc..ba863c7 100644 --- a/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/uilogger/UiLoggerController.java +++ b/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/uilogger/UiLoggerController.java @@ -19,6 +19,7 @@ import org.fxmisc.richtext.model.StyleSpansBuilder; import java.net.URL; import java.util.*; + import java.util.stream.Collectors; public class UiLoggerController implements Initializable { public FlowPane flowPane; @@ -33,7 +34,7 @@ public class UiLoggerController implements Initializable { public CheckMenuItem chkSkipBigPackets; public CheckMenuItem chkMessageName; public CheckMenuItem chkMessageHash; - public Label lblHarbleAPI; + public Label lblPacketInfo; private StyleClassedTextArea area; @@ -95,23 +96,32 @@ public class UiLoggerController implements Initializable { boolean packetInfoAvailable = packetInfoManager.getPacketInfoList().size() > 0; - lblHarbleAPI.setText("Packet info: " + (packetInfoAvailable ? "True" : "False")); + lblPacketInfo.setText("Packet info: " + (packetInfoAvailable ? "True" : "False")); if ((viewMessageName || viewMessageHash) && packetInfoAvailable) { - PacketInfo message = packetInfoManager.getPacketInfoFromHeaderId( + List messages = packetInfoManager.getAllPacketInfoFromHeaderId( (isIncoming ? HMessage.Direction.TOCLIENT : HMessage.Direction.TOSERVER), packet.headerId() ); + List names = messages.stream().map(PacketInfo::getName) + .filter(Objects::nonNull).distinct().collect(Collectors.toList()); + List hashes = messages.stream().map(PacketInfo::getHash) + .filter(Objects::nonNull).distinct().collect(Collectors.toList()); - if (message != null && !(viewMessageName && !viewMessageHash && message.getName() == null)) { - if (viewMessageName && message.getName() != null) { - elements.add(new Element("["+message.getName()+"]", "messageinfo")); - } - if (viewMessageHash && message.getHash() != null) { - elements.add(new Element("["+message.getHash()+"]", "messageinfo")); - } + boolean addedSomething = false; + if (viewMessageName && names.size() > 0) { + for (String name : names) {elements.add(new Element("["+name+"]", "messageinfo")); } + addedSomething = true; + } + if (viewMessageHash && hashes.size() > 0) { + for (String hash : hashes) {elements.add(new Element("["+hash+"]", "messageinfo")); } + addedSomething = true; + } + + if (addedSomething) { elements.add(new Element("\n", "")); } + } if (isBlocked) elements.add(new Element("[Blocked]\n", "blocked")); 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 index 1299ca7..cc7e3e1 100644 --- a/G-Earth/src/main/resources/gearth/ui/logger/uilogger/UiLogger.fxml +++ b/G-Earth/src/main/resources/gearth/ui/logger/uilogger/UiLogger.fxml @@ -1,15 +1,11 @@ - - - - - - - - + + + + - + @@ -75,7 +71,7 @@ - From 7030fcb9f2d753996e9a3238005f59392fe5510e Mon Sep 17 00:00:00 2001 From: sirjonasxx <36828922+sirjonasxx@users.noreply.github.com> Date: Fri, 23 Apr 2021 20:26:15 +0200 Subject: [PATCH 10/33] more packet stuff --- .../java/gearth/extensions/Extension.java | 9 ++- .../HarblePacketInfoProvider.java | 1 + .../PacketStringUtils.java | 14 ++++ .../java/gearth/protocol/HConnection.java | 20 ++++- .../main/java/gearth/protocol/HPacket.java | 75 ++++++++++++++++--- .../ui/injection/InjectionController.java | 41 +++++++++- .../scheduler/InteractableScheduleItem.java | 11 +-- 7 files changed, 149 insertions(+), 22 deletions(-) diff --git a/G-Earth/src/main/java/gearth/extensions/Extension.java b/G-Earth/src/main/java/gearth/extensions/Extension.java index 254e7a5..2f40d1c 100644 --- a/G-Earth/src/main/java/gearth/extensions/Extension.java +++ b/G-Earth/src/main/java/gearth/extensions/Extension.java @@ -36,6 +36,8 @@ public abstract class Extension implements IExtension { 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 + protected PacketInfoManager packetInfoManager = new PacketInfoManager(new ArrayList<>()); // empty + private OutputStream out = null; private final Map> incomingMessageListeners = new HashMap<>(); private final Map> outgoingMessageListeners = new HashMap<>(); @@ -144,7 +146,7 @@ public abstract class Extension implements IExtension { String hotelVersion = packet.readString(); String clientIdentifier = packet.readString(); HClient clientType = HClient.valueOf(packet.readString()); - PacketInfoManager packetInfoManager = PacketInfoManager.readFromPacket(packet); + packetInfoManager = PacketInfoManager.readFromPacket(packet); Constants.UNITY_PACKETS = clientType == HClient.UNITY; onConnectionObservable.fireEvent(l -> l.onConnection( @@ -256,6 +258,11 @@ public abstract class Extension implements IExtension { return send(packet, HMessage.Direction.TOSERVER); } private boolean send(HPacket packet, HMessage.Direction direction) { + if (packet.isCorrupted()) return false; + + if (!packet.isPacketComplete()) packet.completePacket(direction, packetInfoManager); + if (!packet.isPacketComplete()) return false; + HPacket packet1 = new HPacket(NetworkExtensionInfo.INCOMING_MESSAGES_IDS.SENDMESSAGE); packet1.appendByte(direction == HMessage.Direction.TOCLIENT ? (byte)0 : (byte)1); packet1.appendInt(packet.getBytesLength()); diff --git a/G-Earth/src/main/java/gearth/misc/packet_info/providers/implementations/HarblePacketInfoProvider.java b/G-Earth/src/main/java/gearth/misc/packet_info/providers/implementations/HarblePacketInfoProvider.java index b8c4b9f..f7aeb39 100644 --- a/G-Earth/src/main/java/gearth/misc/packet_info/providers/implementations/HarblePacketInfoProvider.java +++ b/G-Earth/src/main/java/gearth/misc/packet_info/providers/implementations/HarblePacketInfoProvider.java @@ -44,6 +44,7 @@ public class HarblePacketInfoProvider extends RemotePacketInfoProvider { catch (Exception e) { hash = null; } try { structure = object.getString("Structure"); } catch (Exception e) { structure = null; } + structure = (structure == null || structure.equals("")) ? null : structure; int headerId; try {headerId = object.getInt("Id"); } diff --git a/G-Earth/src/main/java/gearth/misc/packetrepresentation/PacketStringUtils.java b/G-Earth/src/main/java/gearth/misc/packetrepresentation/PacketStringUtils.java index 4226958..a86f1c7 100644 --- a/G-Earth/src/main/java/gearth/misc/packetrepresentation/PacketStringUtils.java +++ b/G-Earth/src/main/java/gearth/misc/packetrepresentation/PacketStringUtils.java @@ -135,6 +135,14 @@ public class PacketStringUtils { packet.substring(end + 2); } + String[] identifier = {null}; + if (!fixLengthLater && packet.startsWith("{")) { + packet = replaceAll(packet, "^\\{([^:{}]*)}", m -> { + identifier[0] = m.group(1); + return "[255][255]"; + }); + } + if (identifier[0] != null) fixLengthLater = true; if (packet.contains("{") || packet.contains("}")) { throw new InvalidPacketException(); @@ -164,6 +172,9 @@ public class PacketStringUtils { if (fixLengthLater) { hPacket.fixLength(); } + if (identifier[0] != null) { + hPacket.setIdentifier(identifier[0]); + } return hPacket; } public static String toString(byte[] packet) { @@ -255,6 +266,9 @@ public class PacketStringUtils { } public static void main(String[] args) throws InvalidPacketException { + HPacket zed = fromString("{test}{s:\"Â¥\"}{i:0}{i:0}"); + System.out.println(zed); + HPacket p1 = fromString("{l}{h:1129}{s:\"\\\\\\\\\"}{i:0}{i:0}"); System.out.println(p1.toExpression()); HPacket p1_2 = fromString(p1.toExpression()); diff --git a/G-Earth/src/main/java/gearth/protocol/HConnection.java b/G-Earth/src/main/java/gearth/protocol/HConnection.java index a6d1887..85b0db4 100644 --- a/G-Earth/src/main/java/gearth/protocol/HConnection.java +++ b/G-Earth/src/main/java/gearth/protocol/HConnection.java @@ -138,16 +138,28 @@ public class HConnection { public boolean sendToClientAsync(HPacket message) { - if (proxy == null) { - return false; + if (proxy == null) return false; + + if (!message.isPacketComplete()) { + PacketInfoManager packetInfoManager = getPacketInfoManager(); + message.completePacket(HMessage.Direction.TOCLIENT, packetInfoManager); + + if (!message.isPacketComplete()) return false; } + proxy.getAsyncPacketSender().sendToClientAsync(message); return true; } public boolean sendToServerAsync(HPacket message) { - if (proxy == null) { - return false; + if (proxy == null) return false; + + if (!message.isPacketComplete()) { + PacketInfoManager packetInfoManager = getPacketInfoManager(); + message.completePacket(HMessage.Direction.TOSERVER, packetInfoManager); + + if (!message.isPacketComplete()) return false; } + proxy.getAsyncPacketSender().sendToServerAsync(message); return true; } diff --git a/G-Earth/src/main/java/gearth/protocol/HPacket.java b/G-Earth/src/main/java/gearth/protocol/HPacket.java index 0a69fe6..469232f 100644 --- a/G-Earth/src/main/java/gearth/protocol/HPacket.java +++ b/G-Earth/src/main/java/gearth/protocol/HPacket.java @@ -15,12 +15,13 @@ import java.util.Optional; public class HPacket implements StringifyAble { - - private boolean isEdited = false; private byte[] packetInBytes; private int readIndex = 6; + // if identifier != null, this is a placeholder name for the type of packet, headerId will be "-1" + private String identifier = null; + public HPacket(byte[] packet) { packetInBytes = packet.clone(); } @@ -30,11 +31,11 @@ public class HPacket implements StringifyAble { } public HPacket(String packet) { try { - packetInBytes = PacketStringUtils.fromString(packet).packetInBytes; + HPacket packetFromString = PacketStringUtils.fromString(packet); + packetInBytes = packetFromString.packetInBytes; + identifier = packetFromString.identifier; } catch (InvalidPacketException e) { packetInBytes = new byte[0]; - // will be corrupted - // e.printStackTrace(); } } public HPacket(int header) { @@ -42,6 +43,7 @@ public class HPacket implements StringifyAble { replaceShort(4, (short)header); isEdited = false; } + public HPacket(int header, byte[] bytes) { this(header); appendBytes(bytes); @@ -55,14 +57,19 @@ public class HPacket implements StringifyAble { */ public HPacket(int header, Object... objects) throws InvalidParameterException { this(header); - for (int i = 0; i < objects.length; i++) { - Object o = objects[i]; - appendObject(o); - } - + appendObjects(objects); isEdited = false; } + public HPacket(String identifier, Object... objects) throws InvalidParameterException { + packetInBytes = new byte[]{0,0,0,2,-1,-1}; + this.identifier = identifier; + appendObjects(objects); + isEdited = false; + } + + + public String toString() { return PacketStringUtils.toString(packetInBytes); } @@ -77,6 +84,46 @@ public class HPacket implements StringifyAble { return 2; } + public void setIdentifier(String identifier) { + this.identifier = identifier; + } + + public String getIdentifier() { + return identifier; + } + + public void completePacket(HMessage.Direction direction, PacketInfoManager packetInfoManager) { + if (isCorrupted() || identifier == null) return; + + PacketInfo packetInfo = packetInfoManager.getPacketInfoFromName(direction, identifier); + if (packetInfo == null) { + packetInfo = packetInfoManager.getPacketInfoFromHash(direction, identifier); + if (packetInfo == null) return; + } + + boolean wasEdited = isEdited; + replaceShort(4, (short)(packetInfo.getHeaderId())); + identifier = null; + + isEdited = wasEdited; + } + + public boolean canComplete(HMessage.Direction direction, PacketInfoManager packetInfoManager) { + if (isCorrupted() || identifier == null) return false; + + PacketInfo packetInfo = packetInfoManager.getPacketInfoFromName(direction, identifier); + if (packetInfo == null) { + packetInfo = packetInfoManager.getPacketInfoFromHash(direction, identifier); + return packetInfo != null; + } + + return true; + } + + public boolean isPacketComplete() { + return identifier == null; + } + public byte[] toBytes() { return packetInBytes; } @@ -534,6 +581,14 @@ public class HPacket implements StringifyAble { return appendLongString(s, StandardCharsets.ISO_8859_1); } + public HPacket appendObjects(Object... objects) { + for (Object object : objects) { + appendObject(object); + } + + return this; + } + public HPacket appendObject(Object o) throws InvalidParameterException { isEdited = true; diff --git a/G-Earth/src/main/java/gearth/ui/injection/InjectionController.java b/G-Earth/src/main/java/gearth/ui/injection/InjectionController.java index 7cc3e52..e4ca766 100644 --- a/G-Earth/src/main/java/gearth/ui/injection/InjectionController.java +++ b/G-Earth/src/main/java/gearth/ui/injection/InjectionController.java @@ -1,5 +1,7 @@ package gearth.ui.injection; +import gearth.misc.packet_info.PacketInfoManager; +import gearth.protocol.HMessage; import gearth.protocol.connection.HState; import javafx.application.Platform; import javafx.event.ActionEvent; @@ -12,7 +14,13 @@ import gearth.protocol.HConnection; import gearth.protocol.HPacket; import gearth.ui.SubForm; +import java.util.ArrayList; +import java.util.Arrays; import java.util.LinkedList; +import java.util.List; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collectors; public class InjectionController extends SubForm { public TextArea inputPacket; @@ -95,9 +103,38 @@ public class InjectionController extends SubForm { } if (!dirty) { - btn_sendToClient.setDisable(getHConnection().getState() != HState.CONNECTED); - btn_sendToServer.setDisable(getHConnection().getState() != HState.CONNECTED); + PacketInfoManager packetInfoManager = getHConnection().getPacketInfoManager(); + + List unIdentifiedPackets = Arrays.stream(packets) + .filter(hPacket -> !hPacket.isPacketComplete()) + .map(HPacket::getIdentifier).collect(Collectors.toList()); + + boolean canSendToClient = unIdentifiedPackets.stream().allMatch(s -> { + if (packetInfoManager == null) return false; + return packetInfoManager.getPacketInfoFromHash(HMessage.Direction.TOCLIENT, s) != null || + packetInfoManager.getPacketInfoFromName(HMessage.Direction.TOCLIENT, s) != null; + }); + boolean canSendToServer = unIdentifiedPackets.stream().allMatch(s -> { + if (packetInfoManager == null) return false; + return packetInfoManager.getPacketInfoFromHash(HMessage.Direction.TOSERVER, s) != null || + packetInfoManager.getPacketInfoFromName(HMessage.Direction.TOSERVER, s) != null; + }); + + btn_sendToClient.setDisable(!canSendToClient || getHConnection().getState() != HState.CONNECTED); + btn_sendToServer.setDisable(!canSendToServer || getHConnection().getState() != HState.CONNECTED); if (packets.length == 1) { + + // complete packet to show correct headerId + if (!packets[0].isPacketComplete()) { + HPacket packet = packets[0]; + if (packet.canComplete(HMessage.Direction.TOCLIENT, packetInfoManager) && !packet.canComplete(HMessage.Direction.TOSERVER, packetInfoManager)) { + packet.completePacket(HMessage.Direction.TOCLIENT, packetInfoManager); + } + else if (!packet.canComplete(HMessage.Direction.TOCLIENT, packetInfoManager) && packet.canComplete(HMessage.Direction.TOSERVER, packetInfoManager)) { + packet.completePacket(HMessage.Direction.TOSERVER, packetInfoManager); + } + } + lbl_pcktInfo.setText("header (id:" + packets[0].headerId() + ", length:" + packets[0].length() + ")"); } diff --git a/G-Earth/src/main/java/gearth/ui/scheduler/InteractableScheduleItem.java b/G-Earth/src/main/java/gearth/ui/scheduler/InteractableScheduleItem.java index 1af3246..d663145 100644 --- a/G-Earth/src/main/java/gearth/ui/scheduler/InteractableScheduleItem.java +++ b/G-Earth/src/main/java/gearth/ui/scheduler/InteractableScheduleItem.java @@ -72,8 +72,8 @@ public class InteractableScheduleItem extends ScheduleItem implements StringifyA .append("\t") .append(getDelayProperty().get().toString()) .append("\t") - .append(getPacketProperty().get().toString()) - .append("\t") +// .append(getPacketProperty().get().toString()) +// .append("\t") .append(getDestinationProperty().get().name()) .append("\t") .append(getPacketAsStringProperty().get()); @@ -87,9 +87,10 @@ public class InteractableScheduleItem extends ScheduleItem implements StringifyA int index = Integer.parseInt(parts[0]); boolean paused = parts[1].equals("true"); Interval delay = new Interval(parts[2]); - HPacket packet = new HPacket(parts[3]); - HMessage.Direction direction = parts[4].equals(HMessage.Direction.TOSERVER.name()) ? HMessage.Direction.TOSERVER : HMessage.Direction.TOCLIENT; - String packetAsString = parts[5]; +// HPacket packet = new HPacket(parts[3]); + HMessage.Direction direction = parts[3].equals(HMessage.Direction.TOSERVER.name()) ? HMessage.Direction.TOSERVER : HMessage.Direction.TOCLIENT; + String packetAsString = parts[4]; + HPacket packet = new HPacket(packetAsString); construct(index, paused, delay, packet, direction); this.packetAsStringProperty = new SimpleStringProperty(packetAsString); From 367f93ae86e75019192d49de1e4aa30c5ab4bb32 Mon Sep 17 00:00:00 2001 From: sirjonasxx <36828922+sirjonasxx@users.noreply.github.com> Date: Fri, 23 Apr 2021 21:01:44 +0200 Subject: [PATCH 11/33] fixes --- .../PacketStringUtils.java | 7 +++++-- .../java/gearth/ui/tools/ToolsController.java | 21 +++++++++++++++++-- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/G-Earth/src/main/java/gearth/misc/packetrepresentation/PacketStringUtils.java b/G-Earth/src/main/java/gearth/misc/packetrepresentation/PacketStringUtils.java index a86f1c7..3c54834 100644 --- a/G-Earth/src/main/java/gearth/misc/packetrepresentation/PacketStringUtils.java +++ b/G-Earth/src/main/java/gearth/misc/packetrepresentation/PacketStringUtils.java @@ -49,8 +49,8 @@ public class PacketStringUtils { packet = replaceAll(packet, "\\{u:([0-9]+)}", m -> "[" + (Integer.parseInt(m.group(1))/256) + "][" + (Integer.parseInt(m.group(1)) % 256) + "]"); - packet = replaceAll(packet, "\\{h:([0-9]+)}", - m -> "[" + (Integer.parseInt(m.group(1))/256) + "][" + (Integer.parseInt(m.group(1)) % 256) + "]"); + packet = replaceAll(packet, "\\{h:(-?[0-9]+)}", + m -> toString(ByteBuffer.allocate(2).putShort(Short.parseShort(m.group(1))).array())); packet = replaceAll(packet, "\\{b:([Ff]alse|[Tt]rue)}", m -> m.group(1).toLowerCase().equals("true") ? "[1]" : "[0]"); @@ -266,6 +266,9 @@ public class PacketStringUtils { } public static void main(String[] args) throws InvalidPacketException { + HPacket fghdft = fromString("{l}{h:-1}{i:1}{i:0}{i:6}{i:4}{s:\"1.0\"}"); + System.out.println(fghdft); + HPacket zed = fromString("{test}{s:\"Â¥\"}{i:0}{i:0}"); System.out.println(zed); diff --git a/G-Earth/src/main/java/gearth/ui/tools/ToolsController.java b/G-Earth/src/main/java/gearth/ui/tools/ToolsController.java index 308d1e8..ed80e4b 100644 --- a/G-Earth/src/main/java/gearth/ui/tools/ToolsController.java +++ b/G-Earth/src/main/java/gearth/ui/tools/ToolsController.java @@ -1,5 +1,7 @@ package gearth.ui.tools; +import gearth.misc.packet_info.PacketInfoManager; +import gearth.protocol.HMessage; import javafx.event.ActionEvent; import javafx.scene.control.Button; import javafx.scene.control.TextArea; @@ -138,11 +140,26 @@ public class ToolsController extends SubForm { } + private HPacket parseToPacket(String p) { + PacketInfoManager packetInfoManager = getHConnection().getPacketInfoManager(); + HPacket packet = new HPacket(p); + if (!packet.isPacketComplete() && packetInfoManager != null) { + if (packet.canComplete(HMessage.Direction.TOCLIENT, packetInfoManager) && !packet.canComplete(HMessage.Direction.TOSERVER, packetInfoManager)) { + packet.completePacket(HMessage.Direction.TOCLIENT, packetInfoManager); + } + else if (!packet.canComplete(HMessage.Direction.TOCLIENT, packetInfoManager) && packet.canComplete(HMessage.Direction.TOSERVER, packetInfoManager)) { + packet.completePacket(HMessage.Direction.TOSERVER, packetInfoManager); + } + } + + return packet; + } + public void btn_toExpr_clicked(ActionEvent actionEvent) { - txt_exprArea.setText(new HPacket(txt_packetArea.getText()).toExpression(getHConnection().getPacketInfoManager(), true)); + txt_exprArea.setText(parseToPacket(txt_packetArea.getText()).toExpression(getHConnection().getPacketInfoManager(), true)); } public void btn_toPacket_clicked(ActionEvent actionEvent) { - txt_packetArea.setText(new HPacket(txt_exprArea.getText()).toString()); + txt_packetArea.setText(parseToPacket(txt_exprArea.getText()).toString()); } } From b7bf03f31383f18d5512bb05c4a0c66d464068e5 Mon Sep 17 00:00:00 2001 From: sirjonasxx <36828922+sirjonasxx@users.noreply.github.com> Date: Sun, 25 Apr 2021 15:41:32 +0200 Subject: [PATCH 12/33] internal extensions --- Extensions/BlockReplacePackets/pom.xml | 113 -------------- .../java/gearth/extensions/Extension.java | 133 ++--------------- .../java/gearth/extensions/ExtensionBase.java | 130 ++++++++++++++++ .../java/gearth/extensions/ExtensionForm.java | 6 +- .../extensions/ExtensionFormLauncher.java | 10 +- .../java/gearth/extensions/IExtension.java | 25 ++-- .../gearth/extensions/InternalExtension.java | 68 +++++++++ .../extensions/InternalExtensionBuilder.java | 139 ++++++++++++++++++ .../InternalExtensionFormBuilder.java | 74 ++++++++++ .../extra/{harble => tools}/ChatConsole.java | 5 +- .../{harble => tools}/ChatInputListener.java | 2 +- .../{harble => tools}/PacketInfoSupport.java | 4 +- .../windows/WindowsHabboClient.java | 2 +- .../simple/SimpleExtensionProducer.java | 5 +- .../BlockAndReplacePackets.java | 27 ++-- .../blockreplacepackets/RuleContainer.java | 6 +- .../rules/BlockPacketRule.java | 2 +- .../rules/BlockReplaceRule.java | 2 +- .../rules/ReplaceIntegerRule.java | 2 +- .../rules/ReplacePacketRule.java | 4 +- .../rules/ReplaceStringRule.java | 2 +- .../rules/ReplaceSubstringRule.java | 2 +- .../rules/RuleFactory.java | 2 +- .../blockreplacepackets/blockreplace.fxml | 16 +- pom.xml | 1 - 25 files changed, 487 insertions(+), 295 deletions(-) delete mode 100644 Extensions/BlockReplacePackets/pom.xml create mode 100644 G-Earth/src/main/java/gearth/extensions/ExtensionBase.java create mode 100644 G-Earth/src/main/java/gearth/extensions/InternalExtension.java create mode 100644 G-Earth/src/main/java/gearth/extensions/InternalExtensionBuilder.java create mode 100644 G-Earth/src/main/java/gearth/extensions/InternalExtensionFormBuilder.java rename G-Earth/src/main/java/gearth/extensions/extra/{harble => tools}/ChatConsole.java (95%) rename G-Earth/src/main/java/gearth/extensions/extra/{harble => tools}/ChatInputListener.java (65%) rename G-Earth/src/main/java/gearth/extensions/extra/{harble => tools}/PacketInfoSupport.java (97%) rename {Extensions/BlockReplacePackets/src/main/java/extensions => G-Earth/src/main/java/gearth/services/internal_extensions}/blockreplacepackets/BlockAndReplacePackets.java (91%) rename {Extensions/BlockReplacePackets/src/main/java/extensions => G-Earth/src/main/java/gearth/services/internal_extensions}/blockreplacepackets/RuleContainer.java (93%) rename {Extensions/BlockReplacePackets/src/main/java/extensions => G-Earth/src/main/java/gearth/services/internal_extensions}/blockreplacepackets/rules/BlockPacketRule.java (94%) rename {Extensions/BlockReplacePackets/src/main/java/extensions => G-Earth/src/main/java/gearth/services/internal_extensions}/blockreplacepackets/rules/BlockReplaceRule.java (93%) rename {Extensions/BlockReplacePackets/src/main/java/extensions => G-Earth/src/main/java/gearth/services/internal_extensions}/blockreplacepackets/rules/ReplaceIntegerRule.java (94%) rename {Extensions/BlockReplacePackets/src/main/java/extensions => G-Earth/src/main/java/gearth/services/internal_extensions}/blockreplacepackets/rules/ReplacePacketRule.java (92%) rename {Extensions/BlockReplacePackets/src/main/java/extensions => G-Earth/src/main/java/gearth/services/internal_extensions}/blockreplacepackets/rules/ReplaceStringRule.java (94%) rename {Extensions/BlockReplacePackets/src/main/java/extensions => G-Earth/src/main/java/gearth/services/internal_extensions}/blockreplacepackets/rules/ReplaceSubstringRule.java (94%) rename {Extensions/BlockReplacePackets/src/main/java/extensions => G-Earth/src/main/java/gearth/services/internal_extensions}/blockreplacepackets/rules/RuleFactory.java (95%) rename {Extensions/BlockReplacePackets/src/main/java/extensions => G-Earth/src/main/resources/gearth/services/internal_extensions}/blockreplacepackets/blockreplace.fxml (94%) diff --git a/Extensions/BlockReplacePackets/pom.xml b/Extensions/BlockReplacePackets/pom.xml deleted file mode 100644 index 9a1a6fc..0000000 --- a/Extensions/BlockReplacePackets/pom.xml +++ /dev/null @@ -1,113 +0,0 @@ - - - 4.0.0 - - BlockReplacePackets - - jar - - 0.0.1-beta - - - G-Earth - G-Earth-Parent - 1.3.4 - ../../ - - - - - - - false - src/main/java - - **/*.fxml - **/*.css - - - - - - - org.apache.maven.plugins - maven-jar-plugin - 2.5 - - ${project.build.directory}/bin - - - true - true - extensions.blockreplacepackets.BlockAndReplacePackets - false - lib/ - true - - - ${project.artifactId} - - - - - maven-assembly-plugin - 2.5 - - - package - - single - - - - - ${project.build.directory}/bin - - - extensions.blockreplacepackets.BlockAndReplacePackets - - - - jar-with-dependencies - - ${project.artifactId} - false - - - - - - maven-antrun-plugin - 3.0.0 - - - package - - - - - - - - - - run - - - - - - - - - - - G-Earth - G-Earth - 1.3.4 - - - - \ No newline at end of file diff --git a/G-Earth/src/main/java/gearth/extensions/Extension.java b/G-Earth/src/main/java/gearth/extensions/Extension.java index 2f40d1c..bd00f8d 100644 --- a/G-Earth/src/main/java/gearth/extensions/Extension.java +++ b/G-Earth/src/main/java/gearth/extensions/Extension.java @@ -1,5 +1,9 @@ package gearth.extensions; +import gearth.extensions.ExtensionBase; +import gearth.extensions.ExtensionInfo; +import gearth.extensions.IExtension; +import gearth.extensions.OnConnectionListener; import gearth.misc.listenerpattern.Observable; import gearth.misc.packet_info.PacketInfoManager; import gearth.protocol.HMessage; @@ -18,17 +22,9 @@ import java.util.Map; /** * Created by Jonas on 23/06/18. */ -public abstract class Extension implements IExtension { +public abstract class Extension extends ExtensionBase { - public interface MessageListener { - void act(HMessage message); - } - public interface FlagsCheckListener { - void act(String[] args); - } - - protected boolean canLeave; // can you disconnect the ext - protected boolean canDelete; // can you delete the ext (will be false for some built-in extensions) + protected FlagsCheckListener flagRequestCallback = null; private String[] args; private boolean isCorrupted = false; @@ -39,9 +35,6 @@ public abstract class Extension implements IExtension { protected PacketInfoManager packetInfoManager = new PacketInfoManager(new ArrayList<>()); // empty private OutputStream out = null; - private final Map> incomingMessageListeners = new HashMap<>(); - private final Map> outgoingMessageListeners = new HashMap<>(); - private FlagsCheckListener flagRequestCallback = null; private String getArgument(String[] args, String... arg) { for (int i = 0; i < args.length - 1; i++) { @@ -59,8 +52,7 @@ public abstract class Extension implements IExtension { * @param args arguments */ public Extension(String[] args) { - canLeave = canLeave(); - canDelete = canDelete(); + super(); //obtain port this.args = args; @@ -136,8 +128,8 @@ public abstract class Extension implements IExtension { .appendBoolean(file != null) .appendString(file == null ? "": file) .appendString(cookie == null ? "" : cookie) - .appendBoolean(canLeave) - .appendBoolean(canDelete); + .appendBoolean(canLeave()) + .appendBoolean(canDelete()); writeToStream(response.toBytes()); } else if (packet.headerId() == NetworkExtensionInfo.OUTGOING_MESSAGES_IDS.CONNECTIONSTART) { @@ -149,7 +141,7 @@ public abstract class Extension implements IExtension { packetInfoManager = PacketInfoManager.readFromPacket(packet); Constants.UNITY_PACKETS = clientType == HClient.UNITY; - onConnectionObservable.fireEvent(l -> l.onConnection( + getOnConnectionObservable().fireEvent(l -> l.onConnection( host, connectionPort, hotelVersion, clientIdentifier, clientType, packetInfoManager) ); @@ -180,36 +172,8 @@ public abstract class Extension implements IExtension { else if (packet.headerId() == NetworkExtensionInfo.OUTGOING_MESSAGES_IDS.PACKETINTERCEPT) { String stringifiedMessage = packet.readLongString(); HMessage habboMessage = new HMessage(stringifiedMessage); - HPacket habboPacket = habboMessage.getPacket(); - Map> listeners = - habboMessage.getDestination() == HMessage.Direction.TOCLIENT ? - incomingMessageListeners : - outgoingMessageListeners; - - List correctListeners = new ArrayList<>(); - - synchronized (incomingMessageListeners) { - synchronized (outgoingMessageListeners) { - if (listeners.containsKey(-1)) { // registered on all packets - for (int i = listeners.get(-1).size() - 1; i >= 0; i--) { - correctListeners.add(listeners.get(-1).get(i)); - } - } - - if (listeners.containsKey(habboPacket.headerId())) { - for (int i = listeners.get(habboPacket.headerId()).size() - 1; i >= 0; i--) { - correctListeners.add(listeners.get(habboPacket.headerId()).get(i)); - } - } - } - } - - for(MessageListener listener : correctListeners) { - habboMessage.getPacket().resetReadIndex(); - listener.act(habboMessage); - } - habboMessage.getPacket().resetReadIndex(); + modifyMessage(habboMessage); HPacket response = new HPacket(NetworkExtensionInfo.INCOMING_MESSAGES_IDS.MANIPULATEDPACKET); response.appendLongString(habboMessage.stringify()); @@ -275,37 +239,6 @@ public abstract class Extension implements IExtension { } } - /** - * Register a listener on a specific packet Type - * @param direction ToClient or ToServer - * @param headerId the packet header ID - * @param messageListener the callback - */ - public void intercept(HMessage.Direction direction, int headerId, MessageListener messageListener) { - Map> listeners = - direction == HMessage.Direction.TOCLIENT ? - incomingMessageListeners : - outgoingMessageListeners; - - synchronized (listeners) { - if (!listeners.containsKey(headerId)) { - listeners.put(headerId, new ArrayList<>()); - } - } - - - listeners.get(headerId).add(messageListener); - } - - /** - * Register a listener on all packets - * @param direction ToClient or ToServer - * @param messageListener the callback - */ - public void intercept(HMessage.Direction direction, MessageListener messageListener) { - intercept(direction, -1, messageListener); - } - /** * Requests the flags which have been given to G-Earth when it got executed * For example, you might want this extension to do a specific thing if the flag "-e" was given @@ -324,15 +257,6 @@ public abstract class Extension implements IExtension { } } - - /** - * Write to the console in G-Earth - * @param s the text to be written - */ - public void writeToConsole(String s) { - writeToConsole("black", s, true); - } - /** * Write to the console in G-Earth * @param s the text to be written @@ -360,37 +284,12 @@ public abstract class Extension implements IExtension { } } - - private boolean isOnClickMethodUsed() { - - Class c = getClass(); - - while (c != Extension.class) { - try { - c.getDeclaredMethod("onClick"); - // if it didnt error, onClick exists - return true; - } catch (NoSuchMethodException e) { -// e.printStackTrace(); - } - - c = (Class) c.getSuperclass(); - } - - return false; - } - /** * 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(){} - /** * A connection with Habbo has been started */ @@ -409,14 +308,4 @@ public abstract class Extension implements IExtension { return true; } - ExtensionInfo getInfoAnnotations() { - return getClass().getAnnotation(ExtensionInfo.class); - } - - - private Observable onConnectionObservable = new Observable<>(); - public void onConnect(OnConnectionListener listener){ - onConnectionObservable.addListener(listener); - } - } diff --git a/G-Earth/src/main/java/gearth/extensions/ExtensionBase.java b/G-Earth/src/main/java/gearth/extensions/ExtensionBase.java new file mode 100644 index 0000000..060b835 --- /dev/null +++ b/G-Earth/src/main/java/gearth/extensions/ExtensionBase.java @@ -0,0 +1,130 @@ +package gearth.extensions; + +import gearth.misc.listenerpattern.Observable; +import gearth.protocol.HMessage; +import gearth.protocol.HPacket; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public abstract class ExtensionBase extends IExtension { + + public interface MessageListener { + void act(HMessage message); + } + public interface FlagsCheckListener { + void act(String[] args); + } + + protected final Map> incomingMessageListeners = new HashMap<>(); + protected final Map> outgoingMessageListeners = new HashMap<>(); + + /** + * Register a listener on a specific packet Type + * @param direction ToClient or ToServer + * @param headerId the packet header ID + * @param messageListener the callback + */ + public void intercept(HMessage.Direction direction, int headerId, MessageListener messageListener) { + Map> listeners = + direction == HMessage.Direction.TOCLIENT ? + incomingMessageListeners : + outgoingMessageListeners; + + synchronized (listeners) { + if (!listeners.containsKey(headerId)) { + listeners.put(headerId, new ArrayList<>()); + } + } + + + listeners.get(headerId).add(messageListener); + } + + /** + * Register a listener on all packets + * @param direction ToClient or ToServer + * @param messageListener the callback + */ + public void intercept(HMessage.Direction direction, MessageListener messageListener) { + intercept(direction, -1, messageListener); + } + + @Override + public void writeToConsole(String s) { + writeToConsole("black", s); + } + + protected boolean isOnClickMethodUsed() { + Class c = getClass(); + while (c != Extension.class) { + try { + c.getDeclaredMethod("onClick"); + // if it didnt error, onClick exists + return true; + } catch (NoSuchMethodException e) { +// e.printStackTrace(); + } + + c = (Class) c.getSuperclass(); + } + return false; + } + + public void modifyMessage(HMessage habboMessage) { + HPacket habboPacket = habboMessage.getPacket(); + + Map> listeners = + habboMessage.getDestination() == HMessage.Direction.TOCLIENT ? + incomingMessageListeners : + outgoingMessageListeners; + + List correctListeners = new ArrayList<>(); + + synchronized (incomingMessageListeners) { + synchronized (outgoingMessageListeners) { + if (listeners.containsKey(-1)) { // registered on all packets + for (int i = listeners.get(-1).size() - 1; i >= 0; i--) { + correctListeners.add(listeners.get(-1).get(i)); + } + } + + if (listeners.containsKey(habboPacket.headerId())) { + for (int i = listeners.get(habboPacket.headerId()).size() - 1; i >= 0; i--) { + correctListeners.add(listeners.get(habboPacket.headerId()).get(i)); + } + } + } + } + + for(MessageListener listener : correctListeners) { + habboMessage.getPacket().resetReadIndex(); + listener.act(habboMessage); + } + habboMessage.getPacket().resetReadIndex(); + } + + /** + * The application got doubleclicked from the G-Earth interface. Doing something here is optional + */ + @Override + void onClick() { + + } + + @Override + protected ExtensionInfo getInfoAnnotations() { + return getClass().getAnnotation(ExtensionInfo.class); + } + + private Observable onConnectionObservable = new Observable<>(); + public void onConnect(OnConnectionListener listener){ + onConnectionObservable.addListener(listener); + } + + Observable getOnConnectionObservable() { + return onConnectionObservable; + } +} diff --git a/G-Earth/src/main/java/gearth/extensions/ExtensionForm.java b/G-Earth/src/main/java/gearth/extensions/ExtensionForm.java index 145733c..5310cd0 100644 --- a/G-Earth/src/main/java/gearth/extensions/ExtensionForm.java +++ b/G-Earth/src/main/java/gearth/extensions/ExtensionForm.java @@ -8,9 +8,9 @@ import gearth.protocol.HPacket; /** * Created by Jonas on 22/09/18. */ -public abstract class ExtensionForm implements IExtension { +public abstract class ExtensionForm extends ExtensionBase { - volatile Extension extension; + volatile ExtensionBase extension; protected volatile Stage primaryStage; protected static void runExtensionForm(String[] args, Class extension) { @@ -59,7 +59,7 @@ public abstract class ExtensionForm implements IExtension { /** * The application got doubleclicked from the G-Earth interface. Doing something here is optional */ - protected void onClick(){ + public void onClick(){ Platform.runLater(() -> { primaryStage.show(); primaryStage.requestFocus(); diff --git a/G-Earth/src/main/java/gearth/extensions/ExtensionFormLauncher.java b/G-Earth/src/main/java/gearth/extensions/ExtensionFormLauncher.java index 0eec47b..920f02a 100644 --- a/G-Earth/src/main/java/gearth/extensions/ExtensionFormLauncher.java +++ b/G-Earth/src/main/java/gearth/extensions/ExtensionFormLauncher.java @@ -5,7 +5,7 @@ import javafx.application.Platform; import javafx.stage.Stage; /** - * Created by Jeunez on 6/11/2018. + * Created by Jonas on 6/11/2018. */ public class ExtensionFormLauncher extends Application { @@ -19,7 +19,7 @@ public class ExtensionFormLauncher extends Application { ExtensionForm creator = extension.newInstance(); ExtensionForm extensionForm = creator.launchForm(primaryStage); - extensionForm.extension = new Extension(args) { + Extension extension = new Extension(args) { @Override protected void initExtension() { extensionForm.initExtension(); @@ -41,7 +41,7 @@ public class ExtensionFormLauncher extends Application { } @Override - ExtensionInfo getInfoAnnotations() { + protected ExtensionInfo getInfoAnnotations() { return extInfo; } @@ -55,9 +55,11 @@ public class ExtensionFormLauncher extends Application { return extensionForm.canDelete(); } }; + extensionForm.extension = extension; + extensionForm.primaryStage = primaryStage; Thread t = new Thread(() -> { - extensionForm.extension.run(); + extension.run(); //when the extension has ended, close this process System.exit(0); }); diff --git a/G-Earth/src/main/java/gearth/extensions/IExtension.java b/G-Earth/src/main/java/gearth/extensions/IExtension.java index 8040bce..3b8ae89 100644 --- a/G-Earth/src/main/java/gearth/extensions/IExtension.java +++ b/G-Earth/src/main/java/gearth/extensions/IExtension.java @@ -3,15 +3,22 @@ package gearth.extensions; import gearth.protocol.HMessage; import gearth.protocol.HPacket; -public interface IExtension { +public abstract class IExtension { - boolean sendToClient(HPacket packet); - boolean sendToServer(HPacket packet); - void intercept(HMessage.Direction direction, int headerId, Extension.MessageListener messageListener); - void intercept(HMessage.Direction direction, Extension.MessageListener messageListener); - boolean requestFlags(Extension.FlagsCheckListener flagRequestCallback); - void writeToConsole(String colorClass, String s); - void writeToConsole(String s); - void onConnect(OnConnectionListener listener); + public abstract boolean sendToClient(HPacket packet); + public abstract boolean sendToServer(HPacket packet); + public abstract void intercept(HMessage.Direction direction, int headerId, Extension.MessageListener messageListener); + public abstract void intercept(HMessage.Direction direction, Extension.MessageListener messageListener); + public abstract boolean requestFlags(Extension.FlagsCheckListener flagRequestCallback); + public abstract void writeToConsole(String colorClass, String s); + public abstract void writeToConsole(String s); + public abstract void onConnect(OnConnectionListener listener); + abstract void initExtension(); + abstract void onClick(); + abstract void onStartConnection(); + abstract void onEndConnection(); + abstract ExtensionInfo getInfoAnnotations(); + abstract boolean canLeave(); + abstract boolean canDelete(); } diff --git a/G-Earth/src/main/java/gearth/extensions/InternalExtension.java b/G-Earth/src/main/java/gearth/extensions/InternalExtension.java new file mode 100644 index 0000000..5f870d2 --- /dev/null +++ b/G-Earth/src/main/java/gearth/extensions/InternalExtension.java @@ -0,0 +1,68 @@ +package gearth.extensions; + +import gearth.Main; +import gearth.extensions.ExtensionBase; +import gearth.extensions.IExtension; +import gearth.protocol.HPacket; + + +public class InternalExtension extends ExtensionBase { + + public interface InternalExtensionCommunicator { + void sendToClient(HPacket packet); + void sendToServer(HPacket packet); + void writeToConsole(String s); + } + + private InternalExtensionCommunicator communicator = null; + + public void setCommunicator(InternalExtensionCommunicator communicator) { + this.communicator = communicator; + } + + @Override + public boolean sendToClient(HPacket packet) { + communicator.sendToClient(packet); + return true; + } + + @Override + public boolean sendToServer(HPacket packet) { + communicator.sendToServer(packet); + return true; + } + + @Override + public boolean requestFlags(FlagsCheckListener flagRequestCallback) { + flagRequestCallback.act(Main.args); + return true; + } + + @Override + public void writeToConsole(String colorClass, String s) { + String text = "[" + colorClass + "]" + getInfoAnnotations().Title() + " --> " + s; + communicator.writeToConsole(text); + } + + // to be maybe overwritten + @Override + protected void initExtension() { } + + // to be maybe overwritten + @Override + protected void onStartConnection() {} + + // to be maybe overwritten + @Override + protected void onEndConnection() {} + + @Override + protected boolean canLeave() { + return false; + } + + @Override + protected boolean canDelete() { + return false; + } +} diff --git a/G-Earth/src/main/java/gearth/extensions/InternalExtensionBuilder.java b/G-Earth/src/main/java/gearth/extensions/InternalExtensionBuilder.java new file mode 100644 index 0000000..e1631b7 --- /dev/null +++ b/G-Earth/src/main/java/gearth/extensions/InternalExtensionBuilder.java @@ -0,0 +1,139 @@ +package gearth.extensions; + + +import gearth.misc.packet_info.PacketInfoManager; +import gearth.protocol.HMessage; +import gearth.protocol.HPacket; +import gearth.protocol.connection.HClient; +import gearth.services.extensionhandler.extensions.GEarthExtension; + +// wraps internal GEarthExtension class to IExtension interface +// to allow internal extensions that follow the same remote-extensions interface +public class InternalExtensionBuilder extends GEarthExtension { + + private final InternalExtension extension; + + public InternalExtensionBuilder(InternalExtension extension) { + this.extension = extension; + extension.setCommunicator(new InternalExtension.InternalExtensionCommunicator() { + @Override + public void sendToClient(HPacket packet) { + sendMessage(HMessage.Direction.TOCLIENT, packet); + } + + @Override + public void sendToServer(HPacket packet) { + sendMessage(HMessage.Direction.TOSERVER, packet); + } + + @Override + public void writeToConsole(String s) { + log(s); + } + }); + } + + @Override + public String getAuthor() { + return extension.getInfoAnnotations().Author(); + } + + @Override + public String getDescription() { + return extension.getInfoAnnotations().Description(); + } + + @Override + public String getTitle() { + return extension.getInfoAnnotations().Title(); + } + + @Override + public String getVersion() { + return extension.getInfoAnnotations().Version(); + } + + @Override + public boolean isFireButtonUsed() { + Class c = extension.getClass(); + + while (c != InternalExtension.class) { + try { + c.getDeclaredMethod("onClick"); + return true; + } catch (NoSuchMethodException e) { +// e.printStackTrace(); + } + + c = (Class) c.getSuperclass(); + } + + return false; + } + + @Override + public boolean isDeleteButtonVisible() { + return extension.canDelete(); + } + + @Override + public boolean isLeaveButtonVisible() { + return extension.canLeave(); + } + + @Override + public boolean isInstalledExtension() { + return false; + } + + @Override + public void doubleclick() { + extension.onClick(); + } + + @Override + public void packetIntercept(HMessage hMessage) { + extension.modifyMessage(hMessage); + sendManipulatedPacket(hMessage); + } + + @Override + public void provideFlags(String[] flags) { + // no need + } + + @Override + public void connectionStart(String host, int port, String hotelVersion, String clientIdentifier, HClient clientType, PacketInfoManager packetInfoManager) { + extension.getOnConnectionObservable().fireEvent(l -> l.onConnection( + host, port, hotelVersion, + clientIdentifier, clientType, packetInfoManager) + ); + extension.onStartConnection(); + } + + @Override + public void connectionEnd() { + extension.onEndConnection(); + } + + @Override + public void init() { + extension.initExtension(); + } + + @Override + public void close() { + // no need in internal ext + } + + @Override + public void packetToStringResponse(String string, String expression) { + // no need in java ext + } + + @Override + public void stringToPacketResponse(HPacket packet) { + // no need in java ext + } + +} diff --git a/G-Earth/src/main/java/gearth/extensions/InternalExtensionFormBuilder.java b/G-Earth/src/main/java/gearth/extensions/InternalExtensionFormBuilder.java new file mode 100644 index 0000000..c1cfc03 --- /dev/null +++ b/G-Earth/src/main/java/gearth/extensions/InternalExtensionFormBuilder.java @@ -0,0 +1,74 @@ +package gearth.extensions; + +import gearth.services.extensionhandler.extensions.GEarthExtension; +import gearth.services.extensionhandler.extensions.extensionproducers.ExtensionProducerObserver; +import javafx.application.Platform; +import javafx.stage.Stage; + +public class InternalExtensionFormBuilder { + + public static void launch(Class extension, ExtensionProducerObserver observer) { + try { + ExtensionInfo extInfo = extension.getAnnotation(ExtensionInfo.class); + ExtensionForm creator = extension.newInstance(); + + Stage stage = new Stage(); + ExtensionForm extensionForm = creator.launchForm(stage); + + InternalExtension internalExtension = new InternalExtension() { + @Override + protected void initExtension() { + extensionForm.initExtension(); + } + + @Override + protected void onClick() { + extensionForm.onClick(); + } + + @Override + protected void onStartConnection() { + extensionForm.onStartConnection(); + } + + @Override + protected void onEndConnection() { + extensionForm.onEndConnection(); + } + + @Override + protected ExtensionInfo getInfoAnnotations() { + return extInfo; + } + + @Override + protected boolean canLeave() { + return extensionForm.canLeave(); + } + + @Override + protected boolean canDelete() { + return extensionForm.canDelete(); + } + }; + extensionForm.extension = internalExtension; + extensionForm.primaryStage = stage; + + GEarthExtension gEarthExtension = new InternalExtensionBuilder(internalExtension); + observer.onExtensionProduced(gEarthExtension); + + + Platform.setImplicitExit(false); + + stage.setOnCloseRequest(event -> { + event.consume(); + Platform.runLater(() -> { + stage.hide(); + extensionForm.onHide(); + }); + }); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/G-Earth/src/main/java/gearth/extensions/extra/harble/ChatConsole.java b/G-Earth/src/main/java/gearth/extensions/extra/tools/ChatConsole.java similarity index 95% rename from G-Earth/src/main/java/gearth/extensions/extra/harble/ChatConsole.java rename to G-Earth/src/main/java/gearth/extensions/extra/tools/ChatConsole.java index 5411670..cde0c8c 100644 --- a/G-Earth/src/main/java/gearth/extensions/extra/harble/ChatConsole.java +++ b/G-Earth/src/main/java/gearth/extensions/extra/tools/ChatConsole.java @@ -1,13 +1,10 @@ -package gearth.extensions.extra.harble; +package gearth.extensions.extra.tools; import gearth.extensions.ExtensionInfo; import gearth.extensions.IExtension; -import gearth.extensions.OnConnectionListener; import gearth.misc.listenerpattern.Observable; -import gearth.misc.packet_info.PacketInfoManager; import gearth.protocol.HMessage; import gearth.protocol.HPacket; -import gearth.protocol.connection.HClient; /** * Created by Jonas on 3/12/2018. diff --git a/G-Earth/src/main/java/gearth/extensions/extra/harble/ChatInputListener.java b/G-Earth/src/main/java/gearth/extensions/extra/tools/ChatInputListener.java similarity index 65% rename from G-Earth/src/main/java/gearth/extensions/extra/harble/ChatInputListener.java rename to G-Earth/src/main/java/gearth/extensions/extra/tools/ChatInputListener.java index a9a933a..4e097a8 100644 --- a/G-Earth/src/main/java/gearth/extensions/extra/harble/ChatInputListener.java +++ b/G-Earth/src/main/java/gearth/extensions/extra/tools/ChatInputListener.java @@ -1,4 +1,4 @@ -package gearth.extensions.extra.harble; +package gearth.extensions.extra.tools; public interface ChatInputListener { void inputEntered(String input); diff --git a/G-Earth/src/main/java/gearth/extensions/extra/harble/PacketInfoSupport.java b/G-Earth/src/main/java/gearth/extensions/extra/tools/PacketInfoSupport.java similarity index 97% rename from G-Earth/src/main/java/gearth/extensions/extra/harble/PacketInfoSupport.java rename to G-Earth/src/main/java/gearth/extensions/extra/tools/PacketInfoSupport.java index 217893e..e0dedee 100644 --- a/G-Earth/src/main/java/gearth/extensions/extra/harble/PacketInfoSupport.java +++ b/G-Earth/src/main/java/gearth/extensions/extra/tools/PacketInfoSupport.java @@ -1,13 +1,11 @@ -package gearth.extensions.extra.harble; +package gearth.extensions.extra.tools; import gearth.extensions.Extension; import gearth.extensions.IExtension; -import gearth.extensions.OnConnectionListener; import gearth.misc.packet_info.PacketInfo; import gearth.misc.packet_info.PacketInfoManager; import gearth.protocol.HMessage; import gearth.protocol.HPacket; -import gearth.protocol.connection.HClient; import java.security.InvalidParameterException; import java.util.*; diff --git a/G-Earth/src/main/java/gearth/protocol/memory/habboclient/windows/WindowsHabboClient.java b/G-Earth/src/main/java/gearth/protocol/memory/habboclient/windows/WindowsHabboClient.java index 8801fef..7178b06 100644 --- a/G-Earth/src/main/java/gearth/protocol/memory/habboclient/windows/WindowsHabboClient.java +++ b/G-Earth/src/main/java/gearth/protocol/memory/habboclient/windows/WindowsHabboClient.java @@ -15,7 +15,7 @@ import java.net.URISyntaxException; import java.util.*; /** - * Created by Jeunez on 27/06/2018. + * Created by Jonas on 27/06/2018. */ public class WindowsHabboClient extends HabboClient { diff --git a/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/implementations/simple/SimpleExtensionProducer.java b/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/implementations/simple/SimpleExtensionProducer.java index 105b907..b5c55aa 100644 --- a/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/implementations/simple/SimpleExtensionProducer.java +++ b/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/implementations/simple/SimpleExtensionProducer.java @@ -1,7 +1,9 @@ package gearth.services.extensionhandler.extensions.implementations.simple; +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; public class SimpleExtensionProducer implements ExtensionProducer { @@ -9,7 +11,8 @@ public class SimpleExtensionProducer implements ExtensionProducer { public void startProducing(ExtensionProducerObserver observer) { // uncomment the next line if you want to see an embedded example extension in G-Earth - // observer.onExtensionConnect(new ExampleExtension()); +// observer.onExtensionProduced(new ExampleExtension()); + InternalExtensionFormBuilder.launch(BlockAndReplacePackets.class, observer); } } diff --git a/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/BlockAndReplacePackets.java b/G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/BlockAndReplacePackets.java similarity index 91% rename from Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/BlockAndReplacePackets.java rename to G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/BlockAndReplacePackets.java index ad3d6ff..30e9e13 100644 --- a/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/BlockAndReplacePackets.java +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/BlockAndReplacePackets.java @@ -1,10 +1,12 @@ -package extensions.blockreplacepackets; +package gearth.services.internal_extensions.blockreplacepackets; -import extensions.blockreplacepackets.rules.BlockReplaceRule; -import extensions.blockreplacepackets.rules.RuleFactory; -import gearth.extensions.Extension; +import gearth.Main; +import gearth.extensions.ExtensionForm; +import gearth.extensions.ExtensionInfo; import gearth.protocol.HMessage; import gearth.protocol.HPacket; +import gearth.services.internal_extensions.blockreplacepackets.rules.BlockReplaceRule; +import gearth.services.internal_extensions.blockreplacepackets.rules.RuleFactory; import gearth.ui.GEarthController; import javafx.application.Platform; import javafx.event.ActionEvent; @@ -15,11 +17,10 @@ import javafx.scene.control.Button; import javafx.scene.control.ComboBox; import javafx.scene.control.ScrollPane; import javafx.scene.control.TextField; +import javafx.scene.image.Image; 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; @@ -48,9 +49,9 @@ public class BlockAndReplacePackets extends ExtensionForm { List rules = new ArrayList<>(); - public static void main(String[] args) { - runExtensionForm(args, BlockAndReplacePackets.class); - } +// public static void main(String[] args) { +// runExtensionForm(args, BlockAndReplacePackets.class); +// } //initialize javaFX elements public void initialize() { @@ -177,7 +178,7 @@ public class BlockAndReplacePackets extends ExtensionForm { @Override protected void initExtension() { - Extension.MessageListener messageListener = message -> { + MessageListener messageListener = message -> { for (BlockReplaceRule rule : rules) { rule.appendRuleToMessage(message); } @@ -196,6 +197,7 @@ public class BlockAndReplacePackets extends ExtensionForm { primaryStage.setScene(new Scene(root)); primaryStage.setResizable(false); 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(); } @@ -215,6 +217,11 @@ public class BlockAndReplacePackets extends ExtensionForm { clearInput(); } + @Override + protected boolean canLeave() { + return false; + } + @Override protected boolean canDelete() { return false; diff --git a/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/RuleContainer.java b/G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/RuleContainer.java similarity index 93% rename from Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/RuleContainer.java rename to G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/RuleContainer.java index c72ee00..4539d53 100644 --- a/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/RuleContainer.java +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/RuleContainer.java @@ -1,6 +1,6 @@ -package extensions.blockreplacepackets; +package gearth.services.internal_extensions.blockreplacepackets; -import extensions.blockreplacepackets.rules.BlockReplaceRule; +import gearth.services.internal_extensions.blockreplacepackets.rules.BlockReplaceRule; import gearth.ui.buttons.DeleteButton; import javafx.geometry.Insets; import javafx.geometry.Pos; @@ -13,7 +13,7 @@ import javafx.scene.layout.VBox; import javafx.scene.text.Font; /** - * Created by Jeunez on 6/11/2018. + * Created by Jonas on 6/11/2018. */ public class RuleContainer extends GridPane { diff --git a/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/BlockPacketRule.java b/G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/rules/BlockPacketRule.java similarity index 94% rename from Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/BlockPacketRule.java rename to G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/rules/BlockPacketRule.java index d80c675..a8e22df 100644 --- a/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/BlockPacketRule.java +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/rules/BlockPacketRule.java @@ -1,4 +1,4 @@ -package extensions.blockreplacepackets.rules; +package gearth.services.internal_extensions.blockreplacepackets.rules; import gearth.protocol.HMessage; diff --git a/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/BlockReplaceRule.java b/G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/rules/BlockReplaceRule.java similarity index 93% rename from Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/BlockReplaceRule.java rename to G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/rules/BlockReplaceRule.java index d1cc521..621cf0a 100644 --- a/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/BlockReplaceRule.java +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/rules/BlockReplaceRule.java @@ -1,4 +1,4 @@ -package extensions.blockreplacepackets.rules; +package gearth.services.internal_extensions.blockreplacepackets.rules; import gearth.protocol.HMessage; import javafx.beans.InvalidationListener; diff --git a/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/ReplaceIntegerRule.java b/G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/rules/ReplaceIntegerRule.java similarity index 94% rename from Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/ReplaceIntegerRule.java rename to G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/rules/ReplaceIntegerRule.java index f543461..d5141ee 100644 --- a/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/ReplaceIntegerRule.java +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/rules/ReplaceIntegerRule.java @@ -1,4 +1,4 @@ -package extensions.blockreplacepackets.rules; +package gearth.services.internal_extensions.blockreplacepackets.rules; import gearth.protocol.HMessage; diff --git a/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/ReplacePacketRule.java b/G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/rules/ReplacePacketRule.java similarity index 92% rename from Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/ReplacePacketRule.java rename to G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/rules/ReplacePacketRule.java index c6bfa0d..6134234 100644 --- a/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/ReplacePacketRule.java +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/rules/ReplacePacketRule.java @@ -1,10 +1,10 @@ -package extensions.blockreplacepackets.rules; +package gearth.services.internal_extensions.blockreplacepackets.rules; import gearth.protocol.HMessage; import gearth.protocol.HPacket; /** - * Created by Jeunez on 6/11/2018. + * Created by Jonas on 6/11/2018. */ public class ReplacePacketRule extends BlockReplaceRule { diff --git a/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/ReplaceStringRule.java b/G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/rules/ReplaceStringRule.java similarity index 94% rename from Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/ReplaceStringRule.java rename to G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/rules/ReplaceStringRule.java index fd20820..5449370 100644 --- a/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/ReplaceStringRule.java +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/rules/ReplaceStringRule.java @@ -1,4 +1,4 @@ -package extensions.blockreplacepackets.rules; +package gearth.services.internal_extensions.blockreplacepackets.rules; import gearth.protocol.HMessage; diff --git a/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/ReplaceSubstringRule.java b/G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/rules/ReplaceSubstringRule.java similarity index 94% rename from Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/ReplaceSubstringRule.java rename to G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/rules/ReplaceSubstringRule.java index 9e56286..dbb58be 100644 --- a/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/ReplaceSubstringRule.java +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/rules/ReplaceSubstringRule.java @@ -1,4 +1,4 @@ -package extensions.blockreplacepackets.rules; +package gearth.services.internal_extensions.blockreplacepackets.rules; import gearth.protocol.HMessage; diff --git a/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/RuleFactory.java b/G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/rules/RuleFactory.java similarity index 95% rename from Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/RuleFactory.java rename to G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/rules/RuleFactory.java index ef99e03..dc59f63 100644 --- a/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/rules/RuleFactory.java +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/rules/RuleFactory.java @@ -1,4 +1,4 @@ -package extensions.blockreplacepackets.rules; +package gearth.services.internal_extensions.blockreplacepackets.rules; import gearth.protocol.HPacket; diff --git a/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/blockreplace.fxml b/G-Earth/src/main/resources/gearth/services/internal_extensions/blockreplacepackets/blockreplace.fxml similarity index 94% rename from Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/blockreplace.fxml rename to G-Earth/src/main/resources/gearth/services/internal_extensions/blockreplacepackets/blockreplace.fxml index 5df9e8a..0e135cf 100644 --- a/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/blockreplace.fxml +++ b/G-Earth/src/main/resources/gearth/services/internal_extensions/blockreplacepackets/blockreplace.fxml @@ -1,17 +1,9 @@ - - - - - - - - - - - - + + + + diff --git a/pom.xml b/pom.xml index ca40e40..d3aa29e 100644 --- a/pom.xml +++ b/pom.xml @@ -18,7 +18,6 @@ Extensions/AdminOnConnect - Extensions/BlockReplacePackets From eb7c9f1829b6eeb154849aae228271f9f52034e3 Mon Sep 17 00:00:00 2001 From: sirjonasxx <36828922+sirjonasxx@users.noreply.github.com> Date: Sun, 25 Apr 2021 18:05:15 +0200 Subject: [PATCH 13/33] packetlogger changes --- .../InternalExtensionFormBuilder.java | 14 ++- .../main/java/gearth/protocol/HPacket.java | 2 +- .../extensionhandler/ExtensionHandler.java | 14 ++- .../ExtensionProducerFactory.java | 10 +- .../simple/SimpleExtensionProducer.java | 3 +- .../uilogger/Element.java | 2 +- .../uilogger/UiLogger.java | 110 ++++++++++++++++++ .../uilogger/UiLoggerController.java | 32 ++++- .../main/java/gearth/ui/GEarthController.java | 6 +- .../ui/connection/ConnectionController.java | 6 + .../ui/extensions/ExtensionsController.java | 4 + .../gearth/ui/logger/LoggerController.java | 8 +- .../loggerdisplays/PacketLoggerFactory.java | 27 ++++- .../loggerdisplays/uilogger/UiLogger.java | 103 ---------------- .../uilogger/UiLogger.fxml | 42 +++++-- .../internal_extensions}/uilogger/logger.css | 0 16 files changed, 243 insertions(+), 140 deletions(-) rename G-Earth/src/main/java/gearth/{ui/logger/loggerdisplays => services/internal_extensions}/uilogger/Element.java (80%) create mode 100644 G-Earth/src/main/java/gearth/services/internal_extensions/uilogger/UiLogger.java rename G-Earth/src/main/java/gearth/{ui/logger/loggerdisplays => services/internal_extensions}/uilogger/UiLoggerController.java (90%) delete mode 100644 G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/uilogger/UiLogger.java rename G-Earth/src/main/resources/gearth/{ui/logger => services/internal_extensions}/uilogger/UiLogger.fxml (61%) rename G-Earth/src/main/resources/gearth/{ui/logger => services/internal_extensions}/uilogger/logger.css (100%) diff --git a/G-Earth/src/main/java/gearth/extensions/InternalExtensionFormBuilder.java b/G-Earth/src/main/java/gearth/extensions/InternalExtensionFormBuilder.java index c1cfc03..ddf5358 100644 --- a/G-Earth/src/main/java/gearth/extensions/InternalExtensionFormBuilder.java +++ b/G-Earth/src/main/java/gearth/extensions/InternalExtensionFormBuilder.java @@ -5,15 +5,15 @@ import gearth.services.extensionhandler.extensions.extensionproducers.ExtensionP import javafx.application.Platform; import javafx.stage.Stage; -public class InternalExtensionFormBuilder { +public class InternalExtensionFormBuilder { - public static void launch(Class extension, ExtensionProducerObserver observer) { + public T launch(Class extensionClass, ExtensionProducerObserver observer) { try { - ExtensionInfo extInfo = extension.getAnnotation(ExtensionInfo.class); - ExtensionForm creator = extension.newInstance(); + ExtensionInfo extInfo = extensionClass.getAnnotation(ExtensionInfo.class); + T creator = extensionClass.newInstance(); Stage stage = new Stage(); - ExtensionForm extensionForm = creator.launchForm(stage); + T extensionForm = (T)(creator.launchForm(stage)); InternalExtension internalExtension = new InternalExtension() { @Override @@ -67,8 +67,12 @@ public class InternalExtensionFormBuilder { extensionForm.onHide(); }); }); + + return extensionForm; } catch (Exception e) { e.printStackTrace(); } + + return null; } } diff --git a/G-Earth/src/main/java/gearth/protocol/HPacket.java b/G-Earth/src/main/java/gearth/protocol/HPacket.java index 469232f..6de7ed7 100644 --- a/G-Earth/src/main/java/gearth/protocol/HPacket.java +++ b/G-Earth/src/main/java/gearth/protocol/HPacket.java @@ -650,7 +650,7 @@ public class HPacket implements StringifyAble { if (isCorrupted()) return ""; PacketInfo packetInfo = getPacketInfo(direction, packetInfoManager); - if (packetInfo.getStructure() != null) { + if (packetInfo != null && packetInfo.getStructure() != null) { return PacketStringUtils.toExpressionFromGivenStructure(this, packetInfo.getStructure(), removeShuffle ? packetInfo : null); } return PacketStringUtils.predictedExpression(this, removeShuffle ? packetInfo : null); diff --git a/G-Earth/src/main/java/gearth/services/extensionhandler/ExtensionHandler.java b/G-Earth/src/main/java/gearth/services/extensionhandler/ExtensionHandler.java index 596e858..f110770 100644 --- a/G-Earth/src/main/java/gearth/services/extensionhandler/ExtensionHandler.java +++ b/G-Earth/src/main/java/gearth/services/extensionhandler/ExtensionHandler.java @@ -44,7 +44,6 @@ public class ExtensionHandler { } private void initialize() { - hConnection.getStateObservable().addListener((oldState, newState) -> { if (newState == HState.CONNECTED) { synchronized (gEarthExtensions) { @@ -70,7 +69,7 @@ public class ExtensionHandler { }); extensionProducers = ExtensionProducerFactory.getAll(); - extensionProducers.forEach(this::initializeExtensionProducer); + extensionProducers.forEach(extensionProducer -> extensionProducer.startProducing(createExtensionProducerObserver())); } @@ -173,8 +172,8 @@ public class ExtensionHandler { - private void initializeExtensionProducer(ExtensionProducer producer) { - producer.startProducing(new ExtensionProducerObserver() { + private ExtensionProducerObserver createExtensionProducerObserver() { + return new ExtensionProducerObserver() { @Override public void onExtensionProduced(GEarthExtension extension) { synchronized (gEarthExtensions) { @@ -254,7 +253,7 @@ public class ExtensionHandler { observable.fireEvent(l -> l.onExtensionConnect(extension)); } - }); + }; } public List getExtensionProducers() { @@ -264,5 +263,10 @@ public class ExtensionHandler { return observable; } + public void addExtensionProducer(ExtensionProducer producer) { + producer.startProducing(createExtensionProducerObserver()); + extensionProducers.add(producer); + } + } diff --git a/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/extensionproducers/ExtensionProducerFactory.java b/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/extensionproducers/ExtensionProducerFactory.java index d02b910..40c0b83 100644 --- a/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/extensionproducers/ExtensionProducerFactory.java +++ b/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/extensionproducers/ExtensionProducerFactory.java @@ -3,6 +3,7 @@ package gearth.services.extensionhandler.extensions.extensionproducers; import gearth.services.extensionhandler.extensions.implementations.network.NetworkExtensionsProducer; import gearth.services.extensionhandler.extensions.implementations.simple.SimpleExtensionProducer; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -10,10 +11,11 @@ public class ExtensionProducerFactory { // returns one of every ExtensionProducer class we have created, to support all types of extensions public static List getAll() { - return Arrays.asList( - new NetworkExtensionsProducer(), - new SimpleExtensionProducer() - ); + List all = new ArrayList<>(); + all.add(new NetworkExtensionsProducer()); + all.add(new SimpleExtensionProducer()); + + return all; } diff --git a/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/implementations/simple/SimpleExtensionProducer.java b/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/implementations/simple/SimpleExtensionProducer.java index b5c55aa..ddd5539 100644 --- a/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/implementations/simple/SimpleExtensionProducer.java +++ b/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/implementations/simple/SimpleExtensionProducer.java @@ -13,6 +13,7 @@ public class SimpleExtensionProducer implements ExtensionProducer { // uncomment the next line if you want to see an embedded example extension in G-Earth // observer.onExtensionProduced(new ExampleExtension()); - InternalExtensionFormBuilder.launch(BlockAndReplacePackets.class, observer); + new InternalExtensionFormBuilder() + .launch(BlockAndReplacePackets.class, observer); } } diff --git a/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/uilogger/Element.java b/G-Earth/src/main/java/gearth/services/internal_extensions/uilogger/Element.java similarity index 80% rename from G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/uilogger/Element.java rename to G-Earth/src/main/java/gearth/services/internal_extensions/uilogger/Element.java index 7c6d0d1..7a8169a 100644 --- a/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/uilogger/Element.java +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/uilogger/Element.java @@ -1,4 +1,4 @@ -package gearth.ui.logger.loggerdisplays.uilogger; +package gearth.services.internal_extensions.uilogger; /** * Created by Jonas on 17/11/2018. diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/uilogger/UiLogger.java b/G-Earth/src/main/java/gearth/services/internal_extensions/uilogger/UiLogger.java new file mode 100644 index 0000000..3c8049d --- /dev/null +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/uilogger/UiLogger.java @@ -0,0 +1,110 @@ +package gearth.services.internal_extensions.uilogger; + +import gearth.extensions.ExtensionForm; +import gearth.extensions.ExtensionInfo; +import gearth.misc.packet_info.PacketInfoManager; +import gearth.protocol.HConnection; +import gearth.protocol.HMessage; +import gearth.protocol.HPacket; +import gearth.ui.logger.loggerdisplays.PacketLogger; +import javafx.fxml.FXMLLoader; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.scene.image.Image; +import javafx.stage.Modality; +import javafx.stage.Stage; + +import java.util.ArrayList; + +@ExtensionInfo( + Title = "Packet Logger", + Description = "", + Version = "0.1", + Author = "sirjonasxx & Scott" +) +public class UiLogger extends ExtensionForm implements PacketLogger { + private UiLoggerController controller = null; + + @Override + public void start(HConnection hConnection) { +// // don't let the user close this window on their own +// stage.setOnCloseRequest(Event::consume); + +// primaryStage.show(); + } + + @Override + public void stop() { +// primaryStage.hide(); +// if (stage != null) +// stage.close(); + } + + @Override + public void appendSplitLine() { + // don't use this, we can't discern incoming/outgoing + //Platform.runLater(() -> controller.appendSplitLine()); + } + + @Override + protected void initExtension() { + onConnect((host, port, hotelversion, clientIdentifier, clientType, packetInfoManager) -> { + controller.setPacketInfoManager(packetInfoManager); + controller.onConnect(); + }); + } + + @Override + protected void onEndConnection() { + controller.onDisconnect(); + controller.setPacketInfoManager(new PacketInfoManager(new ArrayList<>())); + } + + @Override + public ExtensionForm launchForm(Stage stage) throws Exception { + FXMLLoader loader = new FXMLLoader(UiLogger.class.getResource("UiLogger.fxml")); + + Parent root = loader.load(); + stage.setTitle("G-Earth | Packet Logger"); + stage.initModality(Modality.NONE); + stage.getIcons().add(new Image(getClass().getResourceAsStream("/gearth/G-EarthLogoSmaller.png"))); + + Scene scene = new Scene(root); + scene.getStylesheets().add("/gearth/ui/bootstrap3.css"); + scene.getStylesheets().add("/gearth/services/internal_extensions/uilogger/logger.css"); + controller = loader.getController(); + controller.setStage(stage); + + stage.setScene(scene); + return this; + } + + private class Elem { + HPacket packet; + int types; + Elem(HPacket packet, int types) { + this.packet = packet; + this.types = types; + } + } + + @Override + public void appendMessage(HPacket packet, int types) { + controller.appendMessage(packet, types); + } + + @Override + public void appendStructure(HPacket packet, HMessage.Direction direction) { + + } + + @Override + protected boolean canLeave() { + return false; + } + + @Override + protected boolean canDelete() { + return false; + } +} diff --git a/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/uilogger/UiLoggerController.java b/G-Earth/src/main/java/gearth/services/internal_extensions/uilogger/UiLoggerController.java similarity index 90% rename from G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/uilogger/UiLoggerController.java rename to G-Earth/src/main/java/gearth/services/internal_extensions/uilogger/UiLoggerController.java index 22f4532..e55f4c8 100644 --- a/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/uilogger/UiLoggerController.java +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/uilogger/UiLoggerController.java @@ -1,4 +1,4 @@ -package gearth.ui.logger.loggerdisplays.uilogger; +package gearth.services.internal_extensions.uilogger; import gearth.misc.packet_info.PacketInfo; import gearth.misc.packet_info.PacketInfoManager; @@ -37,10 +37,15 @@ public class UiLoggerController implements Initializable { public Label lblPacketInfo; public CheckMenuItem chkUseNewStructures; + public CheckMenuItem chkOpenOnConnect; + public CheckMenuItem chkResetOnConnect; + public CheckMenuItem chkHideOnDisconnect; + public CheckMenuItem chkResetOnDisconnect; + private StyleClassedTextArea area; private Stage stage; - private PacketInfoManager packetInfoManager; + private PacketInfoManager packetInfoManager = null; private boolean viewIncoming = true; private boolean viewOutgoing = true; @@ -97,7 +102,6 @@ public class UiLoggerController implements Initializable { boolean packetInfoAvailable = packetInfoManager.getPacketInfoList().size() > 0; - lblPacketInfo.setText("Packet info: " + (packetInfoAvailable ? "True" : "False")); if ((viewMessageName || viewMessageHash) && packetInfoAvailable) { List messages = packetInfoManager.getAllPacketInfoFromHeaderId( @@ -208,6 +212,10 @@ public class UiLoggerController implements Initializable { public void setPacketInfoManager(PacketInfoManager packetInfoManager) { this.packetInfoManager = packetInfoManager; + Platform.runLater(() -> { + boolean packetInfoAvailable = packetInfoManager.getPacketInfoList().size() > 0; + lblPacketInfo.setText("Packet info: " + (packetInfoAvailable ? "True" : "False")); + }); } public void toggleViewIncoming() { @@ -252,4 +260,22 @@ public class UiLoggerController implements Initializable { public void clearText(ActionEvent actionEvent) { area.clear(); } + + public void onDisconnect() { + if (chkHideOnDisconnect.isSelected()) { + stage.hide(); + } + if (chkResetOnDisconnect.isSelected()) { + clearText(null); + } + } + + public void onConnect() { + if (chkResetOnConnect.isSelected()) { + clearText(null); + } + if (chkOpenOnConnect.isSelected()) { + stage.show(); + } + } } diff --git a/G-Earth/src/main/java/gearth/ui/GEarthController.java b/G-Earth/src/main/java/gearth/ui/GEarthController.java index 43a7f45..c405c42 100644 --- a/G-Earth/src/main/java/gearth/ui/GEarthController.java +++ b/G-Earth/src/main/java/gearth/ui/GEarthController.java @@ -87,7 +87,11 @@ public class GEarthController { private void trySetController() { if (++initcount == 2) { GEarthController self = this; - tabs.forEach(subForm -> subForm.setParentController(self)); + + extensionsController.setParentController(self); + tabs.forEach(subForm -> { + if (subForm != extensionsController) subForm.setParentController(self); + }); } } diff --git a/G-Earth/src/main/java/gearth/ui/connection/ConnectionController.java b/G-Earth/src/main/java/gearth/ui/connection/ConnectionController.java index e7b1f22..72d1a34 100644 --- a/G-Earth/src/main/java/gearth/ui/connection/ConnectionController.java +++ b/G-Earth/src/main/java/gearth/ui/connection/ConnectionController.java @@ -116,7 +116,11 @@ public class ConnectionController extends SubForm { } } + + private void updateInputUI() { + if (parentController == null) return; + grd_clientSelection.setDisable(getHConnection().getState() != HState.NOT_CONNECTED); txtfield_hotelversion.setText(getHConnection().getHotelVersion()); @@ -184,6 +188,8 @@ public class ConnectionController extends SubForm { } })); + + Platform.runLater(this::updateInputUI); } public void btnConnect_clicked(ActionEvent actionEvent) { diff --git a/G-Earth/src/main/java/gearth/ui/extensions/ExtensionsController.java b/G-Earth/src/main/java/gearth/ui/extensions/ExtensionsController.java index 813599f..214acea 100644 --- a/G-Earth/src/main/java/gearth/ui/extensions/ExtensionsController.java +++ b/G-Earth/src/main/java/gearth/ui/extensions/ExtensionsController.java @@ -133,4 +133,8 @@ public class ExtensionsController extends SubForm { Platform.runLater(this::updateGPythonStatus); }); } + + public ExtensionHandler getExtensionHandler() { + return extensionHandler; + } } diff --git a/G-Earth/src/main/java/gearth/ui/logger/LoggerController.java b/G-Earth/src/main/java/gearth/ui/logger/LoggerController.java index 5caa3df..905cf1d 100644 --- a/G-Earth/src/main/java/gearth/ui/logger/LoggerController.java +++ b/G-Earth/src/main/java/gearth/ui/logger/LoggerController.java @@ -2,6 +2,7 @@ package gearth.ui.logger; import gearth.extensions.parsers.HDirection; import gearth.protocol.connection.HState; +import gearth.services.extensionhandler.extensions.extensionproducers.ExtensionProducer; import javafx.application.Platform; import javafx.event.ActionEvent; import javafx.scene.control.Button; @@ -18,6 +19,7 @@ import gearth.ui.logger.loggerdisplays.PacketLogger; import gearth.ui.logger.loggerdisplays.PacketLoggerFactory; import java.util.Calendar; +import java.util.function.Predicate; public class LoggerController extends SubForm { @@ -34,9 +36,13 @@ public class LoggerController extends SubForm { private int packetLimit = 8000; - private PacketLogger packetLogger = PacketLoggerFactory.get(); + private PacketLoggerFactory packetLoggerFactory; + private PacketLogger packetLogger; public void onParentSet(){ + packetLoggerFactory = new PacketLoggerFactory(parentController.extensionsController.getExtensionHandler()); + packetLogger = packetLoggerFactory.get(); + getHConnection().getStateObservable().addListener((oldState, newState) -> Platform.runLater(() -> { if (newState == HState.PREPARING) { miniLogText(Color.ORANGE, "Connecting to "+getHConnection().getDomain() + ":" + getHConnection().getServerPort()); diff --git a/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/PacketLoggerFactory.java b/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/PacketLoggerFactory.java index 86c5994..cc1b41b 100644 --- a/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/PacketLoggerFactory.java +++ b/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/PacketLoggerFactory.java @@ -1,21 +1,33 @@ package gearth.ui.logger.loggerdisplays; import gearth.Main; +import gearth.extensions.InternalExtensionFormBuilder; import gearth.misc.OSValidator; -import gearth.ui.logger.loggerdisplays.uilogger.UiLogger; +import gearth.services.extensionhandler.ExtensionHandler; +import gearth.services.extensionhandler.extensions.extensionproducers.ExtensionProducer; +import gearth.services.extensionhandler.extensions.extensionproducers.ExtensionProducerObserver; +import gearth.services.internal_extensions.uilogger.UiLogger; /** * Created by Jonas on 04/04/18. */ -public class PacketLoggerFactory { +public class PacketLoggerFactory implements ExtensionProducer { + + private UiLogger uiLogger; public static boolean usesUIlogger() { return (!Main.hasFlag("-t")); } - public static PacketLogger get() { + public PacketLoggerFactory(ExtensionHandler handler) { + handler.addExtensionProducer(this); + } + + + public PacketLogger get() { if (usesUIlogger()) { - return new UiLogger(); +// return new UiLogger(); //now an extension + return uiLogger; } if (OSValidator.isUnix()) { @@ -24,4 +36,11 @@ public class PacketLoggerFactory { return new SimpleTerminalLogger(); } + @Override + public void startProducing(ExtensionProducerObserver observer) { + if (usesUIlogger()) { + uiLogger = new InternalExtensionFormBuilder() + .launch(UiLogger.class, observer); + } + } } diff --git a/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/uilogger/UiLogger.java b/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/uilogger/UiLogger.java deleted file mode 100644 index 3bc4678..0000000 --- a/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/uilogger/UiLogger.java +++ /dev/null @@ -1,103 +0,0 @@ -package gearth.ui.logger.loggerdisplays.uilogger; - -import gearth.extensions.parsers.HDirection; -import gearth.protocol.HConnection; -import gearth.protocol.HMessage; -import gearth.protocol.HPacket; -import gearth.ui.logger.loggerdisplays.PacketLogger; -import javafx.event.ActionEvent; -import javafx.event.Event; -import javafx.fxml.FXMLLoader; -import javafx.scene.Parent; -import javafx.scene.Scene; -import javafx.scene.image.Image; -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; - private HConnection hConnection = null; - - @Override - public void start(HConnection hConnection) { - 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); - stage.getIcons().add(new Image(getClass().getResourceAsStream("/gearth/G-EarthLogoSmaller.png"))); - - Scene scene = new Scene(root); - scene.getStylesheets().add("/gearth/ui/bootstrap3.css"); - scene.getStylesheets().add("/gearth/ui/logger/uilogger/logger.css"); - UiLoggerController controller = loader.getController(); - controller.setStage(stage); - controller.setPacketInfoManager(hConnection.getPacketInfoManager()); - - - stage.setScene(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, HMessage.Direction direction) { - - } -} diff --git a/G-Earth/src/main/resources/gearth/ui/logger/uilogger/UiLogger.fxml b/G-Earth/src/main/resources/gearth/services/internal_extensions/uilogger/UiLogger.fxml similarity index 61% rename from G-Earth/src/main/resources/gearth/ui/logger/uilogger/UiLogger.fxml rename to G-Earth/src/main/resources/gearth/services/internal_extensions/uilogger/UiLogger.fxml index 2d073d3..19fcbc7 100644 --- a/G-Earth/src/main/resources/gearth/ui/logger/uilogger/UiLogger.fxml +++ b/G-Earth/src/main/resources/gearth/services/internal_extensions/uilogger/UiLogger.fxml @@ -5,18 +5,27 @@ - + + + + + + + + + + + + + + + + + + - - - - - - - - @@ -29,13 +38,24 @@ - - + + + + + + + + + + + + + diff --git a/G-Earth/src/main/resources/gearth/ui/logger/uilogger/logger.css b/G-Earth/src/main/resources/gearth/services/internal_extensions/uilogger/logger.css similarity index 100% rename from G-Earth/src/main/resources/gearth/ui/logger/uilogger/logger.css rename to G-Earth/src/main/resources/gearth/services/internal_extensions/uilogger/logger.css From d612eb8c54c6599052764b5f8a8156c8c8a98cd0 Mon Sep 17 00:00:00 2001 From: sirjonasxx <36828922+sirjonasxx@users.noreply.github.com> Date: Sun, 25 Apr 2021 18:13:33 +0200 Subject: [PATCH 14/33] bugfixes --- .../uilogger/UiLoggerController.java | 28 +++++++++++-------- .../uilogger/UiLogger.fxml | 5 +--- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/uilogger/UiLoggerController.java b/G-Earth/src/main/java/gearth/services/internal_extensions/uilogger/UiLoggerController.java index e55f4c8..2291dca 100644 --- a/G-Earth/src/main/java/gearth/services/internal_extensions/uilogger/UiLoggerController.java +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/uilogger/UiLoggerController.java @@ -262,20 +262,24 @@ public class UiLoggerController implements Initializable { } public void onDisconnect() { - if (chkHideOnDisconnect.isSelected()) { - stage.hide(); - } - if (chkResetOnDisconnect.isSelected()) { - clearText(null); - } + Platform.runLater(() -> { + if (chkHideOnDisconnect.isSelected()) { + stage.hide(); + } + if (chkResetOnDisconnect.isSelected()) { + clearText(null); + } + }); } public void onConnect() { - if (chkResetOnConnect.isSelected()) { - clearText(null); - } - if (chkOpenOnConnect.isSelected()) { - stage.show(); - } + Platform.runLater(() -> { + if (chkResetOnConnect.isSelected()) { + clearText(null); + } + if (chkOpenOnConnect.isSelected()) { + stage.show(); + } + }); } } diff --git a/G-Earth/src/main/resources/gearth/services/internal_extensions/uilogger/UiLogger.fxml b/G-Earth/src/main/resources/gearth/services/internal_extensions/uilogger/UiLogger.fxml index 19fcbc7..0b56f13 100644 --- a/G-Earth/src/main/resources/gearth/services/internal_extensions/uilogger/UiLogger.fxml +++ b/G-Earth/src/main/resources/gearth/services/internal_extensions/uilogger/UiLogger.fxml @@ -38,10 +38,7 @@ - - - - + From 60992d9e38e5dfd367b2d1d5432ff57c91a3bfb0 Mon Sep 17 00:00:00 2001 From: sirjonasxx <36828922+sirjonasxx@users.noreply.github.com> Date: Sun, 25 Apr 2021 19:31:37 +0200 Subject: [PATCH 15/33] highlight internal exts --- .../java/gearth/extensions/InternalExtensionBuilder.java | 6 ++++++ .../services/extensionhandler/extensions/ExtensionType.java | 6 ++++++ .../extensionhandler/extensions/GEarthExtension.java | 3 +++ .../implementations/network/NetworkExtension.java | 6 ++++++ .../extensions/implementations/simple/ExampleExtension.java | 6 ++++++ .../java/gearth/ui/extensions/ExtensionItemContainer.java | 6 ++++++ 6 files changed, 33 insertions(+) create mode 100644 G-Earth/src/main/java/gearth/services/extensionhandler/extensions/ExtensionType.java diff --git a/G-Earth/src/main/java/gearth/extensions/InternalExtensionBuilder.java b/G-Earth/src/main/java/gearth/extensions/InternalExtensionBuilder.java index e1631b7..b7fe5d4 100644 --- a/G-Earth/src/main/java/gearth/extensions/InternalExtensionBuilder.java +++ b/G-Earth/src/main/java/gearth/extensions/InternalExtensionBuilder.java @@ -5,6 +5,7 @@ import gearth.misc.packet_info.PacketInfoManager; import gearth.protocol.HMessage; import gearth.protocol.HPacket; import gearth.protocol.connection.HClient; +import gearth.services.extensionhandler.extensions.ExtensionType; import gearth.services.extensionhandler.extensions.GEarthExtension; // wraps internal GEarthExtension class to IExtension interface @@ -136,4 +137,9 @@ public class InternalExtensionBuilder extends GEarthExtension { // no need in java ext } + @Override + public ExtensionType extensionType() { + return ExtensionType.INTERNAL; + } + } diff --git a/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/ExtensionType.java b/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/ExtensionType.java new file mode 100644 index 0000000..00d0358 --- /dev/null +++ b/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/ExtensionType.java @@ -0,0 +1,6 @@ +package gearth.services.extensionhandler.extensions; + +public enum ExtensionType { + INTERNAL, + EXTERNAL +} diff --git a/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/GEarthExtension.java b/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/GEarthExtension.java index adaf8c9..a4dc25a 100644 --- a/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/GEarthExtension.java +++ b/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/GEarthExtension.java @@ -123,4 +123,7 @@ public abstract class GEarthExtension { } // ---------------------------------------------------------------------------------------- + + + public abstract ExtensionType extensionType(); } diff --git a/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/implementations/network/NetworkExtension.java b/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/implementations/network/NetworkExtension.java index 723f822..bf0f3fd 100644 --- a/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/implementations/network/NetworkExtension.java +++ b/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/implementations/network/NetworkExtension.java @@ -3,6 +3,7 @@ package gearth.services.extensionhandler.extensions.implementations.network; import gearth.misc.packet_info.PacketInfoManager; import gearth.protocol.HMessage; import gearth.protocol.connection.HClient; +import gearth.services.extensionhandler.extensions.ExtensionType; import gearth.services.extensionhandler.extensions.GEarthExtension; import gearth.protocol.HPacket; @@ -239,4 +240,9 @@ public class NetworkExtension extends GEarthExtension { packet.appendLongString(packetFromString.stringify()); sendMessage(packet); } + + @Override + public ExtensionType extensionType() { + return ExtensionType.EXTERNAL; + } } \ No newline at end of file diff --git a/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/implementations/simple/ExampleExtension.java b/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/implementations/simple/ExampleExtension.java index c580eeb..742cc4f 100644 --- a/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/implementations/simple/ExampleExtension.java +++ b/G-Earth/src/main/java/gearth/services/extensionhandler/extensions/implementations/simple/ExampleExtension.java @@ -4,6 +4,7 @@ import gearth.misc.packet_info.PacketInfoManager; import gearth.protocol.HMessage; import gearth.protocol.HPacket; import gearth.protocol.connection.HClient; +import gearth.services.extensionhandler.extensions.ExtensionType; import gearth.services.extensionhandler.extensions.GEarthExtension; public class ExampleExtension extends GEarthExtension { @@ -122,4 +123,9 @@ public class ExampleExtension extends GEarthExtension { public void stringToPacketResponse(HPacket packet) { } + + @Override + public ExtensionType extensionType() { + return ExtensionType.INTERNAL; + } } diff --git a/G-Earth/src/main/java/gearth/ui/extensions/ExtensionItemContainer.java b/G-Earth/src/main/java/gearth/ui/extensions/ExtensionItemContainer.java index 43b1158..12729b5 100644 --- a/G-Earth/src/main/java/gearth/ui/extensions/ExtensionItemContainer.java +++ b/G-Earth/src/main/java/gearth/ui/extensions/ExtensionItemContainer.java @@ -1,5 +1,6 @@ package gearth.ui.extensions; +import gearth.services.extensionhandler.extensions.ExtensionType; import gearth.services.extensionhandler.extensions.GEarthExtension; import javafx.application.Platform; import javafx.event.EventHandler; @@ -142,6 +143,11 @@ public class ExtensionItemContainer extends GridPane { parent.getChildren().add(this); + if (item.extensionType() == ExtensionType.INTERNAL) { + setBackground(new Background(new BackgroundFill(Paint.valueOf("F0FFFF"), CornerRadii.EMPTY, Insets.EMPTY))); + } + + initExtension(); } From 71496b8a3047534c366a823fc9b314f70f8303b9 Mon Sep 17 00:00:00 2001 From: sirjonasxx <36828922+sirjonasxx@users.noreply.github.com> Date: Sun, 25 Apr 2021 20:05:25 +0200 Subject: [PATCH 16/33] packet names in replaceblockpackets --- .../misc/packet_info/PacketInfoManager.java | 3 ++ .../BlockAndReplacePackets.java | 37 +++++++++++++++++-- .../rules/RuleFactory.java | 10 ++++- 3 files changed, 45 insertions(+), 5 deletions(-) diff --git a/G-Earth/src/main/java/gearth/misc/packet_info/PacketInfoManager.java b/G-Earth/src/main/java/gearth/misc/packet_info/PacketInfoManager.java index 115c8eb..da7b629 100644 --- a/G-Earth/src/main/java/gearth/misc/packet_info/PacketInfoManager.java +++ b/G-Earth/src/main/java/gearth/misc/packet_info/PacketInfoManager.java @@ -183,4 +183,7 @@ public class PacketInfoManager { hPacket.appendBoolean(packetInfo.getDestination() == HMessage.Direction.TOSERVER); } } + + + public static PacketInfoManager EMPTY = new PacketInfoManager(new ArrayList<>()); } diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/BlockAndReplacePackets.java b/G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/BlockAndReplacePackets.java index 30e9e13..8a197f2 100644 --- a/G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/BlockAndReplacePackets.java +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/BlockAndReplacePackets.java @@ -3,8 +3,12 @@ package gearth.services.internal_extensions.blockreplacepackets; import gearth.Main; import gearth.extensions.ExtensionForm; import gearth.extensions.ExtensionInfo; +import gearth.extensions.OnConnectionListener; +import gearth.misc.packet_info.PacketInfo; +import gearth.misc.packet_info.PacketInfoManager; import gearth.protocol.HMessage; import gearth.protocol.HPacket; +import gearth.protocol.connection.HClient; import gearth.services.internal_extensions.blockreplacepackets.rules.BlockReplaceRule; import gearth.services.internal_extensions.blockreplacepackets.rules.RuleFactory; import gearth.ui.GEarthController; @@ -49,6 +53,8 @@ public class BlockAndReplacePackets extends ExtensionForm { List rules = new ArrayList<>(); + private PacketInfoManager packetInfoManager = PacketInfoManager.EMPTY; + // public static void main(String[] args) { // runExtensionForm(args, BlockAndReplacePackets.class); // } @@ -71,6 +77,26 @@ public class BlockAndReplacePackets extends ExtensionForm { } + private String getVal() { + String val = txt_value.getText(); + String type = cmb_type.getSelectionModel().getSelectedItem(); + String side = cmb_side.getSelectionModel().getSelectedItem(); + + if (type.endsWith("packet")) { + HMessage.Direction dir = side.equals("Outgoing") ? HMessage.Direction.TOSERVER : HMessage.Direction.TOCLIENT; + PacketInfo fromName = packetInfoManager.getPacketInfoFromName(dir, val); + PacketInfo fromHash = packetInfoManager.getPacketInfoFromHash(dir, val); + if (fromName != null) { + val = fromName.getHeaderId() +""; + } + else if (fromHash != null) { + val = fromHash.getHeaderId() +""; + } + } + + return val; + } + private void refreshOptions() { txt_replacement.setDisable(cmb_type.getSelectionModel().getSelectedItem().startsWith("Block")); if (cmb_side.getItems().size() == 2 && !cmb_type.getSelectionModel().getSelectedItem().endsWith("packet")) { @@ -84,7 +110,7 @@ public class BlockAndReplacePackets extends ExtensionForm { } boolean isValid = false; - String val = txt_value.getText(); + String val = getVal(); String repl = txt_replacement.getText(); String type = cmb_type.getSelectionModel().getSelectedItem(); String side = cmb_side.getSelectionModel().getSelectedItem(); @@ -155,7 +181,7 @@ public class BlockAndReplacePackets extends ExtensionForm { if (val.equals("")) { if (spl[1].equals("packet")) { - txt_value.setPromptText("Enter the headerID"); + txt_value.setPromptText("Enter headerID/name"); } else if (spl[1].equals("integer")) { txt_value.setPromptText("Enter an integer"); @@ -186,6 +212,10 @@ public class BlockAndReplacePackets extends ExtensionForm { intercept(HMessage.Direction.TOSERVER, messageListener); intercept(HMessage.Direction.TOCLIENT, messageListener); + + onConnect((host, port, hotelversion, clientIdentifier, clientType, packetInfoManager) -> { + this.packetInfoManager = packetInfoManager; + }); } @Override @@ -208,7 +238,8 @@ public class BlockAndReplacePackets extends ExtensionForm { } public void click_btnAddRule(ActionEvent actionEvent) { - BlockReplaceRule rule = RuleFactory.getRule(cmb_type.getSelectionModel().getSelectedItem(), cmb_side.getSelectionModel().getSelectedItem(), txt_value.getText(), txt_replacement.getText()); + BlockReplaceRule rule = RuleFactory.getRule(cmb_type.getSelectionModel().getSelectedItem(), + cmb_side.getSelectionModel().getSelectedItem(), getVal(), txt_replacement.getText(), packetInfoManager); rules.add(rule); rule.onDelete(observable -> rules.remove(rule)); new RuleContainer(rule, vbox); diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/rules/RuleFactory.java b/G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/rules/RuleFactory.java index dc59f63..07171f3 100644 --- a/G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/rules/RuleFactory.java +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/blockreplacepackets/rules/RuleFactory.java @@ -1,5 +1,7 @@ package gearth.services.internal_extensions.blockreplacepackets.rules; +import gearth.misc.packet_info.PacketInfoManager; +import gearth.protocol.HMessage; import gearth.protocol.HPacket; /** @@ -7,7 +9,7 @@ import gearth.protocol.HPacket; */ public class RuleFactory { - public static BlockReplaceRule getRule(String type, String side, String value, String replacement) { + public static BlockReplaceRule getRule(String type, String side, String value, String replacement, PacketInfoManager packetInfoManager) { 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()); @@ -24,7 +26,11 @@ public class RuleFactory { 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)); + HPacket packet = new HPacket(replacement); + if (!packet.isPacketComplete()) { + packet.completePacket(rSide == BlockReplaceRule.Side.INCOMING ? HMessage.Direction.TOCLIENT : HMessage.Direction.TOSERVER, packetInfoManager); + } + return new ReplacePacketRule(rSide, Integer.parseInt(value), packet); } if (rType == BlockReplaceRule.Type.STRING) { return new ReplaceStringRule(rSide, value, replacement); From da35c4152442fdab3fdf6a2f5bf045a4cf2b2bd8 Mon Sep 17 00:00:00 2001 From: sirjonasxx <36828922+sirjonasxx@users.noreply.github.com> Date: Sun, 25 Apr 2021 23:41:40 +0200 Subject: [PATCH 17/33] anti spam filter packetlogger --- .../uilogger/UiLoggerController.java | 44 ++++++++++++++++++- .../uilogger/UiLogger.fxml | 12 +++++ 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/uilogger/UiLoggerController.java b/G-Earth/src/main/java/gearth/services/internal_extensions/uilogger/UiLoggerController.java index 2291dca..e5c6612 100644 --- a/G-Earth/src/main/java/gearth/services/internal_extensions/uilogger/UiLoggerController.java +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/uilogger/UiLoggerController.java @@ -10,7 +10,8 @@ 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.control.RadioMenuItem; + import javafx.scene.layout.BorderPane; import javafx.scene.layout.FlowPane; import javafx.stage.Stage; import org.fxmisc.flowless.VirtualizedScrollPane; @@ -42,6 +43,18 @@ public class UiLoggerController implements Initializable { public CheckMenuItem chkHideOnDisconnect; public CheckMenuItem chkResetOnDisconnect; + private final static int FILTER_AMOUNT_THRESHOLD_S = 15; + private final static int FILTER_AMOUNT_THRESHOLD_M = 9; + private final static int FILTER_AMOUNT_THRESHOLD_H = 4; + private final static int FILTER_TIME_THRESHOLD = 5000; + + public RadioMenuItem chkAntiSpam_none; + public RadioMenuItem chkAntiSpam_low; + public RadioMenuItem chkAntiSpam_medium; + public RadioMenuItem chkAntiSpam_high; + + private Map> filterTimestamps = new HashMap<>(); + private StyleClassedTextArea area; private Stage stage; @@ -90,11 +103,40 @@ public class UiLoggerController implements Initializable { return text.trim(); } + + private boolean checkFilter(HPacket packet) { + int headerId = packet.headerId(); + + int threshold = chkAntiSpam_none.isSelected() ? 100000000 : ( + chkAntiSpam_low.isSelected() ? FILTER_AMOUNT_THRESHOLD_S : ( + chkAntiSpam_medium.isSelected() ? FILTER_AMOUNT_THRESHOLD_M : FILTER_AMOUNT_THRESHOLD_H + ) + ); + + if (!filterTimestamps.containsKey(headerId)) { + filterTimestamps.put(headerId, new LinkedList<>()); + } + + long queueRemoveThreshold = System.currentTimeMillis() - FILTER_TIME_THRESHOLD; + LinkedList list = filterTimestamps.get(headerId); + while (!list.isEmpty() && list.get(0) < queueRemoveThreshold) list.removeFirst(); + + if (list.size() == threshold) list.removeFirst(); + list.add(System.currentTimeMillis()); + + return list.size() >= threshold; + } + 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 && !isBlocked && !isReplaced) { + boolean filter = checkFilter(packet); + if (filter) return; + } + if (isIncoming && !viewIncoming) return; if (!isIncoming && !viewOutgoing) return; diff --git a/G-Earth/src/main/resources/gearth/services/internal_extensions/uilogger/UiLogger.fxml b/G-Earth/src/main/resources/gearth/services/internal_extensions/uilogger/UiLogger.fxml index 0b56f13..5bcdc88 100644 --- a/G-Earth/src/main/resources/gearth/services/internal_extensions/uilogger/UiLogger.fxml +++ b/G-Earth/src/main/resources/gearth/services/internal_extensions/uilogger/UiLogger.fxml @@ -50,6 +50,18 @@ + + + + + + + + + + + + From bcc428408a19249fad4885ab1fcbcd5b5870e7a3 Mon Sep 17 00:00:00 2001 From: sirjonasxx <36828922+sirjonasxx@users.noreply.github.com> Date: Sun, 25 Apr 2021 23:54:22 +0200 Subject: [PATCH 18/33] extra option --- .../uilogger/UiLoggerController.java | 10 +++++++--- .../internal_extensions/uilogger/UiLogger.fxml | 1 + 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/uilogger/UiLoggerController.java b/G-Earth/src/main/java/gearth/services/internal_extensions/uilogger/UiLoggerController.java index e5c6612..83a2a65 100644 --- a/G-Earth/src/main/java/gearth/services/internal_extensions/uilogger/UiLoggerController.java +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/uilogger/UiLoggerController.java @@ -43,15 +43,17 @@ public class UiLoggerController implements Initializable { public CheckMenuItem chkHideOnDisconnect; public CheckMenuItem chkResetOnDisconnect; - private final static int FILTER_AMOUNT_THRESHOLD_S = 15; + private final static int FILTER_AMOUNT_THRESHOLD_L = 15; private final static int FILTER_AMOUNT_THRESHOLD_M = 9; private final static int FILTER_AMOUNT_THRESHOLD_H = 4; + private final static int FILTER_AMOUNT_THRESHOLD_U = 2; private final static int FILTER_TIME_THRESHOLD = 5000; public RadioMenuItem chkAntiSpam_none; public RadioMenuItem chkAntiSpam_low; public RadioMenuItem chkAntiSpam_medium; public RadioMenuItem chkAntiSpam_high; + public RadioMenuItem chkAntiSpam_ultra; private Map> filterTimestamps = new HashMap<>(); @@ -108,8 +110,10 @@ public class UiLoggerController implements Initializable { int headerId = packet.headerId(); int threshold = chkAntiSpam_none.isSelected() ? 100000000 : ( - chkAntiSpam_low.isSelected() ? FILTER_AMOUNT_THRESHOLD_S : ( - chkAntiSpam_medium.isSelected() ? FILTER_AMOUNT_THRESHOLD_M : FILTER_AMOUNT_THRESHOLD_H + chkAntiSpam_low.isSelected() ? FILTER_AMOUNT_THRESHOLD_L : ( + chkAntiSpam_medium.isSelected() ? FILTER_AMOUNT_THRESHOLD_M : ( + chkAntiSpam_high.isSelected() ? FILTER_AMOUNT_THRESHOLD_H : FILTER_AMOUNT_THRESHOLD_U + ) ) ); diff --git a/G-Earth/src/main/resources/gearth/services/internal_extensions/uilogger/UiLogger.fxml b/G-Earth/src/main/resources/gearth/services/internal_extensions/uilogger/UiLogger.fxml index 5bcdc88..1282f26 100644 --- a/G-Earth/src/main/resources/gearth/services/internal_extensions/uilogger/UiLogger.fxml +++ b/G-Earth/src/main/resources/gearth/services/internal_extensions/uilogger/UiLogger.fxml @@ -60,6 +60,7 @@ + From 9260d308eb4426c66b5a92ec738ecb1aeff586f4 Mon Sep 17 00:00:00 2001 From: sirjonasxx <36828922+sirjonasxx@users.noreply.github.com> Date: Mon, 26 Apr 2021 00:24:39 +0200 Subject: [PATCH 19/33] skipped packets & save packetlogger settings --- .../uilogger/UiLoggerController.java | 72 ++++++++++++++++++- .../uilogger/UiLogger.fxml | 6 ++ 2 files changed, 76 insertions(+), 2 deletions(-) diff --git a/G-Earth/src/main/java/gearth/services/internal_extensions/uilogger/UiLoggerController.java b/G-Earth/src/main/java/gearth/services/internal_extensions/uilogger/UiLoggerController.java index 83a2a65..8d8e6f8 100644 --- a/G-Earth/src/main/java/gearth/services/internal_extensions/uilogger/UiLoggerController.java +++ b/G-Earth/src/main/java/gearth/services/internal_extensions/uilogger/UiLoggerController.java @@ -1,5 +1,7 @@ package gearth.services.internal_extensions.uilogger; + import com.sun.org.apache.xpath.internal.operations.Bool; + import gearth.misc.Cacher; import gearth.misc.packet_info.PacketInfo; import gearth.misc.packet_info.PacketInfoManager; import gearth.protocol.HMessage; @@ -7,9 +9,11 @@ import gearth.protocol.HPacket; import gearth.ui.logger.loggerdisplays.PacketLogger; import javafx.application.Platform; import javafx.event.ActionEvent; -import javafx.fxml.Initializable; + import javafx.event.EventHandler; + import javafx.fxml.Initializable; import javafx.scene.control.CheckMenuItem; import javafx.scene.control.Label; + import javafx.scene.control.MenuItem; import javafx.scene.control.RadioMenuItem; import javafx.scene.layout.BorderPane; import javafx.scene.layout.FlowPane; @@ -23,10 +27,14 @@ import java.util.*; import java.util.stream.Collectors; public class UiLoggerController implements Initializable { + + private static final String LOGGER_SETTINGS_CACHE = "LOGGER_SETTINGS"; + public FlowPane flowPane; public BorderPane borderPane; public Label lblViewIncoming; public Label lblViewOutgoing; + public CheckMenuItem chkViewIncoming; public CheckMenuItem chkViewOutgoing; public CheckMenuItem chkDisplayStructure; @@ -54,6 +62,7 @@ public class UiLoggerController implements Initializable { public RadioMenuItem chkAntiSpam_medium; public RadioMenuItem chkAntiSpam_high; public RadioMenuItem chkAntiSpam_ultra; + public Label lblSkipped; private Map> filterTimestamps = new HashMap<>(); @@ -71,11 +80,66 @@ public class UiLoggerController implements Initializable { private boolean viewMessageHash = false; private boolean alwaysOnTop = false; + private int skipped = 0; + private volatile boolean initialized = false; private final List appendLater = new ArrayList<>(); + private List allMenuItems = new ArrayList<>(); + + private boolean isSelected(MenuItem item) { + if (item instanceof CheckMenuItem) { + return ((CheckMenuItem)item).isSelected(); + } + if (item instanceof RadioMenuItem) { + return ((RadioMenuItem)item).isSelected(); + } + return false; + } + + private void setSelected(MenuItem item, boolean selected) { + if (item instanceof CheckMenuItem) { + ((CheckMenuItem)item).setSelected(selected); + } + if (item instanceof RadioMenuItem) { + ((RadioMenuItem)item).setSelected(selected); + } + } + + + private void saveAllMenuItems() { + List selection = new ArrayList<>(); + for (MenuItem menuItem : allMenuItems) { + selection.add(isSelected(menuItem)); + } + + Cacher.put(LOGGER_SETTINGS_CACHE, selection); + } + + private void loadAllMenuItems() { + List selectedMenuItems = Cacher.getList(LOGGER_SETTINGS_CACHE); + if (selectedMenuItems != null) { + for (int i = 0; i < selectedMenuItems.size(); i++) { + boolean isSelected = (boolean) selectedMenuItems.get(i); + setSelected(allMenuItems.get(i), isSelected); + } + } + } + @Override public void initialize(URL arg0, ResourceBundle arg1) { + allMenuItems.addAll(Arrays.asList( + chkViewIncoming, chkViewOutgoing, chkDisplayStructure, chkAutoscroll, + chkSkipBigPackets, chkMessageName, chkMessageHash, chkUseNewStructures, + chkOpenOnConnect, chkResetOnConnect, chkHideOnDisconnect, chkResetOnDisconnect, + chkAntiSpam_none, chkAntiSpam_low, chkAntiSpam_medium, chkAntiSpam_high, chkAntiSpam_ultra + )); + loadAllMenuItems(); + + for (MenuItem item : allMenuItems) { + item.setOnAction(event -> saveAllMenuItems()); + } + area = new StyleClassedTextArea(); area.getStyleClass().add("dark"); area.setWrapText(true); @@ -138,7 +202,11 @@ public class UiLoggerController implements Initializable { if (isIncoming && !isBlocked && !isReplaced) { boolean filter = checkFilter(packet); - if (filter) return; + if (filter) { + skipped++; + lblSkipped.setText("Skipped: " + skipped); + return; + } } if (isIncoming && !viewIncoming) return; diff --git a/G-Earth/src/main/resources/gearth/services/internal_extensions/uilogger/UiLogger.fxml b/G-Earth/src/main/resources/gearth/services/internal_extensions/uilogger/UiLogger.fxml index 1282f26..ca816b3 100644 --- a/G-Earth/src/main/resources/gearth/services/internal_extensions/uilogger/UiLogger.fxml +++ b/G-Earth/src/main/resources/gearth/services/internal_extensions/uilogger/UiLogger.fxml @@ -107,6 +107,12 @@ + +