Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 660cb28

Browse files
committed
Improvement of Listener
1 parent 7005f58 commit 660cb28

File tree

16 files changed

+121
-83
lines changed

16 files changed

+121
-83
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package io.github.jwdeveloper.tiktok.annotations;
2+
/**
3+
* HIGHEST 1
4+
* HIGH 2
5+
* NORMAL 3
6+
* LOW 4
7+
* LOWEST 5
8+
*/
9+
10+
public enum Priority {
11+
LOWEST(2), LOW(1), NORMAL(0), HIGH(-1), HIGHEST(-2);
12+
13+
public int priorityValue;
14+
15+
Priority(int value) {
16+
this.priorityValue = value;
17+
}
18+
}

API/src/main/java/io/github/jwdeveloper/tiktok/annotations/TikTokEventObserver.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,13 @@
2626
import java.lang.annotation.RetentionPolicy;
2727

2828
@Retention(RetentionPolicy.RUNTIME)
29-
public @interface TikTokEventObserver
30-
{
29+
public @interface TikTokEventObserver {
3130

31+
Priority priority() default Priority.NORMAL;
32+
33+
/**
34+
* when true, action is invoked on the another thread
35+
* @return
36+
*/
37+
boolean async();
3238
}

API/src/main/java/io/github/jwdeveloper/tiktok/listener/ListenersManager.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,13 @@
2727
/**
2828
* You can dynamically add or removing TikTokEventListener
2929
*
30-
* @see TikTokEventListener
3130
*
3231
*/
3332
public interface ListenersManager
3433
{
35-
List<TikTokEventListener> getListeners();
34+
List<Object> getListeners();
3635

37-
void addListener(TikTokEventListener listener);
36+
void addListener(Object listener);
3837

39-
void removeListener(TikTokEventListener listener);
38+
void removeListener(Object listener);
4039
}

API/src/main/java/io/github/jwdeveloper/tiktok/listener/TikTokEventListener.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
* {@code
4141
* public static class CustomListener implements TikTokEventListener
4242
* {
43-
* @TikTokEventObserver
43+
* @TikTokEventObserver
4444
* public void onError(LiveClient liveClient, TikTokErrorEvent event)
4545
* {
4646
* System.out.println(event.getException().getMessage());
@@ -67,7 +67,9 @@
6767
* }
6868
* </pre>
6969
*/
70-
public interface TikTokEventListener
71-
{
70+
//TODO I think this interface can be removed, since we are using,
71+
//annotation @TikTokEventHandler to check methods that are events
72+
@Deprecated(forRemoval = true, since = "This interface is not longer needed, please remove it from your class")
73+
public interface TikTokEventListener {
7274

7375
}

API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/LiveClientBuilder.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,11 @@ public interface LiveClientBuilder extends EventsBuilder<LiveClientBuilder> {
5454
LiveClientBuilder configure(Consumer<LiveClientSettings> onConfigure);
5555

5656
/**
57-
* @see TikTokEventListener
5857
* Adding events listener class, its fancy way to register events without using lamda method
5958
* but actual method in class that implements TikTokEventListener
6059
* @return
6160
*/
62-
LiveClientBuilder addListener(TikTokEventListener listener);
61+
LiveClientBuilder addListener(Object listener);
6362

6463

6564
/**

API/src/main/java/io/github/jwdeveloper/tiktok/websocket/SocketClient.java renamed to API/src/main/java/io/github/jwdeveloper/tiktok/websocket/LiveSocketClient.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,8 @@
2424

2525
import io.github.jwdeveloper.tiktok.data.requests.LiveConnectionData;
2626
import io.github.jwdeveloper.tiktok.live.LiveClient;
27-
import io.github.jwdeveloper.tiktok.messages.webcast.WebcastResponse;
2827

29-
public interface SocketClient {
28+
public interface LiveSocketClient {
3029
void start(LiveConnectionData.Response webcastResponse, LiveClient tikTokLiveClient);
3130
void stop();
3231
}

Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
import io.github.jwdeveloper.tiktok.live.*;
3737
import io.github.jwdeveloper.tiktok.messages.webcast.WebcastResponse;
3838
import io.github.jwdeveloper.tiktok.models.ConnectionState;
39-
import io.github.jwdeveloper.tiktok.websocket.SocketClient;
39+
import io.github.jwdeveloper.tiktok.websocket.LiveSocketClient;
4040
import lombok.Getter;
4141

4242
import java.util.Base64;
@@ -49,7 +49,7 @@ public class TikTokLiveClient implements LiveClient
4949
{
5050
private final TikTokRoomInfo roomInfo;
5151
private final LiveHttpClient httpClient;
52-
private final SocketClient webSocketClient;
52+
private final LiveSocketClient webSocketClient;
5353
private final LiveEventsHandler tikTokEventHandler;
5454
private final LiveClientSettings clientSettings;
5555
private final ListenersManager listenersManager;
@@ -62,7 +62,7 @@ public TikTokLiveClient(
6262
GiftsManager giftsManager,
6363
TikTokRoomInfo tikTokLiveMeta,
6464
LiveHttpClient tiktokHttpClient,
65-
SocketClient webSocketClient,
65+
LiveSocketClient webSocketClient,
6666
LiveEventsHandler tikTokEventHandler,
6767
LiveClientSettings clientSettings,
6868
ListenersManager listenersManager,

Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public class TikTokLiveClientBuilder implements LiveClientBuilder {
5252

5353
protected final LiveClientSettings clientSettings;
5454
protected final LiveEventsHandler eventHandler;
55-
protected final List<TikTokEventListener> listeners;
55+
protected final List<Object> listeners;
5656
protected final List<Consumer<LiveMapper>> onCustomMappings;
5757
protected final List<Consumer<DependanceContainerBuilder>> onCustomDependencies;
5858

@@ -75,7 +75,7 @@ public TikTokLiveClientBuilder configure(Consumer<LiveClientSettings> onConfigur
7575
return this;
7676
}
7777

78-
public TikTokLiveClientBuilder addListener(TikTokEventListener listener) {
78+
public TikTokLiveClientBuilder addListener(Object listener) {
7979
if (listener != null)
8080
listeners.add(listener);
8181
return this;
@@ -97,6 +97,7 @@ protected void validate() {
9797
if (clientSettings.getHostName().startsWith("@"))
9898
clientSettings.setHostName(clientSettings.getHostName().substring(1));
9999

100+
//TODO 250 Magic number
100101
if (clientSettings.getPingInterval() < 250)
101102
throw new TikTokLiveException("Minimum allowed ping interval is 250 millseconds");
102103

@@ -124,20 +125,23 @@ public LiveClient build() {
124125

125126
//messages
126127
dependance.registerSingleton(LiveEventsHandler.class, eventHandler);
127-
dependance.registerSingleton(LiveMessagesHandler.class,TikTokLiveMessageHandler.class);
128+
dependance.registerSingleton(LiveMessagesHandler.class, TikTokLiveMessageHandler.class);
128129

129130
//listeners
130-
dependance.registerSingletonList(TikTokEventListener.class, (e) -> listeners);
131-
dependance.registerSingleton(ListenersManager.class, TikTokListenersManager.class);
131+
dependance.registerSingleton(ListenersManager.class, container ->
132+
{
133+
var eventHandlers = (LiveEventsHandler) container.find(LiveEventsHandler.class);
134+
return new TikTokListenersManager(listeners, eventHandlers);
135+
});
132136

133137
//networking
134138
dependance.registerSingleton(HttpClientFactory.class);
135139
dependance.registerSingleton(TikTokWebSocketPingingTask.class);
136140
if (clientSettings.isOffline()) {
137-
dependance.registerSingleton(SocketClient.class, TikTokWebSocketOfflineClient.class);
141+
dependance.registerSingleton(LiveSocketClient.class, TikTokWebSocketOfflineClient.class);
138142
dependance.registerSingleton(LiveHttpClient.class, TikTokLiveHttpOfflineClient.class);
139143
} else {
140-
dependance.registerSingleton(SocketClient.class, TikTokWebSocketClient.class);
144+
dependance.registerSingleton(LiveSocketClient.class, TikTokWebSocketClient.class);
141145
dependance.registerSingleton(LiveHttpClient.class, TikTokLiveHttpClient.class);
142146
}
143147

Client/src/main/java/io/github/jwdeveloper/tiktok/listener/ListenerBindingModel.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,7 @@
3333
@Value
3434
public class ListenerBindingModel
3535
{
36-
37-
TikTokEventListener listener;
36+
Object listener;
3837

3938
Map<Class<?>, List<EventConsumer<?>>> events;
4039
}

Client/src/main/java/io/github/jwdeveloper/tiktok/listener/TikTokListenersManager.java

Lines changed: 38 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
package io.github.jwdeveloper.tiktok.listener;
2424

2525

26-
import io.github.jwdeveloper.tiktok.TikTokLiveEventHandler;
2726
import io.github.jwdeveloper.tiktok.annotations.TikTokEventObserver;
2827
import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent;
2928
import io.github.jwdeveloper.tiktok.exceptions.TikTokEventListenerMethodException;
@@ -32,30 +31,31 @@
3231
import io.github.jwdeveloper.tiktok.live.LiveEventsHandler;
3332
import io.github.jwdeveloper.tiktok.live.builder.EventConsumer;
3433

35-
import java.util.ArrayList;
36-
import java.util.Arrays;
37-
import java.util.HashMap;
38-
import java.util.List;
34+
import java.util.*;
35+
import java.util.concurrent.ExecutorService;
36+
import java.util.concurrent.Executors;
3937

4038
public class TikTokListenersManager implements ListenersManager {
4139
private final LiveEventsHandler eventObserver;
4240
private final List<ListenerBindingModel> bindingModels;
41+
private final ExecutorService executorService;
4342

44-
public TikTokListenersManager(List<TikTokEventListener> listeners, LiveEventsHandler tikTokEventHandler) {
43+
public TikTokListenersManager(List<Object> listeners, LiveEventsHandler tikTokEventHandler) {
4544
this.eventObserver = tikTokEventHandler;
4645
this.bindingModels = new ArrayList<>(listeners.size());
4746
for (var listener : listeners) {
4847
addListener(listener);
4948
}
49+
executorService = Executors.newFixedThreadPool(4);
5050
}
5151

5252
@Override
53-
public List<TikTokEventListener> getListeners() {
53+
public List<Object> getListeners() {
5454
return bindingModels.stream().map(ListenerBindingModel::getListener).toList();
5555
}
5656

5757
@Override
58-
public void addListener(TikTokEventListener listener) {
58+
public void addListener(Object listener) {
5959
var alreadyExists = bindingModels.stream().filter(e -> e.getListener() == listener).findAny();
6060
if (alreadyExists.isPresent()) {
6161
throw new TikTokLiveException("Listener " + listener.getClass() + " has already been registered");
@@ -72,7 +72,7 @@ public void addListener(TikTokEventListener listener) {
7272
}
7373

7474
@Override
75-
public void removeListener(TikTokEventListener listener) {
75+
public void removeListener(Object listener) {
7676
var optional = bindingModels.stream().filter(e -> e.getListener() == listener).findAny();
7777
if (optional.isEmpty()) {
7878
return;
@@ -89,37 +89,49 @@ public void removeListener(TikTokEventListener listener) {
8989
bindingModels.remove(optional.get());
9090
}
9191

92-
private ListenerBindingModel bindToEvents(TikTokEventListener listener) {
93-
92+
private ListenerBindingModel bindToEvents(Object listener) {
9493
var clazz = listener.getClass();
95-
var methods = Arrays.stream(clazz.getDeclaredMethods()).filter(m ->
96-
m.getParameterCount() == 2 &&
97-
m.isAnnotationPresent(TikTokEventObserver.class)).toList();
94+
var methods = Arrays.stream(clazz.getDeclaredMethods())
95+
.filter(m ->
96+
m.getParameterCount() >= 1 &&
97+
m.isAnnotationPresent(TikTokEventObserver.class))
98+
.toList();
9899
var eventsMap = new HashMap<Class<?>, List<EventConsumer<?>>>();
99100
for (var method : methods) {
100-
var liveclientClass = method.getParameterTypes()[0];
101-
var eventClass = method.getParameterTypes()[1];
102-
103-
if (!LiveClient.class.isAssignableFrom(liveclientClass) && !liveclientClass.equals(LiveClient.class)) {
104-
throw new TikTokEventListenerMethodException("Method " + method.getName() + "() 1st parameter must be instance of " + LiveClient.class.getName()
105-
+ " | Invalid parameter class: "+liveclientClass.getName());
106-
}
107-
108-
if (!TikTokEvent.class.isAssignableFrom(eventClass) && !eventClass.equals(TikTokEvent.class)) {
109-
throw new TikTokEventListenerMethodException("Method " + method.getName() + "() 2nd parameter must be instance of " + TikTokEvent.class.getName()
110-
+ " | Invalid parameter class: "+eventClass.getName());
101+
var annotation = method.getAnnotation(TikTokEventObserver.class);
102+
var tiktokEventsParameters = Arrays.stream(method.getParameters())
103+
.filter(parameter ->
104+
TikTokEvent.class.isAssignableFrom(parameter.getType()) ||
105+
parameter.getType().equals(TikTokEvent.class))
106+
.toList();
107+
if (tiktokEventsParameters.size() != 1) {
108+
throw new TikTokEventListenerMethodException("Method " + method.getName() + "() must have only one parameter that inherits from class " + TikTokEvent.class.getName());
111109
}
112110

111+
var eventType = tiktokEventsParameters.get(0).getType();
113112
EventConsumer eventMethodRef = (liveClient, event) ->
114113
{
114+
if (annotation.async()) {
115+
executorService.submit(() ->
116+
{
117+
try {
118+
method.setAccessible(true);
119+
method.invoke(listener, liveClient, event);
120+
} catch (Exception e) {
121+
throw new TikTokEventListenerMethodException(e);
122+
}
123+
});
124+
return;
125+
}
126+
115127
try {
116128
method.setAccessible(true);
117129
method.invoke(listener, liveClient, event);
118130
} catch (Exception e) {
119131
throw new TikTokEventListenerMethodException(e);
120132
}
121133
};
122-
eventsMap.computeIfAbsent(eventClass, (a) -> new ArrayList<>()).add(eventMethodRef);
134+
eventsMap.computeIfAbsent(eventType, (a) -> new ArrayList<>()).add(eventMethodRef);
123135
}
124136
return new ListenerBindingModel(listener, eventsMap);
125137
}

0 commit comments

Comments
 (0)