Skip to content

Commit

Permalink
Sockets are communicating
Browse files Browse the repository at this point in the history
  • Loading branch information
xxAROX committed Jan 24, 2024
1 parent cdedd5d commit 9f9f9d4
Show file tree
Hide file tree
Showing 5 changed files with 75 additions and 50 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/dev-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ jobs:
id: metadata
run: |
javac -d . src/main/java/xxAROX/PresenceMan/Application/AppInfo.java
echo "VERSION=$(java xxAROX.PresenceMan.Application.AppInfo)" >> $GITHUB_OUTPUT
echo "VERSION=$(java xxAROX.PresenceMan.Application.AppInfo development)" >> $GITHUB_OUTPUT
echo ${{ steps.metadata.outputs.VERSION }}
- name: Build with Maven
Expand Down
2 changes: 0 additions & 2 deletions src/main/java/xxAROX/PresenceMan/Application/App.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@
import xxAROX.PresenceMan.Application.events.IBaseListener;
import xxAROX.PresenceMan.Application.scheduler.WaterdogScheduler;
import xxAROX.PresenceMan.Application.sockets.SocketThread;
import xxAROX.PresenceMan.Application.sockets.protocol.packets.types.ByeByePacket;
import xxAROX.PresenceMan.Application.task.FetchGatewayInformationTask;
import xxAROX.PresenceMan.Application.task.UpdateCheckTask;
import xxAROX.PresenceMan.Application.ui.AppUI;
Expand Down Expand Up @@ -112,7 +111,6 @@ public App(Logger logger) {
private void tick(int currentTick) {
scheduler.scheduleAsync(DiscordRPC::discordRunCallbacks);
if (socket != null) socket.tick(currentTick);
if (currentTick %(20*5) == 0) RestAPI.heartbeat();
if (App.ui != null) App.ui.general_tab.tick();
scheduler.onTick(currentTick);
}
Expand Down
37 changes: 0 additions & 37 deletions src/main/java/xxAROX/PresenceMan/Application/RestAPI.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,7 @@
import com.google.gson.JsonSyntaxException;
import lombok.AllArgsConstructor;
import lombok.NonNull;
import xxAROX.PresenceMan.Application.entity.APIActivity;
import xxAROX.PresenceMan.Application.entity.Gateway;
import xxAROX.PresenceMan.Application.sockets.SocketThread;
import xxAROX.PresenceMan.Application.sockets.protocol.packets.types.HeartbeatPacket;
import xxAROX.PresenceMan.Application.task.ReconnectingTask;

import java.io.BufferedReader;
Expand All @@ -40,44 +37,10 @@
import java.util.Map;

public class RestAPI {
private static volatile boolean pending_heartbeat = false;
public static class Endpoints {
public static String skin = "/api/v1/images/skins/";
public static String head = "/api/v1/images/heads/";
}
public static void heartbeat(){
var socket = SocketThread.getInstance();
if (socket == null) return;
if (socket.getConnectionState().get().equals(SocketThread.State.SHUTDOWN)) return;
if (socket.getConnectionState().get().equals(SocketThread.State.DISCONNECTED)) return;
if (socket.getConnectionState().get().equals(SocketThread.State.CONNECTING)) return;
if (socket.getSession_token() == null) return;
if (pending_heartbeat) return;
if (App.getInstance().socket == null) return;
if (App.getInstance().xboxUserInfo == null) return;

pending_heartbeat = true;
var packet = new HeartbeatPacket();
packet.setXuid(App.getInstance().xboxUserInfo.getXuid());
packet.setGamertag(App.getInstance().xboxUserInfo.getGamertag());
packet.setDiscord_user_id(App.getInstance().getDiscord_info().getId());
System.out.println(App.getInstance().socket.sendPacket(packet, (pk) -> {
System.out.println("Calling heartbeat callback");
if (SocketThread.getInstance().getSession_token().get() == null) SocketThread.getInstance().getSession_token().set(pk.getToken());
pending_heartbeat = false;
if (App.getInstance().featuredServer != null) return;
App.getInstance().updateServer(pk.getNetwork(), pk.getServer());

APIActivity new_activity = pk.getApi_activity();
if (new_activity == null) new_activity = APIActivity.none();
if (new_activity.equals(App.getInstance().getApi_activity())) return;
App.setActivity(new_activity);
}, err -> {
App.getInstance().network = null;
App.getInstance().server = null;
App.getLogger().error("Error on heartbeat: " + err);
}));
}


private static JsonObject request(@NonNull String endpoint) {
Expand Down
19 changes: 11 additions & 8 deletions src/main/java/xxAROX/PresenceMan/Application/sockets/Socket.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import java.net.DatagramSocket;

public final class Socket {
private static final String UNKNOWN = " ".repeat(65534);
private final SocketThread connection;
@Getter private DatagramSocket socket = null;

Expand All @@ -38,14 +39,14 @@ public boolean connect(){
close();
try {
DatagramSocket _socket = new DatagramSocket();
_socket.connect(connection.getBackend_address().getAddress(), connection.getBackend_address().getPort());
_socket.setReuseAddress(true);
_socket.setReceiveBufferSize(65535);
_socket.setSendBufferSize(65535);
socket = _socket;
socket.connect(connection.getBackend_address().getAddress(), connection.getBackend_address().getPort());
return true;
} catch (IOException e) {
App.getLogger().error("Error while connecting to cloud: {}", e);
App.getLogger().error("Error while connecting to backend: {}", e);
}
return false;
}
Expand All @@ -57,21 +58,23 @@ public String read() throws Exception {
byte[] bytes = new byte[65535];
DatagramPacket received = new DatagramPacket(bytes, bytes.length);
try {
socket.receive(received);
if (!socket.isClosed()) {
socket.receive(received);
}
} catch (java.net.SocketException e) {
if (!e.getMessage().equals("Socket closed")) App.getLogger().error("Error when receiving packet: ", e);
} catch (IOException e) {
App.getLogger().error("Error when receiving data: ", e);
App.getLogger().error("Error when receiving packet: ", e);
}
buffer = GzipCompressor.getInstance().decompress(received.getData()).trim();
} catch (CompressorException e) {
App.getLogger().error("Error while decompressing packet: ", e);
} catch (CompressorException ignore) {
}
return (buffer == null || buffer.isEmpty() ? null : buffer);
}

public void close(){
if (socket != null) {
if (socket.isConnected()) socket.disconnect();
if (socket.isClosed()) socket.close();
if (!socket.isClosed()) socket.close();
socket = null;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import lombok.Getter;
import lombok.NonNull;
import xxAROX.PresenceMan.Application.App;
import xxAROX.PresenceMan.Application.entity.APIActivity;
import xxAROX.PresenceMan.Application.entity.Gateway;
import xxAROX.PresenceMan.Application.sockets.protocol.CallbackPacketManager;
import xxAROX.PresenceMan.Application.sockets.protocol.PacketPool;
Expand All @@ -42,9 +43,12 @@ public class SocketThread implements Runnable {
@Getter private final AtomicReference<String> session_token = new AtomicReference<>(null);
@Getter private static SocketThread instance;
@Getter private InetSocketAddress backend_address;
@Getter private volatile boolean heartbeat_pending = false;
@Getter private Socket socket;
@Getter private final AtomicReference<State> connectionState = new AtomicReference<>(State.DISCONNECTED);

@Getter private final AtomicInteger heartbeat_pending = new AtomicInteger(0);
@Getter private boolean heartbeats_need_a_token = false;

private final Integer default_tries = 10;
private final AtomicInteger tries_left = new AtomicInteger(default_tries);

Expand All @@ -59,6 +63,62 @@ public SocketThread() {
}
}

public void heartbeat(){
if (connectionState.get().equals(SocketThread.State.SHUTDOWN)) return;
if (connectionState.get().equals(SocketThread.State.DISCONNECTED)) return;
if (connectionState.get().equals(SocketThread.State.CONNECTING)) return;
if (session_token.get() == null && heartbeats_need_a_token) {
System.out.println("No session token");
return;
}
if (heartbeat_pending.get() == 5) {
System.out.println("Timed out");
resetConnection();
heartbeat_pending.set(0);
return;
}
if (App.getInstance().xboxUserInfo == null) return;

heartbeat_pending.getAndIncrement();

var packet = new HeartbeatPacket();
packet.setXuid(App.getInstance().xboxUserInfo.getXuid());
packet.setGamertag(App.getInstance().xboxUserInfo.getGamertag());
packet.setDiscord_user_id(App.getInstance().getDiscord_info().getId());
System.out.println("Sent heartbeat: " + App.getInstance().socket.sendPacket(packet, (pk) -> {
Gateway.connected = true;
if (!heartbeats_need_a_token && session_token.get() == null) {
session_token.set(pk.getToken());
heartbeats_need_a_token = true;
}
heartbeat_pending.getAndDecrement();
if (App.getInstance().featuredServer != null) return;
App.getInstance().updateServer(pk.getNetwork(), pk.getServer());

APIActivity new_activity = pk.getApi_activity();
if (new_activity == null) new_activity = APIActivity.none();
if (new_activity.equals(App.getInstance().getApi_activity())) return;
App.setActivity(new_activity);
}, err -> {
App.getInstance().network = null;
App.getInstance().server = null;
App.getLogger().error("Error on heartbeat: " + err);
}));
}

public void resetConnection(){
System.out.println(1);
session_token.set(null);
connectionState.set(State.CONNECTING);
System.out.println(2);
Gateway.connected = false;
System.out.println(3);
socket.close();
System.out.println(4);
connectionState.set(State.DISCONNECTED);
System.out.println(5);
}

public void tick(int currentTick) {
var xboxInfo = App.getInstance().getXboxUserInfo();
if (xboxInfo == null) return;
Expand All @@ -71,13 +131,15 @@ public void tick(int currentTick) {
App.getLogger().info(tries_left.get() +1 == default_tries ? "Connecting.." : "Reconnecting..");
if (socket.connect()) {
connectionState.set(State.CONNECTED);
App.getLogger().info(tries_left.get() +1 == default_tries ? "Connected!" : "Reconnected!");
tries_left.set(default_tries);
} else {
connectionState.set(State.DISCONNECTED);
App.getLogger().warn(tries_left.get() +1 == default_tries ? "Failed to connect to backend!" :"Reconnecting failed!");
}
}
}
else if (currentTick %(20*5) == 0) heartbeat();
}

@Override public void run() {
Expand All @@ -86,7 +148,6 @@ public void tick(int currentTick) {
String buffer = null;
try {
buffer = socket.read();
System.out.println(buffer);
} catch (Exception e) {
App.getLogger().error("Error while reading packet: ", e);
}
Expand Down

0 comments on commit 9f9f9d4

Please sign in to comment.