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:
JW
2023-10-05 16:52:05 +02:00
parent f0d7cb0cbc
commit 9f4c1c8c92
26 changed files with 200 additions and 89 deletions

View File

@@ -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;

View File

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

View File

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

View File

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

View File

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