diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/badges/CombineBadge.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/badges/CombineBadge.java index 655efe00..0b240332 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/badges/CombineBadge.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/badges/CombineBadge.java @@ -24,19 +24,22 @@ import io.github.jwdeveloper.tiktok.data.models.Picture; import io.github.jwdeveloper.tiktok.messages.data.BadgeStruct; +import lombok.Getter; +@Getter public class CombineBadge extends Badge { private final Picture picture; private final String text; private final String subText; - public CombineBadge(BadgeStruct.CombineBadge combineBadge) { - picture = Picture.map(combineBadge.getIcon()); text = combineBadge.getText().getDefaultPattern(); subText = combineBadge.getStr(); } - -} + @Override + public String toString() { + return "CombineBadge{picture=" + picture +", text='" + text + "', subText='" + subText + "'}"; + } +} \ No newline at end of file diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/badges/PictureBadge.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/badges/PictureBadge.java index 3dbba78a..409662aa 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/badges/PictureBadge.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/badges/PictureBadge.java @@ -24,12 +24,18 @@ import io.github.jwdeveloper.tiktok.data.models.Picture; import io.github.jwdeveloper.tiktok.messages.data.BadgeStruct; +import lombok.Getter; +@Getter public class PictureBadge extends Badge { - private final Picture picture; - public PictureBadge(BadgeStruct.ImageBadge imageBadge) { + public PictureBadge(BadgeStruct.ImageBadge imageBadge) { picture = Picture.map(imageBadge.getImage()); } -} + + @Override + public String toString() { + return "PictureBadge{picture=" + picture + "}"; + } +} \ No newline at end of file diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/badges/StringBadge.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/badges/StringBadge.java index 4f241b3e..68d64be3 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/badges/StringBadge.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/badges/StringBadge.java @@ -23,12 +23,18 @@ package io.github.jwdeveloper.tiktok.data.models.badges; import io.github.jwdeveloper.tiktok.messages.data.BadgeStruct; +import lombok.Getter; +@Getter public class StringBadge extends Badge { + private final String text; - public String text; public StringBadge(BadgeStruct.StringBadge stringBadge) { - this.text = stringBadge.getStr(); } -} + + @Override + public String toString() { + return "StringBadge{text='" + text + "'}"; + } +} \ No newline at end of file diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/badges/TextBadge.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/badges/TextBadge.java index cf62a345..d736569d 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/badges/TextBadge.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/badges/TextBadge.java @@ -23,13 +23,18 @@ package io.github.jwdeveloper.tiktok.data.models.badges; import io.github.jwdeveloper.tiktok.messages.data.BadgeStruct; +import lombok.Getter; -public class TextBadge extends Badge -{ +@Getter +public class TextBadge extends Badge { private final String text; - public TextBadge(BadgeStruct.TextBadge textBadge) - { + public TextBadge(BadgeStruct.TextBadge textBadge) { this.text = textBadge.getDefaultPattern(); } -} + + @Override + public String toString() { + return "TextBadge{text='" + text + "'}"; + } +} \ No newline at end of file diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/HttpUtils.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/HttpUtils.java index 10c441ff..ada69914 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/HttpUtils.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/HttpUtils.java @@ -22,58 +22,30 @@ */ package io.github.jwdeveloper.tiktok.http; -import lombok.SneakyThrows; - import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.Map; +import java.util.stream.Collectors; public class HttpUtils { public static String parseParameters(String url, Map parameters) { - var parameterString = ""; - if (!parameters.isEmpty()) { - var builder = new StringBuilder(); - builder.append("?"); - var first = false; - for (var param : parameters.entrySet()) { - - if (first) { - builder.append("&"); - } - builder.append(param.getKey()).append("=").append(param.getValue()); - first = true; - } - parameterString = builder.toString(); - } + if (parameters.isEmpty()) + return url; - return url+parameterString; + return url+ "?" + parameters.entrySet().stream().map(entry -> entry.getKey()+"="+entry.getValue()).collect(Collectors.joining("&")); } - @SneakyThrows public static String parseParametersEncode(String url, Map parameters) { - - var parameterString = ""; - if (!parameters.isEmpty()) { - var builder = new StringBuilder(); - builder.append("?"); - var first = false; - for (var param : parameters.entrySet()) { - - if (first) { - builder.append("&"); - } - - final String encodedKey = URLEncoder.encode(param.getKey(), StandardCharsets.UTF_8); - final String encodedValue = URLEncoder.encode(param.getValue().toString(), StandardCharsets.UTF_8); - builder.append(encodedKey).append("=").append(encodedValue); - first = true; - } - parameterString = builder.toString(); - } - - return url+parameterString; + if (parameters.isEmpty()) + return url; + + return url+ "?" + parameters.entrySet().stream().map(entry -> { + String encodedKey = URLEncoder.encode(entry.getKey(), StandardCharsets.UTF_8); + String encodedValue = URLEncoder.encode(entry.getValue().toString(), StandardCharsets.UTF_8); + return encodedKey+"="+encodedValue; + }).collect(Collectors.joining("&")); } -} +} \ No newline at end of file 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 4ec76329..344f7f69 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 @@ -73,7 +73,7 @@ public TikTokUserInfo fetchUserInfoFromTikTokApi(String userName) { var message = roomData.get("message").getAsString(); if (message.equals("params_error")) { - throw new TikTokLiveRequestException("fetchRoomIdFromTiktokApi -> Unable to fetch roomID, contact with developer"); + throw new TikTokLiveRequestException("fetchRoomIdFromTiktokApi -> Unable to fetch roomID, contact the developer"); } if (message.equals("user_not_found")) { return new TikTokUserInfo(TikTokUserInfo.UserStatus.NotFound, "", -1); @@ -81,7 +81,11 @@ public TikTokUserInfo fetchUserInfoFromTikTokApi(String userName) { //live -> status 2 //live paused -> 3 //not live -> status 4 - var data = roomData.getAsJsonObject("data"); + var element = roomData.get("data"); + if (element.isJsonNull()) { + return new TikTokUserInfo(TikTokUserInfo.UserStatus.NotFound, "", -1); + } + var data = element.getAsJsonObject(); var user = data.getAsJsonObject("user"); var roomId = user.get("roomId").getAsString(); var status = user.get("status").getAsInt(); diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokCookieJar.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokCookieJar.java index 951138a6..046d7c5f 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokCookieJar.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokCookieJar.java @@ -22,9 +22,8 @@ */ package io.github.jwdeveloper.tiktok.http; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; +import java.util.*; +import java.util.stream.Collectors; public class TikTokCookieJar { private final Map cookies; @@ -40,13 +39,10 @@ public void set(String key, String value) { cookies.put(key, value); } - public String parseCookies() - { - var sb = new StringBuilder(); - for(var entry : cookies.entrySet()) - { - sb.append(entry.getKey()).append("=").append(entry.getValue()).append(";"); - } - return sb.toString(); + public String parseCookies() { + return cookies.entrySet() + .stream() + .map(entry -> entry.getKey()+"="+entry.getValue()+";") + .collect(Collectors.joining()); } -} +} \ No newline at end of file diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokHttpClient.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokHttpClient.java index dd527814..cb44e760 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokHttpClient.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokHttpClient.java @@ -45,8 +45,7 @@ public TikTokHttpClient(TikTokCookieJar tikTokCookieJar, TikTokHttpRequestFactor this.tikTokCookieJar = tikTokCookieJar; } - public void setSessionId(String sessionId) - { + public void setSessionId(String sessionId) { tikTokCookieJar.set("sessionid", sessionId); tikTokCookieJar.set("sessionid_ss", sessionId); tikTokCookieJar.set("sid_tt", sessionId); @@ -54,14 +53,12 @@ public void setSessionId(String sessionId) public String getLivestreamPage(String userName) { - var url = Constants.TIKTOK_URL_WEB + "@" + userName + "/live/"; var get = getRequest(url, null); return get; } - public JsonObject getJsonFromTikTokApi(String path, Map params) - { + public JsonObject getJsonFromTikTokApi(String path, Map params) { var get = getRequest(Constants.TIKTOK_URL_WEB + path, params); var json = JsonParser.parseString(get); var jsonObject = json.getAsJsonObject(); @@ -117,7 +114,6 @@ private byte[] getSignRequest(String url, Map parameters) { { var split = cookie.split(";")[0].split("="); - var key = split[0]; var value = split[1]; tikTokCookieJar.set(key, value); @@ -133,7 +129,6 @@ private byte[] getSignRequest(String url, Map parameters) { private String getSignedUrl(String url, Map parameters) { - var fullUrl = HttpUtils.parseParameters(url,parameters); var signParams = new TreeMap(); signParams.put("client", "ttlive-java"); @@ -143,7 +138,6 @@ private String getSignedUrl(String url, Map parameters) { var request = requestFactory.setQueries(signParams); var content = request.get(Constants.TIKTOK_SIGN_API); - try { var json = JsonParser.parseString(content); var jsonObject = json.getAsJsonObject(); @@ -157,4 +151,4 @@ private String getSignedUrl(String url, Map parameters) { } } -} +} \ No newline at end of file diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokHttpRequestFactory.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokHttpRequestFactory.java index 79a10ef2..63580638 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokHttpRequestFactory.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokHttpRequestFactory.java @@ -42,6 +42,7 @@ import java.util.List; import java.util.Map; import java.util.TreeMap; +import java.util.stream.Collectors; public class TikTokHttpRequestFactory implements TikTokHttpRequest { private final CookieManager cookieManager; @@ -122,18 +123,16 @@ public TikTokHttpRequest setAgent(String value) { public TikTokHttpRequest setQueries(Map queries) { if (queries == null) return this; - var testMap = new TreeMap(queries); - query = String.join("&", testMap.entrySet().stream().map(x -> - { + var testMap = new TreeMap<>(queries); + query = testMap.entrySet().stream().map(x -> { var key = x.getKey(); - var value = ""; try { - value = URLEncoder.encode(x.getValue().toString(), StandardCharsets.UTF_8); + return key+"="+URLEncoder.encode(x.getValue().toString(), StandardCharsets.UTF_8); } catch (Exception e) { e.printStackTrace(); + return key + "="; } - return key + "=" + value; - }).toList()); + }).collect(Collectors.joining("&")); return this; } @@ -162,10 +161,7 @@ private String getContent(HttpRequest request) throws Exception { var map = new HashMap>(); map.put(key, List.of(value)); cookieManager.put(uri, map); - } return response.body(); } - - -} +} \ No newline at end of file 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 c33ec297..410bb74b 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 @@ -115,8 +115,8 @@ private ListenerBindingModel bindToEvents(TikTokEventListener listener) { throw new TikTokEventListenerMethodException(e); } }; - eventsMap.computeIfAbsent(eventClazz, (a) -> new ArrayList>()).add(eventMethodRef); + eventsMap.computeIfAbsent(eventClazz, (a) -> new ArrayList<>()).add(eventMethodRef); } return new ListenerBindingModel(listener, eventsMap); } -} +} \ No newline at end of file diff --git a/Client/src/test/java/io/github/jwdeveloper/tiktok/http/HttpUtilsTest.java b/Client/src/test/java/io/github/jwdeveloper/tiktok/http/HttpUtilsTest.java new file mode 100644 index 00000000..c32a18e6 --- /dev/null +++ b/Client/src/test/java/io/github/jwdeveloper/tiktok/http/HttpUtilsTest.java @@ -0,0 +1,47 @@ +package io.github.jwdeveloper.tiktok.http; + +import org.junit.Test; +import org.junit.jupiter.api.Assertions; + +import java.util.*; + +public class HttpUtilsTest +{ + @Test + public void parseParameters_EmptyParameters_ShouldHaveNoParameters() + { + String parsed = HttpUtils.parseParameters("https://webcast.tiktok.com/webcast/im/fetch/", new HashMap<>()); + + Assertions.assertEquals("https://webcast.tiktok.com/webcast/im/fetch/", parsed); + } + + @Test + public void parseParameters_ValidParameters_ShouldConstructValidURL() + { + LinkedHashMap testMap = new LinkedHashMap<>(); + testMap.put("room_id", 1); + testMap.put("uniqueId", "randomName"); + String parsed = HttpUtils.parseParameters("https://webcast.tiktok.com/webcast/im/fetch/", testMap); + + Assertions.assertEquals("https://webcast.tiktok.com/webcast/im/fetch/?room_id=1&uniqueId=randomName", parsed); + } + + @Test + public void parseParametersEncode_EmptyParameters_ShouldHaveNoParameters() + { + String parsed = HttpUtils.parseParametersEncode("https://webcast.tiktok.com/webcast/im/fetch/", new HashMap<>()); + + Assertions.assertEquals("https://webcast.tiktok.com/webcast/im/fetch/", parsed); + } + + @Test + public void parseParametersEncode_ValidParameters_ShouldConstructValidURL() + { + LinkedHashMap testMap = new LinkedHashMap<>(); + testMap.put("room_id", 1); + testMap.put("root_referer", "https://www.tiktok.com/"); + String parsed = HttpUtils.parseParametersEncode("https://webcast.tiktok.com/webcast/im/fetch/", testMap); + + Assertions.assertEquals("https://webcast.tiktok.com/webcast/im/fetch/?room_id=1&root_referer=https%3A%2F%2Fwww.tiktok.com%2F", parsed); + } +} \ No newline at end of file