G-Earth/Extensions/G-Translator_1.0.2/decompiled/gearth/extensions/Extension.java
Administrator 368b92d87a G-Earth 1.5.4 beta 22 - Initial release
Komplettes G-Earth Paket inkl. JRE, Extensions und Tools.

Extensions:
- G-BuildTools, G-Click Ultimate, G-Loader, G-Manipulate
- G-Presets, G-Translator, G-Trigger, G-itemViewer
- Market Utils, Packet Info Explorer, Plants
- RandomRoomVisitor, RoomLogger, Sanbovir Photo Inspector
- SpyFriends, WallAligner, XabboScripter, xabbo
2026-03-16 09:45:04 +01:00

266 lines
9.9 KiB
Java

/*
* Decompiled with CFR 0.152.
*/
package gearth.extensions;
import gearth.extensions.ExtensionBase;
import gearth.extensions.ExtensionInfo;
import gearth.misc.HostInfo;
import gearth.protocol.HMessage;
import gearth.protocol.HPacket;
import gearth.protocol.connection.HClient;
import gearth.services.Constants;
import gearth.services.packet_info.PacketInfoManager;
import java.io.DataInputStream;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public abstract class Extension
extends ExtensionBase {
protected ExtensionBase.FlagsCheckListener flagRequestCallback = null;
private String[] args;
private volatile boolean isCorrupted = false;
private static final String[] PORT_FLAG = new String[]{"--port", "-p"};
private static final String[] FILE_FLAG = new String[]{"--filename", "-f"};
private static final String[] COOKIE_FLAG = new String[]{"--auth-token", "-c"};
private volatile boolean delayed_init = false;
private OutputStream out = null;
private String getArgument(String[] args, String ... arg) {
for (int i = 0; i < args.length - 1; ++i) {
for (String str : arg) {
if (!args[i].toLowerCase().equals(str.toLowerCase())) continue;
return args[i + 1];
}
}
return null;
}
public Extension(String[] args) {
this.args = args;
if (this.getInfoAnnotations() == null) {
System.err.println("Extension info not found\n\nUsage:\n@ExtensionInfo ( \n Title = \"...\",\n Description = \"...\",\n Version = \"...\",\n Author = \"...\"\n)");
this.isCorrupted = true;
}
if (this.getArgument(args, PORT_FLAG) == null) {
System.err.println("Don't forget to include G-Earth's port in your program parameters (-p {port})");
this.isCorrupted = true;
}
}
/*
* WARNING - Removed try catching itself - possible behaviour change.
*/
public void run() {
if (this.isCorrupted) {
return;
}
int port = Integer.parseInt(this.getArgument(this.args, PORT_FLAG));
String file = this.getArgument(this.args, FILE_FLAG);
String cookie = this.getArgument(this.args, COOKIE_FLAG);
Socket gEarthExtensionServer = null;
try {
gEarthExtensionServer = new Socket("127.0.0.1", port);
gEarthExtensionServer.setTcpNoDelay(true);
InputStream in = gEarthExtensionServer.getInputStream();
DataInputStream dIn = new DataInputStream(in);
this.out = gEarthExtensionServer.getOutputStream();
while (!gEarthExtensionServer.isClosed()) {
int length;
try {
length = dIn.readInt();
}
catch (EOFException exception) {
break;
}
byte[] headerandbody = new byte[length + 4];
for (int amountRead = 0; amountRead < length; amountRead += dIn.read(headerandbody, 4 + amountRead, Math.min(dIn.available(), length - amountRead))) {
}
HPacket packet = new HPacket(headerandbody);
packet.fixLength();
if (packet.headerId() == 2) {
ExtensionInfo info = this.getInfoAnnotations();
HPacket response = new HPacket(1);
response.appendString(info.Title()).appendString(info.Author()).appendString(info.Version()).appendString(info.Description()).appendBoolean(this.isOnClickMethodUsed()).appendBoolean(file != null).appendString(file == null ? "" : file).appendString(cookie == null ? "" : cookie).appendBoolean(this.canLeave()).appendBoolean(this.canDelete());
this.writeToStream(response.toBytes());
continue;
}
if (packet.headerId() == 5) {
String host = packet.readString();
int connectionPort = packet.readInteger();
String hotelVersion = packet.readString();
String clientIdentifier = packet.readString();
HClient clientType = HClient.valueOf(packet.readString());
this.setPacketInfoManager(PacketInfoManager.readFromPacket(packet));
boolean bl = Constants.UNITY_PACKETS = clientType == HClient.UNITY;
if (this.delayed_init) {
this.initExtension();
this.delayed_init = false;
}
this.getOnConnectionObservable().fireEvent(l -> l.onConnection(host, connectionPort, hotelVersion, clientIdentifier, clientType));
this.onStartConnection();
continue;
}
if (packet.headerId() == 6) {
this.onEndConnection();
continue;
}
if (packet.headerId() == 4) {
if (this.flagRequestCallback != null) {
int arraysize = packet.readInteger();
String[] gEarthArgs = new String[arraysize];
for (int i = 0; i < gEarthArgs.length; ++i) {
gEarthArgs[i] = packet.readString();
}
this.flagRequestCallback.act(gEarthArgs);
}
this.flagRequestCallback = null;
continue;
}
if (packet.headerId() == 7) {
this.delayed_init = packet.readBoolean();
HostInfo hostInfo = HostInfo.fromPacket(packet);
this.updateHostInfo(hostInfo);
if (!this.delayed_init) {
this.initExtension();
}
this.writeToConsole("green", "Extension \"" + this.getInfoAnnotations().Title() + "\" successfully initialized", false);
continue;
}
if (packet.headerId() == 1) {
this.onClick();
continue;
}
if (packet.headerId() == 3) {
String stringifiedMessage = packet.readLongString();
HMessage habboMessage = new HMessage(stringifiedMessage);
this.modifyMessage(habboMessage);
HPacket response = new HPacket(2);
response.appendLongString(habboMessage.stringify());
this.writeToStream(response.toBytes());
continue;
}
if (packet.headerId() != 10) continue;
HostInfo hostInfo = HostInfo.fromPacket(packet);
this.updateHostInfo(hostInfo);
}
}
catch (IOException | ArrayIndexOutOfBoundsException e) {
System.err.println("Connection failed; is G-Earth active?");
e.printStackTrace();
}
finally {
if (gEarthExtensionServer != null && !gEarthExtensionServer.isClosed()) {
try {
gEarthExtensionServer.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
}
/*
* WARNING - Removed try catching itself - possible behaviour change.
*/
private void writeToStream(byte[] bytes) throws IOException {
Extension extension = this;
synchronized (extension) {
this.out.write(bytes);
}
}
@Override
public boolean sendToClient(HPacket packet) {
return this.send(packet, HMessage.Direction.TOCLIENT);
}
@Override
public boolean sendToServer(HPacket packet) {
return this.send(packet, HMessage.Direction.TOSERVER);
}
private boolean send(HPacket packet, HMessage.Direction direction) {
if (packet.isCorrupted()) {
return false;
}
if (!packet.isPacketComplete()) {
packet.completePacket(this.packetInfoManager);
}
if (!packet.isPacketComplete()) {
return false;
}
HPacket packet1 = new HPacket(4);
packet1.appendByte(direction == HMessage.Direction.TOCLIENT ? (byte)0 : 1);
packet1.appendInt(packet.getBytesLength());
packet1.appendBytes(packet.toBytes());
try {
this.writeToStream(packet1.toBytes());
return true;
}
catch (IOException e) {
return false;
}
}
@Override
public boolean requestFlags(ExtensionBase.FlagsCheckListener flagRequestCallback) {
if (this.flagRequestCallback != null) {
return false;
}
this.flagRequestCallback = flagRequestCallback;
try {
this.writeToStream(new HPacket(3).toBytes());
return true;
}
catch (IOException e) {
e.printStackTrace();
return false;
}
}
@Override
public void writeToConsole(String colorClass, String s) {
this.writeToConsole(colorClass, s, true);
}
private void writeToConsole(String colorClass, String s, boolean mentionTitle) {
String text = "[" + colorClass + "]" + (mentionTitle ? this.getInfoAnnotations().Title() + " --> " : "") + s;
HPacket packet = new HPacket(98);
packet.appendString(text);
try {
this.writeToStream(packet.toBytes());
}
catch (IOException e) {
e.printStackTrace();
}
}
@Override
protected void initExtension() {
}
@Override
protected void onStartConnection() {
}
@Override
protected void onEndConnection() {
}
@Override
protected boolean canLeave() {
return true;
}
@Override
protected boolean canDelete() {
return true;
}
}