diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokCommentEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokCommentEvent.java
index a1516be..5388d15 100644
--- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokCommentEvent.java
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokCommentEvent.java
@@ -47,11 +47,23 @@ public class TikTokCommentEvent extends TikTokHeaderEvent {
public TikTokCommentEvent(WebcastChatMessage msg) {
super(msg.getCommon());
- user = User.map(msg.getUser(),msg.getUserIdentity());
+ user = User.map(msg.getUser(), msg.getUserIdentity());
text = msg.getContent();
visibleToSender = msg.getVisibleToSender();
getUserLanguage = msg.getContentLanguage();
mentionedUser = User.map(msg.getAtUser());
pictures = msg.getEmotesListList().stream().map(e -> Picture.map(e.getEmote().getImage())).toList();
}
+
+
+ public static TikTokCommentEvent of(String userName, String message) {
+ var builder = WebcastChatMessage.newBuilder();
+ builder.setUser(io.github.jwdeveloper.tiktok.messages.data.User.newBuilder()
+ .setNickname(userName)
+ .build());
+ builder.setContentLanguage("en");
+ builder.setVisibleToSender(true);
+ builder.setContent(message);
+ return new TikTokCommentEvent(builder.build());
+ }
}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokSubscribeEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokSubscribeEvent.java
index b545eba..fde3819 100644
--- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokSubscribeEvent.java
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokSubscribeEvent.java
@@ -36,10 +36,10 @@ import lombok.Getter;
*/
@Getter
@EventMeta(eventType = EventType.Message)
-public class TikTokSubscribeEvent extends TikTokHeaderEvent
-{
+public class TikTokSubscribeEvent extends TikTokHeaderEvent {
private final User user;
+
public TikTokSubscribeEvent(WebcastMemberMessage msg) {
super(msg.getCommon());
user = User.map(msg.getUser());
@@ -52,4 +52,11 @@ public class TikTokSubscribeEvent extends TikTokHeaderEvent
user.addAttribute(UserAttribute.Subscriber);
}
+ public static TikTokSubscribeEvent of(String userName) {
+ return new TikTokSubscribeEvent(WebcastMemberMessage.newBuilder()
+ .setUser(io.github.jwdeveloper.tiktok.messages.data.User.newBuilder()
+ .setNickname(userName)
+ .build())
+ .build());
+ }
}
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 ea5eb18..6736566 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
@@ -23,6 +23,7 @@
package io.github.jwdeveloper.tiktok.data.events.gift;
import io.github.jwdeveloper.tiktok.annotations.*;
+import io.github.jwdeveloper.tiktok.data.models.Picture;
import io.github.jwdeveloper.tiktok.data.models.gifts.*;
import io.github.jwdeveloper.tiktok.data.models.users.User;
import io.github.jwdeveloper.tiktok.messages.webcast.WebcastGiftMessage;
@@ -32,7 +33,7 @@ import lombok.Getter;
/**
* Triggered every time gift is sent
*
- * @see GiftSendType it has 3 states
+ * @see GiftComboStateType it has 3 states
*
*
Example when user sends gift with combo
* >Combo: 1 -> comboState = GiftSendType.Begin
@@ -45,10 +46,21 @@ import lombok.Getter;
@EventMeta(eventType = EventType.Message)
@Getter
public class TikTokGiftComboEvent extends TikTokGiftEvent {
- private final GiftSendType comboState;
+ private final GiftComboStateType comboState;
- public TikTokGiftComboEvent(Gift gift, User host, WebcastGiftMessage msg, GiftSendType comboState) {
+ public TikTokGiftComboEvent(Gift gift, User host, WebcastGiftMessage msg, GiftComboStateType comboState) {
super(gift, host, msg);
this.comboState = comboState;
}
+
+ public static TikTokGiftComboEvent of(Gift gift, int combo, GiftComboStateType comboState) {
+ return new TikTokGiftComboEvent(
+ gift,
+ new User(0L, "Test", new Picture("")),
+ WebcastGiftMessage
+ .newBuilder()
+ .setComboCount(combo)
+ .build(),
+ comboState);
+ }
}
\ No newline at end of file
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 2f0b46f..3b3cd0b 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
@@ -25,6 +25,7 @@ package io.github.jwdeveloper.tiktok.data.events.gift;
import io.github.jwdeveloper.tiktok.annotations.*;
import io.github.jwdeveloper.tiktok.data.events.common.TikTokHeaderEvent;
+import io.github.jwdeveloper.tiktok.data.models.Picture;
import io.github.jwdeveloper.tiktok.data.models.gifts.*;
import io.github.jwdeveloper.tiktok.data.models.users.User;
import io.github.jwdeveloper.tiktok.messages.webcast.WebcastGiftMessage;
@@ -55,4 +56,20 @@ public class TikTokGiftEvent extends TikTokHeaderEvent {
}
combo = msg.getComboCount();
}
+
+ public TikTokGiftEvent(Gift gift) {
+ this.gift = gift;
+ user = new User(0L, "sender", new Picture(""));
+ toUser = new User(0L, "receiver", new Picture(""));
+ combo = 1;
+ }
+
+
+ public static TikTokGiftEvent of(Gift gift) {
+ return new TikTokGiftEvent(gift);
+ }
+
+ public static TikTokGiftEvent of(String name, int id, int diamonds) {
+ return TikTokGiftEvent.of(new Gift(id, name, diamonds, ""));
+ }
}
\ No newline at end of file
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokFollowEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokFollowEvent.java
index c1715d5..5cbe573 100644
--- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokFollowEvent.java
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokFollowEvent.java
@@ -24,8 +24,10 @@ package io.github.jwdeveloper.tiktok.data.events.social;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
+import io.github.jwdeveloper.tiktok.data.events.TikTokSubscribeEvent;
import io.github.jwdeveloper.tiktok.data.events.common.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.data.models.users.User;
+import io.github.jwdeveloper.tiktok.messages.webcast.WebcastMemberMessage;
import io.github.jwdeveloper.tiktok.messages.webcast.WebcastSocialMessage;
import lombok.Value;
@@ -45,4 +47,12 @@ public class TikTokFollowEvent extends TikTokHeaderEvent
totalFollowers = msg.getFollowCount();
}
+ public static TikTokFollowEvent of(String userName)
+ {
+ return new TikTokFollowEvent(WebcastSocialMessage.newBuilder()
+ .setUser(io.github.jwdeveloper.tiktok.messages.data.User.newBuilder()
+ .setNickname(userName)
+ .build())
+ .build());
+ }
}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokJoinEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokJoinEvent.java
index 700e27a..d55a764 100644
--- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokJoinEvent.java
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokJoinEvent.java
@@ -26,6 +26,7 @@ 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.users.User;
+import io.github.jwdeveloper.tiktok.messages.webcast.WebcastLikeMessage;
import io.github.jwdeveloper.tiktok.messages.webcast.WebcastMemberMessage;
import io.github.jwdeveloper.tiktok.messages.webcast.WebcastSocialMessage;
import lombok.Getter;
@@ -47,4 +48,13 @@ public class TikTokJoinEvent extends TikTokHeaderEvent {
user = User.map(msg.getUser());
totalUsers = msg.getMemberCount();
}
+
+ public static TikTokJoinEvent of(String userName)
+ {
+ return new TikTokJoinEvent(WebcastMemberMessage.newBuilder()
+ .setUser(io.github.jwdeveloper.tiktok.messages.data.User.newBuilder()
+ .setNickname(userName)
+ .build())
+ .build());
+ }
}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokLikeEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokLikeEvent.java
index 6c64270..ce93b44 100644
--- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokLikeEvent.java
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokLikeEvent.java
@@ -57,4 +57,15 @@ public class TikTokLikeEvent extends TikTokHeaderEvent
likes = msg.getCount();
totalLikes = msg.getTotal();
}
+
+ public static TikTokLikeEvent of(String userName, int likes)
+ {
+ return new TikTokLikeEvent(WebcastLikeMessage.newBuilder()
+ .setCount(likes)
+ .setTotal(likes)
+ .setUser(io.github.jwdeveloper.tiktok.messages.data.User.newBuilder()
+ .setNickname(userName)
+ .build())
+ .build());
+ }
}
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/GiftComboStateType.java
similarity index 83%
rename from API/src/main/java/io/github/jwdeveloper/tiktok/data/models/gifts/GiftSendType.java
rename to API/src/main/java/io/github/jwdeveloper/tiktok/data/models/gifts/GiftComboStateType.java
index c14c82b..c084189 100644
--- 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/GiftComboStateType.java
@@ -22,17 +22,16 @@
*/
package io.github.jwdeveloper.tiktok.data.models.gifts;
-public enum GiftSendType
-{
+//TODO it should be called GiftComboStateType
+public enum GiftComboStateType {
Finished,
Begin,
Active;
- public static GiftSendType fromNumber(long number)
- {
+ public static GiftComboStateType fromNumber(long number) {
return switch ((int) number) {
- case 1, 2, 4 -> GiftSendType.Active;
- default -> GiftSendType.Finished;
+ case 1, 2, 4 -> GiftComboStateType.Active;
+ default -> GiftComboStateType.Finished;
};
}
}
\ No newline at end of file
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/requests/LiveData.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/requests/LiveData.java
index 9e72b94..c884f06 100644
--- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/requests/LiveData.java
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/requests/LiveData.java
@@ -35,6 +35,7 @@ public class LiveData {
}
@Data
+ @AllArgsConstructor
public static class Response {
private String json;
private LiveStatus liveStatus;
@@ -45,6 +46,11 @@ public class LiveData {
private boolean ageRestricted;
private User host;
private LiveType liveType;
+ public Response() {
+
+ }
+
+
}
public enum LiveStatus {
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/settings/LiveClientSettings.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/settings/LiveClientSettings.java
index af8e992..0f141a9 100644
--- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/settings/LiveClientSettings.java
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/settings/LiveClientSettings.java
@@ -35,10 +35,20 @@ public class LiveClientSettings {
/**
+ * TODO: give better description
+ *
+ * sets client in the offline mode, so it do not connects to TikTok servers
+ * it makes sense to use it when you are testing client with your custom events
+ */
+ private boolean offline;
+
+ /**
+ * TODO: give better description
+ *
* Determines if gifts data is downloaded before TikTokLive starts,
* when `false` then client.giftManager() does not contain initial gifts
*/
- private boolean fetchGifts;
+ private boolean fetchGifts = true;
/**
* ISO-Language for Client
@@ -76,14 +86,19 @@ public class LiveClientSettings {
private HttpClientSettings httpSettings;
/**
- * Optional: Sometimes not every messages from chat are send to TikTokLiveJava to fix this issue you can set sessionId
- * documentation how to obtain sessionId https://github.com/isaackogan/TikTok-Live-Connector#send-chat-messages
+ * Interval of time in milliseconds between pings to TikTok
+ * @apiNote Min: 250 (0.25 seconds), Default: 5000 (5 seconds)
*/
+ private long pingInterval = 5000;
+
+ /**
+ * Optional: Sometimes not every messages from chat are send to TikTokLiveJava to fix this issue you can set sessionId
+ * @see Documentation: How to obtain sessionId
+ */
private String sessionId;
/**
* Optional: By default roomID is fetched before connect to live, but you can set it manually
- *
*/
private String roomId;
@@ -92,8 +107,7 @@ public class LiveClientSettings {
*/
private String apiKey;
- public static LiveClientSettings createDefault()
- {
+ public static LiveClientSettings createDefault() {
var httpSettings = new HttpClientSettings();
httpSettings.getParams().putAll(DefaultClientParams());
httpSettings.getHeaders().putAll(DefaultRequestHeaders());
@@ -166,4 +180,6 @@ public class LiveClientSettings {
headers.put("Accept-Language", "en-US,en; q=0.9");
return headers;
}
+
+
}
\ No newline at end of file
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveClient.java b/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveClient.java
index 3161079..0c4cef9 100644
--- a/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveClient.java
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveClient.java
@@ -59,7 +59,16 @@ public interface LiveClient {
/**
* Use to manually invoke event
*/
- void publishEvent(TikTokEvent event);
+ void publishEvent(TikTokEvent event);
+
+
+ /**
+ * @param webcastMessageName name of TikTok protocol-buffer message
+ * @param payloadBase64 protocol-buffer message bytes payload
+ */
+ void publishMessage(String webcastMessageName, String payloadBase64);
+
+ void publishMessage(String webcastMessageName, byte[] payload);
/**
* Get information about gifts
diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLive.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLive.java
index cde7406..204e9cb 100644
--- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLive.java
+++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLive.java
@@ -28,7 +28,6 @@ import io.github.jwdeveloper.tiktok.http.LiveHttpClient;
import io.github.jwdeveloper.tiktok.live.GiftsManager;
import io.github.jwdeveloper.tiktok.live.builder.LiveClientBuilder;
-import java.util.List;
import java.util.concurrent.CompletableFuture;
public class TikTokLive {
@@ -102,14 +101,9 @@ public class TikTokLive {
* @return GiftsManager
*/
public static GiftsManager gifts() {
- if (giftsManager != null) {
- return giftsManager;
- }
- synchronized (GiftsManager.class)
- {
- if (giftsManager == null)
- {
- return new TikTokGiftsManager(requests().fetchGiftsData().getGifts());
+ if (giftsManager == null) {
+ synchronized (GiftsManager.class) {
+ giftsManager = new TikTokGiftsManager(requests().fetchGiftsData().getGifts());
}
}
return giftsManager;
diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java
index 9826653..6cde52f 100644
--- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java
+++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java
@@ -22,6 +22,7 @@
*/
package io.github.jwdeveloper.tiktok;
+import com.google.protobuf.ByteString;
import io.github.jwdeveloper.tiktok.data.events.TikTokDisconnectedEvent;
import io.github.jwdeveloper.tiktok.data.events.TikTokErrorEvent;
import io.github.jwdeveloper.tiktok.data.events.TikTokReconnectingEvent;
@@ -33,37 +34,44 @@ import io.github.jwdeveloper.tiktok.data.requests.LiveConnectionData;
import io.github.jwdeveloper.tiktok.data.requests.LiveData;
import io.github.jwdeveloper.tiktok.data.requests.LiveUserData;
import io.github.jwdeveloper.tiktok.exceptions.*;
+import io.github.jwdeveloper.tiktok.http.LiveHttpClient;
import io.github.jwdeveloper.tiktok.listener.ListenersManager;
import io.github.jwdeveloper.tiktok.listener.TikTokListenersManager;
import io.github.jwdeveloper.tiktok.live.GiftsManager;
import io.github.jwdeveloper.tiktok.live.LiveClient;
import io.github.jwdeveloper.tiktok.live.LiveRoomInfo;
+import io.github.jwdeveloper.tiktok.messages.webcast.WebcastResponse;
import io.github.jwdeveloper.tiktok.models.ConnectionState;
import io.github.jwdeveloper.tiktok.data.settings.LiveClientSettings;
import io.github.jwdeveloper.tiktok.websocket.SocketClient;
+import java.util.Base64;
import java.util.concurrent.CompletableFuture;
import java.util.function.Consumer;
import java.util.logging.Logger;
public class TikTokLiveClient implements LiveClient {
private final TikTokRoomInfo liveRoomInfo;
- private final TikTokLiveHttpClient httpClient;
+ private final LiveHttpClient httpClient;
private final SocketClient webSocketClient;
private final TikTokLiveEventHandler tikTokEventHandler;
private final LiveClientSettings clientSettings;
private final TikTokListenersManager listenersManager;
private final Logger logger;
private final GiftsManager giftsManager;
+ private final TikTokLiveMessageHandler messageHandler;
- public TikTokLiveClient(GiftsManager giftsManager,
- TikTokRoomInfo tikTokLiveMeta,
- TikTokLiveHttpClient tiktokHttpClient,
- SocketClient webSocketClient,
- TikTokLiveEventHandler tikTokEventHandler,
- LiveClientSettings clientSettings,
- TikTokListenersManager listenersManager,
- Logger logger) {
+ public TikTokLiveClient(
+ TikTokLiveMessageHandler messageHandler,
+ GiftsManager giftsManager,
+ TikTokRoomInfo tikTokLiveMeta,
+ LiveHttpClient tiktokHttpClient,
+ SocketClient webSocketClient,
+ TikTokLiveEventHandler tikTokEventHandler,
+ LiveClientSettings clientSettings,
+ TikTokListenersManager listenersManager,
+ Logger logger) {
+ this.messageHandler = messageHandler;
this.giftsManager = giftsManager;
this.liveRoomInfo = tikTokLiveMeta;
this.httpClient = tiktokHttpClient;
@@ -183,6 +191,20 @@ public class TikTokLiveClient implements LiveClient {
tikTokEventHandler.publish(this, event);
}
+ @Override
+ public void publishMessage(String webcastMessageName, String payloadBase64) {
+ this.publishMessage(webcastMessageName, Base64.getDecoder().decode(payloadBase64));
+ }
+ @Override
+ public void publishMessage(String webcastMessageName, byte[] payload) {
+
+ var builder = WebcastResponse.Message.newBuilder();
+ builder.setMethod(webcastMessageName);
+ builder.setPayload(ByteString.copyFrom(payload));
+ var message = builder.build();
+ messageHandler.handleSingleMessage(this, message);
+ }
+
@Override
public GiftsManager getGiftManager() {
return giftsManager;
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 306febc..d23aad5 100644
--- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java
+++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java
@@ -45,6 +45,7 @@ import io.github.jwdeveloper.tiktok.mappers.data.MappingResult;
import io.github.jwdeveloper.tiktok.mappers.handlers.*;
import io.github.jwdeveloper.tiktok.messages.webcast.*;
import io.github.jwdeveloper.tiktok.websocket.TikTokWebSocketClient;
+import io.github.jwdeveloper.tiktok.websocket.TikTokWebSocketOfflineClient;
import java.util.*;
import java.util.concurrent.CompletableFuture;
@@ -54,7 +55,7 @@ import java.util.logging.Logger;
public class TikTokLiveClientBuilder implements LiveClientBuilder {
protected final LiveClientSettings clientSettings;
- protected final TikTokLiveEventHandler tikTokEventHandler;
+ protected final TikTokLiveEventHandler eventHandler;
protected final List listeners;
protected Consumer onCustomMappings;
protected Logger logger;
@@ -63,7 +64,7 @@ public class TikTokLiveClientBuilder implements LiveClientBuilder {
public TikTokLiveClientBuilder(String userName) {
this.clientSettings = LiveClientSettings.createDefault();
this.clientSettings.setHostName(userName);
- this.tikTokEventHandler = new TikTokLiveEventHandler();
+ this.eventHandler = new TikTokLiveEventHandler();
this.listeners = new ArrayList<>();
this.onCustomMappings = (e) -> {
};
@@ -95,6 +96,9 @@ public class TikTokLiveClientBuilder implements LiveClientBuilder {
if (clientSettings.getHostName().startsWith("@"))
clientSettings.setHostName(clientSettings.getHostName().substring(1));
+ if (clientSettings.getPingInterval() < 250)
+ throw new TikTokLiveException("Minimum allowed ping interval is 250 millseconds");
+
var httpSettings = clientSettings.getHttpSettings();
httpSettings.getParams().put("app_language", clientSettings.getClientLanguage());
httpSettings.getParams().put("webcast_language", clientSettings.getClientLanguage());
@@ -109,27 +113,31 @@ public class TikTokLiveClientBuilder implements LiveClientBuilder {
var tiktokRoomInfo = new TikTokRoomInfo();
tiktokRoomInfo.setHostName(clientSettings.getHostName());
- var listenerManager = new TikTokListenersManager(listeners, tikTokEventHandler);
+ var listenerManager = new TikTokListenersManager(listeners, eventHandler);
var httpClientFactory = new HttpClientFactory(clientSettings);
- var tikTokLiveHttpClient = new TikTokLiveHttpClient(httpClientFactory, clientSettings);
+ var liveHttpClient = clientSettings.isOffline() ?
+ new TikTokLiveHttpOfflineClient() :
+ new TikTokLiveHttpClient(httpClientFactory, clientSettings);
var eventsMapper = createMapper(giftsManager, tiktokRoomInfo);
- var messageHandler = new TikTokLiveMessageHandler(tikTokEventHandler, eventsMapper);
+ var messageHandler = new TikTokLiveMessageHandler(eventHandler, eventsMapper);
-
- var webSocketClient = new TikTokWebSocketClient(
- clientSettings,
- messageHandler,
- tikTokEventHandler);
+ var webSocketClient = clientSettings.isOffline() ?
+ new TikTokWebSocketOfflineClient(eventHandler) :
+ new TikTokWebSocketClient(
+ clientSettings,
+ messageHandler,
+ eventHandler);
return new TikTokLiveClient(
+ messageHandler,
giftsManager,
tiktokRoomInfo,
- tikTokLiveHttpClient,
+ liveHttpClient,
webSocketClient,
- tikTokEventHandler,
+ eventHandler,
clientSettings,
listenerManager,
logger);
@@ -235,255 +243,255 @@ public class TikTokLiveClientBuilder implements LiveClientBuilder {
}
public TikTokLiveClientBuilder onUnhandledSocial(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokUnhandledSocialEvent.class, event);
+ eventHandler.subscribe(TikTokUnhandledSocialEvent.class, event);
return this;
}
public LiveClientBuilder onChest(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokChestEvent.class, event);
+ eventHandler.subscribe(TikTokChestEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onLinkMicFanTicket(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokLinkMicFanTicketEvent.class, event);
+ eventHandler.subscribe(TikTokLinkMicFanTicketEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onEnvelope(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokEnvelopeEvent.class, event);
+ eventHandler.subscribe(TikTokEnvelopeEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onShop(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokShopEvent.class, event);
+ eventHandler.subscribe(TikTokShopEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onDetect(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokDetectEvent.class, event);
+ eventHandler.subscribe(TikTokDetectEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onLinkLayer(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokLinkLayerEvent.class, event);
+ eventHandler.subscribe(TikTokLinkLayerEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onConnected(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokConnectedEvent.class, event);
+ eventHandler.subscribe(TikTokConnectedEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onPreConnection(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokPreConnectionEvent.class, event);
+ eventHandler.subscribe(TikTokPreConnectionEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onCaption(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokCaptionEvent.class, event);
+ eventHandler.subscribe(TikTokCaptionEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onQuestion(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokQuestionEvent.class, event);
+ eventHandler.subscribe(TikTokQuestionEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onRoomPin(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokRoomPinEvent.class, event);
+ eventHandler.subscribe(TikTokRoomPinEvent.class, event);
return this;
}
@Override
public LiveClientBuilder onEvent(Class eventClass, EventConsumer event) {
- tikTokEventHandler.subscribe(eventClass, event);
+ eventHandler.subscribe(eventClass, event);
return this;
}
@Override
public TikTokLiveClientBuilder onRoomInfo(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokRoomInfoEvent.class, event);
+ eventHandler.subscribe(TikTokRoomInfoEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onLivePaused(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokLivePausedEvent.class, event);
+ eventHandler.subscribe(TikTokLivePausedEvent.class, event);
return this;
}
@Override
public TikTokLiveClientBuilder onLiveUnpaused(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokLiveUnpausedEvent.class, event);
+ eventHandler.subscribe(TikTokLiveUnpausedEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onLike(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokLikeEvent.class, event);
+ eventHandler.subscribe(TikTokLikeEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onLink(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokLinkEvent.class, event);
+ eventHandler.subscribe(TikTokLinkEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onBarrage(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokBarrageEvent.class, event);
+ eventHandler.subscribe(TikTokBarrageEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onGift(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokGiftEvent.class, event);
+ eventHandler.subscribe(TikTokGiftEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onGiftCombo(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokGiftComboEvent.class, event);
+ eventHandler.subscribe(TikTokGiftComboEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onLinkMicArmies(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokLinkMicArmiesEvent.class, event);
+ eventHandler.subscribe(TikTokLinkMicArmiesEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onEmote(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokEmoteEvent.class, event);
+ eventHandler.subscribe(TikTokEmoteEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onUnauthorizedMember(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokUnauthorizedMemberEvent.class, event);
+ eventHandler.subscribe(TikTokUnauthorizedMemberEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onInRoomBanner(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokInRoomBannerEvent.class, event);
+ eventHandler.subscribe(TikTokInRoomBannerEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onLinkMicMethod(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokLinkMicMethodEvent.class, event);
+ eventHandler.subscribe(TikTokLinkMicMethodEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onSubscribe(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokSubscribeEvent.class, event);
+ eventHandler.subscribe(TikTokSubscribeEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onPoll(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokPollEvent.class, event);
+ eventHandler.subscribe(TikTokPollEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onFollow(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokFollowEvent.class, event);
+ eventHandler.subscribe(TikTokFollowEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onComment(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokCommentEvent.class, event);
+ eventHandler.subscribe(TikTokCommentEvent.class, event);
return this;
}
@Override
public LiveClientBuilder onHttpResponse(EventConsumer action) {
- tikTokEventHandler.subscribe(TikTokHttpResponseEvent.class, action);
+ eventHandler.subscribe(TikTokHttpResponseEvent.class, action);
return this;
}
public TikTokLiveClientBuilder onGoalUpdate(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokGoalUpdateEvent.class, event);
+ eventHandler.subscribe(TikTokGoalUpdateEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onRankUpdate(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokRankUpdateEvent.class, event);
+ eventHandler.subscribe(TikTokRankUpdateEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onIMDelete(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokIMDeleteEvent.class, event);
+ eventHandler.subscribe(TikTokIMDeleteEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onLiveEnded(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokLiveEndedEvent.class, event);
+ eventHandler.subscribe(TikTokLiveEndedEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onError(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokErrorEvent.class, event);
+ eventHandler.subscribe(TikTokErrorEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onJoin(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokJoinEvent.class, event);
+ eventHandler.subscribe(TikTokJoinEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onRankText(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokRankTextEvent.class, event);
+ eventHandler.subscribe(TikTokRankTextEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onShare(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokShareEvent.class, event);
+ eventHandler.subscribe(TikTokShareEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onUnhandledMember(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokUnhandledMemberEvent.class, event);
+ eventHandler.subscribe(TikTokUnhandledMemberEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onSubNotify(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokSubNotifyEvent.class, event);
+ eventHandler.subscribe(TikTokSubNotifyEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onLinkMicBattle(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokLinkMicBattleEvent.class, event);
+ eventHandler.subscribe(TikTokLinkMicBattleEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onDisconnected(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokDisconnectedEvent.class, event);
+ eventHandler.subscribe(TikTokDisconnectedEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onUnhandledControl(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokUnhandledControlEvent.class, event);
+ eventHandler.subscribe(TikTokUnhandledControlEvent.class, event);
return this;
}
public TikTokLiveClientBuilder onEvent(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokEvent.class, event);
+ eventHandler.subscribe(TikTokEvent.class, event);
return this;
}
@Override
public TikTokLiveClientBuilder onWebsocketResponse(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokWebsocketResponseEvent.class, event);
+ eventHandler.subscribe(TikTokWebsocketResponseEvent.class, event);
return this;
}
@Override
public TikTokLiveClientBuilder onWebsocketMessage(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokWebsocketMessageEvent.class, event);
+ eventHandler.subscribe(TikTokWebsocketMessageEvent.class, event);
return this;
}
@Override
public TikTokLiveClientBuilder onWebsocketUnhandledMessage(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokWebsocketUnhandledMessageEvent.class, event);
+ eventHandler.subscribe(TikTokWebsocketUnhandledMessageEvent.class, event);
return this;
}
@Override
public TikTokLiveClientBuilder onReconnecting(EventConsumer event) {
- tikTokEventHandler.subscribe(TikTokReconnectingEvent.class, event);
+ eventHandler.subscribe(TikTokReconnectingEvent.class, event);
return this;
}
}
\ No newline at end of file
diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveHttpClient.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveHttpClient.java
index eadde29..0d1098d 100644
--- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveHttpClient.java
+++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveHttpClient.java
@@ -83,7 +83,7 @@ public class TikTokLiveHttpClient implements LiveHttpClient
.toJsonResponse();
if (result.isFailure())
- throw new TikTokLiveRequestException("Unable to fetch gifts information's"+result.toStack());
+ throw new TikTokLiveRequestException("Unable to fetch gifts information's - "+result);
var json = result.getContent();
return giftsDataMapper.map(json);
@@ -111,10 +111,10 @@ public class TikTokLiveHttpClient implements LiveHttpClient
.toJsonResponse();
if (result.isFailure())
- throw new TikTokLiveRequestException("Unable to get information's about user"+result.toStack());
+ throw new TikTokLiveRequestException("Unable to get information's about user - "+result);
var json = result.getContent();
- return liveUserDataMapper.map(json);
+ return liveUserDataMapper.map(json, logger);
}
@Override
@@ -138,7 +138,7 @@ public class TikTokLiveHttpClient implements LiveHttpClient
.toJsonResponse();
if (result.isFailure())
- throw new TikTokLiveRequestException("Unable to get info about live room"+result.toStack());
+ throw new TikTokLiveRequestException("Unable to get info about live room - "+result);
var json = result.getContent();
return liveDataMapper.map(json);
@@ -153,7 +153,7 @@ public class TikTokLiveHttpClient implements LiveHttpClient
var resultHeader = ActionResult.of(credentialsResponse.headers().firstValue("x-set-tt-cookie"));
if (resultHeader.isFailure()) {
logger.warning("SignServer Headers: "+request.getRoomId()+" - "+credentialsResponse.headers().map());
- throw new TikTokSignServerException("Sign server did not return the x-set-tt-cookie header"+result.toStack());
+ throw new TikTokSignServerException("Sign server did not return the x-set-tt-cookie header - "+result);
}
var websocketCookie = resultHeader.getContent();
var webcastResponse = WebcastResponse.parseFrom(credentialsResponse.body());
@@ -169,7 +169,7 @@ public class TikTokLiveHttpClient implements LiveHttpClient
return new LiveConnectionData.Response(websocketCookie, webSocketUrl, webcastResponse);
} catch (InvalidProtocolBufferException e) {
- throw new TikTokSignServerException("Unable to parse websocket credentials response to WebcastResponse"+result.toStack());
+ throw new TikTokSignServerException("Unable to parse websocket credentials response to WebcastResponse - "+result);
}
}
@@ -197,7 +197,7 @@ public class TikTokLiveHttpClient implements LiveHttpClient
var result = builder.build().toResponse();
if (result.isFailure())
- throw new TikTokSignServerException("Unable to get websocket connection credentials"+result.toStack());
+ throw new TikTokSignServerException("Unable to get websocket connection credentials - "+result);
return result;
}
diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveHttpOfflineClient.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveHttpOfflineClient.java
new file mode 100644
index 0000000..c5fb961
--- /dev/null
+++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveHttpOfflineClient.java
@@ -0,0 +1,45 @@
+package io.github.jwdeveloper.tiktok;
+
+import io.github.jwdeveloper.tiktok.data.models.Picture;
+import io.github.jwdeveloper.tiktok.data.models.users.User;
+import io.github.jwdeveloper.tiktok.data.requests.GiftsData;
+import io.github.jwdeveloper.tiktok.data.requests.LiveConnectionData;
+import io.github.jwdeveloper.tiktok.data.requests.LiveData;
+import io.github.jwdeveloper.tiktok.data.requests.LiveUserData;
+import io.github.jwdeveloper.tiktok.http.LiveHttpClient;
+import io.github.jwdeveloper.tiktok.messages.webcast.WebcastResponse;
+
+import java.net.URI;
+import java.util.List;
+
+public class TikTokLiveHttpOfflineClient implements LiveHttpClient {
+ @Override
+ public GiftsData.Response fetchGiftsData() {
+ return new GiftsData.Response("", List.of());
+ }
+
+ @Override
+ public LiveUserData.Response fetchLiveUserData(LiveUserData.Request request) {
+ return new LiveUserData.Response("", LiveUserData.UserStatus.Live, "offline_room_id", 0);
+ }
+
+ @Override
+ public LiveData.Response fetchLiveData(LiveData.Request request) {
+ return new LiveData.Response("",
+ LiveData.LiveStatus.HostOnline,
+ "offline live",
+ 0,
+ 0,
+ 0,
+ false,
+ new User(0L, "offline user", new Picture("")),
+ LiveData.LiveType.SOLO);
+ }
+
+ @Override
+ public LiveConnectionData.Response fetchLiveConnectionData(LiveConnectionData.Request request) {
+ return new LiveConnectionData.Response("",
+ URI.create("https://example.live"),
+ WebcastResponse.newBuilder().build());
+ }
+}
diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/common/ActionResult.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/common/ActionResult.java
index 34ab7b3..ac8cd60 100644
--- a/Client/src/main/java/io/github/jwdeveloper/tiktok/common/ActionResult.java
+++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/common/ActionResult.java
@@ -1,6 +1,8 @@
package io.github.jwdeveloper.tiktok.common;
+import com.google.gson.*;
import lombok.Data;
+import lombok.experimental.Accessors;
import java.util.Optional;
import java.util.function.Function;
@@ -11,6 +13,8 @@ public class ActionResult {
private boolean success = true;
private T content;
private String message;
+ @Accessors(chain = true, fluent = true)
+ private ActionResult> previous;
protected ActionResult(T object) {
this.content = object;
@@ -41,8 +45,9 @@ public class ActionResult {
public boolean hasMessage() {
return message != null;
}
- public String toStack() {
- return hasMessage() ? " - "+message : "";
+
+ public boolean hasPrevious() {
+ return previous != null;
}
public boolean hasContent() {
@@ -84,4 +89,18 @@ public class ActionResult {
public static ActionResult failure() {
return failure(null);
}
+
+ public JsonObject toJson() {
+ JsonObject map = new JsonObject();
+ map.addProperty("success", success);
+ map.add("content", new Gson().toJsonTree(content));
+ map.addProperty("message", message);
+ map.add("previous", hasPrevious() ? previous.toJson() : null);
+ return map;
+ }
+
+ @Override
+ public String toString() {
+ return "ActionResult: "+new Gson().newBuilder().setPrettyPrinting().create().toJson(toJson());
+ }
}
\ No newline at end of file
diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/common/ActionResultBuilder.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/common/ActionResultBuilder.java
index 369d35f..f9383d9 100644
--- a/Client/src/main/java/io/github/jwdeveloper/tiktok/common/ActionResultBuilder.java
+++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/common/ActionResultBuilder.java
@@ -1,5 +1,8 @@
package io.github.jwdeveloper.tiktok.common;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+
import java.util.Arrays;
import java.util.stream.Collectors;
@@ -7,6 +10,8 @@ public class ActionResultBuilder
{
private final T content;
private String message;
+ @Setter @Accessors(fluent = true, chain = true)
+ private ActionResult> previous;
public ActionResultBuilder(T content) {
this.content = content;
@@ -18,10 +23,10 @@ public class ActionResultBuilder
}
public ActionResult success() {
- return ActionResult.success(content, message);
+ return ActionResult.success(content, message).previous(previous);
}
public ActionResult failure() {
- return ActionResult.success(content, message);
+ return ActionResult.success(content, message).previous(previous);
}
}
\ No newline at end of file
diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/mappers/LiveUserDataMapper.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/mappers/LiveUserDataMapper.java
index 6dd2aed..9b9cd4b 100644
--- a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/mappers/LiveUserDataMapper.java
+++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/mappers/LiveUserDataMapper.java
@@ -22,45 +22,52 @@
*/
package io.github.jwdeveloper.tiktok.http.mappers;
-import com.google.gson.JsonParser;
+import com.google.gson.*;
import io.github.jwdeveloper.tiktok.data.requests.LiveUserData;
import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveRequestException;
+import java.util.logging.Logger;
+
public class LiveUserDataMapper
{
- public LiveUserData.Response map(String json) {
- var jsonObject = JsonParser.parseString(json).getAsJsonObject();
+ public LiveUserData.Response map(String json, Logger logger) {
+ try {
+ var jsonObject = JsonParser.parseString(json).getAsJsonObject();
- var message = jsonObject.get("message").getAsString();
+ var message = jsonObject.get("message").getAsString();
- if (message.equals("params_error")) {
- throw new TikTokLiveRequestException("fetchRoomIdFromTiktokApi -> Unable to fetch roomID, contact the developer");
- }
- if (message.equals("user_not_found")) {
+ if (message.equals("params_error")) {
+ throw new TikTokLiveRequestException("fetchRoomIdFromTiktokApi -> Unable to fetch roomID, contact the developer");
+ }
+ if (message.equals("user_not_found")) {
+ return new LiveUserData.Response(json, LiveUserData.UserStatus.NotFound, "", -1);
+ }
+ //live -> status 2
+ //live paused -> 3
+ //not live -> status 4
+ var element = jsonObject.get("data");
+ if (element.isJsonNull()) {
+ return new LiveUserData.Response(json, LiveUserData.UserStatus.NotFound, "", -1);
+ }
+ var data = element.getAsJsonObject();
+ var user = data.getAsJsonObject("user");
+ var roomId = user.get("roomId").getAsString();
+ var status = user.get("status").getAsInt();
+
+ var liveRoom = data.getAsJsonObject("liveRoom");
+ long startTime = liveRoom.get("startTime").getAsLong();
+
+ var statusEnum = switch (status) {
+ case 2 -> LiveUserData.UserStatus.Live;
+ case 3 -> LiveUserData.UserStatus.LivePaused;
+ case 4 -> LiveUserData.UserStatus.Offline;
+ default -> LiveUserData.UserStatus.NotFound;
+ };
+
+ return new LiveUserData.Response(json, statusEnum, roomId, startTime);
+ } catch (JsonSyntaxException e) {
+ logger.warning("Malformed Json: '"+json+"' - Error Message: "+e.getMessage());
return new LiveUserData.Response(json, LiveUserData.UserStatus.NotFound, "", -1);
}
- //live -> status 2
- //live paused -> 3
- //not live -> status 4
- var element = jsonObject.get("data");
- if (element.isJsonNull()) {
- return new LiveUserData.Response(json, LiveUserData.UserStatus.NotFound, "", -1);
- }
- var data = element.getAsJsonObject();
- var user = data.getAsJsonObject("user");
- var roomId = user.get("roomId").getAsString();
- var status = user.get("status").getAsInt();
-
- var liveRoom = data.getAsJsonObject("liveRoom");
- long startTime = liveRoom.get("startTime").getAsLong();
-
- var statusEnum = switch (status) {
- case 2 -> LiveUserData.UserStatus.Live;
- case 3 -> LiveUserData.UserStatus.LivePaused;
- case 4 -> LiveUserData.UserStatus.Offline;
- default -> LiveUserData.UserStatus.NotFound;
- };
-
- return new LiveUserData.Response(json, statusEnum, roomId, startTime);
}
}
\ No newline at end of file
diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/handlers/TikTokGiftEventHandler.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/handlers/TikTokGiftEventHandler.java
index 899e13f..0547994 100644
--- a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/handlers/TikTokGiftEventHandler.java
+++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/handlers/TikTokGiftEventHandler.java
@@ -58,40 +58,40 @@ public class TikTokGiftEventHandler {
public List handleGift(WebcastGiftMessage currentMessage) {
var userId = currentMessage.getUser().getId();
- var currentType = GiftSendType.fromNumber(currentMessage.getSendType());
+ var currentType = GiftComboStateType.fromNumber(currentMessage.getSendType());
var containsPreviousMessage = giftsMessages.containsKey(userId);
//If gift is not streakable just return onGift event
if (currentMessage.getGift().getType() != 1) {
- var comboEvent = getGiftComboEvent(currentMessage, GiftSendType.Finished);
+ var comboEvent = getGiftComboEvent(currentMessage, GiftComboStateType.Finished);
var giftEvent = getGiftEvent(currentMessage);
return List.of(comboEvent, giftEvent);
}
if (!containsPreviousMessage) {
- if (currentType == GiftSendType.Finished) {
+ if (currentType == GiftComboStateType.Finished) {
return List.of(getGiftEvent(currentMessage));
} else {
giftsMessages.put(userId, currentMessage);
- return List.of(getGiftComboEvent(currentMessage, GiftSendType.Begin));
+ return List.of(getGiftComboEvent(currentMessage, GiftComboStateType.Begin));
}
}
var previousMessage = giftsMessages.get(userId);
- var previousType = GiftSendType.fromNumber(previousMessage.getSendType());
- if (currentType == GiftSendType.Active &&
- previousType == GiftSendType.Active) {
+ var previousType = GiftComboStateType.fromNumber(previousMessage.getSendType());
+ if (currentType == GiftComboStateType.Active &&
+ previousType == GiftComboStateType.Active) {
giftsMessages.put(userId, currentMessage);
- return List.of(getGiftComboEvent(currentMessage, GiftSendType.Active));
+ return List.of(getGiftComboEvent(currentMessage, GiftComboStateType.Active));
}
- if (currentType == GiftSendType.Finished &&
- previousType == GiftSendType.Active) {
+ if (currentType == GiftComboStateType.Finished &&
+ previousType == GiftComboStateType.Active) {
giftsMessages.clear();
return List.of(
- getGiftComboEvent(currentMessage, GiftSendType.Finished),
+ getGiftComboEvent(currentMessage, GiftComboStateType.Finished),
getGiftEvent(currentMessage));
}
@@ -104,7 +104,7 @@ public class TikTokGiftEventHandler {
return new TikTokGiftEvent(gift, tikTokRoomInfo.getHost(), message);
}
- private TikTokGiftEvent getGiftComboEvent(WebcastGiftMessage message, GiftSendType state) {
+ private TikTokGiftEvent getGiftComboEvent(WebcastGiftMessage message, GiftComboStateType state) {
var gift = getGiftObject(message);
return new TikTokGiftComboEvent(gift, tikTokRoomInfo.getHost(), message, state);
}
diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketClient.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketClient.java
index d3f0f19..d1c8a62 100644
--- a/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketClient.java
+++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketClient.java
@@ -82,7 +82,7 @@ public class TikTokWebSocketClient implements SocketClient {
private void connectDefault() {
try {
webSocketClient.connect();
- pingingTask.run(webSocketClient);
+ pingingTask.run(webSocketClient, clientSettings.getPingInterval());
isConnected = true;
} catch (Exception e) {
isConnected = false;
@@ -112,7 +112,7 @@ public class TikTokWebSocketClient implements SocketClient {
proxySettings.remove();
continue;
}
- pingingTask.run(webSocketClient);
+ pingingTask.run(webSocketClient, clientSettings.getPingInterval());
isConnected = true;
break;
}
diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketOfflineClient.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketOfflineClient.java
new file mode 100644
index 0000000..d30dddc
--- /dev/null
+++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketOfflineClient.java
@@ -0,0 +1,31 @@
+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.TikTokDisconnectedEvent;
+import io.github.jwdeveloper.tiktok.data.requests.LiveConnectionData;
+import io.github.jwdeveloper.tiktok.live.LiveClient;
+
+public class TikTokWebSocketOfflineClient implements SocketClient {
+
+ private final TikTokLiveEventHandler handler;
+ private LiveClient liveClient;
+
+ public TikTokWebSocketOfflineClient(TikTokLiveEventHandler handler) {
+ this.handler = handler;
+ }
+
+ @Override
+ public void start(LiveConnectionData.Response webcastResponse, LiveClient tikTokLiveClient) {
+ liveClient = tikTokLiveClient;
+ handler.publish(liveClient, new TikTokConnectedEvent());
+ }
+
+ @Override
+ public void stop() {
+ if (liveClient == null) {
+ return;
+ }
+ handler.publish(liveClient, new TikTokDisconnectedEvent());
+ }
+}
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 90adbc4..e44987b 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
@@ -8,13 +8,13 @@ public class TikTokWebSocketPingingTask
{
private Thread thread;
private boolean isRunning = false;
- private final int MIN_TIMEOUT = 250;
- private final int MAX_TIMEOUT = 500;
+ private final int MAX_TIMEOUT = 250;
+ private final int SLEEP_TIME = 500;
- public void run(WebSocket webSocket)
+ public void run(WebSocket webSocket, long pingTaskTime)
{
stop();
- thread = new Thread(() -> pingTask(webSocket));
+ thread = new Thread(() -> pingTask(webSocket, pingTaskTime));
isRunning = true;
thread.start();
}
@@ -26,20 +26,18 @@ public class TikTokWebSocketPingingTask
isRunning = false;
}
-
- private void pingTask(WebSocket webSocket)
+ private void pingTask(WebSocket webSocket, long pingTaskTime)
{
var random = new Random();
while (isRunning) {
try {
if (!webSocket.isOpen()) {
- Thread.sleep(100);
+ Thread.sleep(SLEEP_TIME);
continue;
}
webSocket.sendPing();
- var timeout = random.nextInt(MAX_TIMEOUT)+MIN_TIMEOUT;
- Thread.sleep(timeout);
+ Thread.sleep(pingTaskTime+random.nextInt(MAX_TIMEOUT));
}
catch (Exception e) {
isRunning = false;
diff --git a/Client/src/test/java/io/github/jwdeveloper/tiktok/handlers/events/TikTokGiftEventHandlerTest.java b/Client/src/test/java/io/github/jwdeveloper/tiktok/handlers/events/TikTokGiftEventHandlerTest.java
index b77ca91..51d7c97 100644
--- a/Client/src/test/java/io/github/jwdeveloper/tiktok/handlers/events/TikTokGiftEventHandlerTest.java
+++ b/Client/src/test/java/io/github/jwdeveloper/tiktok/handlers/events/TikTokGiftEventHandlerTest.java
@@ -27,7 +27,7 @@ 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.data.models.gifts.GiftComboStateType;
import io.github.jwdeveloper.tiktok.gifts.TikTokGiftsManager;
import io.github.jwdeveloper.tiktok.mappers.handlers.TikTokGiftEventHandler;
import io.github.jwdeveloper.tiktok.messages.data.GiftStruct;
@@ -40,7 +40,6 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import java.util.List;
-import java.util.logging.Logger;
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@@ -99,9 +98,9 @@ class TikTokGiftEventHandlerTest {
Assertions.assertEquals(2, result3.size());
var event3 = (TikTokGiftComboEvent) result3.get(0);
- Assertions.assertEquals(GiftSendType.Begin, event1.getComboState());
- Assertions.assertEquals(GiftSendType.Active, event2.getComboState());
- Assertions.assertEquals(GiftSendType.Finished, event3.getComboState());
+ Assertions.assertEquals(GiftComboStateType.Begin, event1.getComboState());
+ Assertions.assertEquals(GiftComboStateType.Active, event2.getComboState());
+ Assertions.assertEquals(GiftComboStateType.Finished, event3.getComboState());
}
diff --git a/Examples/src/main/java/io/github/jwdeveloper/tiktok/ChatMessageExample.java b/Examples/src/main/java/io/github/jwdeveloper/tiktok/ChatMessageExample.java
deleted file mode 100644
index d7e69ac..0000000
--- a/Examples/src/main/java/io/github/jwdeveloper/tiktok/ChatMessageExample.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (c) 2023-2023 jwdeveloper jacekwoln@gmail.com
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-package io.github.jwdeveloper.tiktok;
-
-import java.time.Duration;
-
-public class ChatMessageExample {
- public static void main(String[] args) {
-
-
- var roomData = TikTokLive.requests()
- .fetchLiveData("X");
-
- var gifts = TikTokLive.requests().fetchGiftsData();
-
-
- var user = TikTokLive.requests()
- .fetchLiveUserData("mark");
-
- TikTokLive.newClient(SimpleExample.TIKTOK_HOSTNAME)
- .configure(clientSettings ->
- {
- clientSettings.setPrintToConsole(true);
- clientSettings.getHttpSettings().setTimeout(Duration.ofSeconds(21));
- })
- .onComment((liveClient, event) ->
- {
- System.out.println("Chat message: " + event.getUser().getName() + " " + event.getText());
- })
- .onWebsocketUnhandledMessage((liveClient, event) ->
- {
- liveClient.getLogger().info(event.getMessage().getMethod());
- }).buildAndConnect();
- }
-}
diff --git a/Examples/src/main/java/io/github/jwdeveloper/tiktok/CollectorExample.java b/Examples/src/main/java/io/github/jwdeveloper/tiktok/CollectorExample.java
index 98e52c4..aed2c8d 100644
--- a/Examples/src/main/java/io/github/jwdeveloper/tiktok/CollectorExample.java
+++ b/Examples/src/main/java/io/github/jwdeveloper/tiktok/CollectorExample.java
@@ -25,27 +25,20 @@ package io.github.jwdeveloper.tiktok;
import io.github.jwdeveloper.tiktok.extension.collector.TikTokLiveCollector;
+import java.io.File;
import java.io.IOException;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
public class CollectorExample {
-
- private static String mongoUser;
-
- private static String mongoPassword;
-
- private static String mongoDatabase;
-
public static void main(String[] args) throws IOException {
- var collector = TikTokLiveCollector.use(settings ->
+ var path = "C:\\Users\\ja\\IdeaProjects\\TikTokLiveJava\\Examples\\src\\main\\resources";
+ var collector = TikTokLiveCollector.useFile(settings ->
{
- settings.setConnectionUrl("mongodb+srv://" + mongoUser + ":" + mongoPassword + "@" + mongoDatabase + "/?retryWrites=true&w=majority");
- settings.setDatabaseName("tiktok");
+ settings.setParentFile(new File(path));
});
- collector.connectDatabase();
+ collector.connect();
var users = List.of("tehila_723", "dino123597", "domaxyzx", "dash4214", "obserwacje_live");
Map additionalDataFields = Map.of("sessionTag", "ExampleTag");
@@ -59,18 +52,11 @@ public class CollectorExample {
{
event.getException().printStackTrace();
})
- .addListener(collector.newListener(additionalDataFields, document ->
- {
- //filtering document data before it is inserted to database
- if (document.get("dataType") == "message") {
- return false;
- }
- return true;
- }))
+ .addListener(collector.newListener(additionalDataFields))
.buildAndConnectAsync();
}
System.in.read();
- collector.disconnectDatabase();
+ collector.disconnect();
}
-}
+}
\ No newline at end of file
diff --git a/Examples/src/main/java/io/github/jwdeveloper/tiktok/SimpleExample.java b/Examples/src/main/java/io/github/jwdeveloper/tiktok/ConnectionExample.java
similarity index 96%
rename from Examples/src/main/java/io/github/jwdeveloper/tiktok/SimpleExample.java
rename to Examples/src/main/java/io/github/jwdeveloper/tiktok/ConnectionExample.java
index ca45379..9e7ebe5 100644
--- a/Examples/src/main/java/io/github/jwdeveloper/tiktok/SimpleExample.java
+++ b/Examples/src/main/java/io/github/jwdeveloper/tiktok/ConnectionExample.java
@@ -31,7 +31,7 @@ import java.io.IOException;
import java.time.Duration;
import java.util.logging.Level;
-public class SimpleExample {
+public class ConnectionExample {
public static String TIKTOK_HOSTNAME = "kvadromama_marina1";
public static void main(String[] args) throws IOException {
@@ -40,10 +40,10 @@ public class SimpleExample {
var gifts = TikTokLive.gifts();
- TikTokLive.newClient(SimpleExample.TIKTOK_HOSTNAME)
+ TikTokLive.newClient(ConnectionExample.TIKTOK_HOSTNAME)
.configure(clientSettings ->
{
- clientSettings.setHostName(SimpleExample.TIKTOK_HOSTNAME); // This method is useful in case you want change hostname later
+ clientSettings.setHostName(ConnectionExample.TIKTOK_HOSTNAME); // This method is useful in case you want change hostname later
clientSettings.setClientLanguage("en"); // Language
clientSettings.setLogLevel(Level.ALL); // Log level
clientSettings.setPrintToConsole(true); // Printing all logs to console even if log level is Level.OFF
diff --git a/Examples/src/main/java/io/github/jwdeveloper/tiktok/CustomEventExample.java b/Examples/src/main/java/io/github/jwdeveloper/tiktok/CustomEventExample.java
index ec38858..3e6ece2 100644
--- a/Examples/src/main/java/io/github/jwdeveloper/tiktok/CustomEventExample.java
+++ b/Examples/src/main/java/io/github/jwdeveloper/tiktok/CustomEventExample.java
@@ -39,7 +39,7 @@ public class CustomEventExample {
public static void main(String[] args)
{
- TikTokLive.newClient(SimpleExample.TIKTOK_HOSTNAME)
+ TikTokLive.newClient(ConnectionExample.TIKTOK_HOSTNAME)
.configure(clientSettings ->
{
clientSettings.setPrintToConsole(true);
diff --git a/Examples/src/main/java/io/github/jwdeveloper/tiktok/Events_And_Gifts_Testing_Example.java b/Examples/src/main/java/io/github/jwdeveloper/tiktok/Events_And_Gifts_Testing_Example.java
new file mode 100644
index 0000000..3d7068b
--- /dev/null
+++ b/Examples/src/main/java/io/github/jwdeveloper/tiktok/Events_And_Gifts_Testing_Example.java
@@ -0,0 +1,74 @@
+package io.github.jwdeveloper.tiktok;
+
+import io.github.jwdeveloper.tiktok.data.events.TikTokCommentEvent;
+import io.github.jwdeveloper.tiktok.data.events.TikTokSubscribeEvent;
+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.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.models.gifts.GiftComboStateType;
+import io.github.jwdeveloper.tiktok.live.LiveClient;
+
+public class Events_And_Gifts_Testing_Example
+{
+
+ public static void main(String[] args) {
+ LiveClient client = TikTokLive.newClient(ConnectionExample.TIKTOK_HOSTNAME)
+ .configure(liveClientSettings ->
+ {
+ liveClientSettings.setOffline(true);
+ liveClientSettings.setPrintToConsole(true);
+ })
+ .onConnected((liveClient, event) ->
+ {
+ liveClient.getLogger().info("Connected");
+ })
+ .onDisconnected((liveClient, event) ->
+ {
+ liveClient.getLogger().info("Disconnected");
+ })
+ .onGiftCombo((liveClient, event) ->
+ {
+ liveClient.getLogger().info("New fake combo Gift: " + event.getGift());
+ })
+ .onGift((liveClient, event) ->
+ {
+ liveClient.getLogger().info("New fake Gift: " + event.getGift());
+ })
+ .onLike((liveClient, event) ->
+ {
+ liveClient.getLogger().info("New fake Like event: " + event.getLikes());
+ })
+ .build();
+
+ var gifts = TikTokLive.gifts();
+ var roseGift = gifts.getByName("Rose");
+
+ var fakeGift = TikTokGiftEvent.of(roseGift);
+ var fakeComboGift = TikTokGiftComboEvent.of(roseGift, 12, GiftComboStateType.Begin);
+
+ var fakeMessage = TikTokCommentEvent.of("Mark", "Hello world");
+
+ var fakeSubscriber = TikTokSubscribeEvent.of("Mark");
+ var fakeFollow = TikTokFollowEvent.of("Mark");
+ var fakeLike = TikTokLikeEvent.of("Mark", 12);
+ var fakeJoin = TikTokJoinEvent.of("Mark");
+
+ client.connect();
+
+ client.publishEvent(fakeGift);
+ client.publishEvent(fakeComboGift);
+ client.publishEvent(fakeMessage);
+ client.publishEvent(fakeSubscriber);
+ client.publishEvent(fakeFollow);
+ client.publishEvent(fakeJoin);
+
+ client.publishEvent(fakeLike);
+ client.publishMessage("WebcastLikeMessage", webcastLikeMessageBase64);
+
+ client.disconnect();
+ }
+
+ private static final String webcastLikeMessageBase64 = "SAFSBRABGKwCUgcIAhABGKwCCv8BUAFYAbABA7gBARCflqWWo8Ha72UgzoPZhd8xQrwBGg4gkAMKCSNmZmZmZmZmZiJ/qgF6CngIhYjjgPWJv7RgGhDwnZKm8J2TjvCdk47wk4WTsgIKa3lsbGVlaGFsbPICTE1TNHdMakFCQUFBQXUyX21LNEw4WGJYa3lNaUFvZzJUTnNmVjk5N09WM2tpQ3NCTkNjYWkwcWxIcUt0Q3B0UGU1N2RLYVhxb0xWSXoICwoQcG1fbXRfbXNnX3ZpZXdlchIXezA6dXNlcn0gbGlrZWQgdGhlIExJVkVIAQoSV2ViY2FzdExpa2VNZXNzYWdlGIaWvY+RhdjvZTABwAEBEA8Y+Voq7RCyAQYImwEQjwK6AQCCAgDyAkxNUzR3TGpBQkFBQUF1Ml9tSzRMOFhiWGt5TWlBb2cyVE5zZlY5OTdPVjNraUNzQk5DY2FpMHFsSHFLdENwdFBlNTdkS2FYcW9MVkl6ggTqCLoBnwUqBggBEAEYIFoNCgASCSNCMzQ3N0VGRoABDwgEEtgEEix3ZWJjYXN0LXZhL2dyYWRlX2JhZGdlX2ljb25fbGl0ZV9sdjE1X3YyLnBuZzrpAnNzbG9jYWw6Ly93ZWJjYXN0X2x5bnh2aWV3X3BvcHVwP3VzZV9zcGFyaz0xJnVybD1odHRwcyUzQSUyRiUyRmxmMTYtZ2Vja28tc291cmNlLnRpa3Rva2Nkbi5jb20lMkZvYmolMkZieXRlLWd1cmQtc291cmNlLXNnJTJGdGlrdG9rJTJGZmUlMkZsaXZlJTJGdGlrdG9rX2xpdmVfcmV2ZW51ZV91c2VyX2xldmVsX21haW4lMkZzcmMlMkZwYWdlcyUyRnByaXZpbGVnZSUyRnBhbmVsJTJGdGVtcGxhdGUuanMmaGlkZV9zdGF0dXNfYmFyPTAmaGlkZV9uYXZfYmFyPTEmY29udGFpbmVyX2JnX2NvbG9yPTAwMDAwMDAwJmhlaWdodD05MCUyNSZiZGhtX2JpZD10aWt0b2tfbGl2ZV9yZXZlbnVlX3VzZXJfbGV2ZWxfbWFpbiZ1c2VfZm9yZXN0PTEKXWh0dHBzOi8vcDE2LXdlYmNhc3QudGlrdG9rY2RuLmNvbS93ZWJjYXN0LXZhL2dyYWRlX2JhZGdlX2ljb25fbGl0ZV9sdjE1X3YyLnBuZ350cGx2LW9iai5pbWFnZQpdaHR0cHM6Ly9wMTktd2ViY2FzdC50aWt0b2tjZG4uY29tL3dlYmNhc3QtdmEvZ3JhZGVfYmFkZ2VfaWNvbl9saXRlX2x2MTVfdjIucG5nfnRwbHYtb2JqLmltYWdlIgIxNTIAOgYaAhIAIgBiDQoAEgkjQjM0NzdFRkZ4DqIBBggBEAEYIAgEEBQYCCABUukCc3Nsb2NhbDovL3dlYmNhc3RfbHlueHZpZXdfcG9wdXA/dXNlX3NwYXJrPTEmdXJsPWh0dHBzJTNBJTJGJTJGbGYxNi1nZWNrby1zb3VyY2UudGlrdG9rY2RuLmNvbSUyRm9iaiUyRmJ5dGUtZ3VyZC1zb3VyY2Utc2clMkZ0aWt0b2slMkZmZSUyRmxpdmUlMkZ0aWt0b2tfbGl2ZV9yZXZlbnVlX3VzZXJfbGV2ZWxfbWFpbiUyRnNyYyUyRnBhZ2VzJTJGcHJpdmlsZWdlJTJGcGFuZWwlMkZ0ZW1wbGF0ZS5qcyZoaWRlX3N0YXR1c19iYXI9MCZoaWRlX25hdl9iYXI9MSZjb250YWluZXJfYmdfY29sb3I9MDAwMDAwMDAmaGVpZ2h0PTkwJTI1JmJkaG1fYmlkPXRpa3Rva19saXZlX3JldmVudWVfdXNlcl9sZXZlbF9tYWluJnVzZV9mb3Jlc3Q9MVgBYk8qAjE1CgEyEhM3MTM4MzgxNzQ3MjkyNTQyNzU2GgEwIi5tb2NrX2ZpeF93aWR0aF90cmFuc3BhcmVudF83MTM4MzgxNzQ3MjkyNTQyNzU2CIWI44D1ib+0YBoQ8J2SpvCdk47wnZOO8JOFk0r1BhJBMTAweDEwMC90b3MtdXNlYXN0OC1hdnQtMDA2OC10eDIvNjY0NmM4NjZjMzI1MWEwOTY3NjhiYjY4OTUyODVjMzEK0gFodHRwczovL3AxOS1wdS1zaWduLXVzZWFzdDgudGlrdG9rY2RuLXVzLmNvbS90b3MtdXNlYXN0OC1hdnQtMDA2OC10eDIvNjY0NmM4NjZjMzI1MWEwOTY3NjhiYjY4OTUyODVjMzF+dHBsdi10aWt0b2stc2hyaW5rOjcyOjcyLndlYnA/bGszcz1hNWQ0ODA3OCZ4LWV4cGlyZXM9MTcwOTMxMjQwMCZ4LXNpZ25hdHVyZT1VMlNEbUk3Z3R5RW9rMlBlWFdmeTNsM1F6NlElM0QKyAFodHRwczovL3AxNi1wdS1zaWduLXVzZWFzdDgudGlrdG9rY2RuLXVzLmNvbS90b3MtdXNlYXN0OC1hdnQtMDA2OC10eDIvNjY0NmM4NjZjMzI1MWEwOTY3NjhiYjY4OTUyODVjMzF+YzVfMTAweDEwMC53ZWJwP2xrM3M9YTVkNDgwNzgmeC1leHBpcmVzPTE3MDkzMTI0MDAmeC1zaWduYXR1cmU9aWNWZEVZa0FnWkYlMkZ2WU5OTSUyRlVNMzE2eG9HdyUzRArGAWh0dHBzOi8vcDE5LXB1LXNpZ24tdXNlYXN0OC50aWt0b2tjZG4tdXMuY29tL3Rvcy11c2Vhc3Q4LWF2dC0wMDY4LXR4Mi82NjQ2Yzg2NmMzMjUxYTA5Njc2OGJiNjg5NTI4NWMzMX5jNV8xMDB4MTAwLndlYnA/bGszcz1hNWQ0ODA3OCZ4LWV4cGlyZXM9MTcwOTMxMjQwMCZ4LXNpZ25hdHVyZT1PQzdBQ3htQUklMkJsYlp4RkVuWktJT1RyRExGUSUzRArGAWh0dHBzOi8vcDE2LXB1LXNpZ24tdXNlYXN0OC50aWt0b2tjZG4tdXMuY29tL3Rvcy11c2Vhc3Q4LWF2dC0wMDY4LXR4Mi82NjQ2Yzg2NmMzMjUxYTA5Njc2OGJiNjg5NTI4NWMzMX5jNV8xMDB4MTAwLmpwZWc/bGszcz1hNWQ0ODA3OCZ4LWV4cGlyZXM9MTcwOTMxMjQwMCZ4LXNpZ25hdHVyZT02YUwlMkZNZWtOeHg5NXlvVTVLOTZON0xwRUlNdyUzRLICCmt5bGxlZWhhbGxCyQEIgojG1pKb0clgErwBChBwbV9tdF9tc2dfdmlld2VyEhd7MDp1c2VyfSBsaWtlZCB0aGUgTElWRRoOCgkjZmZmZmZmZmYgkAMifwgLqgF6CngIhYjjgPWJv7RgGhDwnZKm8J2TjvCdk47wk4WTsgIKa3lsbGVlaGFsbPICTE1TNHdMakFCQUFBQXUyX21LNEw4WGJYa3lNaUFvZzJUTnNmVjk5N09WM2tpQ3NCTkNjYWkwcWxIcUt0Q3B0UGU1N2RLYVhxb0xWSXo=";
+}
diff --git a/Examples/src/main/java/io/github/jwdeveloper/tiktok/ListenerExample.java b/Examples/src/main/java/io/github/jwdeveloper/tiktok/ListenerExample.java
index b74638a..d12111e 100644
--- a/Examples/src/main/java/io/github/jwdeveloper/tiktok/ListenerExample.java
+++ b/Examples/src/main/java/io/github/jwdeveloper/tiktok/ListenerExample.java
@@ -48,7 +48,7 @@ public class ListenerExample
showLogo();
CustomListener customListener = new CustomListener();
- TikTokLive.newClient(SimpleExample.TIKTOK_HOSTNAME)
+ TikTokLive.newClient(ConnectionExample.TIKTOK_HOSTNAME)
.addListener(customListener)
.buildAndConnect();
System.in.read();
diff --git a/Examples/src/main/java/io/github/jwdeveloper/tiktok/ProxyExample.java b/Examples/src/main/java/io/github/jwdeveloper/tiktok/ProxyExample.java
index c911354..9db5c94 100644
--- a/Examples/src/main/java/io/github/jwdeveloper/tiktok/ProxyExample.java
+++ b/Examples/src/main/java/io/github/jwdeveloper/tiktok/ProxyExample.java
@@ -26,7 +26,7 @@ import java.net.Proxy;
public class ProxyExample {
public static void main(String[] args) throws Exception {
- TikTokLive.newClient(SimpleExample.TIKTOK_HOSTNAME)
+ TikTokLive.newClient(ConnectionExample.TIKTOK_HOSTNAME)
.configure(clientSettings -> {
clientSettings.setPrintToConsole(true);
clientSettings.getHttpSettings().configureProxy(proxySettings -> {
diff --git a/Tools-EventsCollector/pom.xml b/Tools-EventsCollector/pom.xml
deleted file mode 100644
index 865218d..0000000
--- a/Tools-EventsCollector/pom.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-
-
-
- TikTokLiveJava
- io.github.jwdeveloper.tiktok
- 1.4.0-Release
-
- 4.0.0
-
- Tools-EventsCollector
-
-
- 16
- 16
- UTF-8
-
-
-
-
-
- org.xerial
- sqlite-jdbc
- 3.34.0
-
-
- org.jdbi
- jdbi3-core
- 3.23.0
-
-
- com.googlecode.protobuf-java-format
- protobuf-java-format
- 1.4
-
-
- org.jdbi
- jdbi3-sqlobject
- 3.23.0
-
-
- org.slf4j
- slf4j-simple
- 1.7.32
-
-
- io.github.jwdeveloper.tiktok
- Client
- ${project.version}
- compile
-
-
- io.github.jwdeveloper.tiktok
- Tools-ReadmeGenerator
- ${project.version}
- compile
-
-
-
-
-
\ No newline at end of file
diff --git a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/TikTokLiveTools.java b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/TikTokLiveTools.java
deleted file mode 100644
index b305f6d..0000000
--- a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/TikTokLiveTools.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (c) 2023-2023 jwdeveloper jacekwoln@gmail.com
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-package io.github.jwdeveloper.tiktok.tools;
-
-import io.github.jwdeveloper.tiktok.tools.collector.client.TikTokDataCollectorBuilder;
-import io.github.jwdeveloper.tiktok.tools.collector.api.DataCollectorBuilder;
-import io.github.jwdeveloper.tiktok.tools.tester.TikTokDataTesterBuilder;
-import io.github.jwdeveloper.tiktok.tools.tester.api.DataTesterBuilder;
-
-public class TikTokLiveTools
-{
- /**
- *
- * @param databaseName dataCollector use sql-lite database to store message
- * if database not exits it creates new one
- * @return
- */
- public static DataCollectorBuilder createCollector(String databaseName)
- {
- return new TikTokDataCollectorBuilder(databaseName);
- }
-
- /**
- *
- * @param databaseName dataTester will read messages for database
- * before using dataTester, use dataCollector to create database
- * if database not exits exception will be thrown
- * @return
- */
- public static DataTesterBuilder createTester(String databaseName)
- {
- return new TikTokDataTesterBuilder(databaseName);
- }
-
- /**
- *
- * Returns browser application that collects and display Events, Messages, WebcastResponses
- * in online web editor so it's easier to read and analyze data structures
- * @return
- */
- public static void createWebViewer()
- {
-
- }
-}
diff --git a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/api/DataCollector.java b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/api/DataCollector.java
deleted file mode 100644
index 52b3713..0000000
--- a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/api/DataCollector.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (c) 2023-2023 jwdeveloper jacekwoln@gmail.com
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-package io.github.jwdeveloper.tiktok.tools.collector.api;
-
-public interface DataCollector {
-
- void connect();
-
-
- void disconnect();
-
- void disconnect(boolean keepDatabase);
-}
diff --git a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/api/DataCollectorBuilder.java b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/api/DataCollectorBuilder.java
deleted file mode 100644
index 74e05d4..0000000
--- a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/api/DataCollectorBuilder.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (c) 2023-2023 jwdeveloper jacekwoln@gmail.com
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-package io.github.jwdeveloper.tiktok.tools.collector.api;
-
-import io.github.jwdeveloper.tiktok.live.builder.LiveClientBuilder;
-import io.github.jwdeveloper.tiktok.tools.db.TikTokDatabase;
-
-import java.util.function.Consumer;
-
-public interface DataCollectorBuilder extends DataFilters {
- DataCollectorBuilder setOutputPath(String path);
- DataCollectorBuilder setSessionTag(String sessionTimestamp);
-
- DataCollectorBuilder setDatabase(TikTokDatabase database);
-
- DataCollectorBuilder configureLiveClient(Consumer consumer);
-
- DataCollectorBuilder addUser(String user);
-
- DataCollector buildAndRun();
-
- DataCollector build();
-
-}
diff --git a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/api/DataFilters.java b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/api/DataFilters.java
deleted file mode 100644
index d1146e3..0000000
--- a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/api/DataFilters.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (c) 2023-2023 jwdeveloper jacekwoln@gmail.com
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-package io.github.jwdeveloper.tiktok.tools.collector.api;
-
-import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent;
-
-public interface DataFilters {
- T addMessageFilter(Class extends com.google.protobuf.GeneratedMessageV3> message);
-
- T addMessageFilter(String message);
-
- T addEventFilter(Class extends TikTokEvent> event);
-
- T addEventFilter(String event);
-}
diff --git a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/api/TikTokDataCollectorModel.java b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/api/TikTokDataCollectorModel.java
deleted file mode 100644
index 47c9dfc..0000000
--- a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/api/TikTokDataCollectorModel.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 2023-2023 jwdeveloper jacekwoln@gmail.com
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-package io.github.jwdeveloper.tiktok.tools.collector.api;
-
-import io.github.jwdeveloper.tiktok.live.builder.LiveClientBuilder;
-import lombok.Data;
-
-import java.util.List;
-import java.util.Set;
-import java.util.function.Consumer;
-
-@Data
-public class TikTokDataCollectorModel {
- private List users;
- private String outputPath;
- private String outputName;
- private Set eventsFilter;
- private Set messagesFilter;
- private String sessionTag ="";
- private Consumer onConfigureLiveClient;
-}
diff --git a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/client/MessagesManager.java b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/client/MessagesManager.java
deleted file mode 100644
index 5859099..0000000
--- a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/client/MessagesManager.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (c) 2023-2023 jwdeveloper jacekwoln@gmail.com
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-package io.github.jwdeveloper.tiktok.tools.collector.client;
-
-import com.google.gson.GsonBuilder;
-import com.google.gson.reflect.TypeToken;
-import io.github.jwdeveloper.tiktok.FilesUtility;
-import io.github.jwdeveloper.tiktok.messages.webcast.WebcastResponse;
-import io.github.jwdeveloper.tiktok.utils.JsonUtil;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-import java.io.File;
-import java.lang.reflect.Type;
-import java.nio.file.Paths;
-import java.time.LocalDateTime;
-import java.util.*;
-import java.util.logging.Logger;
-
-public class MessagesManager {
-
- @Getter
- Map> messages;
- String outputName;
-
- int limit = 20;
- public MessagesManager(String outputName) {
- this.messages = new TreeMap<>();
- this.outputName = outputName;
- load();
- }
-
- public void addMessage(Logger logger, String host, WebcastResponse.Message message) {
- var name = message.getMethod();
- var payload = message.getPayload().toByteArray();
- var base64 = Base64.getEncoder().encodeToString(payload);
-
- if (!messages.containsKey(name)) {
- logger.info("New Message found! " + name);
- messages.put(name, new LinkedList<>());
- }
-
- var queue = messages.get(name);
- if (queue.size() > limit) {
- queue.remove();
- }
-
- queue.add(new MessageData(base64, host, LocalDateTime.now().toString()));
- save();
- }
-
- public String toJson() {
- return JsonUtil.toJson(messages);
- }
-
- public void load() {
- var file = new File(path());
- Type type = new TypeToken