From 84bbfa97e9663a65db9392f6ba5a29abd781a4ca Mon Sep 17 00:00:00 2001 From: JW Date: Tue, 19 Sep 2023 02:53:04 +0200 Subject: [PATCH] Fixed bugs: - addListeners() was throwing exception - 404 response code was return while connecting to tiktok for some users - configure.setRoomId() method for people that want to set roomId manually - client.roomInfo().isAgeRestricted() check if live has age restriction --- .../jwdeveloper/tiktok/ClientSettings.java | 10 +++- .../jwdeveloper/tiktok/live/LiveRoomInfo.java | 1 + .../jwdeveloper/tiktok/live/LiveRoomMeta.java | 2 + .../jwdeveloper/tiktok/mappers/Mapper.java | 6 +++ .../jwdeveloper/tiktok/TikTokLiveClient.java | 16 ++++++- .../jwdeveloper/tiktok/TikTokRoomInfo.java | 3 ++ .../tiktok/http/TikTokApiService.java | 21 ++------- .../listener/TikTokListenersManager.java | 3 +- .../tiktok/mappers/LiveRoomMetaMapper.java | 30 ++++++++++++ README.md | 47 ++++++++++--------- .../tiktok/ConfigurationExample.java | 5 +- .../jwdeveloper/tiktok/ListenerExample.java | 2 +- Tools-ReadmeGenerator/pom.xml | 6 +++ 13 files changed, 105 insertions(+), 47 deletions(-) create mode 100644 API/src/main/java/io/github/jwdeveloper/tiktok/mappers/Mapper.java create mode 100644 Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/LiveRoomMetaMapper.java diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/ClientSettings.java b/API/src/main/java/io/github/jwdeveloper/tiktok/ClientSettings.java index cb72473..647fa80 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/ClientSettings.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/ClientSettings.java @@ -56,7 +56,7 @@ public class ClientSettings { private boolean printMessageData; /** - * Tiktok user name + * Optional: Use it if you need to change tiktok live hostname in builder */ private String hostName; @@ -68,10 +68,16 @@ public class ClientSettings { /* - * Optional: Sometimes not every messages from chat are send to TikTokLiveJava to fix this issue you can set sessionId + * Optional: Sometimes not every messages from chat are send to TikTokLiveJava to fix this issue you can set sessionId * documentation how to obtain sessionId https://github.com/isaackogan/TikTok-Live-Connector#send-chat-messages */ private String sessionId; + /* + * Optional: By default roomID is fetched before connect to live, but you can set it manually + * + */ + private String roomId; + } diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveRoomInfo.java b/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveRoomInfo.java index 6d4ea43..9d67dff 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveRoomInfo.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveRoomInfo.java @@ -3,6 +3,7 @@ package io.github.jwdeveloper.tiktok.live; public interface LiveRoomInfo { int getViewersCount(); + boolean isAgeRestricted(); String getRoomId(); String getUserName(); ConnectionState getConnectionState(); diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveRoomMeta.java b/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveRoomMeta.java index a3ffe92..ee62b13 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveRoomMeta.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveRoomMeta.java @@ -6,4 +6,6 @@ import lombok.Data; public class LiveRoomMeta { private int status; + + private boolean ageRestricted; } diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/mappers/Mapper.java b/API/src/main/java/io/github/jwdeveloper/tiktok/mappers/Mapper.java new file mode 100644 index 0000000..6603270 --- /dev/null +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/mappers/Mapper.java @@ -0,0 +1,6 @@ +package io.github.jwdeveloper.tiktok.mappers; + +public interface Mapper +{ + TARGET mapFrom(SOURCE source); +} diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java index 8be9f17..bb2516d 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java @@ -89,8 +89,20 @@ public class TikTokLiveClient implements LiveClient { apiService.updateSessionId(); - var roomId = apiService.fetchRoomId(liveRoomInfo.getUserName()); - liveRoomInfo.setRoomId(roomId); + + if(clientSettings.getRoomId() != null) + { + + liveRoomInfo.setRoomId(clientSettings.getRoomId()); + logger.info("Using roomID from settings: "+clientSettings.getRoomId()); + } + else + { + var roomId = apiService.fetchRoomId(liveRoomInfo.getUserName()); + liveRoomInfo.setRoomId(roomId); + } + + var roomData = apiService.fetchRoomInfo(); if (roomData.getStatus() == 0 || roomData.getStatus() == 4) { throw new TikTokLiveOfflineHostException("LiveStream for HostID could not be found. Is the Host online?"); diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokRoomInfo.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokRoomInfo.java index 9014022..8d8aec6 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokRoomInfo.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokRoomInfo.java @@ -11,7 +11,10 @@ public class TikTokRoomInfo implements LiveRoomInfo private String roomId; + private boolean ageRestricted; + private String userName; + private ConnectionState connectionState = ConnectionState.DISCONNECTED; public boolean hasConnectionState(ConnectionState state) diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokApiService.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokApiService.java index 36a4a18..69a19bb 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokApiService.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokApiService.java @@ -6,6 +6,7 @@ import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException; import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveOfflineHostException; import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveRequestException; import io.github.jwdeveloper.tiktok.live.LiveRoomMeta; +import io.github.jwdeveloper.tiktok.mappers.LiveRoomMetaMapper; import io.github.jwdeveloper.tiktok.messages.WebcastResponse; import io.github.jwdeveloper.tiktok.models.gifts.TikTokGiftInfo; @@ -100,22 +101,10 @@ public class TikTokApiService { logger.info("Fetch RoomInfo"); try { var response = tiktokHttpClient.getJObjectFromWebcastAPI("room/info/", clientSettings.getClientParameters()); - if (!response.has("data")) { - return new LiveRoomMeta(); - } - - var data = response.getAsJsonObject("data"); - if (!data.has("status")) { - return new LiveRoomMeta(); - } - - var status = data.get("status"); - - var info = new LiveRoomMeta(); - info.setStatus(status.getAsInt()); - - logger.info("RoomInfo status -> " + info.getStatus()); - return info; + var mapper = new LiveRoomMetaMapper(); + var liveRoomMeta = mapper.mapFrom(response); + logger.info("RoomInfo status -> " + liveRoomMeta.getStatus()); + return liveRoomMeta; } catch (Exception e) { throw new TikTokLiveRequestException("Failed to fetch room info from WebCast, see stacktrace for more info.", e); } diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/listener/TikTokListenersManager.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/listener/TikTokListenersManager.java index d3a8e94..7054584 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/listener/TikTokListenersManager.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/listener/TikTokListenersManager.java @@ -19,10 +19,9 @@ public class TikTokListenersManager implements ListenersManager { public TikTokListenersManager(List listeners, TikTokEventObserver tikTokEventHandler) { this.eventObserver = tikTokEventHandler; - this.bindingModels = listeners.stream().map(this::bindToEvents).toList(); + this.bindingModels = new ArrayList<>(listeners.stream().map(this::bindToEvents).toList()); } - @Override public List getListeners() { return bindingModels.stream().map(ListenerBindingModel::getListener).toList(); diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/LiveRoomMetaMapper.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/LiveRoomMetaMapper.java new file mode 100644 index 0000000..8cc900a --- /dev/null +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/LiveRoomMetaMapper.java @@ -0,0 +1,30 @@ +package io.github.jwdeveloper.tiktok.mappers; + +import com.google.gson.JsonObject; +import io.github.jwdeveloper.tiktok.live.LiveRoomMeta; + +public class LiveRoomMetaMapper implements Mapper +{ + @Override + public LiveRoomMeta mapFrom(JsonObject input) { + var liveRoomMeta = new LiveRoomMeta(); + + if (!input.has("data")) { + return liveRoomMeta; + } + var data = input.getAsJsonObject("data"); + if (data.has("status")) { + var status = data.get("status"); + liveRoomMeta.setStatus(status.getAsInt()); + } + + + if(data.has("age_restricted")) + { + var element = data.getAsJsonObject("age_restricted"); + var restricted= element.get("restricted").getAsBoolean(); + liveRoomMeta.setAgeRestricted(restricted); + } + return liveRoomMeta; + } +} diff --git a/README.md b/README.md index 0e0b791..fd89104 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ A Java library based on [TikTokLive](https://github.com/isaackogan/TikTokLive) a Join the support [discord](https://discord.gg/e2XwPNTBBr) and visit the `#java-support` channel for questions, contributions and ideas. Feel free to make pull requests with missing/new features, fixes, etc Do you prefer other programming languages? -- **Node** orginal: [TikTok-Live-Connector](https://github.com/zerodytrash/TikTok-Live-Connector) by [@zerodytrash](https://github.com/zerodytrash) +- **Node** orginal: [TikTok-Live-Connector](https://github.com/isaackogan/TikTok-Live-Connector) by [@zerodytrash](https://github.com/zerodytrash) - **Python** rewrite: [TikTokLive](https://github.com/isaackogan/TikTokLive) by [@isaackogan](https://github.com/isaackogan) - **Go** rewrite: [GoTikTokLive](https://github.com/Davincible/gotiktoklive) by [@Davincible](https://github.com/Davincible) - **C#** rewrite: [TikTokLiveSharp](https://github.com/frankvHoof93/TikTokLiveSharp) by [@frankvHoof93](https://github.com/frankvHoof93) @@ -27,25 +27,25 @@ Do you prefer other programming languages? ```xml - - jitpack.io - https://jitpack.io - - + + jitpack.io + https://jitpack.io + + - - - com.github.jwdeveloper.TikTok-Live-Java - Client - 0.0.22-Release - compile - - - com.google.code.gson - gson - 2.10.1 - - + + + com.github.jwdeveloper.TikTok-Live-Java + Client + 0.0.23-Release + compile + + + com.google.code.gson + gson + 2.10.1 + + ``` 2. Create your first chat connection @@ -119,9 +119,12 @@ public class ConfigurationExample { clientSettings.setRetryOnConnectionFailure(true); // Reconnecting if TikTok user is offline clientSettings.setRetryConnectionTimeout(Duration.ofSeconds(1)); // Timeout before next reconnection - // Optional: Sometimes not every messages from chat are send to TikTokLiveJava to fix this issue you can set sessionId + //Optional: Sometimes not every message from chat are send to TikTokLiveJava to fix this issue you can set sessionId // documentation how to obtain sessionId https://github.com/isaackogan/TikTok-Live-Connector#send-chat-messages clientSettings.setSessionId("86c3c8bf4b17ebb2d74bb7fa66fd0000"); + + //Optional: + clientSettings.setRoomId("XXXXXXXXXXXXXXXXX"); }) .buildAndRun(); System.in.read(); @@ -131,8 +134,6 @@ public class ConfigurationExample { ``` ## Listener Example -Listener is optional approach for handling events - ```java package io.github.jwdeveloper.tiktok; @@ -154,7 +155,7 @@ public class ListenerExample CustomListener customListener = new CustomListener(); // set tiktok username - TikTokLive.newClient(Main.TEST_TIKTOK_USER) + var client = TikTokLive.newClient(Main.TEST_TIKTOK_USER) .addListener(customListener) .buildAndRun(); diff --git a/TestApplication/src/main/java/io/github/jwdeveloper/tiktok/ConfigurationExample.java b/TestApplication/src/main/java/io/github/jwdeveloper/tiktok/ConfigurationExample.java index ff0af2b..6080ca3 100644 --- a/TestApplication/src/main/java/io/github/jwdeveloper/tiktok/ConfigurationExample.java +++ b/TestApplication/src/main/java/io/github/jwdeveloper/tiktok/ConfigurationExample.java @@ -21,9 +21,12 @@ public class ConfigurationExample { clientSettings.setRetryOnConnectionFailure(true); // Reconnecting if TikTok user is offline clientSettings.setRetryConnectionTimeout(Duration.ofSeconds(1)); // Timeout before next reconnection - //Optional: Sometimes not every messages from chat are send to TikTokLiveJava to fix this issue you can set sessionId + //Optional: Sometimes not every message from chat are send to TikTokLiveJava to fix this issue you can set sessionId // documentation how to obtain sessionId https://github.com/isaackogan/TikTok-Live-Connector#send-chat-messages clientSettings.setSessionId("86c3c8bf4b17ebb2d74bb7fa66fd0000"); + + //Optional: + clientSettings.setRoomId("XXXXXXXXXXXXXXXXX"); }) .buildAndRun(); System.in.read(); diff --git a/TestApplication/src/main/java/io/github/jwdeveloper/tiktok/ListenerExample.java b/TestApplication/src/main/java/io/github/jwdeveloper/tiktok/ListenerExample.java index b4f39a5..5c99e42 100644 --- a/TestApplication/src/main/java/io/github/jwdeveloper/tiktok/ListenerExample.java +++ b/TestApplication/src/main/java/io/github/jwdeveloper/tiktok/ListenerExample.java @@ -18,7 +18,7 @@ public class ListenerExample CustomListener customListener = new CustomListener(); // set tiktok username - TikTokLive.newClient(Main.TEST_TIKTOK_USER) + var client = TikTokLive.newClient(Main.TEST_TIKTOK_USER) .addListener(customListener) .buildAndRun(); diff --git a/Tools-ReadmeGenerator/pom.xml b/Tools-ReadmeGenerator/pom.xml index f66b5c8..383630b 100644 --- a/Tools-ReadmeGenerator/pom.xml +++ b/Tools-ReadmeGenerator/pom.xml @@ -35,5 +35,11 @@ 0.0.7-Release compile + + org.reflections + reflections + 0.9.12 + compile + \ No newline at end of file