From 7476a11ae07edeeebf466508a9d1d08cb831ed55 Mon Sep 17 00:00:00 2001 From: kohlerpop1 Date: Mon, 23 Dec 2024 22:14:55 -0500 Subject: [PATCH 1/3] Optimized TikTokLinkMicBattleEvent and added helper methods! --- .../data/events/TikTokLinkMicBattleEvent.java | 53 +++++++++++++++---- 1 file changed, 43 insertions(+), 10 deletions(-) diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokLinkMicBattleEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokLinkMicBattleEvent.java index c8129db2..97d0bcba 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokLinkMicBattleEvent.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokLinkMicBattleEvent.java @@ -30,6 +30,8 @@ import io.github.jwdeveloper.tiktok.messages.webcast.WebcastLinkMicBattle; import lombok.Getter; +import java.util.List; + /** * Triggered every time a battle starts & ends */ @@ -73,21 +75,52 @@ public TikTokLinkMicBattleEvent(WebcastLinkMicBattle msg) { public Team1v1 get1v1Team(String battleHostName) { if (!is1v1()) throw new TikTokLiveException("Teams are not instance of 1v1 battle!"); - if (team1.getAs1v1Team().getHost().getName().equals(battleHostName)) - return team1.getAs1v1Team(); - if (team2.getAs1v1Team().getHost().getName().equals(battleHostName)) - return team2.getAs1v1Team(); - return null; + List list = getTeams(battleHostName); + return list.isEmpty() ? null : list.get(0).getAs1v1Team(); } public Team2v2 get2v2Team(String battleHostName) { if (!is2v2()) throw new TikTokLiveException("Teams are not instance of 2v2 battle!"); - if (team1.getAs2v2Team().getHosts().stream().anyMatch(user -> user.getName().equals(battleHostName))) - return team1.getAs2v2Team(); - if (team2.getAs2v2Team().getHosts().stream().anyMatch(user -> user.getName().equals(battleHostName))) - return team2.getAs2v2Team(); - return null; + List list = getTeams(battleHostName); + return list.isEmpty() ? null : list.get(0).getAs2v2Team(); + } + + /** + * @param battleHostName name of host to search + * @return Team1v1 instance not containing name of host */ + public Team1v1 get1v1OpponentTeam(String battleHostName) { + if (!is1v1()) + throw new TikTokLiveException("Teams are not instance of 1v1 battle!"); + List list = getTeams(battleHostName); + return list.isEmpty() ? null : list.get(1).getAs1v1Team(); + } + + public Team2v2 get2x2OpponentTeam(String battleHostName) { + if (!is2v2()) + throw new TikTokLiveException("Teams are not instance of 2v2 battle!"); + List list = getTeams(battleHostName); + return list.isEmpty() ? null : list.get(1).getAs2v2Team(); + } + + /** + * @param battleHostName name of host to search + * @return {@link List} with host team first, then opponent team + *

Empty if host is in neither otherwise always 2 in length; + */ + public List getTeams(String battleHostName) { + if (is1v1()) { + if (team1.getAs1v1Team().getHost().getName().equals(battleHostName)) + return List.of(team1, team2); + if (team2.getAs1v1Team().getHost().getName().equals(battleHostName)) + return List.of(team2, team1); + } else { + if (team1.getAs2v2Team().getHosts().stream().anyMatch(user -> user.getName().equals(battleHostName))) + return List.of(team1, team2); + if (team2.getAs2v2Team().getHosts().stream().anyMatch(user -> user.getName().equals(battleHostName))) + return List.of(team2, team1); + } + return List.of(); } public boolean is1v1() { From 9c7b24f33efe2cad9b1adfba5050b8ca81059198 Mon Sep 17 00:00:00 2001 From: kohlerpop1 Date: Mon, 23 Dec 2024 22:16:49 -0500 Subject: [PATCH 2/3] Add settings for allowing proxies to be used for working through Websockets. --- .../data/settings/ProxyClientSettings.java | 2 +- .../websocket/TikTokWebSocketClient.java | 27 +++++++++---------- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/settings/ProxyClientSettings.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/settings/ProxyClientSettings.java index 9fa21352..ba34f1c9 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/settings/ProxyClientSettings.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/settings/ProxyClientSettings.java @@ -33,7 +33,7 @@ @Setter public class ProxyClientSettings implements Iterator, Iterable { - private boolean enabled, autoDiscard = true, fallback = true; + private boolean enabled, autoDiscard = true, fallback = true, allowWebsocket = true; private Rotation rotation = Rotation.CONSECUTIVE; private final List proxyList = new ArrayList<>(); private int index; diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketClient.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketClient.java index 1678a1d3..9b914809 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketClient.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketClient.java @@ -74,11 +74,11 @@ public void start(LiveConnectionData.Response connectionData, LiveClient liveCli tikTokEventHandler, liveClient); - // ProxyClientSettings proxyClientSettings = clientSettings.getHttpSettings().getProxyClientSettings(); - // if (proxyClientSettings.isEnabled()) - // connectProxy(proxyClientSettings); - // else - connectDefault(); + ProxyClientSettings proxyClientSettings = clientSettings.getHttpSettings().getProxyClientSettings(); + if (proxyClientSettings.isEnabled() && proxyClientSettings.isAllowWebsocket()) + connectProxy(proxyClientSettings); + else + connectDefault(); } private void connectDefault() { @@ -115,15 +115,14 @@ public X509Certificate[] getAcceptedIssuers() { } while (proxySettings.hasNext()) { ProxyData proxyData = proxySettings.next(); - if (!tryProxyConnection(proxySettings, proxyData)) { - if (proxySettings.isAutoDiscard()) - proxySettings.remove(); - continue; - } - heartbeatTask.run(webSocketClient, clientSettings.getPingInterval()); - isConnected = true; - break; - } + if (tryProxyConnection(proxySettings, proxyData)) { + heartbeatTask.run(webSocketClient, clientSettings.getPingInterval()); + isConnected = true; + break; + } + if (proxySettings.isAutoDiscard()) + proxySettings.remove(); + } if (!isConnected) throw new TikTokLiveException("Failed to connect to the websocket"); } From 4b4874d33ee74cea3c80babfb4fbbdaa47e296ae Mon Sep 17 00:00:00 2001 From: kohlerpop1 Date: Mon, 23 Dec 2024 22:17:27 -0500 Subject: [PATCH 3/3] Update bytes required for ping task! --- .../jwdeveloper/tiktok/websocket/WebSocketHeartbeatTask.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/WebSocketHeartbeatTask.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/WebSocketHeartbeatTask.java index f9fe8d03..504dd203 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/WebSocketHeartbeatTask.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/WebSocketHeartbeatTask.java @@ -24,13 +24,15 @@ import org.java_websocket.WebSocket; +import java.util.Base64; + public class WebSocketHeartbeatTask { private Thread thread; private boolean isRunning = false; private final int MAX_TIMEOUT = 250; private final int SLEEP_TIME = 500; - private final byte[] heartbeatBytes = {58, 2, 104, 98}; // Byte Array of "3A026862" which is TikTok's custom heartbeat value + private final byte[] heartbeatBytes = Base64.getDecoder().decode("MgJwYjoCaGI="); // Used to be '3A026862' aka ':\x02hb', now is '2\x02pb:\x02hb'. public void run(WebSocket webSocket, long pingTaskTime) { stop(); @@ -58,6 +60,5 @@ private void heartbeatTask(WebSocket webSocket, long pingTaskTime) { isRunning = false; } } - } } \ No newline at end of file