From 1736236ccf16041e51ad0774d1a5922791594fa4 Mon Sep 17 00:00:00 2001 From: "jacek.wolniewicz" Date: Mon, 1 Jul 2024 22:19:07 +0200 Subject: [PATCH] Due to convention, interfaces should not have TikTok name inside, but they should have prefix Live instead - rename TikTokMapper to LiveMapper - rename TikTokLiveMapperHelper to LiveMapperHelper Create interface: LiveEventsHandler for TikTokLiveEventHandler LiveMessagesHandler for TikTokLiveMessageHandler --- .../tiktok/live/LiveEventsHandler.java | 19 ++++++ .../tiktok/live/LiveMessagesHandler.java | 18 +++++ .../live/builder/LiveClientBuilder.java | 4 +- .../{TikTokMapper.java => LiveMapper.java} | 7 +- ...apperHelper.java => LiveMapperHelper.java} | 2 +- .../tiktok/mappers/data/MappingAction.java | 4 +- .../jwdeveloper/tiktok/TikTokLiveClient.java | 67 +++++++------------ .../tiktok/TikTokLiveClientBuilder.java | 25 +++---- .../tiktok/TikTokLiveEventHandler.java | 3 +- .../tiktok/TikTokLiveMessageHandler.java | 21 +++--- .../tiktok/http/HttpClientFactory.java | 9 --- .../listener/TikTokListenersManager.java | 5 +- .../tiktok/mappers/MessagesMapperFactory.java | 5 +- .../tiktok/mappers/TikTokLiveMapper.java | 6 +- .../mappers/TikTokLiveMapperHelper.java | 2 +- .../handlers/TikTokGiftEventHandler.java | 4 +- .../handlers/TikTokRoomInfoEventHandler.java | 6 +- .../websocket/TikTokWebSocketClient.java | 31 ++++++--- .../websocket/TikTokWebSocketListener.java | 10 +-- .../TikTokWebSocketOfflineClient.java | 5 +- .../websocket/TikTokWebSocketPingingTask.java | 20 +++--- .../tiktok/common/TikTokBaseTest.java | 55 --------------- .../tiktok/gifts/TikTokGiftManagerTest.java | 38 ----------- 23 files changed, 140 insertions(+), 226 deletions(-) create mode 100644 API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveEventsHandler.java create mode 100644 API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveMessagesHandler.java rename API/src/main/java/io/github/jwdeveloper/tiktok/mappers/{TikTokMapper.java => LiveMapper.java} (95%) rename API/src/main/java/io/github/jwdeveloper/tiktok/mappers/{TikTokMapperHelper.java => LiveMapperHelper.java} (98%) delete mode 100644 Client/src/test/java/io/github/jwdeveloper/tiktok/common/TikTokBaseTest.java delete mode 100644 Client/src/test/java/io/github/jwdeveloper/tiktok/gifts/TikTokGiftManagerTest.java diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveEventsHandler.java b/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveEventsHandler.java new file mode 100644 index 0000000..f3e589d --- /dev/null +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveEventsHandler.java @@ -0,0 +1,19 @@ +package io.github.jwdeveloper.tiktok.live; + +import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent; +import io.github.jwdeveloper.tiktok.live.builder.EventConsumer; + +import java.util.HashSet; +import java.util.Optional; + +public interface LiveEventsHandler { + void publish(LiveClient tikTokLiveClient, TikTokEvent tikTokEvent); + + void subscribe(Class clazz, EventConsumer event); + + void unsubscribeAll(Class clazz); + + void unsubscribe(EventConsumer consumer); + + void unsubscribe(Class clazz, EventConsumer consumer); +} diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveMessagesHandler.java b/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveMessagesHandler.java new file mode 100644 index 0000000..5c8ee90 --- /dev/null +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveMessagesHandler.java @@ -0,0 +1,18 @@ +package io.github.jwdeveloper.tiktok.live; + +import io.github.jwdeveloper.tiktok.data.dto.MessageMetaData; +import io.github.jwdeveloper.tiktok.data.events.TikTokErrorEvent; +import io.github.jwdeveloper.tiktok.data.events.websocket.TikTokWebsocketMessageEvent; +import io.github.jwdeveloper.tiktok.data.events.websocket.TikTokWebsocketResponseEvent; +import io.github.jwdeveloper.tiktok.data.events.websocket.TikTokWebsocketUnhandledMessageEvent; +import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveMessageException; +import io.github.jwdeveloper.tiktok.messages.webcast.WebcastResponse; +import io.github.jwdeveloper.tiktok.utils.Stopwatch; + +import java.time.Duration; + +public interface LiveMessagesHandler { + void handle(LiveClient client, WebcastResponse webcastResponse); + + void handleSingleMessage(LiveClient client, WebcastResponse.Message message); +} diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/LiveClientBuilder.java b/API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/LiveClientBuilder.java index 4d230ed..26c6004 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/LiveClientBuilder.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/LiveClientBuilder.java @@ -26,7 +26,7 @@ import io.github.jwdeveloper.dependance.implementation.DependanceContainerBuilde import io.github.jwdeveloper.tiktok.data.settings.LiveClientSettings; import io.github.jwdeveloper.tiktok.listener.TikTokEventListener; import io.github.jwdeveloper.tiktok.live.LiveClient; -import io.github.jwdeveloper.tiktok.mappers.TikTokMapper; +import io.github.jwdeveloper.tiktok.mappers.LiveMapper; import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; @@ -42,7 +42,7 @@ public interface LiveClientBuilder extends EventsBuilder { * @param onCustomMappings lambda method * @return */ - LiveClientBuilder onMapping(Consumer onCustomMappings); + LiveClientBuilder onMapping(Consumer onCustomMappings); /** diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokMapper.java b/API/src/main/java/io/github/jwdeveloper/tiktok/mappers/LiveMapper.java similarity index 95% rename from API/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokMapper.java rename to API/src/main/java/io/github/jwdeveloper/tiktok/mappers/LiveMapper.java index 479a386..d77b04b 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokMapper.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/mappers/LiveMapper.java @@ -27,9 +27,10 @@ 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 java.util.List; import java.util.function.Function; -public interface TikTokMapper { +public interface LiveMapper { /** * when mapper is not found for messageName, TikTokLiveException is thrown @@ -40,7 +41,6 @@ public interface TikTokMapper { TikTokMapperModel forMessage(String messageName); /** - * * @param mapperName protocol buffer class type * @return */ @@ -54,10 +54,9 @@ public interface TikTokMapper { TikTokMapperModel forAnyMessage(); + List handleMapping(String messageName, byte[] bytes); boolean isRegistered(String mapperName); boolean isRegistered(Class mapperName); - - } diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokMapperHelper.java b/API/src/main/java/io/github/jwdeveloper/tiktok/mappers/LiveMapperHelper.java similarity index 98% rename from API/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokMapperHelper.java rename to API/src/main/java/io/github/jwdeveloper/tiktok/mappers/LiveMapperHelper.java index 7ae5d9d..e03a1ac 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokMapperHelper.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/mappers/LiveMapperHelper.java @@ -26,7 +26,7 @@ import com.google.protobuf.GeneratedMessageV3; import io.github.jwdeveloper.tiktok.exceptions.TikTokMessageMappingException; import io.github.jwdeveloper.tiktok.utils.ProtoBufferObject; -public interface TikTokMapperHelper { +public interface LiveMapperHelper { /** * @param bytes protocol buffer data bytes diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/mappers/data/MappingAction.java b/API/src/main/java/io/github/jwdeveloper/tiktok/mappers/data/MappingAction.java index aefe059..e957cc0 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/mappers/data/MappingAction.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/mappers/data/MappingAction.java @@ -22,7 +22,7 @@ */ package io.github.jwdeveloper.tiktok.mappers.data; -import io.github.jwdeveloper.tiktok.mappers.TikTokMapperHelper; +import io.github.jwdeveloper.tiktok.mappers.LiveMapperHelper; @FunctionalInterface public interface MappingAction { @@ -33,6 +33,6 @@ public interface MappingAction { * @param mapperHelper utils and helper methods that can be use to debbug/display/deserialize protocol buffer data * @return */ - T onMapping(byte[] inputBytes, String messageName, TikTokMapperHelper mapperHelper); + T onMapping(byte[] inputBytes, String messageName, LiveMapperHelper mapperHelper); } 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 b2aac4e..90bf1cf 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java @@ -23,7 +23,6 @@ package io.github.jwdeveloper.tiktok; import com.google.protobuf.ByteString; -import io.github.jwdeveloper.dependance.injector.api.annotations.Inject; import io.github.jwdeveloper.tiktok.data.events.*; import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent; import io.github.jwdeveloper.tiktok.data.events.control.*; @@ -38,22 +37,24 @@ import io.github.jwdeveloper.tiktok.live.*; import io.github.jwdeveloper.tiktok.messages.webcast.WebcastResponse; import io.github.jwdeveloper.tiktok.models.ConnectionState; import io.github.jwdeveloper.tiktok.websocket.SocketClient; +import lombok.Getter; import java.util.Base64; import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; import java.util.logging.Logger; +@Getter public class TikTokLiveClient implements LiveClient { - private final TikTokRoomInfo liveRoomInfo; + private final TikTokRoomInfo roomInfo; private final LiveHttpClient httpClient; private final SocketClient webSocketClient; - private final TikTokLiveEventHandler tikTokEventHandler; + private final LiveEventsHandler tikTokEventHandler; private final LiveClientSettings clientSettings; private final ListenersManager listenersManager; private final Logger logger; - private final GiftsManager giftsManager; + private final GiftsManager giftManager; private final TikTokLiveMessageHandler messageHandler; public TikTokLiveClient( @@ -67,8 +68,8 @@ public class TikTokLiveClient implements LiveClient ListenersManager listenersManager, Logger logger) { this.messageHandler = messageHandler; - this.giftsManager = giftsManager; - this.liveRoomInfo = tikTokLiveMeta; + this.giftManager = giftsManager; + this.roomInfo = tikTokLiveMeta; this.httpClient = tiktokHttpClient; this.webSocketClient = webSocketClient; this.tikTokEventHandler = tikTokEventHandler; @@ -119,45 +120,45 @@ public class TikTokLiveClient implements LiveClient } public void tryConnect() { - if (!liveRoomInfo.hasConnectionState(ConnectionState.DISCONNECTED)) { + if (!roomInfo.hasConnectionState(ConnectionState.DISCONNECTED)) { throw new TikTokLiveException("Already connected"); } setState(ConnectionState.CONNECTING); tikTokEventHandler.publish(this, new TikTokConnectingEvent()); - var userDataRequest = new LiveUserData.Request(liveRoomInfo.getHostName()); + var userDataRequest = new LiveUserData.Request(roomInfo.getHostName()); var userData = httpClient.fetchLiveUserData(userDataRequest); - liveRoomInfo.setStartTime(userData.getStartTime()); - liveRoomInfo.setRoomId(userData.getRoomId()); + roomInfo.setStartTime(userData.getStartTime()); + roomInfo.setRoomId(userData.getRoomId()); if (clientSettings.isFetchGifts()) - giftsManager.attachGiftsList(httpClient.fetchRoomGiftsData(userData.getRoomId()).getGifts()); + giftManager.attachGiftsList(httpClient.fetchRoomGiftsData(userData.getRoomId()).getGifts()); if (userData.getUserStatus() == LiveUserData.UserStatus.Offline) - throw new TikTokLiveOfflineHostException("User is offline: " + liveRoomInfo.getHostName()); + throw new TikTokLiveOfflineHostException("User is offline: " + roomInfo.getHostName()); if (userData.getUserStatus() == LiveUserData.UserStatus.NotFound) - throw new TikTokLiveOfflineHostException("User not found: " + liveRoomInfo.getHostName()); + throw new TikTokLiveOfflineHostException("User not found: " + roomInfo.getHostName()); var liveDataRequest = new LiveData.Request(userData.getRoomId()); var liveData = httpClient.fetchLiveData(liveDataRequest); if (liveData.isAgeRestricted() && clientSettings.isThrowOnAgeRestriction()) - throw new TikTokLiveException("Livestream for " + liveRoomInfo.getHostName() + " is 18+ or age restricted!"); + throw new TikTokLiveException("Livestream for " + roomInfo.getHostName() + " is 18+ or age restricted!"); if (liveData.getLiveStatus() == LiveData.LiveStatus.HostNotFound) - throw new TikTokLiveOfflineHostException("LiveStream for " + liveRoomInfo.getHostName() + " could not be found."); + throw new TikTokLiveOfflineHostException("LiveStream for " + roomInfo.getHostName() + " could not be found."); if (liveData.getLiveStatus() == LiveData.LiveStatus.HostOffline) - throw new TikTokLiveOfflineHostException("LiveStream for " + liveRoomInfo.getHostName() + " not found, is the Host offline?"); + throw new TikTokLiveOfflineHostException("LiveStream for " + roomInfo.getHostName() + " not found, is the Host offline?"); tikTokEventHandler.publish(this, new TikTokRoomDataResponseEvent(liveData)); - liveRoomInfo.setTitle(liveData.getTitle()); - liveRoomInfo.setViewersCount(liveData.getViewers()); - liveRoomInfo.setTotalViewersCount(liveData.getTotalViewers()); - liveRoomInfo.setAgeRestricted(liveData.isAgeRestricted()); - liveRoomInfo.setHost(liveData.getHost()); + roomInfo.setTitle(liveData.getTitle()); + roomInfo.setViewersCount(liveData.getViewers()); + roomInfo.setTotalViewersCount(liveData.getTotalViewers()); + roomInfo.setAgeRestricted(liveData.isAgeRestricted()); + roomInfo.setHost(liveData.getHost()); var preconnectEvent = new TikTokPreConnectionEvent(userData, liveData); tikTokEventHandler.publish(this, preconnectEvent); @@ -169,11 +170,11 @@ public class TikTokLiveClient implements LiveClient webSocketClient.start(liveConnectionData, this); setState(ConnectionState.CONNECTED); - tikTokEventHandler.publish(this, new TikTokRoomInfoEvent(liveRoomInfo)); + tikTokEventHandler.publish(this, new TikTokRoomInfoEvent(roomInfo)); } public void disconnect() { - if (liveRoomInfo.hasConnectionState(ConnectionState.DISCONNECTED)) { + if (roomInfo.hasConnectionState(ConnectionState.DISCONNECTED)) { return; } setState(ConnectionState.DISCONNECTED); @@ -182,7 +183,7 @@ public class TikTokLiveClient implements LiveClient private void setState(ConnectionState connectionState) { logger.info("TikTokLive client state: " + connectionState.name()); - liveRoomInfo.setConnectionState(connectionState); + roomInfo.setConnectionState(connectionState); } public void publishEvent(TikTokEvent event) { @@ -203,22 +204,4 @@ public class TikTokLiveClient implements LiveClient messageHandler.handleSingleMessage(this, message); } - @Override - public GiftsManager getGiftManager() { - return giftsManager; - } - - public LiveRoomInfo getRoomInfo() { - return liveRoomInfo; - } - - @Override - public ListenersManager getListenersManager() { - return listenersManager; - } - - @Override - public Logger getLogger() { - return logger; - } } \ No newline at end of file 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 21fdfd7..581b28b 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java @@ -27,17 +27,7 @@ import io.github.jwdeveloper.dependance.api.DependanceContainer; import io.github.jwdeveloper.dependance.implementation.DependanceContainerBuilder; import io.github.jwdeveloper.tiktok.mappers.MessagesMapperFactory; import io.github.jwdeveloper.tiktok.common.LoggerFactory; -import io.github.jwdeveloper.tiktok.data.events.*; import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent; -import io.github.jwdeveloper.tiktok.data.events.control.TikTokPreConnectionEvent; -import io.github.jwdeveloper.tiktok.data.events.envelop.TikTokChestEvent; -import io.github.jwdeveloper.tiktok.data.events.gift.*; -import io.github.jwdeveloper.tiktok.data.events.http.TikTokHttpResponseEvent; -import io.github.jwdeveloper.tiktok.data.events.link.*; -import io.github.jwdeveloper.tiktok.data.events.poll.TikTokPollEvent; -import io.github.jwdeveloper.tiktok.data.events.room.*; -import io.github.jwdeveloper.tiktok.data.events.social.*; -import io.github.jwdeveloper.tiktok.data.events.websocket.*; import io.github.jwdeveloper.tiktok.data.settings.LiveClientSettings; import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException; import io.github.jwdeveloper.tiktok.gifts.TikTokGiftsManager; @@ -61,9 +51,9 @@ import java.util.logging.Logger; public class TikTokLiveClientBuilder implements LiveClientBuilder { protected final LiveClientSettings clientSettings; - protected final TikTokLiveEventHandler eventHandler; + protected final LiveEventsHandler eventHandler; protected final List listeners; - protected final List> onCustomMappings; + protected final List> onCustomMappings; protected final List> onCustomDependencies; public TikTokLiveClientBuilder(String userName) { @@ -75,7 +65,7 @@ public class TikTokLiveClientBuilder implements LiveClientBuilder { this.onCustomDependencies = new ArrayList<>(); } - public LiveClientBuilder onMapping(Consumer consumer) { + public LiveClientBuilder onMapping(Consumer consumer) { this.onCustomMappings.add(consumer); return this; } @@ -133,8 +123,8 @@ public class TikTokLiveClientBuilder implements LiveClientBuilder { }); //messages - dependance.registerSingleton(TikTokLiveEventHandler.class, eventHandler); - dependance.registerSingleton(TikTokLiveMessageHandler.class); + dependance.registerSingleton(LiveEventsHandler.class, eventHandler); + dependance.registerSingleton(LiveMessagesHandler.class,TikTokLiveMessageHandler.class); //listeners dependance.registerSingletonList(TikTokEventListener.class, (e) -> listeners); @@ -142,6 +132,7 @@ public class TikTokLiveClientBuilder implements LiveClientBuilder { //networking dependance.registerSingleton(HttpClientFactory.class); + dependance.registerSingleton(TikTokWebSocketPingingTask.class); if (clientSettings.isOffline()) { dependance.registerSingleton(SocketClient.class, TikTokWebSocketOfflineClient.class); dependance.registerSingleton(LiveHttpClient.class, TikTokLiveHttpOfflineClient.class); @@ -166,8 +157,8 @@ public class TikTokLiveClientBuilder implements LiveClientBuilder { //mapper dependance.registerSingleton(TikTokGenericEventMapper.class); - dependance.registerSingleton(TikTokMapperHelper.class, TikTokLiveMapperHelper.class); - dependance.registerSingleton(TikTokMapper.class, (container) -> + dependance.registerSingleton(LiveMapperHelper.class, TikTokLiveMapperHelper.class); + dependance.registerSingleton(LiveMapper.class, (container) -> { var dependace = (DependanceContainer) container.find(DependanceContainer.class); var mapper = MessagesMapperFactory.create(dependace); 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 a53abbf..bbca3e4 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveEventHandler.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveEventHandler.java @@ -23,12 +23,13 @@ package io.github.jwdeveloper.tiktok; import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent; +import io.github.jwdeveloper.tiktok.live.LiveEventsHandler; import io.github.jwdeveloper.tiktok.live.builder.EventConsumer; import io.github.jwdeveloper.tiktok.live.LiveClient; import java.util.*; -public class TikTokLiveEventHandler { +public class TikTokLiveEventHandler implements LiveEventsHandler { private final Map, Set> events; public TikTokLiveEventHandler() { 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 8bd374f..9b41d42 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveMessageHandler.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveMessageHandler.java @@ -30,21 +30,22 @@ import io.github.jwdeveloper.tiktok.data.events.websocket.TikTokWebsocketRespons import io.github.jwdeveloper.tiktok.data.events.websocket.TikTokWebsocketUnhandledMessageEvent; import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveMessageException; import io.github.jwdeveloper.tiktok.live.LiveClient; -import io.github.jwdeveloper.tiktok.mappers.TikTokLiveMapper; -import io.github.jwdeveloper.tiktok.mappers.TikTokMapper; +import io.github.jwdeveloper.tiktok.live.LiveEventsHandler; +import io.github.jwdeveloper.tiktok.live.LiveMessagesHandler; +import io.github.jwdeveloper.tiktok.mappers.LiveMapper; import io.github.jwdeveloper.tiktok.messages.webcast.WebcastResponse; import io.github.jwdeveloper.tiktok.utils.Stopwatch; import java.time.Duration; -public class TikTokLiveMessageHandler { +public class TikTokLiveMessageHandler implements LiveMessagesHandler { - private final TikTokLiveEventHandler tikTokEventHandler; - private final TikTokLiveMapper mapper; + private final LiveEventsHandler tikTokEventHandler; + private final LiveMapper mapper; - public TikTokLiveMessageHandler(TikTokLiveEventHandler tikTokEventHandler, TikTokMapper mapper) { + public TikTokLiveMessageHandler(TikTokLiveEventHandler tikTokEventHandler, LiveMapper mapper) { this.tikTokEventHandler = tikTokEventHandler; - this.mapper = (TikTokLiveMapper) mapper; + this.mapper = mapper; } public void handle(LiveClient client, WebcastResponse webcastResponse) { @@ -59,11 +60,9 @@ public class TikTokLiveMessageHandler { } } - public void handleSingleMessage(LiveClient client, WebcastResponse.Message message) - { + public void handleSingleMessage(LiveClient client, WebcastResponse.Message message) { var messageClassName = message.getMethod(); - if (!mapper.isRegistered(messageClassName)) - { + if (!mapper.isRegistered(messageClassName)) { tikTokEventHandler.publish(client, new TikTokWebsocketUnhandledMessageEvent(message)); return; } diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/HttpClientFactory.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/HttpClientFactory.java index 30fa1f1..06374ad 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/HttpClientFactory.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/HttpClientFactory.java @@ -36,13 +36,4 @@ public class HttpClientFactory { public HttpClientBuilder client(String url) { return new HttpClientBuilder(url, liveClientSettings.getHttpSettings().clone()); } - - - //Does not contains default httpClientSettings, Params, headers, etd - //Edit: Do we even use it? - public HttpClientBuilder clientEmpty(String url) { - var settings = new HttpClientSettings(); - settings.setProxyClientSettings(liveClientSettings.getHttpSettings().getProxyClientSettings()); - return new HttpClientBuilder(url, settings); - } } \ 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 572e875..ca981b7 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 @@ -29,6 +29,7 @@ import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent; import io.github.jwdeveloper.tiktok.exceptions.TikTokEventListenerMethodException; import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException; import io.github.jwdeveloper.tiktok.live.LiveClient; +import io.github.jwdeveloper.tiktok.live.LiveEventsHandler; import io.github.jwdeveloper.tiktok.live.builder.EventConsumer; import java.util.ArrayList; @@ -37,10 +38,10 @@ import java.util.HashMap; import java.util.List; public class TikTokListenersManager implements ListenersManager { - private final TikTokLiveEventHandler eventObserver; + private final LiveEventsHandler eventObserver; private final List bindingModels; - public TikTokListenersManager(List listeners, TikTokLiveEventHandler tikTokEventHandler) { + public TikTokListenersManager(List listeners, LiveEventsHandler tikTokEventHandler) { this.eventObserver = tikTokEventHandler; this.bindingModels = new ArrayList<>(listeners.size()); for (var listener : listeners) { diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/MessagesMapperFactory.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/MessagesMapperFactory.java index 85c4ec3..c4f086c 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/MessagesMapperFactory.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/MessagesMapperFactory.java @@ -23,11 +23,8 @@ package io.github.jwdeveloper.tiktok.mappers; import io.github.jwdeveloper.dependance.api.DependanceContainer; -import io.github.jwdeveloper.dependance.injector.api.containers.Container; -import io.github.jwdeveloper.tiktok.TikTokRoomInfo; import io.github.jwdeveloper.tiktok.data.events.*; import io.github.jwdeveloper.tiktok.data.events.link.*; -import io.github.jwdeveloper.tiktok.live.GiftsManager; import io.github.jwdeveloper.tiktok.mappers.data.MappingResult; import io.github.jwdeveloper.tiktok.mappers.handlers.TikTokCommonEventHandler; import io.github.jwdeveloper.tiktok.mappers.handlers.TikTokGiftEventHandler; @@ -40,7 +37,7 @@ import static io.github.jwdeveloper.tiktok.messages.enums.LinkMessageType.*; public class MessagesMapperFactory { public static TikTokLiveMapper create(DependanceContainer container) { - var helper = container.find(TikTokMapperHelper.class); + var helper = container.find(LiveMapperHelper.class); var mapper = new TikTokLiveMapper(helper); //ConnectionEvents events 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 4fe6dd4..e12f748 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 @@ -29,13 +29,13 @@ import io.github.jwdeveloper.tiktok.mappers.data.*; import java.util.*; import java.util.function.Function; -public class TikTokLiveMapper implements TikTokMapper { +public class TikTokLiveMapper implements LiveMapper { private final Map mappers; - private final TikTokMapperHelper mapperUtils; + private final LiveMapperHelper mapperUtils; private final TikTokLiveMapperModel globalMapperModel; - public TikTokLiveMapper(TikTokMapperHelper mapperUtils) { + public TikTokLiveMapper(LiveMapperHelper mapperUtils) { this.mappers = new HashMap<>(); this.mapperUtils = mapperUtils; this.globalMapperModel = new TikTokLiveMapperModel("any message"); diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokLiveMapperHelper.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokLiveMapperHelper.java index 9c854f9..b7ea1eb 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokLiveMapperHelper.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokLiveMapperHelper.java @@ -28,7 +28,7 @@ import io.github.jwdeveloper.tiktok.utils.JsonUtil; import io.github.jwdeveloper.tiktok.utils.ProtoBufferObject; import io.github.jwdeveloper.tiktok.utils.ProtocolUtils; -public class TikTokLiveMapperHelper implements TikTokMapperHelper { +public class TikTokLiveMapperHelper implements LiveMapperHelper { private final TikTokGenericEventMapper genericMapper; public TikTokLiveMapperHelper(TikTokGenericEventMapper genericMapper) { diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/handlers/TikTokGiftEventHandler.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/handlers/TikTokGiftEventHandler.java index 0cda6ab..2e4f17d 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/handlers/TikTokGiftEventHandler.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/handlers/TikTokGiftEventHandler.java @@ -28,7 +28,7 @@ import io.github.jwdeveloper.tiktok.data.events.gift.*; import io.github.jwdeveloper.tiktok.data.models.Picture; import io.github.jwdeveloper.tiktok.data.models.gifts.*; import io.github.jwdeveloper.tiktok.live.GiftsManager; -import io.github.jwdeveloper.tiktok.mappers.TikTokMapperHelper; +import io.github.jwdeveloper.tiktok.mappers.LiveMapperHelper; import io.github.jwdeveloper.tiktok.mappers.data.MappingResult; import io.github.jwdeveloper.tiktok.messages.webcast.WebcastGiftMessage; import lombok.SneakyThrows; @@ -48,7 +48,7 @@ public class TikTokGiftEventHandler { } @SneakyThrows - public MappingResult handleGifts(byte[] msg, String name, TikTokMapperHelper helper) { + public MappingResult handleGifts(byte[] msg, String name, LiveMapperHelper helper) { var currentMessage = WebcastGiftMessage.parseFrom(msg); var gifts = handleGift(currentMessage); return MappingResult.of(currentMessage, gifts); diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/handlers/TikTokRoomInfoEventHandler.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/handlers/TikTokRoomInfoEventHandler.java index b8d14d9..c6a1f21 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/handlers/TikTokRoomInfoEventHandler.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/handlers/TikTokRoomInfoEventHandler.java @@ -31,7 +31,7 @@ import io.github.jwdeveloper.tiktok.data.events.social.TikTokJoinEvent; import io.github.jwdeveloper.tiktok.data.events.social.TikTokLikeEvent; import io.github.jwdeveloper.tiktok.data.models.RankingUser; import io.github.jwdeveloper.tiktok.data.models.users.User; -import io.github.jwdeveloper.tiktok.mappers.TikTokMapperHelper; +import io.github.jwdeveloper.tiktok.mappers.LiveMapperHelper; import io.github.jwdeveloper.tiktok.mappers.data.MappingResult; import io.github.jwdeveloper.tiktok.messages.webcast.WebcastLikeMessage; import io.github.jwdeveloper.tiktok.messages.webcast.WebcastLiveIntroMessage; @@ -86,7 +86,7 @@ public class TikTokRoomInfoEventHandler { } @SneakyThrows - public MappingResult handleMemberMessage(byte[] msg, String name, TikTokMapperHelper helper) { + public MappingResult handleMemberMessage(byte[] msg, String name, LiveMapperHelper helper) { var message = WebcastMemberMessage.parseFrom(msg); var event = switch (message.getAction()) { @@ -103,7 +103,7 @@ public class TikTokRoomInfoEventHandler { } @SneakyThrows - public MappingResult handleLike(byte[] msg, String name, TikTokMapperHelper helper) { + public MappingResult handleLike(byte[] msg, String name, LiveMapperHelper helper) { var message = WebcastLikeMessage.parseFrom(msg); var event = new TikTokLikeEvent(message); var roomInfoEvent = this.handleRoomInfo(tikTokRoomInfo -> 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 5d5ea37..0b251b3 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 @@ -29,6 +29,8 @@ import io.github.jwdeveloper.tiktok.data.requests.LiveConnectionData; import io.github.jwdeveloper.tiktok.data.settings.*; import io.github.jwdeveloper.tiktok.exceptions.*; import io.github.jwdeveloper.tiktok.live.LiveClient; +import io.github.jwdeveloper.tiktok.live.LiveEventsHandler; +import io.github.jwdeveloper.tiktok.live.LiveMessagesHandler; import org.java_websocket.client.WebSocketClient; import javax.net.ssl.*; @@ -38,22 +40,23 @@ import java.util.HashMap; public class TikTokWebSocketClient implements SocketClient { private final LiveClientSettings clientSettings; - private final TikTokLiveMessageHandler messageHandler; - private final TikTokLiveEventHandler tikTokEventHandler; - private WebSocketClient webSocketClient; - + private final LiveMessagesHandler messageHandler; + private final LiveEventsHandler tikTokEventHandler; private final TikTokWebSocketPingingTask pingingTask; + private WebSocketClient webSocketClient; private boolean isConnected; public TikTokWebSocketClient( LiveClientSettings clientSettings, - TikTokLiveMessageHandler messageHandler, - TikTokLiveEventHandler tikTokEventHandler) { + LiveMessagesHandler messageHandler, + LiveEventsHandler tikTokEventHandler, + TikTokWebSocketPingingTask pingingTask) + { this.clientSettings = clientSettings; this.messageHandler = messageHandler; this.tikTokEventHandler = tikTokEventHandler; + this.pingingTask = pingingTask; isConnected = false; - pingingTask = new TikTokWebSocketPingingTask(); } @Override @@ -64,7 +67,7 @@ public class TikTokWebSocketClient implements SocketClient { messageHandler.handle(liveClient, connectionData.getWebcastResponse()); - var headers = new HashMap<>(clientSettings.getHttpSettings().getHeaders()); + var headers = new HashMap<>(clientSettings.getHttpSettings().getHeaders()); headers.put("Cookie", connectionData.getWebsocketCookies()); webSocketClient = new TikTokWebSocketListener(connectionData.getWebsocketUrl(), headers, @@ -96,9 +99,15 @@ public class TikTokWebSocketClient implements SocketClient { if (proxySettings.getType() == Proxy.Type.SOCKS) { SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null, new TrustManager[]{new X509TrustManager() { - public void checkClientTrusted(X509Certificate[] x509Certificates, String s) {} - public void checkServerTrusted(X509Certificate[] x509Certificates, String s) {} - public X509Certificate[] getAcceptedIssuers() { return null; } + public void checkClientTrusted(X509Certificate[] x509Certificates, String s) { + } + + public void checkServerTrusted(X509Certificate[] x509Certificates, String s) { + } + + public X509Certificate[] getAcceptedIssuers() { + return null; + } }}, null); webSocketClient.setSocketFactory(sc.getSocketFactory()); } diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketListener.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketListener.java index 8f845a2..2699cd5 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketListener.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketListener.java @@ -27,6 +27,8 @@ import io.github.jwdeveloper.tiktok.*; import io.github.jwdeveloper.tiktok.data.events.*; import io.github.jwdeveloper.tiktok.exceptions.TikTokProtocolBufferException; import io.github.jwdeveloper.tiktok.live.LiveClient; +import io.github.jwdeveloper.tiktok.live.LiveEventsHandler; +import io.github.jwdeveloper.tiktok.live.LiveMessagesHandler; import io.github.jwdeveloper.tiktok.messages.webcast.*; import org.java_websocket.client.WebSocketClient; import org.java_websocket.drafts.Draft_6455; @@ -38,15 +40,15 @@ import java.util.*; public class TikTokWebSocketListener extends WebSocketClient { - private final TikTokLiveMessageHandler messageHandler; - private final TikTokLiveEventHandler tikTokEventHandler; + private final LiveMessagesHandler messageHandler; + private final LiveEventsHandler tikTokEventHandler; private final LiveClient tikTokLiveClient; public TikTokWebSocketListener(URI serverUri, Map httpHeaders, int connectTimeout, - TikTokLiveMessageHandler messageHandler, - TikTokLiveEventHandler tikTokEventHandler, + LiveMessagesHandler messageHandler, + LiveEventsHandler tikTokEventHandler, LiveClient tikTokLiveClient) { super(serverUri, new Draft_6455(), httpHeaders, connectTimeout); this.messageHandler = messageHandler; diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketOfflineClient.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketOfflineClient.java index 66d6ff5..993491b 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketOfflineClient.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketOfflineClient.java @@ -27,13 +27,14 @@ import io.github.jwdeveloper.tiktok.data.events.TikTokConnectedEvent; import io.github.jwdeveloper.tiktok.data.events.TikTokDisconnectedEvent; import io.github.jwdeveloper.tiktok.data.requests.LiveConnectionData; import io.github.jwdeveloper.tiktok.live.LiveClient; +import io.github.jwdeveloper.tiktok.live.LiveEventsHandler; public class TikTokWebSocketOfflineClient implements SocketClient { - private final TikTokLiveEventHandler handler; + private final LiveEventsHandler handler; private LiveClient liveClient; - public TikTokWebSocketOfflineClient(TikTokLiveEventHandler handler) { + public TikTokWebSocketOfflineClient(LiveEventsHandler handler) { this.handler = handler; } 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 12e166e..ae2fbdb 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 @@ -22,41 +22,37 @@ */ package io.github.jwdeveloper.tiktok.websocket; +import io.github.jwdeveloper.tiktok.live.LiveEventsHandler; import org.java_websocket.WebSocket; -public class TikTokWebSocketPingingTask -{ +public class TikTokWebSocketPingingTask { private Thread thread; private boolean isRunning = false; private final int MAX_TIMEOUT = 250; private final int SLEEP_TIME = 500; - public void run(WebSocket webSocket, long pingTaskTime) - { + public void run(WebSocket webSocket, long pingTaskTime) { stop(); thread = new Thread(() -> pingTask(webSocket, pingTaskTime), "pinging-task"); isRunning = true; thread.start(); } - public void stop() - { + public void stop() { if (thread != null) thread.interrupt(); isRunning = false; } - private void pingTask(WebSocket webSocket, long pingTaskTime) - { + private void pingTask(WebSocket webSocket, long pingTaskTime) { while (isRunning) { try { if (webSocket.isOpen()) { webSocket.sendPing(); - Thread.sleep(pingTaskTime+(int)(Math.random() * MAX_TIMEOUT)); - } else + Thread.sleep(pingTaskTime + (int) (Math.random() * MAX_TIMEOUT)); + } else Thread.sleep(SLEEP_TIME); - } - catch (Exception e) { + } catch (Exception e) { //TODO we should display some kind of error message isRunning = false; } diff --git a/Client/src/test/java/io/github/jwdeveloper/tiktok/common/TikTokBaseTest.java b/Client/src/test/java/io/github/jwdeveloper/tiktok/common/TikTokBaseTest.java deleted file mode 100644 index 678ed32..0000000 --- a/Client/src/test/java/io/github/jwdeveloper/tiktok/common/TikTokBaseTest.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2023-2023 jwdeveloper jacekwoln@gmail.com - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ -package io.github.jwdeveloper.tiktok.common; - - - -import java.io.IOException; -import java.util.Base64; - -public class TikTokBaseTest -{ - public byte[] getFileBytes(String path) - { - try { - var stream = getClass().getClassLoader().getResourceAsStream(path); - var bytes= stream.readAllBytes(); - stream.close(); - return bytes; - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public byte[] getFileBytesUtf(String path) - { - try { - var stream = getClass().getClassLoader().getResourceAsStream(path); - var bytes= stream.readAllBytes(); - stream.close(); - return Base64.getDecoder().decode(bytes); - } catch (IOException e) { - throw new RuntimeException(e); - } - } -} diff --git a/Client/src/test/java/io/github/jwdeveloper/tiktok/gifts/TikTokGiftManagerTest.java b/Client/src/test/java/io/github/jwdeveloper/tiktok/gifts/TikTokGiftManagerTest.java deleted file mode 100644 index 4573678..0000000 --- a/Client/src/test/java/io/github/jwdeveloper/tiktok/gifts/TikTokGiftManagerTest.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2023-2023 jwdeveloper jacekwoln@gmail.com - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ -package io.github.jwdeveloper.tiktok.gifts; - -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.junit.jupiter.MockitoExtension; - - -@ExtendWith(MockitoExtension.class) - -public class TikTokGiftManagerTest { - - - - - - -} \ No newline at end of file