mirror of
https://github.com/jwdeveloper/TikTokLiveJava.git
synced 2026-02-27 16:59:39 -05:00
Breaking changes:
'Gift': changed from class to enum, so now you can handle
incoming gifts in switch
`Events`
- new:
onGiftComboFinished
- Removed:
onGiftBrodcast
- Rename:
onGiftMessage -> onGift
onRoomPinMessage -> onRoomPin
onRoomMessage -> onRoom
onLinkMessage -> onLink
onBarrageMessage -> onBarrage
onPollMessage -> onPoll
onShopMessage -> onShop
onDetectMessage -> onDetect
`GiftManager`
added:
registerGift
findById
findByName
getGifts
removed:
getActiveGifts
This commit is contained in:
@@ -30,6 +30,9 @@ import io.github.jwdeveloper.tiktok.events.messages.TikTokConnectedEvent;
|
||||
import io.github.jwdeveloper.tiktok.events.messages.TikTokDisconnectedEvent;
|
||||
import io.github.jwdeveloper.tiktok.events.messages.gift.TikTokGiftComboFinishedEvent;
|
||||
import io.github.jwdeveloper.tiktok.events.messages.gift.TikTokGiftEvent;
|
||||
import io.github.jwdeveloper.tiktok.events.messages.room.TikTokRoomEvent;
|
||||
import io.github.jwdeveloper.tiktok.events.messages.room.TikTokRoomPinEvent;
|
||||
import io.github.jwdeveloper.tiktok.events.messages.room.TikTokRoomUserInfoEvent;
|
||||
import io.github.jwdeveloper.tiktok.events.messages.social.TikTokFollowEvent;
|
||||
import io.github.jwdeveloper.tiktok.events.messages.social.TikTokJoinEvent;
|
||||
import io.github.jwdeveloper.tiktok.events.messages.social.TikTokLikeEvent;
|
||||
|
||||
@@ -53,7 +53,7 @@ public abstract class TikTokMessageHandler {
|
||||
|
||||
public abstract void init();
|
||||
|
||||
public void registerMapping(Class<?> clazz, Function<WebcastResponse.Message, TikTokEvent> func) {
|
||||
public void registerMapping(Class<?> clazz, Function<byte[], TikTokEvent> func) {
|
||||
handlers.put(clazz.getSimpleName(), func::apply);
|
||||
}
|
||||
|
||||
@@ -72,6 +72,17 @@ public abstract class TikTokMessageHandler {
|
||||
}
|
||||
}
|
||||
}
|
||||
public void handleSingleMessage(LiveClient client, String type, byte[] bytes) throws Exception {
|
||||
|
||||
if (!handlers.containsKey(type)) {
|
||||
tikTokEventHandler.publish(client, new TikTokWebsocketUnhandledMessageEvent(WebcastResponse.Message.newBuilder().setMethod(type).build()));
|
||||
return;
|
||||
}
|
||||
var handler = handlers.get(type);
|
||||
var tiktokEvent = handler.handle(bytes);
|
||||
tikTokEventHandler.publish(client, new TikTokWebsocketMessageEvent(tiktokEvent, WebcastResponse.Message.newBuilder().build()));
|
||||
tikTokEventHandler.publish(client, tiktokEvent);
|
||||
}
|
||||
|
||||
|
||||
public void handleSingleMessage(LiveClient client, WebcastResponse.Message message) throws Exception {
|
||||
@@ -85,15 +96,15 @@ public abstract class TikTokMessageHandler {
|
||||
return;
|
||||
}
|
||||
var handler = handlers.get(methodName);
|
||||
var tiktokEvent = handler.handle(message);
|
||||
var tiktokEvent = handler.handle(message.getPayload().toByteArray());
|
||||
tikTokEventHandler.publish(client, new TikTokWebsocketMessageEvent(tiktokEvent, message));
|
||||
tikTokEventHandler.publish(client, tiktokEvent);
|
||||
}
|
||||
|
||||
protected TikTokEvent mapMessageToEvent(Class<?> inputClazz, Class<?> outputClass, WebcastResponse.Message message) {
|
||||
protected TikTokEvent mapMessageToEvent(Class<?> inputClazz, Class<?> outputClass, byte[] payload) {
|
||||
try {
|
||||
var parseMethod = inputClazz.getDeclaredMethod("parseFrom", ByteString.class);
|
||||
var deserialized = parseMethod.invoke(null, message.getPayload());
|
||||
var parseMethod = inputClazz.getDeclaredMethod("parseFrom", byte[].class);
|
||||
var deserialized = parseMethod.invoke(null,payload);
|
||||
var constructors = Arrays.stream(outputClass.getConstructors())
|
||||
.filter(ea -> Arrays.stream(ea.getParameterTypes())
|
||||
.toList()
|
||||
|
||||
@@ -32,6 +32,9 @@ import io.github.jwdeveloper.tiktok.events.messages.poll.TikTokPollEndEvent;
|
||||
import io.github.jwdeveloper.tiktok.events.messages.poll.TikTokPollEvent;
|
||||
import io.github.jwdeveloper.tiktok.events.messages.poll.TikTokPollStartEvent;
|
||||
import io.github.jwdeveloper.tiktok.events.messages.poll.TikTokPollUpdateEvent;
|
||||
import io.github.jwdeveloper.tiktok.events.messages.room.TikTokRoomEvent;
|
||||
import io.github.jwdeveloper.tiktok.events.messages.room.TikTokRoomPinEvent;
|
||||
import io.github.jwdeveloper.tiktok.events.messages.room.TikTokRoomUserInfoEvent;
|
||||
import io.github.jwdeveloper.tiktok.events.messages.social.TikTokFollowEvent;
|
||||
import io.github.jwdeveloper.tiktok.events.messages.social.TikTokJoinEvent;
|
||||
import io.github.jwdeveloper.tiktok.events.messages.social.TikTokLikeEvent;
|
||||
@@ -111,8 +114,8 @@ public class TikTokMessageHandlerRegistration extends TikTokMessageHandler {
|
||||
|
||||
|
||||
@SneakyThrows
|
||||
private TikTokEvent handleWebcastControlMessage(WebcastResponse.Message msg) {
|
||||
var message = WebcastControlMessage.parseFrom(msg.getPayload());
|
||||
private TikTokEvent handleWebcastControlMessage(byte[] msg) {
|
||||
var message = WebcastControlMessage.parseFrom(msg);
|
||||
return switch (message.getAction()) {
|
||||
case STREAM_PAUSED -> new TikTokLivePausedEvent();
|
||||
case STREAM_ENDED -> new TikTokLiveEndedEvent();
|
||||
@@ -121,8 +124,8 @@ public class TikTokMessageHandlerRegistration extends TikTokMessageHandler {
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
private TikTokEvent handleGift(WebcastResponse.Message msg) {
|
||||
var giftMessage = WebcastGiftMessage.parseFrom(msg.getPayload());
|
||||
private TikTokEvent handleGift(byte[] msg) {
|
||||
var giftMessage = WebcastGiftMessage.parseFrom(msg);
|
||||
|
||||
|
||||
var gift = giftManager.findById((int) giftMessage.getGiftId());
|
||||
@@ -145,8 +148,8 @@ public class TikTokMessageHandlerRegistration extends TikTokMessageHandler {
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
private TikTokEvent handleSocialMedia(WebcastResponse.Message msg) {
|
||||
var message = WebcastSocialMessage.parseFrom(msg.getPayload());
|
||||
private TikTokEvent handleSocialMedia(byte[] msg) {
|
||||
var message = WebcastSocialMessage.parseFrom(msg);
|
||||
|
||||
var socialType = Text.map(message.getCommon().getDisplayText()).getKey();
|
||||
var matcher = socialMediaPattern.matcher(socialType);
|
||||
@@ -167,8 +170,8 @@ public class TikTokMessageHandlerRegistration extends TikTokMessageHandler {
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
private TikTokEvent handleMemberMessage(WebcastResponse.Message msg) {
|
||||
var message = WebcastMemberMessage.parseFrom(msg.getPayload());
|
||||
private TikTokEvent handleMemberMessage(byte[] msg) {
|
||||
var message = WebcastMemberMessage.parseFrom(msg);
|
||||
return switch (message.getAction()) {
|
||||
case JOINED -> new TikTokJoinEvent(message);
|
||||
case SUBSCRIBED -> new TikTokSubscribeEvent(message);
|
||||
@@ -176,21 +179,21 @@ public class TikTokMessageHandlerRegistration extends TikTokMessageHandler {
|
||||
};
|
||||
}
|
||||
|
||||
private TikTokEvent handleRoomUserSeqMessage(WebcastResponse.Message msg) {
|
||||
private TikTokEvent handleRoomUserSeqMessage(byte[] msg) {
|
||||
var event = (TikTokRoomUserInfoEvent) mapMessageToEvent(WebcastRoomUserSeqMessage.class, TikTokRoomUserInfoEvent.class, msg);
|
||||
roomInfo.setViewersCount(event.getTotalUsers());
|
||||
return event;
|
||||
}
|
||||
|
||||
private TikTokEvent handleLike(WebcastResponse.Message msg) {
|
||||
private TikTokEvent handleLike(byte[] msg) {
|
||||
var event = (TikTokLikeEvent) mapMessageToEvent(WebcastLikeMessage.class, TikTokLikeEvent.class, msg);
|
||||
roomInfo.setLikesCount(event.getTotalLikes());
|
||||
return event;
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
private TikTokEvent handlePinMessage(WebcastResponse.Message msg) {
|
||||
var pinMessage = WebcastRoomPinMessage.parseFrom(msg.getPayload());
|
||||
private TikTokEvent handlePinMessage(byte[] msg) {
|
||||
var pinMessage = WebcastRoomPinMessage.parseFrom(msg);
|
||||
var chatMessage = WebcastChatMessage.parseFrom(pinMessage.getPinnedMessage());
|
||||
var chatEvent = new TikTokCommentEvent(chatMessage);
|
||||
return new TikTokRoomPinEvent(pinMessage, chatEvent);
|
||||
@@ -198,8 +201,8 @@ public class TikTokMessageHandlerRegistration extends TikTokMessageHandler {
|
||||
|
||||
//TODO check
|
||||
@SneakyThrows
|
||||
private TikTokEvent handlePollEvent(WebcastResponse.Message msg) {
|
||||
var poolMessage = WebcastPollMessage.parseFrom(msg.getPayload());
|
||||
private TikTokEvent handlePollEvent(byte[] msg) {
|
||||
var poolMessage = WebcastPollMessage.parseFrom(msg);
|
||||
return switch (poolMessage.getMessageType()) {
|
||||
case 0 -> new TikTokPollStartEvent(poolMessage);
|
||||
case 1 -> new TikTokPollEndEvent(poolMessage);
|
||||
|
||||
@@ -88,11 +88,16 @@ public class TikTokWebSocketListener extends WebSocketClient {
|
||||
|
||||
@Override
|
||||
public void onClose(int i, String s, boolean b) {
|
||||
|
||||
System.out.println("CLOSE "+i+" "+s+" "+b);
|
||||
tikTokEventHandler.publish(tikTokLiveClient,new TikTokDisconnectedEvent());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(Exception error) {
|
||||
public void onError(Exception error)
|
||||
{
|
||||
System.out.println("ERROR");
|
||||
error.printStackTrace();
|
||||
tikTokEventHandler.publish(tikTokLiveClient,new TikTokErrorEvent(error));
|
||||
if(isNotClosing())
|
||||
{
|
||||
@@ -106,6 +111,7 @@ public class TikTokWebSocketListener extends WebSocketClient {
|
||||
return;
|
||||
}
|
||||
var websocketMessage = websocketMessageOptional.get();
|
||||
System.out.println("ACK ID "+websocketMessage.getLogId()+" ID "+websocketMessage.getSeqId());
|
||||
sendAckId(websocketMessage.getLogId());
|
||||
|
||||
var webResponse = getWebResponseMessage(websocketMessage.getPayload());
|
||||
@@ -147,7 +153,8 @@ public class TikTokWebSocketListener extends WebSocketClient {
|
||||
.build();
|
||||
if(isNotClosing())
|
||||
{
|
||||
send(serverInfo.toByteString().toByteArray());
|
||||
System.out.println("SEND ICK ID "+id);
|
||||
send(serverInfo.toByteArray());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -36,6 +36,7 @@ public class TikTokWebSocketPingingTask
|
||||
|
||||
public void run(WebSocket webSocket)
|
||||
{
|
||||
stop();
|
||||
var thread = new Thread(() ->
|
||||
{
|
||||
pingTask(webSocket);
|
||||
@@ -66,7 +67,9 @@ public class TikTokWebSocketPingingTask
|
||||
Thread.sleep(100);
|
||||
continue;
|
||||
}
|
||||
System.out.println("PING!");
|
||||
webSocket.sendPing();
|
||||
|
||||
var timeout = random.nextInt(MAX_TIMEOUT)+MIN_TIMEOUT;
|
||||
Thread.sleep(timeout);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user