made: settings.fetchGifts default to true,

attach to options `setOffline`
create static method `of` for events

-TikTokGiftEvent
-TikTokCommentEvent
-TikTokSubscribeEvent
-TikTokFollowEvent
-TikTokLikeEvent
-TikTokJoinEvent
This commit is contained in:
JW
2024-02-28 15:58:16 +01:00
parent faa1185b97
commit e923f3fad7
24 changed files with 296 additions and 193 deletions

View File

@@ -47,11 +47,23 @@ public class TikTokCommentEvent extends TikTokHeaderEvent {
public TikTokCommentEvent(WebcastChatMessage msg) { public TikTokCommentEvent(WebcastChatMessage msg) {
super(msg.getCommon()); super(msg.getCommon());
user = User.map(msg.getUser(),msg.getUserIdentity()); user = User.map(msg.getUser(), msg.getUserIdentity());
text = msg.getContent(); text = msg.getContent();
visibleToSender = msg.getVisibleToSender(); visibleToSender = msg.getVisibleToSender();
getUserLanguage = msg.getContentLanguage(); getUserLanguage = msg.getContentLanguage();
mentionedUser = User.map(msg.getAtUser()); mentionedUser = User.map(msg.getAtUser());
pictures = msg.getEmotesListList().stream().map(e -> Picture.map(e.getEmote().getImage())).toList(); 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());
}
} }

View File

@@ -36,10 +36,10 @@ import lombok.Getter;
*/ */
@Getter @Getter
@EventMeta(eventType = EventType.Message) @EventMeta(eventType = EventType.Message)
public class TikTokSubscribeEvent extends TikTokHeaderEvent public class TikTokSubscribeEvent extends TikTokHeaderEvent {
{
private final User user; private final User user;
public TikTokSubscribeEvent(WebcastMemberMessage msg) { public TikTokSubscribeEvent(WebcastMemberMessage msg) {
super(msg.getCommon()); super(msg.getCommon());
user = User.map(msg.getUser()); user = User.map(msg.getUser());
@@ -52,4 +52,11 @@ public class TikTokSubscribeEvent extends TikTokHeaderEvent
user.addAttribute(UserAttribute.Subscriber); 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());
}
} }

View File

@@ -70,6 +70,6 @@ public class TikTokGiftEvent extends TikTokHeaderEvent {
} }
public static TikTokGiftEvent of(String name, int id, int diamonds) { public static TikTokGiftEvent of(String name, int id, int diamonds) {
return null; return TikTokGiftEvent.of(new Gift(id, name, diamonds, ""));
} }
} }

View File

@@ -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.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType; 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.events.common.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.data.models.users.User; 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 io.github.jwdeveloper.tiktok.messages.webcast.WebcastSocialMessage;
import lombok.Value; import lombok.Value;
@@ -45,4 +47,12 @@ public class TikTokFollowEvent extends TikTokHeaderEvent
totalFollowers = msg.getFollowCount(); 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());
}
} }

View File

@@ -26,6 +26,7 @@ import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType; import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.data.events.common.TikTokHeaderEvent; import io.github.jwdeveloper.tiktok.data.events.common.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.data.models.users.User; 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.WebcastMemberMessage;
import io.github.jwdeveloper.tiktok.messages.webcast.WebcastSocialMessage; import io.github.jwdeveloper.tiktok.messages.webcast.WebcastSocialMessage;
import lombok.Getter; import lombok.Getter;
@@ -47,4 +48,13 @@ public class TikTokJoinEvent extends TikTokHeaderEvent {
user = User.map(msg.getUser()); user = User.map(msg.getUser());
totalUsers = msg.getMemberCount(); 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());
}
} }

View File

@@ -57,4 +57,15 @@ public class TikTokLikeEvent extends TikTokHeaderEvent
likes = msg.getCount(); likes = msg.getCount();
totalLikes = msg.getTotal(); 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());
}
} }

View File

@@ -35,6 +35,7 @@ public class LiveData {
} }
@Data @Data
@AllArgsConstructor
public static class Response { public static class Response {
private String json; private String json;
private LiveStatus liveStatus; private LiveStatus liveStatus;
@@ -45,6 +46,11 @@ public class LiveData {
private boolean ageRestricted; private boolean ageRestricted;
private User host; private User host;
private LiveType liveType; private LiveType liveType;
public Response() {
}
} }
public enum LiveStatus { public enum LiveStatus {

View File

@@ -35,6 +35,16 @@ public class LiveClientSettings {
/** /**
* TODO: give better description
* <p>
* 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
* <p>
* Determines if gifts data is downloaded before TikTokLive starts, * Determines if gifts data is downloaded before TikTokLive starts,
* when `false` then client.giftManager() does not contain initial gifts * when `false` then client.giftManager() does not contain initial gifts
*/ */
@@ -76,14 +86,13 @@ public class LiveClientSettings {
private HttpClientSettings httpSettings; private HttpClientSettings httpSettings;
/** /**
* Optional: Sometimes not every messages from chat are send to TikTokLiveJava to fix this issue you can set sessionId * 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 * documentation how to obtain sessionId https://github.com/isaackogan/TikTok-Live-Connector#send-chat-messages
*/ */
private String sessionId; private String sessionId;
/** /**
* Optional: By default roomID is fetched before connect to live, but you can set it manually * Optional: By default roomID is fetched before connect to live, but you can set it manually
*
*/ */
private String roomId; private String roomId;
@@ -92,8 +101,7 @@ public class LiveClientSettings {
*/ */
private String apiKey; private String apiKey;
public static LiveClientSettings createDefault() public static LiveClientSettings createDefault() {
{
var httpSettings = new HttpClientSettings(); var httpSettings = new HttpClientSettings();
httpSettings.getParams().putAll(DefaultClientParams()); httpSettings.getParams().putAll(DefaultClientParams());
httpSettings.getHeaders().putAll(DefaultRequestHeaders()); httpSettings.getHeaders().putAll(DefaultRequestHeaders());
@@ -166,4 +174,6 @@ public class LiveClientSettings {
headers.put("Accept-Language", "en-US,en; q=0.9"); headers.put("Accept-Language", "en-US,en; q=0.9");
return headers; return headers;
} }
} }

View File

@@ -33,6 +33,7 @@ import io.github.jwdeveloper.tiktok.data.requests.LiveConnectionData;
import io.github.jwdeveloper.tiktok.data.requests.LiveData; import io.github.jwdeveloper.tiktok.data.requests.LiveData;
import io.github.jwdeveloper.tiktok.data.requests.LiveUserData; import io.github.jwdeveloper.tiktok.data.requests.LiveUserData;
import io.github.jwdeveloper.tiktok.exceptions.*; 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.ListenersManager;
import io.github.jwdeveloper.tiktok.listener.TikTokListenersManager; import io.github.jwdeveloper.tiktok.listener.TikTokListenersManager;
import io.github.jwdeveloper.tiktok.live.GiftsManager; import io.github.jwdeveloper.tiktok.live.GiftsManager;
@@ -48,7 +49,7 @@ import java.util.logging.Logger;
public class TikTokLiveClient implements LiveClient { public class TikTokLiveClient implements LiveClient {
private final TikTokRoomInfo liveRoomInfo; private final TikTokRoomInfo liveRoomInfo;
private final TikTokLiveHttpClient httpClient; private final LiveHttpClient httpClient;
private final SocketClient webSocketClient; private final SocketClient webSocketClient;
private final TikTokLiveEventHandler tikTokEventHandler; private final TikTokLiveEventHandler tikTokEventHandler;
private final LiveClientSettings clientSettings; private final LiveClientSettings clientSettings;
@@ -58,7 +59,7 @@ public class TikTokLiveClient implements LiveClient {
public TikTokLiveClient(GiftsManager giftsManager, public TikTokLiveClient(GiftsManager giftsManager,
TikTokRoomInfo tikTokLiveMeta, TikTokRoomInfo tikTokLiveMeta,
TikTokLiveHttpClient tiktokHttpClient, LiveHttpClient tiktokHttpClient,
SocketClient webSocketClient, SocketClient webSocketClient,
TikTokLiveEventHandler tikTokEventHandler, TikTokLiveEventHandler tikTokEventHandler,
LiveClientSettings clientSettings, LiveClientSettings clientSettings,

View File

@@ -45,6 +45,7 @@ import io.github.jwdeveloper.tiktok.mappers.data.MappingResult;
import io.github.jwdeveloper.tiktok.mappers.handlers.*; import io.github.jwdeveloper.tiktok.mappers.handlers.*;
import io.github.jwdeveloper.tiktok.messages.webcast.*; import io.github.jwdeveloper.tiktok.messages.webcast.*;
import io.github.jwdeveloper.tiktok.websocket.TikTokWebSocketClient; import io.github.jwdeveloper.tiktok.websocket.TikTokWebSocketClient;
import io.github.jwdeveloper.tiktok.websocket.TikTokWebSocketOfflineClient;
import java.util.*; import java.util.*;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
@@ -54,7 +55,7 @@ import java.util.logging.Logger;
public class TikTokLiveClientBuilder implements LiveClientBuilder { public class TikTokLiveClientBuilder implements LiveClientBuilder {
protected final LiveClientSettings clientSettings; protected final LiveClientSettings clientSettings;
protected final TikTokLiveEventHandler tikTokEventHandler; protected final TikTokLiveEventHandler eventHandler;
protected final List<TikTokEventListener> listeners; protected final List<TikTokEventListener> listeners;
protected Consumer<TikTokMapper> onCustomMappings; protected Consumer<TikTokMapper> onCustomMappings;
protected Logger logger; protected Logger logger;
@@ -63,7 +64,7 @@ public class TikTokLiveClientBuilder implements LiveClientBuilder {
public TikTokLiveClientBuilder(String userName) { public TikTokLiveClientBuilder(String userName) {
this.clientSettings = LiveClientSettings.createDefault(); this.clientSettings = LiveClientSettings.createDefault();
this.clientSettings.setHostName(userName); this.clientSettings.setHostName(userName);
this.tikTokEventHandler = new TikTokLiveEventHandler(); this.eventHandler = new TikTokLiveEventHandler();
this.listeners = new ArrayList<>(); this.listeners = new ArrayList<>();
this.onCustomMappings = (e) -> { this.onCustomMappings = (e) -> {
}; };
@@ -109,27 +110,30 @@ public class TikTokLiveClientBuilder implements LiveClientBuilder {
var tiktokRoomInfo = new TikTokRoomInfo(); var tiktokRoomInfo = new TikTokRoomInfo();
tiktokRoomInfo.setHostName(clientSettings.getHostName()); tiktokRoomInfo.setHostName(clientSettings.getHostName());
var listenerManager = new TikTokListenersManager(listeners, tikTokEventHandler); var listenerManager = new TikTokListenersManager(listeners, eventHandler);
var httpClientFactory = new HttpClientFactory(clientSettings); 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 eventsMapper = createMapper(giftsManager, tiktokRoomInfo);
var messageHandler = new TikTokLiveMessageHandler(tikTokEventHandler, eventsMapper); var messageHandler = new TikTokLiveMessageHandler(eventHandler, eventsMapper);
var webSocketClient = clientSettings.isOffline() ?
var webSocketClient = new TikTokWebSocketClient( new TikTokWebSocketOfflineClient(eventHandler) :
clientSettings, new TikTokWebSocketClient(
messageHandler, clientSettings,
tikTokEventHandler); messageHandler,
eventHandler);
return new TikTokLiveClient( return new TikTokLiveClient(
giftsManager, giftsManager,
tiktokRoomInfo, tiktokRoomInfo,
tikTokLiveHttpClient, liveHttpClient,
webSocketClient, webSocketClient,
tikTokEventHandler, eventHandler,
clientSettings, clientSettings,
listenerManager, listenerManager,
logger); logger);
@@ -235,255 +239,255 @@ public class TikTokLiveClientBuilder implements LiveClientBuilder {
} }
public TikTokLiveClientBuilder onUnhandledSocial(EventConsumer<TikTokUnhandledSocialEvent> event) { public TikTokLiveClientBuilder onUnhandledSocial(EventConsumer<TikTokUnhandledSocialEvent> event) {
tikTokEventHandler.subscribe(TikTokUnhandledSocialEvent.class, event); eventHandler.subscribe(TikTokUnhandledSocialEvent.class, event);
return this; return this;
} }
public LiveClientBuilder onChest(EventConsumer<TikTokChestEvent> event) { public LiveClientBuilder onChest(EventConsumer<TikTokChestEvent> event) {
tikTokEventHandler.subscribe(TikTokChestEvent.class, event); eventHandler.subscribe(TikTokChestEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onLinkMicFanTicket(EventConsumer<TikTokLinkMicFanTicketEvent> event) { public TikTokLiveClientBuilder onLinkMicFanTicket(EventConsumer<TikTokLinkMicFanTicketEvent> event) {
tikTokEventHandler.subscribe(TikTokLinkMicFanTicketEvent.class, event); eventHandler.subscribe(TikTokLinkMicFanTicketEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onEnvelope(EventConsumer<TikTokEnvelopeEvent> event) { public TikTokLiveClientBuilder onEnvelope(EventConsumer<TikTokEnvelopeEvent> event) {
tikTokEventHandler.subscribe(TikTokEnvelopeEvent.class, event); eventHandler.subscribe(TikTokEnvelopeEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onShop(EventConsumer<TikTokShopEvent> event) { public TikTokLiveClientBuilder onShop(EventConsumer<TikTokShopEvent> event) {
tikTokEventHandler.subscribe(TikTokShopEvent.class, event); eventHandler.subscribe(TikTokShopEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onDetect(EventConsumer<TikTokDetectEvent> event) { public TikTokLiveClientBuilder onDetect(EventConsumer<TikTokDetectEvent> event) {
tikTokEventHandler.subscribe(TikTokDetectEvent.class, event); eventHandler.subscribe(TikTokDetectEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onLinkLayer(EventConsumer<TikTokLinkLayerEvent> event) { public TikTokLiveClientBuilder onLinkLayer(EventConsumer<TikTokLinkLayerEvent> event) {
tikTokEventHandler.subscribe(TikTokLinkLayerEvent.class, event); eventHandler.subscribe(TikTokLinkLayerEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onConnected(EventConsumer<TikTokConnectedEvent> event) { public TikTokLiveClientBuilder onConnected(EventConsumer<TikTokConnectedEvent> event) {
tikTokEventHandler.subscribe(TikTokConnectedEvent.class, event); eventHandler.subscribe(TikTokConnectedEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onPreConnection(EventConsumer<TikTokPreConnectionEvent> event) { public TikTokLiveClientBuilder onPreConnection(EventConsumer<TikTokPreConnectionEvent> event) {
tikTokEventHandler.subscribe(TikTokPreConnectionEvent.class, event); eventHandler.subscribe(TikTokPreConnectionEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onCaption(EventConsumer<TikTokCaptionEvent> event) { public TikTokLiveClientBuilder onCaption(EventConsumer<TikTokCaptionEvent> event) {
tikTokEventHandler.subscribe(TikTokCaptionEvent.class, event); eventHandler.subscribe(TikTokCaptionEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onQuestion(EventConsumer<TikTokQuestionEvent> event) { public TikTokLiveClientBuilder onQuestion(EventConsumer<TikTokQuestionEvent> event) {
tikTokEventHandler.subscribe(TikTokQuestionEvent.class, event); eventHandler.subscribe(TikTokQuestionEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onRoomPin(EventConsumer<TikTokRoomPinEvent> event) { public TikTokLiveClientBuilder onRoomPin(EventConsumer<TikTokRoomPinEvent> event) {
tikTokEventHandler.subscribe(TikTokRoomPinEvent.class, event); eventHandler.subscribe(TikTokRoomPinEvent.class, event);
return this; return this;
} }
@Override @Override
public <E extends TikTokEvent> LiveClientBuilder onEvent(Class<E> eventClass, EventConsumer<E> event) { public <E extends TikTokEvent> LiveClientBuilder onEvent(Class<E> eventClass, EventConsumer<E> event) {
tikTokEventHandler.subscribe(eventClass, event); eventHandler.subscribe(eventClass, event);
return this; return this;
} }
@Override @Override
public TikTokLiveClientBuilder onRoomInfo(EventConsumer<TikTokRoomInfoEvent> event) { public TikTokLiveClientBuilder onRoomInfo(EventConsumer<TikTokRoomInfoEvent> event) {
tikTokEventHandler.subscribe(TikTokRoomInfoEvent.class, event); eventHandler.subscribe(TikTokRoomInfoEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onLivePaused(EventConsumer<TikTokLivePausedEvent> event) { public TikTokLiveClientBuilder onLivePaused(EventConsumer<TikTokLivePausedEvent> event) {
tikTokEventHandler.subscribe(TikTokLivePausedEvent.class, event); eventHandler.subscribe(TikTokLivePausedEvent.class, event);
return this; return this;
} }
@Override @Override
public TikTokLiveClientBuilder onLiveUnpaused(EventConsumer<TikTokLiveUnpausedEvent> event) { public TikTokLiveClientBuilder onLiveUnpaused(EventConsumer<TikTokLiveUnpausedEvent> event) {
tikTokEventHandler.subscribe(TikTokLiveUnpausedEvent.class, event); eventHandler.subscribe(TikTokLiveUnpausedEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onLike(EventConsumer<TikTokLikeEvent> event) { public TikTokLiveClientBuilder onLike(EventConsumer<TikTokLikeEvent> event) {
tikTokEventHandler.subscribe(TikTokLikeEvent.class, event); eventHandler.subscribe(TikTokLikeEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onLink(EventConsumer<TikTokLinkEvent> event) { public TikTokLiveClientBuilder onLink(EventConsumer<TikTokLinkEvent> event) {
tikTokEventHandler.subscribe(TikTokLinkEvent.class, event); eventHandler.subscribe(TikTokLinkEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onBarrage(EventConsumer<TikTokBarrageEvent> event) { public TikTokLiveClientBuilder onBarrage(EventConsumer<TikTokBarrageEvent> event) {
tikTokEventHandler.subscribe(TikTokBarrageEvent.class, event); eventHandler.subscribe(TikTokBarrageEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onGift(EventConsumer<TikTokGiftEvent> event) { public TikTokLiveClientBuilder onGift(EventConsumer<TikTokGiftEvent> event) {
tikTokEventHandler.subscribe(TikTokGiftEvent.class, event); eventHandler.subscribe(TikTokGiftEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onGiftCombo(EventConsumer<TikTokGiftComboEvent> event) { public TikTokLiveClientBuilder onGiftCombo(EventConsumer<TikTokGiftComboEvent> event) {
tikTokEventHandler.subscribe(TikTokGiftComboEvent.class, event); eventHandler.subscribe(TikTokGiftComboEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onLinkMicArmies(EventConsumer<TikTokLinkMicArmiesEvent> event) { public TikTokLiveClientBuilder onLinkMicArmies(EventConsumer<TikTokLinkMicArmiesEvent> event) {
tikTokEventHandler.subscribe(TikTokLinkMicArmiesEvent.class, event); eventHandler.subscribe(TikTokLinkMicArmiesEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onEmote(EventConsumer<TikTokEmoteEvent> event) { public TikTokLiveClientBuilder onEmote(EventConsumer<TikTokEmoteEvent> event) {
tikTokEventHandler.subscribe(TikTokEmoteEvent.class, event); eventHandler.subscribe(TikTokEmoteEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onUnauthorizedMember(EventConsumer<TikTokUnauthorizedMemberEvent> event) { public TikTokLiveClientBuilder onUnauthorizedMember(EventConsumer<TikTokUnauthorizedMemberEvent> event) {
tikTokEventHandler.subscribe(TikTokUnauthorizedMemberEvent.class, event); eventHandler.subscribe(TikTokUnauthorizedMemberEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onInRoomBanner(EventConsumer<TikTokInRoomBannerEvent> event) { public TikTokLiveClientBuilder onInRoomBanner(EventConsumer<TikTokInRoomBannerEvent> event) {
tikTokEventHandler.subscribe(TikTokInRoomBannerEvent.class, event); eventHandler.subscribe(TikTokInRoomBannerEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onLinkMicMethod(EventConsumer<TikTokLinkMicMethodEvent> event) { public TikTokLiveClientBuilder onLinkMicMethod(EventConsumer<TikTokLinkMicMethodEvent> event) {
tikTokEventHandler.subscribe(TikTokLinkMicMethodEvent.class, event); eventHandler.subscribe(TikTokLinkMicMethodEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onSubscribe(EventConsumer<TikTokSubscribeEvent> event) { public TikTokLiveClientBuilder onSubscribe(EventConsumer<TikTokSubscribeEvent> event) {
tikTokEventHandler.subscribe(TikTokSubscribeEvent.class, event); eventHandler.subscribe(TikTokSubscribeEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onPoll(EventConsumer<TikTokPollEvent> event) { public TikTokLiveClientBuilder onPoll(EventConsumer<TikTokPollEvent> event) {
tikTokEventHandler.subscribe(TikTokPollEvent.class, event); eventHandler.subscribe(TikTokPollEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onFollow(EventConsumer<TikTokFollowEvent> event) { public TikTokLiveClientBuilder onFollow(EventConsumer<TikTokFollowEvent> event) {
tikTokEventHandler.subscribe(TikTokFollowEvent.class, event); eventHandler.subscribe(TikTokFollowEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onComment(EventConsumer<TikTokCommentEvent> event) { public TikTokLiveClientBuilder onComment(EventConsumer<TikTokCommentEvent> event) {
tikTokEventHandler.subscribe(TikTokCommentEvent.class, event); eventHandler.subscribe(TikTokCommentEvent.class, event);
return this; return this;
} }
@Override @Override
public LiveClientBuilder onHttpResponse(EventConsumer<TikTokHttpResponseEvent> action) { public LiveClientBuilder onHttpResponse(EventConsumer<TikTokHttpResponseEvent> action) {
tikTokEventHandler.subscribe(TikTokHttpResponseEvent.class, action); eventHandler.subscribe(TikTokHttpResponseEvent.class, action);
return this; return this;
} }
public TikTokLiveClientBuilder onGoalUpdate(EventConsumer<TikTokGoalUpdateEvent> event) { public TikTokLiveClientBuilder onGoalUpdate(EventConsumer<TikTokGoalUpdateEvent> event) {
tikTokEventHandler.subscribe(TikTokGoalUpdateEvent.class, event); eventHandler.subscribe(TikTokGoalUpdateEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onRankUpdate(EventConsumer<TikTokRankUpdateEvent> event) { public TikTokLiveClientBuilder onRankUpdate(EventConsumer<TikTokRankUpdateEvent> event) {
tikTokEventHandler.subscribe(TikTokRankUpdateEvent.class, event); eventHandler.subscribe(TikTokRankUpdateEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onIMDelete(EventConsumer<TikTokIMDeleteEvent> event) { public TikTokLiveClientBuilder onIMDelete(EventConsumer<TikTokIMDeleteEvent> event) {
tikTokEventHandler.subscribe(TikTokIMDeleteEvent.class, event); eventHandler.subscribe(TikTokIMDeleteEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onLiveEnded(EventConsumer<TikTokLiveEndedEvent> event) { public TikTokLiveClientBuilder onLiveEnded(EventConsumer<TikTokLiveEndedEvent> event) {
tikTokEventHandler.subscribe(TikTokLiveEndedEvent.class, event); eventHandler.subscribe(TikTokLiveEndedEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onError(EventConsumer<TikTokErrorEvent> event) { public TikTokLiveClientBuilder onError(EventConsumer<TikTokErrorEvent> event) {
tikTokEventHandler.subscribe(TikTokErrorEvent.class, event); eventHandler.subscribe(TikTokErrorEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onJoin(EventConsumer<TikTokJoinEvent> event) { public TikTokLiveClientBuilder onJoin(EventConsumer<TikTokJoinEvent> event) {
tikTokEventHandler.subscribe(TikTokJoinEvent.class, event); eventHandler.subscribe(TikTokJoinEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onRankText(EventConsumer<TikTokRankTextEvent> event) { public TikTokLiveClientBuilder onRankText(EventConsumer<TikTokRankTextEvent> event) {
tikTokEventHandler.subscribe(TikTokRankTextEvent.class, event); eventHandler.subscribe(TikTokRankTextEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onShare(EventConsumer<TikTokShareEvent> event) { public TikTokLiveClientBuilder onShare(EventConsumer<TikTokShareEvent> event) {
tikTokEventHandler.subscribe(TikTokShareEvent.class, event); eventHandler.subscribe(TikTokShareEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onUnhandledMember(EventConsumer<TikTokUnhandledMemberEvent> event) { public TikTokLiveClientBuilder onUnhandledMember(EventConsumer<TikTokUnhandledMemberEvent> event) {
tikTokEventHandler.subscribe(TikTokUnhandledMemberEvent.class, event); eventHandler.subscribe(TikTokUnhandledMemberEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onSubNotify(EventConsumer<TikTokSubNotifyEvent> event) { public TikTokLiveClientBuilder onSubNotify(EventConsumer<TikTokSubNotifyEvent> event) {
tikTokEventHandler.subscribe(TikTokSubNotifyEvent.class, event); eventHandler.subscribe(TikTokSubNotifyEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onLinkMicBattle(EventConsumer<TikTokLinkMicBattleEvent> event) { public TikTokLiveClientBuilder onLinkMicBattle(EventConsumer<TikTokLinkMicBattleEvent> event) {
tikTokEventHandler.subscribe(TikTokLinkMicBattleEvent.class, event); eventHandler.subscribe(TikTokLinkMicBattleEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onDisconnected(EventConsumer<TikTokDisconnectedEvent> event) { public TikTokLiveClientBuilder onDisconnected(EventConsumer<TikTokDisconnectedEvent> event) {
tikTokEventHandler.subscribe(TikTokDisconnectedEvent.class, event); eventHandler.subscribe(TikTokDisconnectedEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onUnhandledControl(EventConsumer<TikTokUnhandledControlEvent> event) { public TikTokLiveClientBuilder onUnhandledControl(EventConsumer<TikTokUnhandledControlEvent> event) {
tikTokEventHandler.subscribe(TikTokUnhandledControlEvent.class, event); eventHandler.subscribe(TikTokUnhandledControlEvent.class, event);
return this; return this;
} }
public TikTokLiveClientBuilder onEvent(EventConsumer<TikTokEvent> event) { public TikTokLiveClientBuilder onEvent(EventConsumer<TikTokEvent> event) {
tikTokEventHandler.subscribe(TikTokEvent.class, event); eventHandler.subscribe(TikTokEvent.class, event);
return this; return this;
} }
@Override @Override
public TikTokLiveClientBuilder onWebsocketResponse(EventConsumer<TikTokWebsocketResponseEvent> event) { public TikTokLiveClientBuilder onWebsocketResponse(EventConsumer<TikTokWebsocketResponseEvent> event) {
tikTokEventHandler.subscribe(TikTokWebsocketResponseEvent.class, event); eventHandler.subscribe(TikTokWebsocketResponseEvent.class, event);
return this; return this;
} }
@Override @Override
public TikTokLiveClientBuilder onWebsocketMessage(EventConsumer<TikTokWebsocketMessageEvent> event) { public TikTokLiveClientBuilder onWebsocketMessage(EventConsumer<TikTokWebsocketMessageEvent> event) {
tikTokEventHandler.subscribe(TikTokWebsocketMessageEvent.class, event); eventHandler.subscribe(TikTokWebsocketMessageEvent.class, event);
return this; return this;
} }
@Override @Override
public TikTokLiveClientBuilder onWebsocketUnhandledMessage(EventConsumer<TikTokWebsocketUnhandledMessageEvent> event) { public TikTokLiveClientBuilder onWebsocketUnhandledMessage(EventConsumer<TikTokWebsocketUnhandledMessageEvent> event) {
tikTokEventHandler.subscribe(TikTokWebsocketUnhandledMessageEvent.class, event); eventHandler.subscribe(TikTokWebsocketUnhandledMessageEvent.class, event);
return this; return this;
} }
@Override @Override
public TikTokLiveClientBuilder onReconnecting(EventConsumer<TikTokReconnectingEvent> event) { public TikTokLiveClientBuilder onReconnecting(EventConsumer<TikTokReconnectingEvent> event) {
tikTokEventHandler.subscribe(TikTokReconnectingEvent.class, event); eventHandler.subscribe(TikTokReconnectingEvent.class, event);
return this; return this;
} }
} }

View File

@@ -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());
}
}

View File

@@ -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());
}
}

View File

@@ -78,12 +78,6 @@
<version>1.3.0-Release</version> <version>1.3.0-Release</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency>
<groupId>io.github.jwdeveloper.worker</groupId>
<artifactId>extension-tester</artifactId>
<version>1.3.0-Release</version>
<scope>compile</scope>
</dependency>
</dependencies> </dependencies>
<properties> <properties>

View File

@@ -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();
}
}

View File

@@ -31,7 +31,7 @@ import java.io.IOException;
import java.time.Duration; import java.time.Duration;
import java.util.logging.Level; import java.util.logging.Level;
public class SimpleExample { public class ConnectionExample {
public static String TIKTOK_HOSTNAME = "kvadromama_marina1"; public static String TIKTOK_HOSTNAME = "kvadromama_marina1";
public static void main(String[] args) throws IOException { public static void main(String[] args) throws IOException {
@@ -40,10 +40,10 @@ public class SimpleExample {
var gifts = TikTokLive.gifts(); var gifts = TikTokLive.gifts();
TikTokLive.newClient(SimpleExample.TIKTOK_HOSTNAME) TikTokLive.newClient(ConnectionExample.TIKTOK_HOSTNAME)
.configure(clientSettings -> .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.setClientLanguage("en"); // Language
clientSettings.setLogLevel(Level.ALL); // Log level clientSettings.setLogLevel(Level.ALL); // Log level
clientSettings.setPrintToConsole(true); // Printing all logs to console even if log level is Level.OFF clientSettings.setPrintToConsole(true); // Printing all logs to console even if log level is Level.OFF

View File

@@ -39,7 +39,7 @@ public class CustomEventExample {
public static void main(String[] args) public static void main(String[] args)
{ {
TikTokLive.newClient(SimpleExample.TIKTOK_HOSTNAME) TikTokLive.newClient(ConnectionExample.TIKTOK_HOSTNAME)
.configure(clientSettings -> .configure(clientSettings ->
{ {
clientSettings.setPrintToConsole(true); clientSettings.setPrintToConsole(true);

View File

@@ -0,0 +1,68 @@
package io.github.jwdeveloper.tiktok;
import io.github.jwdeveloper.tiktok.data.events.TikTokCommentEvent;
import io.github.jwdeveloper.tiktok.data.events.TikTokSubNotifyEvent;
import io.github.jwdeveloper.tiktok.data.events.TikTokSubscribeEvent;
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.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("Connected");
})
.onGift((liveClient, event) ->
{
liveClient.getLogger().info("New fakeGift: " + event.getGift());
})
.buildAndConnect();
var gifts = TikTokLive.gifts();
var fakeGift = TikTokGiftEvent.of(gifts.getByName("Rose"));
fakeGift = TikTokGiftEvent.of("Rose", 1, 23);
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.publishEvent(fakeGift);
client.publishEvent(fakeMessage);
client.publishEvent(fakeSubscriber);
client.publishEvent(fakeFollow);
client.publishEvent(fakeLike);
client.publishEvent(fakeJoin);
client.disconnect();
}
public void GetBuilder() {
}
}

View File

@@ -1,45 +0,0 @@
package io.github.jwdeveloper.tiktok;
import io.github.jwdeveloper.tiktok.data.events.gift.TikTokGiftEvent;
import io.github.jwdeveloper.tiktok.live.LiveClient;
public class GiftTestingExample {
public static void main(String[] args) throws Exception {
LiveClient client = TikTokLive.newClient(SimpleExample.TIKTOK_HOSTNAME)
.configure(liveClientSettings ->
{
// liveClientSettings.setOffline(true);
})
.onConnected((liveClient, event) ->
{
liveClient.getLogger().info("Connected");
})
.onGiftCombo((liveClient, event) ->
{
})
.onGift((liveClient, event) ->
{
liveClient.getLogger().info("New fakeGift: " + event.getGift());
})
.buildAndConnect();
var gifts = TikTokLive.gifts();
var fakeGift = TikTokGiftEvent.of(gifts.getByName("Rose"));
var fakeGift2 = TikTokGiftEvent.of("Rose", 1, 23);
client.publishEvent(fakeGift);
client.publishEvent(fakeGift2);
}
public void GetTesterBuilder() {
}
public void GetBuilder() {
}
}

View File

@@ -48,7 +48,7 @@ public class ListenerExample
showLogo(); showLogo();
CustomListener customListener = new CustomListener(); CustomListener customListener = new CustomListener();
TikTokLive.newClient(SimpleExample.TIKTOK_HOSTNAME) TikTokLive.newClient(ConnectionExample.TIKTOK_HOSTNAME)
.addListener(customListener) .addListener(customListener)
.buildAndConnect(); .buildAndConnect();
System.in.read(); System.in.read();

View File

@@ -26,7 +26,7 @@ import java.net.Proxy;
public class ProxyExample { public class ProxyExample {
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
TikTokLive.newClient(SimpleExample.TIKTOK_HOSTNAME) TikTokLive.newClient(ConnectionExample.TIKTOK_HOSTNAME)
.configure(clientSettings -> { .configure(clientSettings -> {
clientSettings.setPrintToConsole(true); clientSettings.setPrintToConsole(true);
clientSettings.getHttpSettings().configureProxy(proxySettings -> { clientSettings.getHttpSettings().configureProxy(proxySettings -> {

View File

@@ -1,4 +0,0 @@
package io.github.jwdeveloper.tiktok;
public class TestingGiftsExample {
}

View File

@@ -86,15 +86,15 @@ public class TikTokMockBuilder extends TikTokLiveClientBuilder {
var tiktokRoomInfo = new TikTokRoomInfo(); var tiktokRoomInfo = new TikTokRoomInfo();
tiktokRoomInfo.setHostName(clientSettings.getHostName()); tiktokRoomInfo.setHostName(clientSettings.getHostName());
var listenerManager = new TikTokListenersManager(listeners, tikTokEventHandler); var listenerManager = new TikTokListenersManager(listeners, eventHandler);
var mapper = createMapper(new TikTokGiftsManager(List.of()), tiktokRoomInfo); var mapper = createMapper(new TikTokGiftsManager(List.of()), tiktokRoomInfo);
var handler = new TikTokLiveMessageHandler(tikTokEventHandler, mapper); var handler = new TikTokLiveMessageHandler(eventHandler, mapper);
var webSocketClient = new WebsocketClientMock(logger, responses, handler); var webSocketClient = new WebsocketClientMock(logger, responses, handler);
return new LiveClientMock(tiktokRoomInfo, return new LiveClientMock(tiktokRoomInfo,
new TikTokLiveHttpClient(), new TikTokLiveHttpClient(),
webSocketClient, webSocketClient,
tikTokEventHandler, eventHandler,
clientSettings, clientSettings,
listenerManager, listenerManager,
logger); logger);

View File

@@ -50,7 +50,6 @@ public class TikTokLiveDataCollector {
this.settings = settings; this.settings = settings;
} }
public void connectDatabase() { public void connectDatabase() {
var serverApi = ServerApi.builder() var serverApi = ServerApi.builder()
.version(ServerApiVersion.V1) .version(ServerApiVersion.V1)

View File

@@ -18,7 +18,6 @@
<module>extension-recorder</module> <module>extension-recorder</module>
<module>extension-collector</module> <module>extension-collector</module>
<module>extension-tester</module>
</modules> </modules>
<properties> <properties>