diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLive.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLive.java index cde7406..204e9cb 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLive.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLive.java @@ -28,7 +28,6 @@ import io.github.jwdeveloper.tiktok.http.LiveHttpClient; import io.github.jwdeveloper.tiktok.live.GiftsManager; import io.github.jwdeveloper.tiktok.live.builder.LiveClientBuilder; -import java.util.List; import java.util.concurrent.CompletableFuture; public class TikTokLive { @@ -102,14 +101,9 @@ public class TikTokLive { * @return GiftsManager */ public static GiftsManager gifts() { - if (giftsManager != null) { - return giftsManager; - } - synchronized (GiftsManager.class) - { - if (giftsManager == null) - { - return new TikTokGiftsManager(requests().fetchGiftsData().getGifts()); + if (giftsManager == null) { + synchronized (GiftsManager.class) { + giftsManager = new TikTokGiftsManager(requests().fetchGiftsData().getGifts()); } } return giftsManager; 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 0ec4dff..3090363 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java @@ -184,6 +184,9 @@ public class TikTokLiveClient implements LiveClient { tikTokEventHandler.publish(this, event); } + @Override + public void publishMessage(String base64) {} + @Override public GiftsManager getGiftManager() { return giftsManager; diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveHttpClient.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveHttpClient.java index eadde29..0d1098d 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveHttpClient.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveHttpClient.java @@ -83,7 +83,7 @@ public class TikTokLiveHttpClient implements LiveHttpClient .toJsonResponse(); if (result.isFailure()) - throw new TikTokLiveRequestException("Unable to fetch gifts information's"+result.toStack()); + throw new TikTokLiveRequestException("Unable to fetch gifts information's - "+result); var json = result.getContent(); return giftsDataMapper.map(json); @@ -111,10 +111,10 @@ public class TikTokLiveHttpClient implements LiveHttpClient .toJsonResponse(); if (result.isFailure()) - throw new TikTokLiveRequestException("Unable to get information's about user"+result.toStack()); + throw new TikTokLiveRequestException("Unable to get information's about user - "+result); var json = result.getContent(); - return liveUserDataMapper.map(json); + return liveUserDataMapper.map(json, logger); } @Override @@ -138,7 +138,7 @@ public class TikTokLiveHttpClient implements LiveHttpClient .toJsonResponse(); if (result.isFailure()) - throw new TikTokLiveRequestException("Unable to get info about live room"+result.toStack()); + throw new TikTokLiveRequestException("Unable to get info about live room - "+result); var json = result.getContent(); return liveDataMapper.map(json); @@ -153,7 +153,7 @@ public class TikTokLiveHttpClient implements LiveHttpClient var resultHeader = ActionResult.of(credentialsResponse.headers().firstValue("x-set-tt-cookie")); if (resultHeader.isFailure()) { logger.warning("SignServer Headers: "+request.getRoomId()+" - "+credentialsResponse.headers().map()); - throw new TikTokSignServerException("Sign server did not return the x-set-tt-cookie header"+result.toStack()); + throw new TikTokSignServerException("Sign server did not return the x-set-tt-cookie header - "+result); } var websocketCookie = resultHeader.getContent(); var webcastResponse = WebcastResponse.parseFrom(credentialsResponse.body()); @@ -169,7 +169,7 @@ public class TikTokLiveHttpClient implements LiveHttpClient return new LiveConnectionData.Response(websocketCookie, webSocketUrl, webcastResponse); } catch (InvalidProtocolBufferException e) { - throw new TikTokSignServerException("Unable to parse websocket credentials response to WebcastResponse"+result.toStack()); + throw new TikTokSignServerException("Unable to parse websocket credentials response to WebcastResponse - "+result); } } @@ -197,7 +197,7 @@ public class TikTokLiveHttpClient implements LiveHttpClient var result = builder.build().toResponse(); if (result.isFailure()) - throw new TikTokSignServerException("Unable to get websocket connection credentials"+result.toStack()); + throw new TikTokSignServerException("Unable to get websocket connection credentials - "+result); return result; } diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/common/ActionResult.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/common/ActionResult.java index 34ab7b3..ac8cd60 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/common/ActionResult.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/common/ActionResult.java @@ -1,6 +1,8 @@ package io.github.jwdeveloper.tiktok.common; +import com.google.gson.*; import lombok.Data; +import lombok.experimental.Accessors; import java.util.Optional; import java.util.function.Function; @@ -11,6 +13,8 @@ public class ActionResult { private boolean success = true; private T content; private String message; + @Accessors(chain = true, fluent = true) + private ActionResult previous; protected ActionResult(T object) { this.content = object; @@ -41,8 +45,9 @@ public class ActionResult { public boolean hasMessage() { return message != null; } - public String toStack() { - return hasMessage() ? " - "+message : ""; + + public boolean hasPrevious() { + return previous != null; } public boolean hasContent() { @@ -84,4 +89,18 @@ public class ActionResult { public static ActionResult failure() { return failure(null); } + + public JsonObject toJson() { + JsonObject map = new JsonObject(); + map.addProperty("success", success); + map.add("content", new Gson().toJsonTree(content)); + map.addProperty("message", message); + map.add("previous", hasPrevious() ? previous.toJson() : null); + return map; + } + + @Override + public String toString() { + return "ActionResult: "+new Gson().newBuilder().setPrettyPrinting().create().toJson(toJson()); + } } \ No newline at end of file diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/common/ActionResultBuilder.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/common/ActionResultBuilder.java index 369d35f..f9383d9 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/common/ActionResultBuilder.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/common/ActionResultBuilder.java @@ -1,5 +1,8 @@ package io.github.jwdeveloper.tiktok.common; +import lombok.Setter; +import lombok.experimental.Accessors; + import java.util.Arrays; import java.util.stream.Collectors; @@ -7,6 +10,8 @@ public class ActionResultBuilder { private final T content; private String message; + @Setter @Accessors(fluent = true, chain = true) + private ActionResult previous; public ActionResultBuilder(T content) { this.content = content; @@ -18,10 +23,10 @@ public class ActionResultBuilder } public ActionResult success() { - return ActionResult.success(content, message); + return ActionResult.success(content, message).previous(previous); } public ActionResult failure() { - return ActionResult.success(content, message); + return ActionResult.success(content, message).previous(previous); } } \ No newline at end of file diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/mappers/LiveUserDataMapper.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/mappers/LiveUserDataMapper.java index 6dd2aed..9b9cd4b 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/mappers/LiveUserDataMapper.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/mappers/LiveUserDataMapper.java @@ -22,45 +22,52 @@ */ package io.github.jwdeveloper.tiktok.http.mappers; -import com.google.gson.JsonParser; +import com.google.gson.*; import io.github.jwdeveloper.tiktok.data.requests.LiveUserData; import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveRequestException; +import java.util.logging.Logger; + public class LiveUserDataMapper { - public LiveUserData.Response map(String json) { - var jsonObject = JsonParser.parseString(json).getAsJsonObject(); + public LiveUserData.Response map(String json, Logger logger) { + try { + var jsonObject = JsonParser.parseString(json).getAsJsonObject(); - var message = jsonObject.get("message").getAsString(); + var message = jsonObject.get("message").getAsString(); - if (message.equals("params_error")) { - throw new TikTokLiveRequestException("fetchRoomIdFromTiktokApi -> Unable to fetch roomID, contact the developer"); - } - if (message.equals("user_not_found")) { + if (message.equals("params_error")) { + throw new TikTokLiveRequestException("fetchRoomIdFromTiktokApi -> Unable to fetch roomID, contact the developer"); + } + if (message.equals("user_not_found")) { + return new LiveUserData.Response(json, LiveUserData.UserStatus.NotFound, "", -1); + } + //live -> status 2 + //live paused -> 3 + //not live -> status 4 + var element = jsonObject.get("data"); + if (element.isJsonNull()) { + return new LiveUserData.Response(json, LiveUserData.UserStatus.NotFound, "", -1); + } + var data = element.getAsJsonObject(); + var user = data.getAsJsonObject("user"); + var roomId = user.get("roomId").getAsString(); + var status = user.get("status").getAsInt(); + + var liveRoom = data.getAsJsonObject("liveRoom"); + long startTime = liveRoom.get("startTime").getAsLong(); + + var statusEnum = switch (status) { + case 2 -> LiveUserData.UserStatus.Live; + case 3 -> LiveUserData.UserStatus.LivePaused; + case 4 -> LiveUserData.UserStatus.Offline; + default -> LiveUserData.UserStatus.NotFound; + }; + + return new LiveUserData.Response(json, statusEnum, roomId, startTime); + } catch (JsonSyntaxException e) { + logger.warning("Malformed Json: '"+json+"' - Error Message: "+e.getMessage()); return new LiveUserData.Response(json, LiveUserData.UserStatus.NotFound, "", -1); } - //live -> status 2 - //live paused -> 3 - //not live -> status 4 - var element = jsonObject.get("data"); - if (element.isJsonNull()) { - return new LiveUserData.Response(json, LiveUserData.UserStatus.NotFound, "", -1); - } - var data = element.getAsJsonObject(); - var user = data.getAsJsonObject("user"); - var roomId = user.get("roomId").getAsString(); - var status = user.get("status").getAsInt(); - - var liveRoom = data.getAsJsonObject("liveRoom"); - long startTime = liveRoom.get("startTime").getAsLong(); - - var statusEnum = switch (status) { - case 2 -> LiveUserData.UserStatus.Live; - case 3 -> LiveUserData.UserStatus.LivePaused; - case 4 -> LiveUserData.UserStatus.Offline; - default -> LiveUserData.UserStatus.NotFound; - }; - - return new LiveUserData.Response(json, statusEnum, roomId, startTime); } } \ No newline at end of file