Improvement of Listener

This commit is contained in:
jacek.wolniewicz
2024-07-03 22:27:15 +02:00
parent 7005f58edd
commit 660cb287e9
16 changed files with 121 additions and 83 deletions

View File

@@ -0,0 +1,18 @@
package io.github.jwdeveloper.tiktok.annotations;
/**
* HIGHEST 1
* HIGH 2
* NORMAL 3
* LOW 4
* LOWEST 5
*/
public enum Priority {
LOWEST(2), LOW(1), NORMAL(0), HIGH(-1), HIGHEST(-2);
public int priorityValue;
Priority(int value) {
this.priorityValue = value;
}
}

View File

@@ -26,7 +26,13 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME) @Retention(RetentionPolicy.RUNTIME)
public @interface TikTokEventObserver public @interface TikTokEventObserver {
{
Priority priority() default Priority.NORMAL;
/**
* when true, action is invoked on the another thread
* @return
*/
boolean async();
} }

View File

@@ -27,14 +27,13 @@ import java.util.List;
/** /**
* You can dynamically add or removing TikTokEventListener * You can dynamically add or removing TikTokEventListener
* *
* @see TikTokEventListener
* *
*/ */
public interface ListenersManager public interface ListenersManager
{ {
List<TikTokEventListener> getListeners(); List<Object> getListeners();
void addListener(TikTokEventListener listener); void addListener(Object listener);
void removeListener(TikTokEventListener listener); void removeListener(Object listener);
} }

View File

@@ -67,7 +67,9 @@ import io.github.jwdeveloper.tiktok.live.LiveClient;
* } * }
* </pre> * </pre>
*/ */
public interface TikTokEventListener //TODO I think this interface can be removed, since we are using,
{ //annotation @TikTokEventHandler to check methods that are events
@Deprecated(forRemoval = true, since = "This interface is not longer needed, please remove it from your class")
public interface TikTokEventListener {
} }

View File

@@ -54,12 +54,11 @@ public interface LiveClientBuilder extends EventsBuilder<LiveClientBuilder> {
LiveClientBuilder configure(Consumer<LiveClientSettings> onConfigure); LiveClientBuilder configure(Consumer<LiveClientSettings> onConfigure);
/** /**
* @see TikTokEventListener
* Adding events listener class, its fancy way to register events without using lamda method * Adding events listener class, its fancy way to register events without using lamda method
* but actual method in class that implements TikTokEventListener * but actual method in class that implements TikTokEventListener
* @return * @return
*/ */
LiveClientBuilder addListener(TikTokEventListener listener); LiveClientBuilder addListener(Object listener);
/** /**

View File

@@ -24,9 +24,8 @@ package io.github.jwdeveloper.tiktok.websocket;
import io.github.jwdeveloper.tiktok.data.requests.LiveConnectionData; import io.github.jwdeveloper.tiktok.data.requests.LiveConnectionData;
import io.github.jwdeveloper.tiktok.live.LiveClient; import io.github.jwdeveloper.tiktok.live.LiveClient;
import io.github.jwdeveloper.tiktok.messages.webcast.WebcastResponse;
public interface SocketClient { public interface LiveSocketClient {
void start(LiveConnectionData.Response webcastResponse, LiveClient tikTokLiveClient); void start(LiveConnectionData.Response webcastResponse, LiveClient tikTokLiveClient);
void stop(); void stop();
} }

View File

@@ -36,7 +36,7 @@ import io.github.jwdeveloper.tiktok.listener.*;
import io.github.jwdeveloper.tiktok.live.*; import io.github.jwdeveloper.tiktok.live.*;
import io.github.jwdeveloper.tiktok.messages.webcast.WebcastResponse; import io.github.jwdeveloper.tiktok.messages.webcast.WebcastResponse;
import io.github.jwdeveloper.tiktok.models.ConnectionState; import io.github.jwdeveloper.tiktok.models.ConnectionState;
import io.github.jwdeveloper.tiktok.websocket.SocketClient; import io.github.jwdeveloper.tiktok.websocket.LiveSocketClient;
import lombok.Getter; import lombok.Getter;
import java.util.Base64; import java.util.Base64;
@@ -49,7 +49,7 @@ public class TikTokLiveClient implements LiveClient
{ {
private final TikTokRoomInfo roomInfo; private final TikTokRoomInfo roomInfo;
private final LiveHttpClient httpClient; private final LiveHttpClient httpClient;
private final SocketClient webSocketClient; private final LiveSocketClient webSocketClient;
private final LiveEventsHandler tikTokEventHandler; private final LiveEventsHandler tikTokEventHandler;
private final LiveClientSettings clientSettings; private final LiveClientSettings clientSettings;
private final ListenersManager listenersManager; private final ListenersManager listenersManager;
@@ -62,7 +62,7 @@ public class TikTokLiveClient implements LiveClient
GiftsManager giftsManager, GiftsManager giftsManager,
TikTokRoomInfo tikTokLiveMeta, TikTokRoomInfo tikTokLiveMeta,
LiveHttpClient tiktokHttpClient, LiveHttpClient tiktokHttpClient,
SocketClient webSocketClient, LiveSocketClient webSocketClient,
LiveEventsHandler tikTokEventHandler, LiveEventsHandler tikTokEventHandler,
LiveClientSettings clientSettings, LiveClientSettings clientSettings,
ListenersManager listenersManager, ListenersManager listenersManager,

View File

@@ -52,7 +52,7 @@ public class TikTokLiveClientBuilder implements LiveClientBuilder {
protected final LiveClientSettings clientSettings; protected final LiveClientSettings clientSettings;
protected final LiveEventsHandler eventHandler; protected final LiveEventsHandler eventHandler;
protected final List<TikTokEventListener> listeners; protected final List<Object> listeners;
protected final List<Consumer<LiveMapper>> onCustomMappings; protected final List<Consumer<LiveMapper>> onCustomMappings;
protected final List<Consumer<DependanceContainerBuilder>> onCustomDependencies; protected final List<Consumer<DependanceContainerBuilder>> onCustomDependencies;
@@ -75,7 +75,7 @@ public class TikTokLiveClientBuilder implements LiveClientBuilder {
return this; return this;
} }
public TikTokLiveClientBuilder addListener(TikTokEventListener listener) { public TikTokLiveClientBuilder addListener(Object listener) {
if (listener != null) if (listener != null)
listeners.add(listener); listeners.add(listener);
return this; return this;
@@ -97,6 +97,7 @@ public class TikTokLiveClientBuilder implements LiveClientBuilder {
if (clientSettings.getHostName().startsWith("@")) if (clientSettings.getHostName().startsWith("@"))
clientSettings.setHostName(clientSettings.getHostName().substring(1)); clientSettings.setHostName(clientSettings.getHostName().substring(1));
//TODO 250 Magic number
if (clientSettings.getPingInterval() < 250) if (clientSettings.getPingInterval() < 250)
throw new TikTokLiveException("Minimum allowed ping interval is 250 millseconds"); throw new TikTokLiveException("Minimum allowed ping interval is 250 millseconds");
@@ -124,20 +125,23 @@ public class TikTokLiveClientBuilder implements LiveClientBuilder {
//messages //messages
dependance.registerSingleton(LiveEventsHandler.class, eventHandler); dependance.registerSingleton(LiveEventsHandler.class, eventHandler);
dependance.registerSingleton(LiveMessagesHandler.class,TikTokLiveMessageHandler.class); dependance.registerSingleton(LiveMessagesHandler.class, TikTokLiveMessageHandler.class);
//listeners //listeners
dependance.registerSingletonList(TikTokEventListener.class, (e) -> listeners); dependance.registerSingleton(ListenersManager.class, container ->
dependance.registerSingleton(ListenersManager.class, TikTokListenersManager.class); {
var eventHandlers = (LiveEventsHandler) container.find(LiveEventsHandler.class);
return new TikTokListenersManager(listeners, eventHandlers);
});
//networking //networking
dependance.registerSingleton(HttpClientFactory.class); dependance.registerSingleton(HttpClientFactory.class);
dependance.registerSingleton(TikTokWebSocketPingingTask.class); dependance.registerSingleton(TikTokWebSocketPingingTask.class);
if (clientSettings.isOffline()) { if (clientSettings.isOffline()) {
dependance.registerSingleton(SocketClient.class, TikTokWebSocketOfflineClient.class); dependance.registerSingleton(LiveSocketClient.class, TikTokWebSocketOfflineClient.class);
dependance.registerSingleton(LiveHttpClient.class, TikTokLiveHttpOfflineClient.class); dependance.registerSingleton(LiveHttpClient.class, TikTokLiveHttpOfflineClient.class);
} else { } else {
dependance.registerSingleton(SocketClient.class, TikTokWebSocketClient.class); dependance.registerSingleton(LiveSocketClient.class, TikTokWebSocketClient.class);
dependance.registerSingleton(LiveHttpClient.class, TikTokLiveHttpClient.class); dependance.registerSingleton(LiveHttpClient.class, TikTokLiveHttpClient.class);
} }

View File

@@ -33,8 +33,7 @@ import java.util.Map;
@Value @Value
public class ListenerBindingModel public class ListenerBindingModel
{ {
Object listener;
TikTokEventListener listener;
Map<Class<?>, List<EventConsumer<?>>> events; Map<Class<?>, List<EventConsumer<?>>> events;
} }

View File

@@ -23,7 +23,6 @@
package io.github.jwdeveloper.tiktok.listener; package io.github.jwdeveloper.tiktok.listener;
import io.github.jwdeveloper.tiktok.TikTokLiveEventHandler;
import io.github.jwdeveloper.tiktok.annotations.TikTokEventObserver; import io.github.jwdeveloper.tiktok.annotations.TikTokEventObserver;
import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent; import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent;
import io.github.jwdeveloper.tiktok.exceptions.TikTokEventListenerMethodException; import io.github.jwdeveloper.tiktok.exceptions.TikTokEventListenerMethodException;
@@ -32,30 +31,31 @@ import io.github.jwdeveloper.tiktok.live.LiveClient;
import io.github.jwdeveloper.tiktok.live.LiveEventsHandler; import io.github.jwdeveloper.tiktok.live.LiveEventsHandler;
import io.github.jwdeveloper.tiktok.live.builder.EventConsumer; import io.github.jwdeveloper.tiktok.live.builder.EventConsumer;
import java.util.ArrayList; import java.util.*;
import java.util.Arrays; import java.util.concurrent.ExecutorService;
import java.util.HashMap; import java.util.concurrent.Executors;
import java.util.List;
public class TikTokListenersManager implements ListenersManager { public class TikTokListenersManager implements ListenersManager {
private final LiveEventsHandler eventObserver; private final LiveEventsHandler eventObserver;
private final List<ListenerBindingModel> bindingModels; private final List<ListenerBindingModel> bindingModels;
private final ExecutorService executorService;
public TikTokListenersManager(List<TikTokEventListener> listeners, LiveEventsHandler tikTokEventHandler) { public TikTokListenersManager(List<Object> listeners, LiveEventsHandler tikTokEventHandler) {
this.eventObserver = tikTokEventHandler; this.eventObserver = tikTokEventHandler;
this.bindingModels = new ArrayList<>(listeners.size()); this.bindingModels = new ArrayList<>(listeners.size());
for (var listener : listeners) { for (var listener : listeners) {
addListener(listener); addListener(listener);
} }
executorService = Executors.newFixedThreadPool(4);
} }
@Override @Override
public List<TikTokEventListener> getListeners() { public List<Object> getListeners() {
return bindingModels.stream().map(ListenerBindingModel::getListener).toList(); return bindingModels.stream().map(ListenerBindingModel::getListener).toList();
} }
@Override @Override
public void addListener(TikTokEventListener listener) { public void addListener(Object listener) {
var alreadyExists = bindingModels.stream().filter(e -> e.getListener() == listener).findAny(); var alreadyExists = bindingModels.stream().filter(e -> e.getListener() == listener).findAny();
if (alreadyExists.isPresent()) { if (alreadyExists.isPresent()) {
throw new TikTokLiveException("Listener " + listener.getClass() + " has already been registered"); throw new TikTokLiveException("Listener " + listener.getClass() + " has already been registered");
@@ -72,7 +72,7 @@ public class TikTokListenersManager implements ListenersManager {
} }
@Override @Override
public void removeListener(TikTokEventListener listener) { public void removeListener(Object listener) {
var optional = bindingModels.stream().filter(e -> e.getListener() == listener).findAny(); var optional = bindingModels.stream().filter(e -> e.getListener() == listener).findAny();
if (optional.isEmpty()) { if (optional.isEmpty()) {
return; return;
@@ -89,29 +89,41 @@ public class TikTokListenersManager implements ListenersManager {
bindingModels.remove(optional.get()); bindingModels.remove(optional.get());
} }
private ListenerBindingModel bindToEvents(TikTokEventListener listener) { private ListenerBindingModel bindToEvents(Object listener) {
var clazz = listener.getClass(); var clazz = listener.getClass();
var methods = Arrays.stream(clazz.getDeclaredMethods()).filter(m -> var methods = Arrays.stream(clazz.getDeclaredMethods())
m.getParameterCount() == 2 && .filter(m ->
m.isAnnotationPresent(TikTokEventObserver.class)).toList(); m.getParameterCount() >= 1 &&
m.isAnnotationPresent(TikTokEventObserver.class))
.toList();
var eventsMap = new HashMap<Class<?>, List<EventConsumer<?>>>(); var eventsMap = new HashMap<Class<?>, List<EventConsumer<?>>>();
for (var method : methods) { for (var method : methods) {
var liveclientClass = method.getParameterTypes()[0]; var annotation = method.getAnnotation(TikTokEventObserver.class);
var eventClass = method.getParameterTypes()[1]; var tiktokEventsParameters = Arrays.stream(method.getParameters())
.filter(parameter ->
if (!LiveClient.class.isAssignableFrom(liveclientClass) && !liveclientClass.equals(LiveClient.class)) { TikTokEvent.class.isAssignableFrom(parameter.getType()) ||
throw new TikTokEventListenerMethodException("Method " + method.getName() + "() 1st parameter must be instance of " + LiveClient.class.getName() parameter.getType().equals(TikTokEvent.class))
+ " | Invalid parameter class: "+liveclientClass.getName()); .toList();
} if (tiktokEventsParameters.size() != 1) {
throw new TikTokEventListenerMethodException("Method " + method.getName() + "() must have only one parameter that inherits from class " + TikTokEvent.class.getName());
if (!TikTokEvent.class.isAssignableFrom(eventClass) && !eventClass.equals(TikTokEvent.class)) {
throw new TikTokEventListenerMethodException("Method " + method.getName() + "() 2nd parameter must be instance of " + TikTokEvent.class.getName()
+ " | Invalid parameter class: "+eventClass.getName());
} }
var eventType = tiktokEventsParameters.get(0).getType();
EventConsumer eventMethodRef = (liveClient, event) -> EventConsumer eventMethodRef = (liveClient, event) ->
{
if (annotation.async()) {
executorService.submit(() ->
{ {
try {
method.setAccessible(true);
method.invoke(listener, liveClient, event);
} catch (Exception e) {
throw new TikTokEventListenerMethodException(e);
}
});
return;
}
try { try {
method.setAccessible(true); method.setAccessible(true);
method.invoke(listener, liveClient, event); method.invoke(listener, liveClient, event);
@@ -119,7 +131,7 @@ public class TikTokListenersManager implements ListenersManager {
throw new TikTokEventListenerMethodException(e); throw new TikTokEventListenerMethodException(e);
} }
}; };
eventsMap.computeIfAbsent(eventClass, (a) -> new ArrayList<>()).add(eventMethodRef); eventsMap.computeIfAbsent(eventType, (a) -> new ArrayList<>()).add(eventMethodRef);
} }
return new ListenerBindingModel(listener, eventsMap); return new ListenerBindingModel(listener, eventsMap);
} }

View File

@@ -29,6 +29,9 @@ import io.github.jwdeveloper.tiktok.utils.ProtoBufferObject;
import io.github.jwdeveloper.tiktok.utils.ProtocolUtils; import io.github.jwdeveloper.tiktok.utils.ProtocolUtils;
public class TikTokLiveMapperHelper implements LiveMapperHelper { public class TikTokLiveMapperHelper implements LiveMapperHelper {
private static final String PACKAGE_PREFIX = "io.github.jwdeveloper.tiktok.messages.webcast.";
private final TikTokGenericEventMapper genericMapper; private final TikTokGenericEventMapper genericMapper;
public TikTokLiveMapperHelper(TikTokGenericEventMapper genericMapper) { public TikTokLiveMapperHelper(TikTokGenericEventMapper genericMapper) {
@@ -39,6 +42,7 @@ public class TikTokLiveMapperHelper implements LiveMapperHelper {
public <T extends GeneratedMessageV3> T bytesToWebcastObject(byte[] bytes, Class<T> messageClass) { public <T extends GeneratedMessageV3> T bytesToWebcastObject(byte[] bytes, Class<T> messageClass) {
try { try {
var parsingMethod = genericMapper.getParsingMethod(messageClass); var parsingMethod = genericMapper.getParsingMethod(messageClass);
//NULL is passed, since Parsing method is Static
var sourceObject = parsingMethod.invoke(null, bytes); var sourceObject = parsingMethod.invoke(null, bytes);
return (T) sourceObject; return (T) sourceObject;
} catch (Exception e) { } catch (Exception e) {
@@ -49,7 +53,7 @@ public class TikTokLiveMapperHelper implements LiveMapperHelper {
@Override @Override
public Object bytesToWebcastObject(byte[] bytes, String messageName) { public Object bytesToWebcastObject(byte[] bytes, String messageName) {
try { try {
var packageName = "io.github.jwdeveloper.tiktok.messages.webcast." + messageName; var packageName = PACKAGE_PREFIX + messageName;
var clazz = Class.forName(packageName); var clazz = Class.forName(packageName);
return bytesToWebcastObject(bytes, (Class<? extends GeneratedMessageV3>) clazz); return bytesToWebcastObject(bytes, (Class<? extends GeneratedMessageV3>) clazz);
} catch (Exception e) { } catch (Exception e) {
@@ -60,7 +64,7 @@ public class TikTokLiveMapperHelper implements LiveMapperHelper {
@Override @Override
public boolean isMessageHasProtoClass(String messageName) { public boolean isMessageHasProtoClass(String messageName) {
try { try {
var packageName = "io.github.jwdeveloper.tiktok.messages.webcast." + messageName; var packageName = PACKAGE_PREFIX + messageName;
Class.forName(packageName); Class.forName(packageName);
return true; return true;
} catch (Exception e) { } catch (Exception e) {

View File

@@ -22,8 +22,6 @@
*/ */
package io.github.jwdeveloper.tiktok.websocket; package io.github.jwdeveloper.tiktok.websocket;
import io.github.jwdeveloper.dependance.injector.api.containers.Container;
import io.github.jwdeveloper.tiktok.*;
import io.github.jwdeveloper.tiktok.data.dto.ProxyData; import io.github.jwdeveloper.tiktok.data.dto.ProxyData;
import io.github.jwdeveloper.tiktok.data.requests.LiveConnectionData; import io.github.jwdeveloper.tiktok.data.requests.LiveConnectionData;
import io.github.jwdeveloper.tiktok.data.settings.*; import io.github.jwdeveloper.tiktok.data.settings.*;
@@ -38,7 +36,7 @@ import java.net.Proxy;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
import java.util.HashMap; import java.util.HashMap;
public class TikTokWebSocketClient implements SocketClient { public class TikTokWebSocketClient implements LiveSocketClient {
private final LiveClientSettings clientSettings; private final LiveClientSettings clientSettings;
private final LiveMessagesHandler messageHandler; private final LiveMessagesHandler messageHandler;
private final LiveEventsHandler tikTokEventHandler; private final LiveEventsHandler tikTokEventHandler;

View File

@@ -23,7 +23,6 @@
package io.github.jwdeveloper.tiktok.websocket; package io.github.jwdeveloper.tiktok.websocket;
import com.google.protobuf.ByteString; import com.google.protobuf.ByteString;
import io.github.jwdeveloper.tiktok.*;
import io.github.jwdeveloper.tiktok.data.events.*; import io.github.jwdeveloper.tiktok.data.events.*;
import io.github.jwdeveloper.tiktok.exceptions.TikTokProtocolBufferException; import io.github.jwdeveloper.tiktok.exceptions.TikTokProtocolBufferException;
import io.github.jwdeveloper.tiktok.live.LiveClient; import io.github.jwdeveloper.tiktok.live.LiveClient;
@@ -40,9 +39,9 @@ import java.util.*;
public class TikTokWebSocketListener extends WebSocketClient { public class TikTokWebSocketListener extends WebSocketClient {
private final LiveMessagesHandler messageHandler; private final LiveMessagesHandler messagesHandler;
private final LiveEventsHandler tikTokEventHandler; private final LiveEventsHandler eventHandler;
private final LiveClient tikTokLiveClient; private final LiveClient liveClient;
public TikTokWebSocketListener(URI serverUri, public TikTokWebSocketListener(URI serverUri,
Map<String, String> httpHeaders, Map<String, String> httpHeaders,
@@ -51,9 +50,9 @@ public class TikTokWebSocketListener extends WebSocketClient {
LiveEventsHandler tikTokEventHandler, LiveEventsHandler tikTokEventHandler,
LiveClient tikTokLiveClient) { LiveClient tikTokLiveClient) {
super(serverUri, new Draft_6455(), httpHeaders, connectTimeout); super(serverUri, new Draft_6455(), httpHeaders, connectTimeout);
this.messageHandler = messageHandler; this.messagesHandler = messageHandler;
this.tikTokEventHandler = tikTokEventHandler; this.eventHandler = tikTokEventHandler;
this.tikTokLiveClient = tikTokLiveClient; this.liveClient = tikTokLiveClient;
} }
@Override @Override
@@ -61,7 +60,7 @@ public class TikTokWebSocketListener extends WebSocketClient {
try { try {
handleBinary(bytes.array()); handleBinary(bytes.array());
} catch (Exception e) { } catch (Exception e) {
tikTokEventHandler.publish(tikTokLiveClient, new TikTokErrorEvent(e)); eventHandler.publish(liveClient, new TikTokErrorEvent(e));
} }
if (isOpen()) { if (isOpen()) {
sendPing(); sendPing();
@@ -85,12 +84,12 @@ public class TikTokWebSocketListener extends WebSocketClient {
this.send(pushFrameBuilder.build().toByteArray()); this.send(pushFrameBuilder.build().toByteArray());
} }
} }
messageHandler.handle(tikTokLiveClient, webcastResponse); messagesHandler.handle(liveClient, webcastResponse);
} }
@Override @Override
public void onOpen(ServerHandshake serverHandshake) { public void onOpen(ServerHandshake serverHandshake) {
tikTokEventHandler.publish(tikTokLiveClient, new TikTokConnectedEvent()); eventHandler.publish(liveClient, new TikTokConnectedEvent());
if (isOpen()) { if (isOpen()) {
sendPing(); sendPing();
} }
@@ -98,13 +97,13 @@ public class TikTokWebSocketListener extends WebSocketClient {
@Override @Override
public void onClose(int code, String reason, boolean remote) { public void onClose(int code, String reason, boolean remote) {
tikTokEventHandler.publish(tikTokLiveClient, new TikTokDisconnectedEvent(reason)); eventHandler.publish(liveClient, new TikTokDisconnectedEvent(reason));
tikTokLiveClient.disconnect(); liveClient.disconnect();
} }
@Override @Override
public void onError(Exception error) { public void onError(Exception error) {
tikTokEventHandler.publish(tikTokLiveClient, new TikTokErrorEvent(error)); eventHandler.publish(liveClient, new TikTokErrorEvent(error));
if (isOpen()) { if (isOpen()) {
sendPing(); sendPing();
} }
@@ -132,6 +131,7 @@ public class TikTokWebSocketListener extends WebSocketClient {
@Override @Override
public void onMessage(String s) { public void onMessage(String s) {
// System.err.println(s); //TODO we are not using this method, however I wounder if there might be
//so messages that are send as String from TikTok, for example some Jsons
} }
} }

View File

@@ -22,14 +22,13 @@
*/ */
package io.github.jwdeveloper.tiktok.websocket; package io.github.jwdeveloper.tiktok.websocket;
import io.github.jwdeveloper.tiktok.TikTokLiveEventHandler;
import io.github.jwdeveloper.tiktok.data.events.TikTokConnectedEvent; import io.github.jwdeveloper.tiktok.data.events.TikTokConnectedEvent;
import io.github.jwdeveloper.tiktok.data.events.TikTokDisconnectedEvent; import io.github.jwdeveloper.tiktok.data.events.TikTokDisconnectedEvent;
import io.github.jwdeveloper.tiktok.data.requests.LiveConnectionData; import io.github.jwdeveloper.tiktok.data.requests.LiveConnectionData;
import io.github.jwdeveloper.tiktok.live.LiveClient; import io.github.jwdeveloper.tiktok.live.LiveClient;
import io.github.jwdeveloper.tiktok.live.LiveEventsHandler; import io.github.jwdeveloper.tiktok.live.LiveEventsHandler;
public class TikTokWebSocketOfflineClient implements SocketClient { public class TikTokWebSocketOfflineClient implements LiveSocketClient {
private final LiveEventsHandler handler; private final LiveEventsHandler handler;
private LiveClient liveClient; private LiveClient liveClient;

View File

@@ -23,6 +23,7 @@
package io.github.jwdeveloper.tiktok.listener; package io.github.jwdeveloper.tiktok.listener;
import io.github.jwdeveloper.tiktok.TikTokLiveEventHandler; import io.github.jwdeveloper.tiktok.TikTokLiveEventHandler;
import io.github.jwdeveloper.tiktok.annotations.Priority;
import io.github.jwdeveloper.tiktok.annotations.TikTokEventObserver; import io.github.jwdeveloper.tiktok.annotations.TikTokEventObserver;
import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent; import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent;
import io.github.jwdeveloper.tiktok.data.events.gift.TikTokGiftEvent; import io.github.jwdeveloper.tiktok.data.events.gift.TikTokGiftEvent;
@@ -48,23 +49,23 @@ class TikTokListenersManagerTest {
@BeforeEach @BeforeEach
void setUp() { void setUp() {
eventObserver = Mockito.mock(TikTokLiveEventHandler.class); eventObserver = Mockito.mock(TikTokLiveEventHandler.class);
List<TikTokEventListener> listeners = new ArrayList<>(); List<Object> listeners = new ArrayList<>();
tikTokListenersManager = new TikTokListenersManager(listeners, eventObserver); tikTokListenersManager = new TikTokListenersManager(listeners, eventObserver);
} }
@Test @Test
void addListener() { void addListener() {
TikTokEventListener listener =new TikTokEventListenerTest(); Object listener =new TikTokEventListenerTest();
tikTokListenersManager.addListener(listener); tikTokListenersManager.addListener(listener);
List<TikTokEventListener> listeners = tikTokListenersManager.getListeners(); List<Object> listeners = tikTokListenersManager.getListeners();
assertEquals(1, listeners.size()); assertEquals(1, listeners.size());
assertSame(listener, listeners.get(0)); assertSame(listener, listeners.get(0));
} }
@Test @Test
void addListener_alreadyRegistered_throwsException() { void addListener_alreadyRegistered_throwsException() {
TikTokEventListener listener = new TikTokEventListenerTest(); Object listener = new TikTokEventListenerTest();
tikTokListenersManager.addListener(listener); tikTokListenersManager.addListener(listener);
Exception exception = assertThrows(TikTokLiveException.class, () -> { Exception exception = assertThrows(TikTokLiveException.class, () -> {
@@ -76,22 +77,22 @@ class TikTokListenersManagerTest {
@Test @Test
void removeListener() { void removeListener() {
TikTokEventListener listener = new TikTokEventListenerTest(); Object listener = new TikTokEventListenerTest();
tikTokListenersManager.addListener(listener); tikTokListenersManager.addListener(listener);
tikTokListenersManager.removeListener(listener); tikTokListenersManager.removeListener(listener);
List<TikTokEventListener> listeners = tikTokListenersManager.getListeners(); List<Object> listeners = tikTokListenersManager.getListeners();
assertTrue(listeners.isEmpty()); assertTrue(listeners.isEmpty());
} }
@Test @Test
void removeListener_notRegistered_doesNotThrow() { void removeListener_notRegistered_doesNotThrow() {
TikTokEventListener listener = new TikTokEventListenerTest(); Object listener = new TikTokEventListenerTest();
assertDoesNotThrow(() -> tikTokListenersManager.removeListener(listener)); assertDoesNotThrow(() -> tikTokListenersManager.removeListener(listener));
} }
public static class TikTokEventListenerTest implements TikTokEventListener public static class TikTokEventListenerTest
{ {
@TikTokEventObserver @TikTokEventObserver
public void onJoin(LiveClient client, TikTokJoinEvent joinEvent) public void onJoin(LiveClient client, TikTokJoinEvent joinEvent)
@@ -99,7 +100,7 @@ class TikTokListenersManagerTest {
} }
@TikTokEventObserver @TikTokEventObserver(priority = Priority.NORMAL,async=true)
public void onGift(LiveClient client, TikTokGiftEvent giftMessageEvent) public void onGift(LiveClient client, TikTokGiftEvent giftMessageEvent)
{ {

View File

@@ -29,8 +29,6 @@ public class GiftsExample {
public static void main(String[] args) { public static void main(String[] args) {
var giftsManager = TikTokLive.gifts(); var giftsManager = TikTokLive.gifts();
var giftsList = giftsManager.toList(); var giftsList = giftsManager.toList();
for (var gift : giftsList) { for (var gift : giftsList) {
System.out.println("Gift: " + gift); System.out.println("Gift: " + gift);