diff --git a/API/pom.xml b/API/pom.xml
index 18fd420..97f494f 100644
--- a/API/pom.xml
+++ b/API/pom.xml
@@ -58,6 +58,25 @@
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ 3.3.0
+
+
+ attach-javadocs
+ package
+
+ jar
+
+
+ -html,-syntax,-accessibility,-missing
+ false
+ true
+
+
+
+
\ No newline at end of file
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/Constants.java b/API/src/main/java/io/github/jwdeveloper/tiktok/Constants.java
index a2dcf50..a2236fd 100644
--- a/API/src/main/java/io/github/jwdeveloper/tiktok/Constants.java
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/Constants.java
@@ -116,6 +116,7 @@ public class Constants {
public static Map DefaultRequestHeaders() {
var headers = new HashMap();
+ headers.put("authority","www.tiktok.com");
headers.put("Connection", "keep-alive");
headers.put("Cache-Control", "max-age=0");
headers.put("Accept", "text/html,application/json,application/protobuf");
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/common/TikTokEmptyEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/common/TikTokEmptyEvent.java
new file mode 100644
index 0000000..bb51d4e
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/common/TikTokEmptyEvent.java
@@ -0,0 +1,10 @@
+package io.github.jwdeveloper.tiktok.data.events.common;
+
+
+/**
+ *
+ */
+public class TikTokEmptyEvent extends TikTokEvent
+{
+
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/common/TikTokEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/common/TikTokEvent.java
index 3e36636..1c01ec5 100644
--- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/common/TikTokEvent.java
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/common/TikTokEvent.java
@@ -26,8 +26,8 @@ package io.github.jwdeveloper.tiktok.data.events.common;
import io.github.jwdeveloper.tiktok.utils.JsonUtil;
import lombok.Getter;
-/*
- Base class for all events
+/**
+ * Base class for all events
*/
@Getter
public abstract class TikTokEvent {
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftComboEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftComboEvent.java
index 439cd26..2363fbe 100644
--- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftComboEvent.java
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftComboEvent.java
@@ -24,16 +24,32 @@ package io.github.jwdeveloper.tiktok.data.events.gift;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
-import io.github.jwdeveloper.tiktok.data.models.Gift;
-
+import io.github.jwdeveloper.tiktok.data.models.gifts.Gift;
+import io.github.jwdeveloper.tiktok.data.models.gifts.GiftSendType;
import io.github.jwdeveloper.tiktok.messages.webcast.WebcastGiftMessage;
import lombok.Getter;
+
+/**
+ * Triggered every time gift is sent
+ *
+ * @see GiftSendType it has 3 states
+ *
+ * Example when user sends gift with combo
+ * Combo: 1 -> comboState = GiftSendType.Begin
+ * Combo: 4 -> comboState = GiftSendType.Active
+ * Combo: 8 -> comboState = GiftSendType.Active
+ * Combo: 12 -> comboState = GiftSendType.Finsihed
+ *
+ * Remember if comboState is Finsihed both TikTokGiftComboEvent and TikTokGiftEvent event gets triggered
+ */
@EventMeta(eventType = EventType.Message)
@Getter
-public class TikTokGiftComboEvent extends TikTokGiftEvent
-{
- public TikTokGiftComboEvent(Gift gift, WebcastGiftMessage msg) {
+public class TikTokGiftComboEvent extends TikTokGiftEvent {
+ private final GiftSendType comboState;
+
+ public TikTokGiftComboEvent(Gift gift, WebcastGiftMessage msg, GiftSendType comboState) {
super(gift, msg);
+ this.comboState = comboState;
}
}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftEvent.java
index a95f8f7..d3a2ff8 100644
--- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftEvent.java
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftEvent.java
@@ -26,14 +26,17 @@ package io.github.jwdeveloper.tiktok.data.events.gift;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.data.events.common.TikTokHeaderEvent;
-import io.github.jwdeveloper.tiktok.data.models.Gift;
+import io.github.jwdeveloper.tiktok.data.models.gifts.Gift;
+import io.github.jwdeveloper.tiktok.data.models.gifts.GiftSendType;
import io.github.jwdeveloper.tiktok.data.models.users.User;
import io.github.jwdeveloper.tiktok.messages.webcast.WebcastGiftMessage;
import lombok.Getter;
/*
- * Triggered every time a gift arrives.
+ * Triggered when user sends gifts that has
+ * no combo (most of expensive gifts)
+ * or if combo has finished
*/
@EventMeta(eventType = EventType.Message)
@Getter
@@ -41,15 +44,10 @@ public class TikTokGiftEvent extends TikTokHeaderEvent {
private final Gift gift;
private final User user;
private final int combo;
- private final boolean comboFinished;
- private final int comboIndex;
-
public TikTokGiftEvent(Gift gift, WebcastGiftMessage msg) {
super(msg.getCommon());
this.gift = gift;
- user = User.map(msg.getUser(),msg.getUserIdentity());
+ user = User.map(msg.getUser(), msg.getUserIdentity());
combo = msg.getComboCount();
- comboFinished = msg.getRepeatEnd() > 0;
- comboIndex = msg.getRepeatCount();
}
}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/websocket/TikTokWebsocketMessageEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/websocket/TikTokWebsocketMessageEvent.java
index 814450d..2576996 100644
--- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/websocket/TikTokWebsocketMessageEvent.java
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/websocket/TikTokWebsocketMessageEvent.java
@@ -28,6 +28,9 @@ import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent;
import io.github.jwdeveloper.tiktok.messages.webcast.WebcastResponse;
import lombok.AllArgsConstructor;
import lombok.Getter;
+import lombok.Value;
+
+import java.time.Duration;
/**
@@ -41,4 +44,12 @@ public class TikTokWebsocketMessageEvent extends TikTokEvent
private TikTokEvent event;
private WebcastResponse.Message message;
+
+ private MetaData metaData;
+
+ @Value
+ public static class MetaData
+ {
+ Duration handlingTime;
+ }
}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/Text.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/Text.java
index 68af552..bb467e7 100644
--- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/Text.java
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/Text.java
@@ -69,9 +69,14 @@ public class Text {
var format = matcher.replaceAll("%s");
var output = new ArrayList();
- for (var piece : textPieces) {
+ for (var piece : textPieces)
+ {
output.add(piece.getText());
}
+ if(matcher.groupCount() != output.size())
+ {
+ return format;
+ }
return String.format(format, output.toArray());
}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/Gift.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/gifts/Gift.java
similarity index 99%
rename from API/src/main/java/io/github/jwdeveloper/tiktok/data/models/Gift.java
rename to API/src/main/java/io/github/jwdeveloper/tiktok/data/models/gifts/Gift.java
index 20529e5..de88661 100644
--- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/Gift.java
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/gifts/Gift.java
@@ -21,8 +21,9 @@
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
// This enum is generated
-package io.github.jwdeveloper.tiktok.data.models;
+package io.github.jwdeveloper.tiktok.data.models.gifts;
+import io.github.jwdeveloper.tiktok.data.models.Picture;
import lombok.Getter;
@Getter
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/gifts/GiftSendType.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/gifts/GiftSendType.java
new file mode 100644
index 0000000..3a1b6c7
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/gifts/GiftSendType.java
@@ -0,0 +1,18 @@
+package io.github.jwdeveloper.tiktok.data.models.gifts;
+
+public enum GiftSendType
+{
+ Finished,
+ Begin,
+ Active;
+
+
+ public static GiftSendType fromNumber(long number)
+ {
+ return switch ((int) number) {
+ case 0 -> GiftSendType.Finished;
+ case 1, 2, 4 -> GiftSendType.Active;
+ default -> GiftSendType.Finished;
+ };
+ }
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/users/User.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/users/User.java
index d84815a..28ea7b7 100644
--- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/users/User.java
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/users/User.java
@@ -46,9 +46,6 @@ public class User {
@Getter(AccessLevel.NONE)
private Set attributes;
- @Setter
- private boolean tracked;
-
public List getAttributes() {
return attributes.stream().toList();
}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/handler/TikTokMessageHandler.java b/API/src/main/java/io/github/jwdeveloper/tiktok/handler/TikTokMessageHandler.java
index 0f58193..a5f1cb2 100644
--- a/API/src/main/java/io/github/jwdeveloper/tiktok/handler/TikTokMessageHandler.java
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/handler/TikTokMessageHandler.java
@@ -25,8 +25,10 @@ package io.github.jwdeveloper.tiktok.handler;
import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent;
+import java.util.List;
+
public interface TikTokMessageHandler
{
- TikTokEvent handle(byte[] messagePayload) throws Exception;
+ List handle(byte[] messagePayload) throws Exception;
}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/live/GiftManager.java b/API/src/main/java/io/github/jwdeveloper/tiktok/live/GiftManager.java
index 3c32abc..628bf86 100644
--- a/API/src/main/java/io/github/jwdeveloper/tiktok/live/GiftManager.java
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/live/GiftManager.java
@@ -22,7 +22,7 @@
*/
package io.github.jwdeveloper.tiktok.live;
-import io.github.jwdeveloper.tiktok.data.models.Gift;
+import io.github.jwdeveloper.tiktok.data.models.gifts.Gift;
import io.github.jwdeveloper.tiktok.data.models.Picture;
import java.util.List;
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/live/TrackedUser.java b/API/src/main/java/io/github/jwdeveloper/tiktok/live/TrackedUser.java
index ea5d444..6cd9341 100644
--- a/API/src/main/java/io/github/jwdeveloper/tiktok/live/TrackedUser.java
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/live/TrackedUser.java
@@ -23,7 +23,7 @@
package io.github.jwdeveloper.tiktok.live;
import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent;
-import io.github.jwdeveloper.tiktok.data.models.Gift;
+import io.github.jwdeveloper.tiktok.data.models.gifts.Gift;
import io.github.jwdeveloper.tiktok.data.models.users.User;
import java.util.List;
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 65859d1..988f9cf 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,7 +52,6 @@ public interface EventsBuilder {
T onWebsocketUnhandledMessage(EventConsumer event);
T onGiftCombo(EventConsumer event);
-
T onGift(EventConsumer event);
T onQuestion(EventConsumer event);
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/utils/Stopwatch.java b/API/src/main/java/io/github/jwdeveloper/tiktok/utils/Stopwatch.java
new file mode 100644
index 0000000..22e2e48
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/utils/Stopwatch.java
@@ -0,0 +1,20 @@
+package io.github.jwdeveloper.tiktok.utils;
+
+public class Stopwatch {
+ private long startTime;
+ private long stopTime;
+
+ public void start() {
+ startTime = System.nanoTime();
+ }
+
+ public long stop() {
+ stopTime = System.nanoTime();
+ return getElapsedTime();
+ }
+
+ public long getElapsedTime() {
+ return stopTime - startTime;
+ }
+
+}
\ No newline at end of file
diff --git a/Client/pom.xml b/Client/pom.xml
index d5bfae8..4009d70 100644
--- a/Client/pom.xml
+++ b/Client/pom.xml
@@ -80,7 +80,7 @@
*:*
- **/tiktokSchema.proto/**
+ **/*.proto
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 618bd24..6d70eea 100644
--- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java
+++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java
@@ -41,6 +41,7 @@ import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException;
import io.github.jwdeveloper.tiktok.gifts.TikTokGiftManager;
import io.github.jwdeveloper.tiktok.handlers.TikTokEventObserver;
import io.github.jwdeveloper.tiktok.handlers.TikTokMessageHandlerRegistration;
+import io.github.jwdeveloper.tiktok.handlers.events.TikTokGiftEventHandler;
import io.github.jwdeveloper.tiktok.http.TikTokApiService;
import io.github.jwdeveloper.tiktok.http.TikTokCookieJar;
import io.github.jwdeveloper.tiktok.http.TikTokHttpClient;
@@ -50,6 +51,7 @@ import io.github.jwdeveloper.tiktok.listener.TikTokListenersManager;
import io.github.jwdeveloper.tiktok.live.LiveClient;
import io.github.jwdeveloper.tiktok.live.builder.EventConsumer;
import io.github.jwdeveloper.tiktok.live.builder.LiveClientBuilder;
+import io.github.jwdeveloper.tiktok.mappers.TikTokGenericEventMapper;
import io.github.jwdeveloper.tiktok.utils.ConsoleColors;
import io.github.jwdeveloper.tiktok.websocket.TikTokWebSocketClient;
@@ -147,10 +149,14 @@ public class TikTokLiveClientBuilder implements LiveClientBuilder {
var apiClient = new TikTokHttpClient(cookieJar, requestFactory);
var apiService = new TikTokApiService(apiClient, logger, clientSettings);
var giftManager = new TikTokGiftManager();
+ var eventMapper = new TikTokGenericEventMapper();
+ var giftHandler = new TikTokGiftEventHandler(giftManager);
var webResponseHandler = new TikTokMessageHandlerRegistration(tikTokEventHandler,
- giftManager,
- tiktokRoomInfo);
+ tiktokRoomInfo,
+ eventMapper,
+ giftHandler
+ );
var webSocketClient = new TikTokWebSocketClient(logger,
cookieJar,
diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/gifts/TikTokGiftManager.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/gifts/TikTokGiftManager.java
index 41616be..e97b58e 100644
--- a/Client/src/main/java/io/github/jwdeveloper/tiktok/gifts/TikTokGiftManager.java
+++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/gifts/TikTokGiftManager.java
@@ -22,7 +22,7 @@
*/
package io.github.jwdeveloper.tiktok.gifts;
-import io.github.jwdeveloper.tiktok.data.models.Gift;
+import io.github.jwdeveloper.tiktok.data.models.gifts.Gift;
import io.github.jwdeveloper.tiktok.data.models.Picture;
import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException;
import io.github.jwdeveloper.tiktok.live.GiftManager;
diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/handlers/TikTokMessageHandler.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/handlers/TikTokMessageHandler.java
index 2259f26..e65fe4a 100644
--- a/Client/src/main/java/io/github/jwdeveloper/tiktok/handlers/TikTokMessageHandler.java
+++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/handlers/TikTokMessageHandler.java
@@ -23,18 +23,20 @@
package io.github.jwdeveloper.tiktok.handlers;
-import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent;
import io.github.jwdeveloper.tiktok.data.events.TikTokErrorEvent;
+import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent;
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.exceptions.TikTokMessageMappingException;
import io.github.jwdeveloper.tiktok.live.LiveClient;
+import io.github.jwdeveloper.tiktok.mappers.TikTokGenericEventMapper;
import io.github.jwdeveloper.tiktok.messages.webcast.WebcastResponse;
+import io.github.jwdeveloper.tiktok.utils.Stopwatch;
-import java.util.Arrays;
+import java.time.Duration;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.function.Function;
@@ -43,21 +45,24 @@ public abstract class TikTokMessageHandler {
private final Map handlers;
private final TikTokEventObserver tikTokEventHandler;
+ protected final TikTokGenericEventMapper mapper;
- public TikTokMessageHandler(TikTokEventObserver tikTokEventHandler) {
+ public TikTokMessageHandler(TikTokEventObserver tikTokEventHandler, TikTokGenericEventMapper mapper) {
handlers = new HashMap<>();
this.tikTokEventHandler = tikTokEventHandler;
- init();
+ this.mapper = mapper;
}
- public abstract void init();
-
public void registerMapping(Class> clazz, Function func) {
+ handlers.put(clazz.getSimpleName(), messagePayload -> List.of(func.apply(messagePayload)));
+ }
+
+ public void registerMappings(Class> clazz, Function> func) {
handlers.put(clazz.getSimpleName(), func::apply);
}
public void registerMapping(Class> input, Class> output) {
- registerMapping(input, (e) -> mapMessageToEvent(input, output, e));
+ registerMapping(input, (e) -> mapper.mapToEvent(input, output, e));
}
public void handle(LiveClient client, WebcastResponse webcastResponse) {
@@ -71,18 +76,6 @@ public abstract class TikTokMessageHandler {
}
}
}
- public void handleSingleMessage(LiveClient client, String type, byte[] bytes) throws Exception {
-
- if (!handlers.containsKey(type)) {
- tikTokEventHandler.publish(client, new TikTokWebsocketUnhandledMessageEvent(WebcastResponse.Message.newBuilder().setMethod(type).build()));
- return;
- }
- var handler = handlers.get(type);
- var tiktokEvent = handler.handle(bytes);
- tikTokEventHandler.publish(client, new TikTokWebsocketMessageEvent(tiktokEvent, WebcastResponse.Message.newBuilder().build()));
- tikTokEventHandler.publish(client, tiktokEvent);
- }
-
public void handleSingleMessage(LiveClient client, WebcastResponse.Message message) throws Exception {
var messageClassName = message.getMethod();
@@ -91,29 +84,16 @@ public abstract class TikTokMessageHandler {
return;
}
var handler = handlers.get(messageClassName);
- var tiktokEvent = handler.handle(message.getPayload().toByteArray());
- tikTokEventHandler.publish(client, new TikTokWebsocketMessageEvent(tiktokEvent, message));
- tikTokEventHandler.publish(client, tiktokEvent);
- }
+ var stopwatch = new Stopwatch();
+ stopwatch.start();
+ var events = handler.handle(message.getPayload().toByteArray());
+ var handlingTimeInMs = stopwatch.stop();
+ var metadata = new TikTokWebsocketMessageEvent.MetaData(Duration.ofNanos(handlingTimeInMs));
- protected TikTokEvent mapMessageToEvent(Class> inputClazz, Class> outputClass, byte[] payload) {
- try {
- var parseMethod = inputClazz.getDeclaredMethod("parseFrom", byte[].class);
- var deserialized = parseMethod.invoke(null,payload);
- var constructors = Arrays.stream(outputClass.getConstructors())
- .filter(ea -> Arrays.stream(ea.getParameterTypes())
- .toList()
- .contains(inputClazz))
- .findFirst();
-
- if (constructors.isEmpty()) {
- throw new TikTokMessageMappingException(inputClazz, outputClass, "Unable to find constructor with input class type");
- }
-
- var tiktokEvent = constructors.get().newInstance(deserialized);
- return (TikTokEvent) tiktokEvent;
- } catch (Exception ex) {
- throw new TikTokMessageMappingException(inputClazz, outputClass, ex);
+ for (var event : events) {
+ tikTokEventHandler.publish(client, new TikTokWebsocketMessageEvent(event, message, metadata));
+ tikTokEventHandler.publish(client, event);
}
}
+
}
diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/handlers/TikTokMessageHandlerRegistration.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/handlers/TikTokMessageHandlerRegistration.java
index 720c79d..d4298b5 100644
--- a/Client/src/main/java/io/github/jwdeveloper/tiktok/handlers/TikTokMessageHandlerRegistration.java
+++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/handlers/TikTokMessageHandlerRegistration.java
@@ -23,11 +23,8 @@
package io.github.jwdeveloper.tiktok.handlers;
import io.github.jwdeveloper.tiktok.TikTokRoomInfo;
-import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent;
import io.github.jwdeveloper.tiktok.data.events.*;
-import io.github.jwdeveloper.tiktok.data.events.TikTokBarrageEvent;
-import io.github.jwdeveloper.tiktok.data.events.gift.TikTokGiftComboEvent;
-import io.github.jwdeveloper.tiktok.data.events.gift.TikTokGiftEvent;
+import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent;
import io.github.jwdeveloper.tiktok.data.events.poll.TikTokPollEndEvent;
import io.github.jwdeveloper.tiktok.data.events.poll.TikTokPollEvent;
import io.github.jwdeveloper.tiktok.data.events.poll.TikTokPollStartEvent;
@@ -39,10 +36,9 @@ import io.github.jwdeveloper.tiktok.data.events.social.TikTokFollowEvent;
import io.github.jwdeveloper.tiktok.data.events.social.TikTokJoinEvent;
import io.github.jwdeveloper.tiktok.data.events.social.TikTokLikeEvent;
import io.github.jwdeveloper.tiktok.data.events.social.TikTokShareEvent;
-import io.github.jwdeveloper.tiktok.data.models.Gift;
-import io.github.jwdeveloper.tiktok.data.models.Picture;
import io.github.jwdeveloper.tiktok.data.models.Text;
-import io.github.jwdeveloper.tiktok.gifts.TikTokGiftManager;
+import io.github.jwdeveloper.tiktok.handlers.events.TikTokGiftEventHandler;
+import io.github.jwdeveloper.tiktok.mappers.TikTokGenericEventMapper;
import io.github.jwdeveloper.tiktok.messages.webcast.*;
import io.github.jwdeveloper.tiktok.models.SocialTypes;
import lombok.SneakyThrows;
@@ -50,19 +46,21 @@ import lombok.SneakyThrows;
import java.util.regex.Pattern;
public class TikTokMessageHandlerRegistration extends TikTokMessageHandler {
- private final TikTokGiftManager giftManager;
+
private final TikTokRoomInfo roomInfo;
+ private final TikTokGiftEventHandler giftHandler;
private final Pattern socialMediaPattern = Pattern.compile("pm_mt_guidance_viewer_([0-9]+)_share");
public TikTokMessageHandlerRegistration(TikTokEventObserver tikTokEventHandler,
- TikTokGiftManager giftManager,
- TikTokRoomInfo roomInfo) {
- super(tikTokEventHandler);
- this.giftManager = giftManager;
+ TikTokRoomInfo roomInfo,
+ TikTokGenericEventMapper genericTikTokEventMapper,
+ TikTokGiftEventHandler tikTokGiftEventHandler) {
+ super(tikTokEventHandler, genericTikTokEventMapper);
+ this.giftHandler = tikTokGiftEventHandler;
this.roomInfo = roomInfo;
+ init();
}
- @Override
public void init() {
//ConnectionEvents events
@@ -80,7 +78,7 @@ public class TikTokMessageHandlerRegistration extends TikTokMessageHandler {
//User Interactions events
registerMapping(WebcastChatMessage.class, TikTokCommentEvent.class);
registerMapping(WebcastLikeMessage.class, this::handleLike);
- registerMapping(WebcastGiftMessage.class, this::handleGift);
+ registerMappings(WebcastGiftMessage.class, giftHandler::handleGift);
registerMapping(WebcastSocialMessage.class, this::handleSocialMedia);
registerMapping(WebcastMemberMessage.class, this::handleMemberMessage);
@@ -124,29 +122,6 @@ public class TikTokMessageHandlerRegistration extends TikTokMessageHandler {
};
}
- @SneakyThrows
- private TikTokEvent handleGift(byte[] msg) {
- var giftMessage = WebcastGiftMessage.parseFrom(msg);
-
-
- var gift = giftManager.findById((int) giftMessage.getGiftId());
- if (gift == Gift.UNDEFINED) {
- gift = giftManager.findByName(giftMessage.getGift().getName());
- }
- if (gift == Gift.UNDEFINED) {
- gift = giftManager.registerGift(
- (int) giftMessage.getGift().getId(),
- giftMessage.getGift().getName(),
- giftMessage.getGift().getDiamondCount(),
- Picture.map(giftMessage.getGift().getImage()));
- }
-
- if (giftMessage.getRepeatEnd() > 0) {
- return new TikTokGiftComboEvent(gift, giftMessage);
- }
-
- return new TikTokGiftEvent(gift, giftMessage);
- }
@SneakyThrows
private TikTokEvent handleSocialMedia(byte[] msg) {
@@ -181,13 +156,13 @@ public class TikTokMessageHandlerRegistration extends TikTokMessageHandler {
}
private TikTokEvent handleRoomUserSeqMessage(byte[] msg) {
- var event = (TikTokRoomUserInfoEvent) mapMessageToEvent(WebcastRoomUserSeqMessage.class, TikTokRoomUserInfoEvent.class, msg);
+ var event = (TikTokRoomUserInfoEvent) mapper.mapToEvent(WebcastRoomUserSeqMessage.class, TikTokRoomUserInfoEvent.class, msg);
roomInfo.setViewersCount(event.getTotalUsers());
return event;
}
private TikTokEvent handleLike(byte[] msg) {
- var event = (TikTokLikeEvent) mapMessageToEvent(WebcastLikeMessage.class, TikTokLikeEvent.class, msg);
+ var event = (TikTokLikeEvent) mapper.mapToEvent(WebcastLikeMessage.class, TikTokLikeEvent.class, msg);
roomInfo.setLikesCount(event.getTotalLikes());
return event;
}
@@ -200,7 +175,7 @@ public class TikTokMessageHandlerRegistration extends TikTokMessageHandler {
return new TikTokRoomPinEvent(pinMessage, chatEvent);
}
- //TODO check
+ //TODO Probably not working
@SneakyThrows
private TikTokEvent handlePollEvent(byte[] msg) {
var poolMessage = WebcastPollMessage.parseFrom(msg);
diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/handlers/events/TikTokGiftEventHandler.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/handlers/events/TikTokGiftEventHandler.java
new file mode 100644
index 0000000..29d1238
--- /dev/null
+++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/handlers/events/TikTokGiftEventHandler.java
@@ -0,0 +1,86 @@
+package io.github.jwdeveloper.tiktok.handlers.events;
+
+import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent;
+import io.github.jwdeveloper.tiktok.data.events.gift.TikTokGiftComboEvent;
+import io.github.jwdeveloper.tiktok.data.events.gift.TikTokGiftEvent;
+import io.github.jwdeveloper.tiktok.data.models.Picture;
+import io.github.jwdeveloper.tiktok.data.models.gifts.Gift;
+import io.github.jwdeveloper.tiktok.data.models.gifts.GiftSendType;
+import io.github.jwdeveloper.tiktok.live.GiftManager;
+import io.github.jwdeveloper.tiktok.messages.webcast.WebcastGiftMessage;
+import lombok.SneakyThrows;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class TikTokGiftEventHandler {
+ private final GiftManager giftManager;
+ private final Map giftsMessages;
+
+ public TikTokGiftEventHandler(GiftManager giftManager) {
+ this.giftManager = giftManager;
+ giftsMessages = new HashMap<>();
+ }
+
+ @SneakyThrows
+ public List handleGift(byte[] msg) {
+ var currentMessage = WebcastGiftMessage.parseFrom(msg);
+ var userId = currentMessage.getUser().getId();
+ var currentType = GiftSendType.fromNumber(currentMessage.getSendType());
+ var containsPreviousMessage = giftsMessages.containsKey(userId);
+
+ if (!containsPreviousMessage) {
+ if (currentType == GiftSendType.Finished) {
+ return List.of(getGiftEvent(currentMessage));
+ } else {
+ giftsMessages.put(userId, currentMessage);
+ return List.of(getGiftComboEvent(currentMessage, GiftSendType.Begin));
+ }
+ }
+
+ var previousMessage = giftsMessages.get(userId);
+ var previousType = GiftSendType.fromNumber(previousMessage.getSendType());
+ if (currentType == GiftSendType.Active &&
+ previousType == GiftSendType.Active) {
+ giftsMessages.put(userId, currentMessage);
+ return List.of(getGiftComboEvent(currentMessage, GiftSendType.Active));
+ }
+
+
+ if (currentType == GiftSendType.Finished &&
+ previousType == GiftSendType.Active) {
+ giftsMessages.clear();
+ return List.of(
+ getGiftComboEvent(currentMessage, GiftSendType.Finished),
+ getGiftEvent(currentMessage));
+ }
+
+ return List.of();
+ }
+
+ private TikTokGiftEvent getGiftEvent(WebcastGiftMessage message) {
+ var gift = getGiftObject(message);
+ return new TikTokGiftEvent(gift, message);
+ }
+
+ private TikTokGiftEvent getGiftComboEvent(WebcastGiftMessage message, GiftSendType state) {
+ var gift = getGiftObject(message);
+ return new TikTokGiftComboEvent(gift, message, state);
+ }
+
+ private Gift getGiftObject(WebcastGiftMessage giftMessage) {
+ var gift = giftManager.findById((int) giftMessage.getGiftId());
+ if (gift == Gift.UNDEFINED) {
+ gift = giftManager.findByName(giftMessage.getGift().getName());
+ }
+ if (gift == Gift.UNDEFINED) {
+ gift = giftManager.registerGift(
+ (int) giftMessage.getGift().getId(),
+ giftMessage.getGift().getName(),
+ giftMessage.getGift().getDiamondCount(),
+ Picture.map(giftMessage.getGift().getImage()));
+ }
+ return gift;
+ }
+}
diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokHttpClient.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokHttpClient.java
index 49a86a7..83e17fe 100644
--- a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokHttpClient.java
+++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/TikTokHttpClient.java
@@ -133,12 +133,12 @@ public class TikTokHttpClient {
private String getSignedUrl(String url, Map parameters) {
var fullUrl = HttpUtils.parseParameters(url,parameters);
- var singHeaders = new TreeMap();
- singHeaders.put("client", "ttlive-java");
- singHeaders.put("uuc", 1);
- singHeaders.put("url", fullUrl);
+ var signParams = new TreeMap();
+ signParams.put("client", "ttlive-java");
+ signParams.put("uuc", 1);
+ signParams.put("url", fullUrl);
- var request = requestFactory.setQueries(singHeaders);
+ var request = requestFactory.setQueries(signParams);
var content = request.get(Constants.TIKTOK_SIGN_API);
diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokGenericEventMapper.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokGenericEventMapper.java
new file mode 100644
index 0000000..b517637
--- /dev/null
+++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokGenericEventMapper.java
@@ -0,0 +1,85 @@
+package io.github.jwdeveloper.tiktok.mappers;
+
+import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent;
+import io.github.jwdeveloper.tiktok.exceptions.TikTokMessageMappingException;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Goal of this class is to map ProtocolBuffer objects to TikTok Event in generic way
+ *
+ * First parameter is ProtocolBuffer class type
+ * Second parameters is TikTokEvent class type
+ * Third parameters is bytes payload
+ *
+ * mapToEvent(WebcastGiftMessage.class, TikTokGiftEvent.class, payload)
+ *
+ * How does it work?
+ * 1. Finds method `parseFrom(byte[] bytes)` inside ProtocolBuffer class
+ * 2. put payload to the method methods and create new instance of ProtcolBuffer object
+ * 3. Finds in TikTokEvent constructor that takes ProtocolBuffer type as parameter
+ * 4. create new Instance in TikTokEvents using object from step 2 and constructor from step 3
+ *
+ * methodCache and constructorCache are used to boost performance
+ */
+public class TikTokGenericEventMapper {
+
+ private record TypePair(Class> a, Class> b) {
+ }
+
+ private final Map, Method> methodCache;
+ private final Map> constructorCache;
+
+ public TikTokGenericEventMapper() {
+ this.methodCache = new HashMap<>();
+ this.constructorCache = new HashMap<>();
+ }
+
+ public TikTokEvent mapToEvent(Class> inputClazz, Class> outputClass, byte[] payload) {
+ try {
+ var method = getParsingMethod(inputClazz);
+ var deserializedMessage = method.invoke(null, payload);
+ var constructor = getParsingConstructor(inputClazz, outputClass);
+
+ var tiktokEvent = constructor.newInstance(deserializedMessage);
+ return (TikTokEvent) tiktokEvent;
+ } catch (Exception ex) {
+ throw new TikTokMessageMappingException(inputClazz, outputClass, ex);
+ }
+ }
+
+ private Method getParsingMethod(Class> input) throws NoSuchMethodException {
+ if (methodCache.containsKey(input)) {
+ return methodCache.get(input);
+ }
+ var method = input.getDeclaredMethod("parseFrom", byte[].class);
+ methodCache.put(input, method);
+ return method;
+ }
+
+ private Constructor> getParsingConstructor(Class> input, Class> output) {
+ var pair = new TypePair(input, output);
+ if (constructorCache.containsKey(pair)) {
+ return constructorCache.get(pair);
+ }
+
+ var optional = Arrays.stream(output.getConstructors())
+ .filter(ea -> Arrays.stream(ea.getParameterTypes())
+ .toList()
+ .contains(input))
+ .findFirst();
+
+ if (optional.isEmpty()) {
+ throw new TikTokMessageMappingException(input, output, "Unable to find constructor with input class type");
+ }
+
+ constructorCache.put(pair, optional.get());
+ return optional.get();
+ }
+
+
+}
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 2678d1e..ecd87aa 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
@@ -125,7 +125,7 @@ public class TikTokWebSocketListener extends WebSocketClient {
}
return Optional.of(websocketMessage);
} catch (Exception e) {
- throw new TikTokProtocolBufferException("Unable to parse WebcastWebsocketMessage", buffer, e);
+ throw new TikTokProtocolBufferException("Unable to parse WebcastPushFrame", buffer, e);
}
}
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 1a413a3..1b48ea8 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
@@ -28,7 +28,6 @@ import java.util.Random;
public class TikTokWebSocketPingingTask
{
private Thread thread;
-
private boolean isRunning = false;
private final int MIN_TIMEOUT = 5;
private final int MAX_TIMEOUT = 100;
@@ -37,7 +36,7 @@ public class TikTokWebSocketPingingTask
public void run(WebSocket webSocket)
{
stop();
- var thread = new Thread(() ->
+ thread = new Thread(() ->
{
pingTask(webSocket);
});
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
index 85c6eb3..5f6aeed 100644
--- a/Client/src/test/java/io/github/jwdeveloper/tiktok/gifts/TikTokGiftManagerTest.java
+++ b/Client/src/test/java/io/github/jwdeveloper/tiktok/gifts/TikTokGiftManagerTest.java
@@ -22,7 +22,7 @@
*/
package io.github.jwdeveloper.tiktok.gifts;
-import io.github.jwdeveloper.tiktok.data.models.Gift;
+import io.github.jwdeveloper.tiktok.data.models.gifts.Gift;
import io.github.jwdeveloper.tiktok.data.models.Picture;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
diff --git a/Examples/pom.xml b/Examples/pom.xml
index cec5ec0..e340b30 100644
--- a/Examples/pom.xml
+++ b/Examples/pom.xml
@@ -46,7 +46,7 @@
4.0.0
- TestApplication
+ Examples
io.github.jwdeveloper.tiktok
diff --git a/Examples/target/classes/io/github/jwdeveloper/tiktok/SimpleExample$1.class b/Examples/target/classes/io/github/jwdeveloper/tiktok/SimpleExample$1.class
index 01865c9..6c17f4a 100644
Binary files a/Examples/target/classes/io/github/jwdeveloper/tiktok/SimpleExample$1.class and b/Examples/target/classes/io/github/jwdeveloper/tiktok/SimpleExample$1.class differ
diff --git a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/RunCollector.java b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/RunCollector.java
index 3d37013..72c5730 100644
--- a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/RunCollector.java
+++ b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/RunCollector.java
@@ -22,8 +22,10 @@
*/
package io.github.jwdeveloper.tiktok.tools.collector;
+import io.github.jwdeveloper.tiktok.messages.webcast.WebcastGiftMessage;
import io.github.jwdeveloper.tiktok.tools.collector.client.TikTokMessageCollectorClient;
+import java.io.IOException;
import java.sql.SQLException;
public class RunCollector {
@@ -33,15 +35,48 @@ public class RunCollector {
//WebcastLinkMicBattleItemCard does streamer win battle?
- public static void main(String[] args) throws SQLException {
+ public static void main(String[] args) throws SQLException, IOException {
- TikTokMessageCollectorClient.create("messageCollector")
- .addUser("bangbetmenygy")
- .addUser("mr_cios")
- .addUser("sleepstreamxxx")
- .addUser("psychotropnazywo")
- .addUser("accordionistka")
+ TikTokMessageCollectorClient.create("giftsCollector")
+ .addUser("cbcgod")
+ // .addUser("mr_cios")
+ // .addUser("cbcgod")
+ // .addUser("psychotropnazywo")
+ // .addUser("accordionistka")
+ .addEventFilter(WebcastGiftMessage.class)
+ .addOnBuilder(liveClientBuilder ->
+ {
+ liveClientBuilder.onGift((liveClient, event) ->
+ {
+
+ });
+
+ liveClientBuilder.onGiftCombo((liveClient, event) ->
+ {
+
+ });
+
+ liveClientBuilder.onGift((liveClient, event) ->
+ {
+ var sb = new StringBuilder();
+ sb.append("GIFT User: " + event.getUser().getDisplayName()+" ");
+ sb.append("Name: " + event.getGift().name() + " ");
+ sb.append("Combo: " + event.getCombo() + " ");
+ System.out.println(sb.toString());
+ });
+ liveClientBuilder.onGiftCombo((liveClient, event) ->
+ {
+ var sb = new StringBuilder();
+ sb.append("COMBO User: " + event.getUser().getDisplayName()+" ");
+ sb.append("Name: " + event.getGift().name() + " ");
+ sb.append("Combo: " + event.getCombo() + " ");
+ sb.append("Type: " + event.getComboState().name());
+ System.out.println(sb.toString());
+ });
+ })
.buildAndRun();
+
+ System.in.read();
}
diff --git a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/client/MessageCollector.java b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/client/MessageCollector.java
index b80c064..a5915c7 100644
--- a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/client/MessageCollector.java
+++ b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/client/MessageCollector.java
@@ -62,7 +62,7 @@ public class MessageCollector {
var queue = messages.get(name);
if (queue.size() > limit) {
- queue.poll();
+ queue.remove();
}
queue.add(new MessageData(base64, host, LocalDateTime.now().toString()));
diff --git a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/client/TikTokClientFactory.java b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/client/TikTokClientFactory.java
index 58afd77..5cfb59a 100644
--- a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/client/TikTokClientFactory.java
+++ b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/client/TikTokClientFactory.java
@@ -34,6 +34,7 @@ import io.github.jwdeveloper.tiktok.tools.collector.tables.TikTokMessageModel;
import io.github.jwdeveloper.tiktok.tools.collector.tables.TikTokResponseModel;
import java.util.Base64;
+import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.function.Consumer;
@@ -46,8 +47,9 @@ public class TikTokClientFactory {
this.tikTokDatabase = tikTokDatabase;
}
- public CompletableFuture runClientAsync(String tiktokUser, Consumer onBuilder) {
+ public CompletableFuture runClientAsync(String tiktokUser, List> filters, Consumer onBuilder) {
var builder = TikTokLive.newClient(tiktokUser);
+ var msgFilter = filters.stream().map(Class::getSimpleName).toList();
onBuilder.accept(builder);
return builder.onConnected((liveClient, event) ->
{
@@ -62,7 +64,12 @@ public class TikTokClientFactory {
responseModel.setHostName(liveClient.getRoomInfo().getHostName());
tikTokDatabase.insertResponse(responseModel);
liveClient.getLogger().info("Response");
- for (var message : event.getResponse().getMessagesList()) {
+ for (var message : event.getResponse().getMessagesList())
+ {
+ if(msgFilter.size() > 0 && !msgFilter.contains(message.getMethod()))
+ {
+ continue;
+ }
messageCollector.addMessage(liveClient.getLogger(), liveClient.getRoomInfo().getHostName(), message);
}
})
@@ -71,7 +78,7 @@ public class TikTokClientFactory {
var eventName = event.getEvent().getClass().getSimpleName();
/*
- if (filter.size() != 0 && !filter.contains(event.getEvent().getClass())) {
+ if (msgFilter.size() != 0 && !msgFilter.contains(event.getEvent().getClass())) {
return;
}*/
@@ -83,7 +90,7 @@ public class TikTokClientFactory {
model.setMessage(messageBinary);
// tikTokDatabase.insertMessage(model);
- liveClient.getLogger().info("EVENT: [" + tiktokUser + "] " + eventName);
+ // liveClient.getLogger().info("EVENT: [" + tiktokUser + "] " + eventName);
})
.onError((liveClient, event) ->
{
diff --git a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/client/TikTokMessagessCollectorBuilder.java b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/client/TikTokMessagessCollectorBuilder.java
index 5cf9189..e3738ee 100644
--- a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/client/TikTokMessagessCollectorBuilder.java
+++ b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/client/TikTokMessagessCollectorBuilder.java
@@ -82,7 +82,7 @@ public class TikTokMessagessCollectorBuilder {
db.init();
var factory = new TikTokClientFactory(messageCollector, db);
for (var user : users) {
- var client = factory.runClientAsync(user, onBuilder);
+ var client = factory.runClientAsync(user,filters, onBuilder);
client.thenAccept(liveClient ->
{
tiktokclients.add(liveClient);
diff --git a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/tester/RunJsonTester.java b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/tester/RunJsonTester.java
index 4ffa762..0bb898e 100644
--- a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/tester/RunJsonTester.java
+++ b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/tester/RunJsonTester.java
@@ -47,7 +47,15 @@ public class RunJsonTester {
sb.append(MessageUtil.getContent(event.getData()));
- liveClient.getLogger().info(sb.toString());
+ // liveClient.getLogger().info(sb.toString());
+ }).
+ onGift((liveClient, event) ->
+ {
+ liveClient.getLogger().info("Gift event: "+event.toJson());
+ })
+ .onGiftCombo((liveClient, event) ->
+ {
+ liveClient.getLogger().info("GiftCombo event"+event.toJson());
})
.onError((liveClient, event) ->
{
diff --git a/Tools-EventsCollector/target/classes/io/github/jwdeveloper/tiktok/tools/collector/RunCollector.class b/Tools-EventsCollector/target/classes/io/github/jwdeveloper/tiktok/tools/collector/RunCollector.class
index 8d8152e..784b759 100644
Binary files a/Tools-EventsCollector/target/classes/io/github/jwdeveloper/tiktok/tools/collector/RunCollector.class and b/Tools-EventsCollector/target/classes/io/github/jwdeveloper/tiktok/tools/collector/RunCollector.class differ
diff --git a/Tools-EventsWebViewer/src/main/java/io/github/jwdeveloper/tiktok/webviewer/Main.java b/Tools-EventsWebViewer/src/main/java/io/github/jwdeveloper/tiktok/webviewer/Main.java
index af59fb3..9600f2e 100644
--- a/Tools-EventsWebViewer/src/main/java/io/github/jwdeveloper/tiktok/webviewer/Main.java
+++ b/Tools-EventsWebViewer/src/main/java/io/github/jwdeveloper/tiktok/webviewer/Main.java
@@ -45,6 +45,7 @@ public class Main {
app.get("/tiktok/connect", handler::connect);
app.get("/tiktok/disconnect", handler::disconnect);
app.get("/tiktok/events", handler::events);
+ app.get("/tiktok/events/pages", handler::eventPages);
app.get("/tiktok/events/message", handler::eventMessage);
}
}
diff --git a/Tools-EventsWebViewer/src/main/java/io/github/jwdeveloper/tiktok/webviewer/TikTokManager.java b/Tools-EventsWebViewer/src/main/java/io/github/jwdeveloper/tiktok/webviewer/TikTokManager.java
index 6f1c99b..f6e423b 100644
--- a/Tools-EventsWebViewer/src/main/java/io/github/jwdeveloper/tiktok/webviewer/TikTokManager.java
+++ b/Tools-EventsWebViewer/src/main/java/io/github/jwdeveloper/tiktok/webviewer/TikTokManager.java
@@ -23,7 +23,6 @@
package io.github.jwdeveloper.tiktok.webviewer;
import com.google.protobuf.InvalidProtocolBufferException;
-import io.github.jwdeveloper.tiktok.messages.webcast.WebcastResponse;
import io.github.jwdeveloper.tiktok.tools.collector.client.MessageCollector;
import io.github.jwdeveloper.tiktok.tools.collector.client.TikTokMessageCollectorClient;
import io.github.jwdeveloper.tiktok.tools.collector.client.TikTokMessagessCollectorBuilder;
@@ -34,6 +33,7 @@ import java.sql.SQLException;
import java.util.Base64;
import java.util.List;
import java.util.Random;
+import java.util.concurrent.atomic.AtomicInteger;
public class TikTokManager {
TikTokMessagessCollectorBuilder client;
@@ -45,7 +45,17 @@ public class TikTokManager {
public void connect(String name) throws SQLException {
disconnect();
- client = TikTokMessageCollectorClient.create(msgCollector, "web").addUser(name);
+ client = TikTokMessageCollectorClient.create(msgCollector, "web")
+ .addOnBuilder(liveClientBuilder ->
+ {
+
+
+ liveClientBuilder.onGift((liveClient, event) ->
+ {
+
+ });
+ })
+ .addUser(name);
client.buildAndRun();
}
@@ -58,19 +68,49 @@ public class TikTokManager {
}
- public MessageDto getMessage(String event) throws InvalidProtocolBufferException {
+ public MessageDto getMessage(String event, String index) throws InvalidProtocolBufferException {
var eventData = msgCollector.getMessages().get(event);
var messages = eventData.stream().toList();
var random = new Random();
- var index = random.nextInt(messages.size()-1);
- var msg = messages.get(index);
+
+ var msgIndex = 0;
+ if (index != null && !index.isEmpty()) {
+ msgIndex = Integer.parseInt(index);
+ msgIndex = Math.min(msgIndex, messages.size() - 1);
+ msgIndex = Math.max(msgIndex, 0);
+ }
+
+
+ var msg = messages.get(msgIndex);
var bytes = Base64.getDecoder().decode(msg.getEventData());
- var content = MessageUtil.getContent(event,bytes);
+ var content = MessageUtil.getContent(event, bytes);
return new MessageDto(content, msg.getEventData(), event);
}
+
+ public PagesDto getPages(String event) throws InvalidProtocolBufferException {
+ var eventData = msgCollector.getMessages().get(event);
+ var messages = eventData.stream().toList();
+
+ var counter = new AtomicInteger(-1);
+ var pages = messages.stream().map(e ->
+ {
+ return "http://localhost:8001/tiktok/events/message?eventName=" + event + "&page=" + counter.incrementAndGet();
+ }).toList();
+
+ return new PagesDto(event, messages.size(), pages);
+ }
+
+ @Value
+ public class PagesDto {
+ String eventName;
+ int pages;
+ List links;
+ }
+
+
@Value
public class MessageDto {
String content;
diff --git a/Tools-EventsWebViewer/src/main/java/io/github/jwdeveloper/tiktok/webviewer/handlers/TikTokHandler.java b/Tools-EventsWebViewer/src/main/java/io/github/jwdeveloper/tiktok/webviewer/handlers/TikTokHandler.java
index da21628..c36ea63 100644
--- a/Tools-EventsWebViewer/src/main/java/io/github/jwdeveloper/tiktok/webviewer/handlers/TikTokHandler.java
+++ b/Tools-EventsWebViewer/src/main/java/io/github/jwdeveloper/tiktok/webviewer/handlers/TikTokHandler.java
@@ -23,6 +23,7 @@
package io.github.jwdeveloper.tiktok.webviewer.handlers;
import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
import com.google.protobuf.InvalidProtocolBufferException;
import io.github.jwdeveloper.tiktok.webviewer.TikTokManager;
import io.javalin.http.Context;
@@ -55,7 +56,7 @@ public class TikTokHandler {
public void events(Context context) throws SQLException {
var events = tikTokManager.getEventsNames();
- var gson = new Gson();
+ var gson = getGson();
var result = gson.toJson(events);
context.result(result);
context.status(200);
@@ -63,8 +64,22 @@ public class TikTokHandler {
public void eventMessage(Context context) throws InvalidProtocolBufferException {
String name = context.queryParam("eventName");
- var result = tikTokManager.getMessage(name);
- var gson = new Gson();
+ String page = context.queryParam("page");
+
+ var result = tikTokManager.getMessage(name, page);
+ var gson = getGson();
context.result(gson.toJson(result));
}
+
+ public void eventPages(Context context) throws InvalidProtocolBufferException {
+ String name = context.queryParam("eventName");
+ var result = tikTokManager.getPages(name);
+ var gson = getGson();
+ context.result(gson.toJson(result));
+ }
+
+
+ public Gson getGson() {
+ return new GsonBuilder().disableHtmlEscaping().setPrettyPrinting().create();
+ }
}
diff --git a/Tools-EventsWebViewer/src/main/resources/public/index.html b/Tools-EventsWebViewer/src/main/resources/public/index.html
index b43cfe3..e7e5d51 100644
--- a/Tools-EventsWebViewer/src/main/resources/public/index.html
+++ b/Tools-EventsWebViewer/src/main/resources/public/index.html
@@ -103,6 +103,10 @@
language: 'json',
theme: 'vs-dark'
});
+ editor.onDidChangeModelContent(function () {
+ console.log("hello")
+ });
+
});
@@ -130,11 +134,8 @@
@@ -156,10 +157,9 @@