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-12 03:41:36 +02:00
parent b18ca25865
commit 2d6111ef4d
48 changed files with 657 additions and 180 deletions

View File

@@ -116,6 +116,7 @@ public class Constants {
public static Map<String, String> DefaultRequestHeaders() {
var headers = new HashMap<String, String>();
headers.put("authority","www.tiktok.com");
headers.put("Connection", "keep-alive");
headers.put("Cache-Control", "max-age=0");
headers.put("Accept", "text/html,application/json,application/protobuf");

View File

@@ -0,0 +1,10 @@
package io.github.jwdeveloper.tiktok.data.events.common;
/**
*
*/
public class TikTokEmptyEvent extends TikTokEvent
{
}

View File

@@ -26,8 +26,8 @@ package io.github.jwdeveloper.tiktok.data.events.common;
import io.github.jwdeveloper.tiktok.utils.JsonUtil;
import lombok.Getter;
/*
Base class for all events
/**
* Base class for all events
*/
@Getter
public abstract class TikTokEvent {

View File

@@ -24,16 +24,32 @@ package io.github.jwdeveloper.tiktok.data.events.gift;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.data.models.Gift;
import io.github.jwdeveloper.tiktok.data.models.gifts.Gift;
import io.github.jwdeveloper.tiktok.data.models.gifts.GiftSendType;
import io.github.jwdeveloper.tiktok.messages.webcast.WebcastGiftMessage;
import lombok.Getter;
/**
* Triggered every time gift is sent
*
* @see GiftSendType it has 3 states
*
* Example when user sends gift with combo
* Combo: 1 -> comboState = GiftSendType.Begin
* Combo: 4 -> comboState = GiftSendType.Active
* Combo: 8 -> comboState = GiftSendType.Active
* Combo: 12 -> comboState = GiftSendType.Finsihed
*
* Remember if comboState is Finsihed both TikTokGiftComboEvent and TikTokGiftEvent event gets triggered
*/
@EventMeta(eventType = EventType.Message)
@Getter
public class TikTokGiftComboEvent extends TikTokGiftEvent
{
public TikTokGiftComboEvent(Gift gift, WebcastGiftMessage msg) {
public class TikTokGiftComboEvent extends TikTokGiftEvent {
private final GiftSendType comboState;
public TikTokGiftComboEvent(Gift gift, WebcastGiftMessage msg, GiftSendType comboState) {
super(gift, msg);
this.comboState = comboState;
}
}

View File

@@ -26,14 +26,17 @@ package io.github.jwdeveloper.tiktok.data.events.gift;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.data.events.common.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.data.models.Gift;
import io.github.jwdeveloper.tiktok.data.models.gifts.Gift;
import io.github.jwdeveloper.tiktok.data.models.gifts.GiftSendType;
import io.github.jwdeveloper.tiktok.data.models.users.User;
import io.github.jwdeveloper.tiktok.messages.webcast.WebcastGiftMessage;
import lombok.Getter;
/*
* Triggered every time a gift arrives.
* Triggered when user sends gifts that has
* no combo (most of expensive gifts)
* or if combo has finished
*/
@EventMeta(eventType = EventType.Message)
@Getter
@@ -41,15 +44,10 @@ public class TikTokGiftEvent extends TikTokHeaderEvent {
private final Gift gift;
private final User user;
private final int combo;
private final boolean comboFinished;
private final int comboIndex;
public TikTokGiftEvent(Gift gift, WebcastGiftMessage msg) {
super(msg.getCommon());
this.gift = gift;
user = User.map(msg.getUser(),msg.getUserIdentity());
user = User.map(msg.getUser(), msg.getUserIdentity());
combo = msg.getComboCount();
comboFinished = msg.getRepeatEnd() > 0;
comboIndex = msg.getRepeatCount();
}
}

View File

@@ -28,6 +28,9 @@ import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent;
import io.github.jwdeveloper.tiktok.messages.webcast.WebcastResponse;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Value;
import java.time.Duration;
/**
@@ -41,4 +44,12 @@ public class TikTokWebsocketMessageEvent extends TikTokEvent
private TikTokEvent event;
private WebcastResponse.Message message;
private MetaData metaData;
@Value
public static class MetaData
{
Duration handlingTime;
}
}

View File

@@ -69,9 +69,14 @@ public class Text {
var format = matcher.replaceAll("%s");
var output = new ArrayList<String>();
for (var piece : textPieces) {
for (var piece : textPieces)
{
output.add(piece.getText());
}
if(matcher.groupCount() != output.size())
{
return format;
}
return String.format(format, output.toArray());
}

View File

@@ -21,8 +21,9 @@
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
// This enum is generated
package io.github.jwdeveloper.tiktok.data.models;
package io.github.jwdeveloper.tiktok.data.models.gifts;
import io.github.jwdeveloper.tiktok.data.models.Picture;
import lombok.Getter;
@Getter

View File

@@ -0,0 +1,18 @@
package io.github.jwdeveloper.tiktok.data.models.gifts;
public enum GiftSendType
{
Finished,
Begin,
Active;
public static GiftSendType fromNumber(long number)
{
return switch ((int) number) {
case 0 -> GiftSendType.Finished;
case 1, 2, 4 -> GiftSendType.Active;
default -> GiftSendType.Finished;
};
}
}

View File

@@ -46,9 +46,6 @@ public class User {
@Getter(AccessLevel.NONE)
private Set<UserAttribute> attributes;
@Setter
private boolean tracked;
public List<UserAttribute> getAttributes() {
return attributes.stream().toList();
}

View File

@@ -25,8 +25,10 @@ package io.github.jwdeveloper.tiktok.handler;
import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent;
import java.util.List;
public interface TikTokMessageHandler
{
TikTokEvent handle(byte[] messagePayload) throws Exception;
List<TikTokEvent> handle(byte[] messagePayload) throws Exception;
}

View File

@@ -22,7 +22,7 @@
*/
package io.github.jwdeveloper.tiktok.live;
import io.github.jwdeveloper.tiktok.data.models.Gift;
import io.github.jwdeveloper.tiktok.data.models.gifts.Gift;
import io.github.jwdeveloper.tiktok.data.models.Picture;
import java.util.List;

View File

@@ -23,7 +23,7 @@
package io.github.jwdeveloper.tiktok.live;
import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent;
import io.github.jwdeveloper.tiktok.data.models.Gift;
import io.github.jwdeveloper.tiktok.data.models.gifts.Gift;
import io.github.jwdeveloper.tiktok.data.models.users.User;
import java.util.List;

View File

@@ -52,7 +52,6 @@ public interface EventsBuilder<T> {
T onWebsocketUnhandledMessage(EventConsumer<TikTokWebsocketUnhandledMessageEvent> event);
T onGiftCombo(EventConsumer<TikTokGiftComboEvent> event);
T onGift(EventConsumer<TikTokGiftEvent> event);
T onQuestion(EventConsumer<TikTokQuestionEvent> event);

View File

@@ -0,0 +1,20 @@
package io.github.jwdeveloper.tiktok.utils;
public class Stopwatch {
private long startTime;
private long stopTime;
public void start() {
startTime = System.nanoTime();
}
public long stop() {
stopTime = System.nanoTime();
return getElapsedTime();
}
public long getElapsedTime() {
return stopTime - startTime;
}
}