From 947c9c49a2ee7792b09c9b3ce89480bc20787df9 Mon Sep 17 00:00:00 2001 From: kohlerpop1 Date: Sat, 29 Jun 2024 23:28:49 -0400 Subject: [PATCH] Improve addProxy(String addressPort) in ProxyClientSettings Added @param action description and return values Optimized methods in TikTokLiveMapper Optimized Thread in TikTokWebSocketPingingTask Optimized TikTokLiveEventHandler and TikTokLiveMessageHandler methods --- .../data/settings/ProxyClientSettings.java | 4 +- .../tiktok/live/builder/EventsBuilder.java | 63 +++++++++---------- .../tiktok/TikTokLiveClientBuilder.java | 10 +-- .../tiktok/TikTokLiveEventHandler.java | 37 +++-------- .../tiktok/TikTokLiveMessageHandler.java | 29 +++++---- .../tiktok/mappers/TikTokLiveMapper.java | 32 +++------- .../websocket/TikTokWebSocketPingingTask.java | 16 ++--- 7 files changed, 71 insertions(+), 120 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 fa457f8..ad5ce17 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 @@ -41,7 +41,7 @@ public class ProxyClientSettings implements Iterator, Iterable onProxyUpdated = x -> {}; public boolean addProxy(String addressPort) { - return proxyList.add(ProxyData.map(addressPort)); + return addProxy(ProxyData.map(addressPort).toSocketAddress()); } public boolean addProxy(String address, int port) { @@ -117,7 +117,7 @@ public class ProxyClientSettings implements Iterator, Iterable interface you can use this object inside For loop! + * With {@code Iterable} interface, you can use this object inside for loop! */ @Override public Iterator iterator() { diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/EventsBuilder.java b/API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/EventsBuilder.java index 5083c57..c5dfb7a 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/EventsBuilder.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/EventsBuilder.java @@ -52,77 +52,70 @@ public interface EventsBuilder { /** * Invoked whenever any event is triggered * - * @param action - * @return + * @param action consumable action + * @return self instance */ T onEvent(EventConsumer action); /** * Invoked when information about room (live) got updated such as viewer count, etc.. * - * @param action - * @return + * @param action consumable action + * @return self instance */ T onRoomInfo(EventConsumer action); /** * Invoked when someone send message to chat - * - * @param action - * @return + * @param action consumable action + * @return self instance */ T onComment(EventConsumer action); - /** * Invoked when TikTokLiveJava makes http request and getting response - * - * @param action - * @return + * @param action consumable action + * @return self instance */ T onHttpResponse(EventConsumer action); /** * Invoked when TikTok protocolBuffer data "message" was successfully mapped to event * events contains protocol-buffer "Message" and TikTokLiveJava "Event" - * - * @param action - * @return + * @param action consumable action + * @return self instance */ T onWebsocketMessage(EventConsumer action); /** * Invoked when there was not found event mapper for TikTok protocolBuffer data "message" - * - * @param action - * @return + * @param action consumable action + * @return self instance */ T onWebsocketUnhandledMessage(EventConsumer action); /** * Invoked every time TikTok sends protocolBuffer data to websocket * Response contains list of messages that are later mapped to events - * @param action - * @return + * @param action consumable action + * @return self instance */ T onWebsocketResponse(EventConsumer action); - /** * Invoked for gifts that has no combo, or when combo finishes - * @param action - * @return + * @param action consumable action + * @return self instance */ T onGift(EventConsumer action); /** * Invoked for gifts that has combo options such as roses - * @param action - * @return + * @param action consumable action + * @return self instance */ T onGiftCombo(EventConsumer action); - T onQuestion(EventConsumer action); T onSubscribe(EventConsumer action); @@ -145,36 +138,36 @@ public interface EventsBuilder { /** * Invoked when client has been successfully connected to live - * @param action - * @return + * @param action consumable action + * @return self instance */ T onConnected(EventConsumer action); /** * Invoked before client has been successfully connected to live - * @param action - * @return + * @param action consumable action + * @return self instance */ T onPreConnection(EventConsumer action); /** * Invoked when client tries to reconnect - * @param action - * @return + * @param action consumable action + * @return self instance */ T onReconnecting(EventConsumer action); /** * Invoked when client disconnected - * @param action - * @return + * @param action consumable action + * @return self instance */ T onDisconnected(EventConsumer action); /** * Invoked when exception was throed inside client or event handler - * @param action - * @return + * @param action consumable action + * @return self instance */ T onError(EventConsumer action); diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java index 68bacae..a65a009 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java @@ -148,11 +148,11 @@ public class TikTokLiveClientBuilder implements LiveClientBuilder { dependance.registerSingleton(LiveHttpClient.class, TikTokLiveHttpClient.class); } - /** TODO in future, custom proxy implementation that can be provided via builder - * if(customProxy != null) - * dependance.registerSingleton(TikTokProxyProvider.class,customProxy); - * else - * dependance.registerSingleton(TikTokProxyProvider.class,DefaultProxyProvider.class); + /* TODO in future, custom proxy implementation that can be provided via builder + * if(customProxy != null) + * dependance.registerSingleton(TikTokProxyProvider.class,customProxy); + * else + * dependance.registerSingleton(TikTokProxyProvider.class,DefaultProxyProvider.class); */ //gifts diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveEventHandler.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveEventHandler.java index cbeaf99..6da780d 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveEventHandler.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveEventHandler.java @@ -26,10 +26,7 @@ import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent; import io.github.jwdeveloper.tiktok.live.builder.EventConsumer; import io.github.jwdeveloper.tiktok.live.LiveClient; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; +import java.util.*; public class TikTokLiveEventHandler { private final Map, Set> events; @@ -39,16 +36,8 @@ public class TikTokLiveEventHandler { } public void publish(LiveClient tikTokLiveClient, TikTokEvent tikTokEvent) { - if (events.containsKey(TikTokEvent.class)) { - var handlers = events.get(TikTokEvent.class); - handlers.forEach(handler -> handler.onEvent(tikTokLiveClient,tikTokEvent)); - } - - if (!events.containsKey(tikTokEvent.getClass())) { - return; - } - var handlers = events.get(tikTokEvent.getClass()); - handlers.forEach(handler -> handler.onEvent(tikTokLiveClient,tikTokEvent)); + Optional.ofNullable(events.get(TikTokEvent.class)).ifPresent(handlers -> handlers.forEach(handler -> handler.onEvent(tikTokLiveClient, tikTokEvent))); + Optional.ofNullable(events.get(tikTokEvent.getClass())).ifPresent(handlers -> handlers.forEach(handler -> handler.onEvent(tikTokLiveClient, tikTokEvent))); } public void subscribe(Class clazz, EventConsumer event) { @@ -60,21 +49,11 @@ public class TikTokLiveEventHandler { } public void unsubscribe(EventConsumer consumer) { - for (var entry : events.entrySet()) { - entry.getValue().remove(consumer); - } + events.forEach((key, value) -> value.remove(consumer)); } public void unsubscribe(Class clazz, EventConsumer consumer) { - if (clazz == null) { - return; - } - - if (!events.containsKey(clazz)) { - return; - } - - var eventSet = events.get(clazz); - eventSet.remove(consumer); - } -} + if (clazz != null) + Optional.ofNullable(events.get(clazz)).ifPresent(eventConsumers -> eventConsumers.remove(consumer)); + } +} \ No newline at end of file diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveMessageHandler.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveMessageHandler.java index 8ebb6fc..c0ffc12 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveMessageHandler.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveMessageHandler.java @@ -44,7 +44,7 @@ public class TikTokLiveMessageHandler { public TikTokLiveMessageHandler(TikTokLiveEventHandler tikTokEventHandler, TikTokMapper mapper) { this.tikTokEventHandler = tikTokEventHandler; - this.mapper = (TikTokLiveMapper)mapper; + this.mapper = (TikTokLiveMapper) mapper; } public void handle(LiveClient client, WebcastResponse webcastResponse) { @@ -62,20 +62,19 @@ public class TikTokLiveMessageHandler { public void handleSingleMessage(LiveClient client, WebcastResponse.Message message) { var messageClassName = message.getMethod(); - if (!mapper.isRegistered(messageClassName)) { - tikTokEventHandler.publish(client, new TikTokWebsocketUnhandledMessageEvent(message)); - return; - } - var stopwatch = new Stopwatch(); - stopwatch.start(); - var events = mapper.handleMapping(messageClassName, message.getPayload().toByteArray()); - var handlingTimeInMs = stopwatch.stop(); - var metadata = new MessageMetaData(Duration.ofNanos(handlingTimeInMs)); + if (!mapper.isRegistered(messageClassName)) + tikTokEventHandler.publish(client, new TikTokWebsocketUnhandledMessageEvent(message)); + else { + var stopwatch = new Stopwatch(); + stopwatch.start(); + var events = mapper.handleMapping(messageClassName, message.getPayload().toByteArray()); + var handlingTimeInMs = stopwatch.stop(); + var metadata = new MessageMetaData(Duration.ofNanos(handlingTimeInMs)); - for (var event : events) { - tikTokEventHandler.publish(client, new TikTokWebsocketMessageEvent(message, event, metadata)); - tikTokEventHandler.publish(client, event); + for (var event : events) { + tikTokEventHandler.publish(client, new TikTokWebsocketMessageEvent(message, event, metadata)); + tikTokEventHandler.publish(client, event); + } } } - -} +} \ No newline at end of file diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokLiveMapper.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokLiveMapper.java index 99e79f5..4fe6dd4 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokLiveMapper.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokLiveMapper.java @@ -23,14 +23,10 @@ package io.github.jwdeveloper.tiktok.mappers; import com.google.protobuf.GeneratedMessageV3; -import io.github.jwdeveloper.tiktok.TikTokLive; import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent; -import io.github.jwdeveloper.tiktok.mappers.data.MappingAction; -import io.github.jwdeveloper.tiktok.mappers.data.MappingResult; +import io.github.jwdeveloper.tiktok.mappers.data.*; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.function.Function; public class TikTokLiveMapper implements TikTokMapper { @@ -47,11 +43,7 @@ public class TikTokLiveMapper implements TikTokMapper { @Override public TikTokMapperModel forMessage(String messageName) { - if (!isRegistered(messageName)) { - var model = new TikTokLiveMapperModel(messageName); - mappers.put(messageName, model); - } - return mappers.get(messageName); + return mappers.computeIfAbsent(messageName, TikTokLiveMapperModel::new); } @Override @@ -66,7 +58,6 @@ public class TikTokLiveMapper implements TikTokMapper { return model; } - @Override public TikTokMapperModel forMessage(Class mapperName, MappingAction onMapping) { var model = forMessage(mapperName); @@ -84,7 +75,6 @@ public class TikTokLiveMapper implements TikTokMapper { return globalMapperModel; } - public boolean isRegistered(String mapperName) { return mappers.containsKey(mapperName); } @@ -94,23 +84,19 @@ public class TikTokLiveMapper implements TikTokMapper { } public List handleMapping(String messageName, byte[] bytes) { - if (!isRegistered(messageName)) { - return List.of(); - } var mapperModel = mappers.get(messageName); + if (mapperModel == null) + return List.of(); var inputBytes = mapperModel.getOnBeforeMapping().onMapping(bytes, messageName, mapperUtils); var globalInputBytes = globalMapperModel.getOnBeforeMapping().onMapping(inputBytes, messageName, mapperUtils); - var mappingResult = mapperModel.getOnMapping().onMapping(globalInputBytes, messageName, mapperUtils); - if (mappingResult == null) { - mappingResult = globalMapperModel.getOnMapping().onMapping(globalInputBytes, messageName, mapperUtils); - } + if (mappingResult == null) + mappingResult = globalMapperModel.getOnMapping().onMapping(globalInputBytes, messageName, mapperUtils); var afterMappingResult = mapperModel.getOnAfterMapping().apply(mappingResult); - var globalAfterMappingResult = globalMapperModel.getOnAfterMapping().apply(MappingResult.of(mappingResult.getSource(), afterMappingResult)); - return globalAfterMappingResult; + return globalMapperModel.getOnAfterMapping().apply(MappingResult.of(mappingResult.getSource(), afterMappingResult)); } -} +} \ No newline at end of file diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketPingingTask.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketPingingTask.java index 65f2ce0..12e166e 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketPingingTask.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketPingingTask.java @@ -24,8 +24,6 @@ package io.github.jwdeveloper.tiktok.websocket; import org.java_websocket.WebSocket; -import java.util.Random; - public class TikTokWebSocketPingingTask { private Thread thread; @@ -36,8 +34,7 @@ public class TikTokWebSocketPingingTask public void run(WebSocket webSocket, long pingTaskTime) { stop(); - thread = new Thread(() -> pingTask(webSocket, pingTaskTime)); - thread.setName("pinging-task"); + thread = new Thread(() -> pingTask(webSocket, pingTaskTime), "pinging-task"); isRunning = true; thread.start(); } @@ -51,16 +48,13 @@ public class TikTokWebSocketPingingTask private void pingTask(WebSocket webSocket, long pingTaskTime) { - var random = new Random(); while (isRunning) { try { - if (!webSocket.isOpen()) { + if (webSocket.isOpen()) { + webSocket.sendPing(); + Thread.sleep(pingTaskTime+(int)(Math.random() * MAX_TIMEOUT)); + } else Thread.sleep(SLEEP_TIME); - continue; - } - webSocket.sendPing(); - - Thread.sleep(pingTaskTime+random.nextInt(MAX_TIMEOUT)); } catch (Exception e) { //TODO we should display some kind of error message