remove PacketInfoSupport -> methods now built-in

This commit is contained in:
sirjonasxx 2021-08-14 03:30:38 +02:00
parent bdf8f81d73
commit 6621a468f1
6 changed files with 80 additions and 134 deletions

View File

@ -3,12 +3,18 @@ package gearth.extensions;
import gearth.misc.listenerpattern.Observable;
import gearth.protocol.HMessage;
import gearth.protocol.HPacket;
import gearth.services.packet_info.PacketInfo;
import gearth.services.packet_info.PacketInfoManager;
import org.reactfx.util.Lists;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Stream;
public abstract class ExtensionBase extends IExtension {
@ -22,6 +28,10 @@ public abstract class ExtensionBase extends IExtension {
protected final Map<Integer, List<MessageListener>> incomingMessageListeners = new HashMap<>();
protected final Map<Integer, List<MessageListener>> outgoingMessageListeners = new HashMap<>();
protected final Map<String, List<MessageListener>> hashOrNameIncomingListeners = new HashMap<>();
protected final Map<String, List<MessageListener>> hashOrNameOutgoingListeners = new HashMap<>();
volatile PacketInfoManager packetInfoManager = PacketInfoManager.EMPTY;
/**
@ -46,6 +56,28 @@ public abstract class ExtensionBase extends IExtension {
listeners.get(headerId).add(messageListener);
}
/**
* Register a listener on a specific packet Type
* @param direction ToClient or ToServer
* @param hashOrName the packet hash or name
* @param messageListener the callback
*/
public void intercept(HMessage.Direction direction, String hashOrName, MessageListener messageListener) {
Map<String, List<MessageListener>> listeners =
direction == HMessage.Direction.TOCLIENT ?
hashOrNameIncomingListeners :
hashOrNameOutgoingListeners;
synchronized (listeners) {
if (!listeners.containsKey(hashOrName)) {
listeners.put(hashOrName, new ArrayList<>());
}
}
listeners.get(hashOrName).add(messageListener);
}
/**
* Register a listener on all packets
* @param direction ToClient or ToServer
@ -84,10 +116,14 @@ public abstract class ExtensionBase extends IExtension {
incomingMessageListeners :
outgoingMessageListeners;
Map<String, List<MessageListener>> hashOrNameListeners =
habboMessage.getDestination() == HMessage.Direction.TOCLIENT ?
hashOrNameIncomingListeners :
hashOrNameOutgoingListeners ;
List<MessageListener> correctListeners = new ArrayList<>();
synchronized (incomingMessageListeners) {
synchronized (outgoingMessageListeners) {
synchronized (listeners) {
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));
@ -100,6 +136,23 @@ public abstract class ExtensionBase extends IExtension {
}
}
}
synchronized (hashOrNameListeners) {
List<PacketInfo> packetInfos = packetInfoManager.getAllPacketInfoFromHeaderId(habboMessage.getDestination(), habboPacket.headerId());
List<String> identifiers = new ArrayList<>();
packetInfos.forEach(packetInfo -> {
String name = packetInfo.getName();
String hash = packetInfo.getHash();
if (name != null && hashOrNameListeners.containsKey(name)) identifiers.add(name);
if (hash != null && hashOrNameListeners.containsKey(hash)) identifiers.add(hash);
});
for (String identifier : identifiers) {
for (int i = hashOrNameListeners.get(identifier).size() - 1; i >= 0; i--) {
correctListeners.add(hashOrNameListeners.get(identifier).get(i));
}
}
}
for(MessageListener listener : correctListeners) {

View File

@ -9,6 +9,7 @@ public abstract class IExtension {
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, String hashOrName, 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);

View File

@ -17,25 +17,25 @@ public class ChatConsole {
private volatile int chatid;
private volatile String name;
private volatile PacketInfoSupport packetInfoSupport;
private volatile String infoMessage;
private volatile boolean firstTime = true;
private volatile Observable<ChatInputListener> chatInputObservable = new Observable<>();
private final IExtension extension;
public ChatConsole(final PacketInfoSupport packetInfoSupport, IExtension extension) {
this(packetInfoSupport, extension, null);
public ChatConsole(IExtension extension) {
this(extension, null);
}
/**
* infomessage will be used as response for :info and for initialize
* @param packetInfoSupport
* @param extension
* @param infoMessage
*/
public ChatConsole(final PacketInfoSupport packetInfoSupport, IExtension extension, String infoMessage) {
this.packetInfoSupport = packetInfoSupport;
public ChatConsole(IExtension extension, String infoMessage) {
this.extension = extension;
this.name = extension.getClass().getAnnotation(ExtensionInfo.class).Title();
chatid = (this.name.hashCode() % 300000000) + 300000000;
this.infoMessage = infoMessage;
@ -56,7 +56,7 @@ public class ChatConsole {
}
});
packetInfoSupport.intercept(HMessage.Direction.TOCLIENT, "FriendListFragment", hMessage -> {
extension.intercept(HMessage.Direction.TOCLIENT, "FriendListFragment", hMessage -> {
if (doOncePerConnection[0]) {
doOncePerConnection[0] = false;
@ -72,7 +72,7 @@ public class ChatConsole {
}
});
packetInfoSupport.intercept(HMessage.Direction.TOSERVER, "SendMsg", hMessage -> {
extension.intercept(HMessage.Direction.TOSERVER, "SendMsg", hMessage -> {
HPacket packet = hMessage.getPacket();
if (packet.readInteger() == chatid) {
hMessage.setBlocked(true);
@ -88,11 +88,12 @@ public class ChatConsole {
}
private void createChat() {
packetInfoSupport.sendToClient("FriendListUpdate",
HPacket packet = new HPacket("FriendListUpdate", HMessage.Direction.TOCLIENT,
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, ""
);
0, "", 0, true, false, true, "");
extension.sendToClient(packet);
if (infoMessage != null) {
writeOutput(infoMessage, false);
@ -101,10 +102,10 @@ public class ChatConsole {
public void writeOutput(String string, boolean asInvite) {
if (asInvite) {
packetInfoSupport.sendToClient("RoomInvite", chatid, string);
extension.sendToClient(new HPacket("RoomInvite", HMessage.Direction.TOCLIENT, chatid, string));
}
else {
packetInfoSupport.sendToClient("NewConsole", chatid, string, 0, "");
extension.sendToClient(new HPacket("NewConsole", HMessage.Direction.TOCLIENT, chatid, string, 0, ""));
}
}

View File

@ -1,107 +0,0 @@
package gearth.extensions.extra.tools;
import gearth.extensions.Extension;
import gearth.extensions.IExtension;
import gearth.services.packet_info.PacketInfo;
import gearth.services.packet_info.PacketInfoManager;
import gearth.protocol.HMessage;
import gearth.protocol.HPacket;
import java.security.InvalidParameterException;
import java.util.*;
/**
* Created by Jonas on 10/11/2018.
*/
public class PacketInfoSupport {
private final Object lock = new Object();
private Map<String, List<Extension.MessageListener>> incomingMessageListeners = new HashMap<>();
private Map<String, List<Extension.MessageListener>> outgoingMessageListeners = new HashMap<>();
private IExtension extension;
public PacketInfoSupport(IExtension extension) {
this.extension = extension;
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<Extension.MessageListener> callbacks = new HashSet<>();
Map<String, List<Extension.MessageListener>> messageListeners =
(direction == HMessage.Direction.TOSERVER
? outgoingMessageListeners
: incomingMessageListeners);
List<PacketInfo> packetInfos = extension.getPacketInfoManager().getAllPacketInfoFromHeaderId(direction, message.getPacket().headerId());
for (PacketInfo packetInfo : packetInfos) {
List<Extension.MessageListener> listeners_hash = messageListeners.get(packetInfo.getHash());
List<Extension.MessageListener> 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<String, List<Extension.MessageListener>> 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 = extension.getPacketInfoManager().getPacketInfoFromName(direction, hashOrName);
if (fromname != null) {
headerId = fromname.getHeaderId();
}
else {
PacketInfo fromHash = extension.getPacketInfoManager().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);
}
}

View File

@ -100,7 +100,7 @@ public class HPacket implements StringifyAble {
this.identifierDirection = identifierDirection;
}
public String getIdentifier() {
public String packetIncompleteIdentifier() {
return identifier;
}

View File

@ -8,10 +8,8 @@ import gearth.services.packet_info.PacketInfoManager;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Predicate;
public class InjectedPackets implements StringifyAble {
@ -27,7 +25,7 @@ public class InjectedPackets implements StringifyAble {
HPacket packet = new HPacket(packetsAsString);
String identifier = null;
if (!packet.isPacketComplete()) {
identifier = packet.getIdentifier();
identifier = packet.packetIncompleteIdentifier();
}
else {
Optional<PacketInfo> maybeInfo = packetInfoManager.getAllPacketInfoFromHeaderId(direction, packet.headerId())