diff --git a/API/pom.xml b/API/pom.xml
index 46b39fa..1ac9ac9 100644
--- a/API/pom.xml
+++ b/API/pom.xml
@@ -4,7 +4,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
TikTokLiveJava
- org.example
+ io.github.jwdeveloper.tiktok
1.0-SNAPSHOT
4.0.0
@@ -17,6 +17,24 @@
1.18.22
compile
+
+ junit
+ junit
+ 4.13.1
+ test
+
+
+ org.testng
+ testng
+ RELEASE
+ test
+
+
+
+ com.google.protobuf
+ protobuf-java
+ 3.8.0
+
@@ -25,4 +43,52 @@
UTF-8
+
+ target/generated-sources
+
+
+ kr.motd.maven
+ os-maven-plugin
+ 1.7.0
+
+
+ initialize
+
+ detect
+
+
+
+
+
+
+
+ com.github.os72
+ protoc-jar-maven-plugin
+ 3.11.4
+
+
+ generate-sources
+
+ run
+
+
+ all
+ direct
+
+ src/main
+
+
+ src/main/proto
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/annotations/Nullable.java b/API/src/main/java/io/github/jwdeveloper/tiktok/annotations/Nullable.java
new file mode 100644
index 0000000..716cf6b
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/annotations/Nullable.java
@@ -0,0 +1,4 @@
+package io.github.jwdeveloper.tiktok.annotations;
+
+public @interface Nullable {
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/TikTokEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/TikTokEvent.java
new file mode 100644
index 0000000..c70cc90
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/TikTokEvent.java
@@ -0,0 +1,41 @@
+package io.github.jwdeveloper.tiktok.events;
+
+import io.github.jwdeveloper.tiktok.messages.*;
+import lombok.Getter;
+
+@Getter
+public class TikTokEvent {
+ private long messageId;
+ private long roomId;
+ private long timeStamp;
+
+ public TikTokEvent(MessageHeader header) {
+ this(header.getMessageId(),header.getRoomId(), header.getTimeStamp1());
+ }
+
+ public TikTokEvent(GiftMessageHeader header) {
+ this(header.getMessageId(),header.getRoomId(), header.getTimeStamp1());
+ }
+
+ public TikTokEvent(MemberMessageHeader header) {
+ this(header.getMessageId(),header.getRoomId(), header.getTimeStamp1());
+ }
+
+ public TikTokEvent(SocialMessageHeader header) {
+ this(header.getMessageId(),header.getRoomId(), header.getTimeStamp1());
+ }
+
+ public TikTokEvent(LikeMessageHeader header) {
+ this(header.getMessageId(),header.getRoomId(), header.getTimeStamp1());
+ }
+
+ public TikTokEvent(long messageId, long roomId, long timeStamp) {
+ this.messageId = messageId;
+ this.roomId = roomId;
+ this.timeStamp = timeStamp;
+ }
+
+ public TikTokEvent() {
+
+ }
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/TikTokEventBuilder.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/TikTokEventBuilder.java
new file mode 100644
index 0000000..17dd64d
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/TikTokEventBuilder.java
@@ -0,0 +1,75 @@
+package io.github.jwdeveloper.tiktok.events;
+
+import io.github.jwdeveloper.tiktok.events.messages.*;
+
+import java.util.function.Consumer;
+
+
+
+public interface TikTokEventBuilder {
+ T onLinkMicFanTicket(Consumer event);
+
+ T onEnvelope(Consumer event);
+
+ T onShopMessage(Consumer event);
+
+ T onDetectMessage(Consumer event);
+
+ T onLinkLayerMessage(Consumer event);
+
+ T onCaption(Consumer event);
+
+ T onQuestion(Consumer event);
+
+ T onRoomPinMessage(Consumer event);
+
+ T onRoomMessage(Consumer event);
+
+ T onLike(Consumer event);
+
+ T onLinkMessage(Consumer event);
+
+ T onBarrageMessage(Consumer event);
+
+ T onGiftMessage(Consumer event);
+
+ T onLinkMicArmies(Consumer event);
+
+ T onEmote(Consumer event);
+
+ T onUnauthorizedMember(Consumer event);
+
+ T onInRoomBanner(Consumer event);
+
+ T onLinkMicMethod(Consumer event);
+
+ T onSubscribe(Consumer event);
+
+ T onPollMessage(Consumer event);
+
+ T onFollow(Consumer event);
+
+ T onRoomViewerData(Consumer event);
+
+ T onGoalUpdate(Consumer event);
+
+ T onComment(Consumer event);
+
+ T onRankUpdate(Consumer event);
+
+ T onIMDelete(Consumer event);
+
+ T onJoin(Consumer event);
+
+ T onRankText(Consumer event);
+
+ T onShare(Consumer event);
+
+ T onSubNotify(Consumer event);
+
+ T onLinkMicBattle(Consumer event);
+
+ T onGiftBroadcast(Consumer event);
+}
+
+
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/TikTokLiveEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/TikTokLiveEvent.java
new file mode 100644
index 0000000..57ecd9a
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/TikTokLiveEvent.java
@@ -0,0 +1,8 @@
+package io.github.jwdeveloper.tiktok.events;
+
+import io.github.jwdeveloper.tiktok.live.LiveClient;
+
+public interface TikTokLiveEvent
+{
+ void onEvent(LiveClient liveClient, T event);
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokBarrageMessageEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokBarrageMessageEvent.java
new file mode 100644
index 0000000..3ab5f85
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokBarrageMessageEvent.java
@@ -0,0 +1,37 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.events.objects.BarrageData;
+import io.github.jwdeveloper.tiktok.events.objects.Picture;
+import io.github.jwdeveloper.tiktok.events.objects.User;
+import io.github.jwdeveloper.tiktok.messages.WebcastBarrageMessage;
+import lombok.Getter;
+
+@Getter
+public class TikTokBarrageMessageEvent extends TikTokEvent {
+ private final Picture picture;
+
+ private final Picture picture2;
+
+ private final Picture picture3;
+
+ private final User user;
+ private final BarrageData barrageData;
+
+ public TikTokBarrageMessageEvent(WebcastBarrageMessage msg) {
+ super(msg.getHeader());
+
+ picture = new Picture(msg.getPicture());
+ picture2 = new Picture(msg.getPicture2());
+ picture3 = new Picture(msg.getPicture3());
+ user = new User(msg.getUserData().getUser());
+ barrageData = new BarrageData(msg.getMessage().getEventType(),
+ msg.getMessage().getLabel(),
+ msg.getMessage().getData1List().stream().map(e ->
+ {
+ var user = new User(e.getUser().getUser());
+ return new BarrageData.BarrageUser(user, e.getData2());
+ }).toList()
+ );
+ }
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokCaptionEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokCaptionEvent.java
new file mode 100644
index 0000000..b67c203
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokCaptionEvent.java
@@ -0,0 +1,21 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.messages.WebcastCaptionMessage;
+import lombok.Getter;
+
+@Getter
+public class TikTokCaptionEvent extends TikTokEvent {
+ private final Long captionTimeStamp;
+
+ private final String iSOLanguage;
+
+ private final String text;
+
+ public TikTokCaptionEvent(WebcastCaptionMessage msg) {
+ super(msg.getHeader());
+ captionTimeStamp = msg.getTimeStamp();
+ iSOLanguage = msg.getCaptionData().getISOLanguage();
+ text = msg.getCaptionData().getText();
+ }
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokCommentEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokCommentEvent.java
new file mode 100644
index 0000000..cb68495
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokCommentEvent.java
@@ -0,0 +1,43 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.annotations.Nullable;
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.events.objects.Picture;
+import io.github.jwdeveloper.tiktok.events.objects.User;
+import io.github.jwdeveloper.tiktok.messages.WebcastChatMessage;
+import io.github.jwdeveloper.tiktok.messages.WebcastRoomPinMessage;
+import lombok.Getter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Getter
+public class TikTokCommentEvent extends TikTokEvent
+{
+ @Nullable
+ private User user;
+ private final String text;
+ private final String language;
+ private final List mentionedUsers;
+ private final List pictures;
+
+ public TikTokCommentEvent(WebcastRoomPinMessage.RoomPinMessageData data) {
+ super(data.getDetails().getRoomId(), data.getDetails().getMessageId(), data.getDetails().getServerTime());
+ if (data.hasSender())
+ user = new User(data.getSender());
+ text = data.getComment();
+ language = data.getLanguage();
+ mentionedUsers = new ArrayList<>();
+ pictures = new ArrayList<>();
+ }
+
+ public TikTokCommentEvent(WebcastChatMessage msg) {
+ super(msg.getHeader());
+ if (msg.hasSender())
+ user = new User(msg.getSender());
+ text = msg.getComment();
+ language = msg.getLanguage();
+ mentionedUsers = msg.getMentionedUsersList().stream().map(User::new).toList();
+ pictures = msg.getImagesList().stream().map(e -> new Picture(e.getPicture())).toList();
+ }
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokConnectedEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokConnectedEvent.java
new file mode 100644
index 0000000..e9d50d7
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokConnectedEvent.java
@@ -0,0 +1,8 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+
+public class TikTokConnectedEvent extends TikTokEvent
+{
+
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokDetectMessageEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokDetectMessageEvent.java
new file mode 100644
index 0000000..bd7d884
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokDetectMessageEvent.java
@@ -0,0 +1,23 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.messages.WebcastMsgDetectMessage;
+import lombok.Getter;
+
+import java.util.List;
+
+@Getter
+public class TikTokDetectMessageEvent extends TikTokEvent {
+ private final String language;
+
+ private final List data;
+
+ private final List timings;
+
+ public TikTokDetectMessageEvent(WebcastMsgDetectMessage msg) {
+ super(msg.getHeader());;
+ language = msg.getLanguage();
+ data = List.of(msg.getData2().getData1(), msg.getData2().getData2(), msg.getData2().getData3());
+ timings= List.of(msg.getTimestamps().getTimestamp1(), msg.getTimestamps().getTimestamp2(), msg.getTimestamps().getTimestamp3());
+ }
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokDisconnectedEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokDisconnectedEvent.java
new file mode 100644
index 0000000..525fa31
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokDisconnectedEvent.java
@@ -0,0 +1,6 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+
+public class TikTokDisconnectedEvent extends TikTokEvent {
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokEmoteEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokEmoteEvent.java
new file mode 100644
index 0000000..28d2a2a
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokEmoteEvent.java
@@ -0,0 +1,26 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.annotations.Nullable;
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.events.objects.Picture;
+import io.github.jwdeveloper.tiktok.events.objects.User;
+import io.github.jwdeveloper.tiktok.messages.WebcastEmoteChatMessage;
+import lombok.Getter;
+
+@Getter
+public class TikTokEmoteEvent extends TikTokEvent
+{
+ @Nullable
+ private User user;
+ private final String emoteId;
+ private final Picture picture;
+
+ public TikTokEmoteEvent(WebcastEmoteChatMessage msg) {
+ super(msg.getHeader());
+ if (msg.hasSender()) {
+ user = new User(msg.getSender());
+ }
+ emoteId = msg.getDetails().getId();
+ picture = new Picture(msg.getDetails().getImage().getUrl());
+ }
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokEnvelopeEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokEnvelopeEvent.java
new file mode 100644
index 0000000..3b0ae05
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokEnvelopeEvent.java
@@ -0,0 +1,16 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.events.objects.User;
+import io.github.jwdeveloper.tiktok.messages.WebcastEnvelopeMessage;
+import lombok.Getter;
+
+@Getter
+public class TikTokEnvelopeEvent extends TikTokEvent {
+ private final User user;
+
+ public TikTokEnvelopeEvent(WebcastEnvelopeMessage msg) {
+ super(msg.getHeader());
+ user = new User(msg.getUser().getId(), msg.getUser().getUsername());
+ }
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokFollowEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokFollowEvent.java
new file mode 100644
index 0000000..f8e8236
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokFollowEvent.java
@@ -0,0 +1,25 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.annotations.Nullable;
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.events.objects.User;
+import io.github.jwdeveloper.tiktok.messages.WebcastSocialMessage;
+import lombok.Getter;
+
+@Getter
+public class TikTokFollowEvent extends TikTokEvent
+{
+ @Nullable
+ private User newFollower;
+ private final Long totalFollowers;
+
+ public TikTokFollowEvent(WebcastSocialMessage msg) {
+ super(msg.getHeader());
+ if(msg.hasSender())
+ {
+ newFollower = new User(msg.getSender());
+ }
+ totalFollowers = msg.getTotalFollowers();
+
+ }
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokGiftBroadcastEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokGiftBroadcastEvent.java
new file mode 100644
index 0000000..976e29c
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokGiftBroadcastEvent.java
@@ -0,0 +1,31 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.events.objects.Picture;
+import io.github.jwdeveloper.tiktok.messages.WebcastGiftBroadcastMessage;
+import lombok.Getter;
+
+@Getter
+public class TikTokGiftBroadcastEvent extends TikTokEvent
+{
+ private final Picture picture;
+
+ private final String shortURL;
+
+ private final String notifyEventType;
+
+ private final String notifyLabel;
+
+ private final String notifyType;
+
+ public TikTokGiftBroadcastEvent(WebcastGiftBroadcastMessage msg)
+ {
+ super(msg.getHeader());
+ picture = new Picture(msg.getPicture());
+ var data = msg.getData();
+ shortURL = data.getUri();
+ notifyEventType = data.getRoomNotifyMessage().getData().getType();
+ notifyLabel = data.getRoomNotifyMessage().getData().getLabel();
+ notifyType = data.getNotifyType();
+ }
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokGiftMessageEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokGiftMessageEvent.java
new file mode 100644
index 0000000..5beec96
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokGiftMessageEvent.java
@@ -0,0 +1,40 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.annotations.Nullable;
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.events.objects.Gift;
+import io.github.jwdeveloper.tiktok.events.objects.User;
+import io.github.jwdeveloper.tiktok.messages.WebcastGiftMessage;
+import lombok.Getter;
+
+@Getter
+public class TikTokGiftMessageEvent extends TikTokEvent {
+ private final Gift gift;
+
+ @Nullable
+ private User sender;
+
+ private final String purchaseId;
+
+ private final String receipt;
+
+ private final Integer amount;
+
+ private final Boolean streakFinished;
+
+ private final Integer streakIndex;
+
+ public TikTokGiftMessageEvent(WebcastGiftMessage msg) {
+ super(msg.getHeader());;
+ gift = new Gift(msg.getGiftDetails());
+ if(msg.hasSender())
+ {
+ sender = new User(msg.getSender());
+ }
+ purchaseId = msg.getLogId();
+ receipt = msg.getReceiptJson();
+ amount = msg.getAmount();
+ streakFinished = msg.getRepeatEnd();
+ streakIndex = msg.getRepeatCount();
+ }
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokGoalUpdateEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokGoalUpdateEvent.java
new file mode 100644
index 0000000..c886b0a
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokGoalUpdateEvent.java
@@ -0,0 +1,29 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.events.objects.Picture;
+
+import io.github.jwdeveloper.tiktok.events.objects.User;
+import io.github.jwdeveloper.tiktok.messages.WebcastGoalUpdateMessage;
+import lombok.Getter;
+
+import java.util.List;
+
+@Getter
+public class TikTokGoalUpdateEvent extends TikTokEvent
+{
+ private final Long goalId;
+ private final Picture picture;
+ private final String eventType;
+ private final String label;
+ private final List users;
+
+ public TikTokGoalUpdateEvent(WebcastGoalUpdateMessage msg) {
+ super(msg.getHeader());
+ picture = new Picture(msg.getPicture());
+ goalId = msg.getId();
+ eventType = msg.getData().getType();
+ label = msg.getUpdateData().getLabel();
+ users = msg.getUpdateData().getUsersList().stream().map(u ->new User(u.getId(),u.getNickname(),new Picture(u.getProfilePicture()))).toList();
+ }
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokIMDeleteEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokIMDeleteEvent.java
new file mode 100644
index 0000000..ad1959f
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokIMDeleteEvent.java
@@ -0,0 +1,17 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.messages.WebcastImDeleteMessage;
+import lombok.Getter;
+
+@Getter
+public class TikTokIMDeleteEvent extends TikTokEvent {
+ private final String data1;
+ private final String data2;
+
+ public TikTokIMDeleteEvent(WebcastImDeleteMessage msg) {
+ super(msg.getHeader());;
+ data1 = msg.getData1();
+ data2 = msg.getData2();
+ }
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokInRoomBannerEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokInRoomBannerEvent.java
new file mode 100644
index 0000000..b088ae7
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokInRoomBannerEvent.java
@@ -0,0 +1,15 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.messages.WebcastInRoomBannerMessage;
+import lombok.Getter;
+
+@Getter
+public class TikTokInRoomBannerEvent extends TikTokEvent {
+ private String jSON;
+
+ public TikTokInRoomBannerEvent(WebcastInRoomBannerMessage msg) {
+ super(msg.getHeader());;
+ jSON = msg.getJson();
+ }
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokJoinEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokJoinEvent.java
new file mode 100644
index 0000000..5980ba4
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokJoinEvent.java
@@ -0,0 +1,34 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.annotations.Nullable;
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.events.objects.User;
+import io.github.jwdeveloper.tiktok.messages.WebcastMemberMessage;
+import io.github.jwdeveloper.tiktok.messages.WebcastSocialMessage;
+import lombok.Getter;
+
+@Getter
+public class TikTokJoinEvent extends TikTokEvent {
+ @Nullable
+ private User user;
+
+ private final Long totalViewers;
+
+ public TikTokJoinEvent(WebcastSocialMessage msg) {
+ super(msg.getHeader());
+
+ if (msg.hasSender()) {
+ user = new User(msg.getSender());
+ }
+
+ totalViewers = 0L;
+ }
+
+ public TikTokJoinEvent(WebcastMemberMessage msg) {
+ super(msg.getHeader());
+ if (msg.hasUser()) {
+ user = new User(msg.getUser());
+ }
+ totalViewers = msg.getTotalViewers();
+ }
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLikeEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLikeEvent.java
new file mode 100644
index 0000000..18d473e
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLikeEvent.java
@@ -0,0 +1,39 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.annotations.Nullable;
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.events.objects.User;
+import io.github.jwdeveloper.tiktok.messages.WebcastLikeMessage;
+import io.github.jwdeveloper.tiktok.messages.WebcastSocialMessage;
+import lombok.Getter;
+
+@Getter
+public class TikTokLikeEvent extends TikTokEvent
+{
+ @Nullable
+ private User sender;
+
+ private final Integer count;
+
+ private final Long totalLikes;
+
+ public TikTokLikeEvent(WebcastSocialMessage msg) {
+ super(msg.getHeader());
+ if (msg.hasSender()) {
+ sender = new User(msg.getSender());
+ }
+ count = 1;
+ totalLikes = 0L;
+ }
+
+ public TikTokLikeEvent(WebcastLikeMessage msg) {
+ super(msg.getHeader());
+
+ if (msg.hasSender()) {
+ sender = new User(msg.getSender());
+ }
+
+ count = msg.getCount();
+ totalLikes = msg.getTotalLikes();
+ }
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLinkLayerMessageEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLinkLayerMessageEvent.java
new file mode 100644
index 0000000..029e502
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLinkLayerMessageEvent.java
@@ -0,0 +1,27 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.messages.WebcastLinkLayerMessage;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+public class TikTokLinkLayerMessageEvent extends TikTokEvent {
+ private final Long linkId;
+ private final LinkData link1;
+ private final LinkData link2;
+
+ public TikTokLinkLayerMessageEvent(WebcastLinkLayerMessage msg) {
+ super(msg.getHeader());
+ linkId = msg.getId();
+ link1 = new LinkData(msg.getIdContainer1().getIds().getId1(), msg.getIdContainer1().getIds().getId2());
+ link2 = new LinkData(msg.getIdContainer2().getIds().getId1(), msg.getIdContainer2().getIds().getId2());
+ }
+
+ @AllArgsConstructor
+ @Getter
+ private class LinkData {
+ private final Long id1;
+ private final Long id2;
+ }
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLinkMessageEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLinkMessageEvent.java
new file mode 100644
index 0000000..8763aaf
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLinkMessageEvent.java
@@ -0,0 +1,28 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.annotations.Nullable;
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.events.objects.User;
+import io.github.jwdeveloper.tiktok.messages.WebcastLinkMessage;
+import lombok.Getter;
+
+import java.util.List;
+
+@Getter
+public class TikTokLinkMessageEvent extends TikTokEvent {
+ private final String token;
+
+ @Nullable
+ private User user;
+
+ private final List otherUsers;
+
+ public TikTokLinkMessageEvent(WebcastLinkMessage msg) {
+ super(msg.getHeader());
+ token = msg.getToken();
+ if (msg.getUser().getUser().hasUser()) {
+ user = new User(msg.getUser().getUser().getUser());
+ }
+ otherUsers = msg.getUser().getOtherUsersList().stream().map(e -> new User(e.getUser())).toList();
+ }
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLinkMicArmiesEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLinkMicArmiesEvent.java
new file mode 100644
index 0000000..bc789c4
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLinkMicArmiesEvent.java
@@ -0,0 +1,28 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.events.objects.LinkMicArmy;
+import io.github.jwdeveloper.tiktok.events.objects.Picture;
+import io.github.jwdeveloper.tiktok.messages.WebcastLinkMicArmies;
+import lombok.Getter;
+
+import java.util.List;
+
+@Getter
+public class TikTokLinkMicArmiesEvent extends TikTokEvent {
+ private final Long battleId;
+
+ private final Integer battleStatus;
+
+ private final Picture picture;
+
+ private final List armies;
+
+ public TikTokLinkMicArmiesEvent(WebcastLinkMicArmies msg) {
+ super(msg.getHeader());
+ battleId = msg.getId();
+ armies = msg.getBattleItemsList().stream().map(LinkMicArmy::new).toList();
+ picture = new Picture(msg.getPicture());
+ battleStatus = msg.getBattleStatus();
+ }
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLinkMicBattleEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLinkMicBattleEvent.java
new file mode 100644
index 0000000..0890c4c
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLinkMicBattleEvent.java
@@ -0,0 +1,22 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.events.objects.LinkMicBattleTeam;
+import io.github.jwdeveloper.tiktok.messages.WebcastLinkMicBattle;
+import lombok.Getter;
+
+import java.util.List;
+
+@Getter
+public class TikTokLinkMicBattleEvent extends TikTokEvent {
+ private final Long battleId;
+ private final List team1;
+ private final List team2;
+
+ public TikTokLinkMicBattleEvent(WebcastLinkMicBattle msg) {
+ super(msg.getHeader());
+ battleId = msg.getId();
+ team1 = msg.getTeams1List().stream().map(LinkMicBattleTeam::new).toList();
+ team2 = msg.getTeams2List().stream().map(LinkMicBattleTeam::new).toList();
+ }
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLinkMicFanTicketEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLinkMicFanTicketEvent.java
new file mode 100644
index 0000000..33a0002
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLinkMicFanTicketEvent.java
@@ -0,0 +1,19 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.messages.WebcastLinkMicFanTicketMethod;
+import lombok.Getter;
+
+@Getter
+public class TikTokLinkMicFanTicketEvent extends TikTokEvent {
+ private final Long id;
+ private final Integer data1;
+ private final Integer data2;
+
+ public TikTokLinkMicFanTicketEvent(WebcastLinkMicFanTicketMethod msg) {
+ super(msg.getHeader());
+ id = msg.getData().getDetails().getId();
+ data1 = msg.getData().getData1();
+ data2 = msg.getData().getDetails().getData();
+ }
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLinkMicMethodEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLinkMicMethodEvent.java
new file mode 100644
index 0000000..83dc22d
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLinkMicMethodEvent.java
@@ -0,0 +1,21 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.messages.LinkMicMethod;
+import io.github.jwdeveloper.tiktok.messages.WebcastLinkMicMethod;
+import lombok.Getter;
+
+@Getter
+public class TikTokLinkMicMethodEvent extends TikTokEvent {
+ private final String jSON;
+
+ public TikTokLinkMicMethodEvent(WebcastLinkMicMethod msg) {
+ super(msg.getHeader());;
+ jSON = "";
+ }
+
+ public TikTokLinkMicMethodEvent(LinkMicMethod msg) {
+ super(msg.getHeader());;
+ jSON = msg.getJson();
+ }
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLiveEndedEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLiveEndedEvent.java
new file mode 100644
index 0000000..4471fc7
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLiveEndedEvent.java
@@ -0,0 +1,6 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+
+public class TikTokLiveEndedEvent extends TikTokEvent {
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLivePausedEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLivePausedEvent.java
new file mode 100644
index 0000000..3241cce
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLivePausedEvent.java
@@ -0,0 +1,6 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+
+public class TikTokLivePausedEvent extends TikTokEvent {
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokPollMessageEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokPollMessageEvent.java
new file mode 100644
index 0000000..a8ce5ca
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokPollMessageEvent.java
@@ -0,0 +1,28 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.events.objects.PollOption;
+import io.github.jwdeveloper.tiktok.events.objects.User;
+import io.github.jwdeveloper.tiktok.messages.WebcastPollMessage;
+import lombok.Getter;
+
+import java.util.List;
+
+@Getter
+public class TikTokPollMessageEvent extends TikTokEvent {
+ private final Long id;
+
+ private final PollOption option1;
+
+ private final PollOption option2;
+
+ private final List options;
+
+ public TikTokPollMessageEvent(WebcastPollMessage msg) {
+ super(msg.getHeader());
+ id = msg.getId();
+ options = msg.getPollData().getOptionsList().stream().map(e -> new PollOption.Option(e.getLabel(), e.getCurrentTotal())).toList();
+ option1 = new PollOption(new User(msg.getOptions1().getUser()), msg.getOptions1().getOptionsList().stream().map(e -> new PollOption.Option(e.getLabel(), e.getCurrentTotal())).toList());
+ option2 = new PollOption(new User(msg.getOptions2().getUser()), msg.getOptions2().getOptionsList().stream().map(e -> new PollOption.Option(e.getLabel(), e.getCurrentTotal())).toList());
+ }
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokQuestionEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokQuestionEvent.java
new file mode 100644
index 0000000..6d97696
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokQuestionEvent.java
@@ -0,0 +1,29 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.events.objects.User;
+import io.github.jwdeveloper.tiktok.messages.WebcastQuestionNewMessage;
+import lombok.Getter;
+
+@Getter
+public class TikTokQuestionEvent extends TikTokEvent {
+ private final Long questionId;
+
+ private final String text;
+
+ private final Long time;
+
+ private User user;
+
+
+ public TikTokQuestionEvent(WebcastQuestionNewMessage msg) {
+ super(msg.getHeader());
+ var data = msg.getDetails();
+ questionId = data.getId();
+ text = data.getText();
+ time = data.getTimeStamp();
+ if (data.hasUser()) {
+ user = new User(data.getUser());
+ }
+ }
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokRankTextEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokRankTextEvent.java
new file mode 100644
index 0000000..957a916
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokRankTextEvent.java
@@ -0,0 +1,20 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.messages.WebcastRankTextMessage;
+import lombok.Getter;
+
+@Getter
+public class TikTokRankTextEvent extends TikTokEvent {
+ private String eventType;
+
+ private String label;
+
+
+ public TikTokRankTextEvent(WebcastRankTextMessage msg) {
+ super(0,0,0);//TODO passing info
+ eventType = msg.getDetails().getType();
+ label =msg.getDetails().getLabel();
+ }
+
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokRankUpdateEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokRankUpdateEvent.java
new file mode 100644
index 0000000..752e25c
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokRankUpdateEvent.java
@@ -0,0 +1,38 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.messages.WebcastHourlyRankMessage;
+import io.github.jwdeveloper.tiktok.messages.WebcastRankUpdateMessage;
+import lombok.Getter;
+
+@Getter
+public class TikTokRankUpdateEvent extends TikTokEvent {
+ private final String eventType;
+
+ private final String label;
+
+ private final String rank;
+
+ private final String color;
+
+ public TikTokRankUpdateEvent(WebcastHourlyRankMessage msg) {
+ super(msg.getHeader());
+ var rankData = msg.getData().getRankings();
+ eventType = rankData.getType();
+ label = rankData.getLabel();
+ rank = rankData.getDetails(0).getLabel();
+ color = rankData.getColor().getColor();
+
+
+ }
+
+ public TikTokRankUpdateEvent(WebcastRankUpdateMessage msg) {
+ super(msg.getHeader());
+ var rankData = msg.getData().getRankData();
+ eventType = rankData.getType();
+ label = rankData.getLabel();
+ rank = rankData.getDetails(0).getLabel();
+ color = rankData.getColor().getColor();
+ }
+
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokRoomMessageEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokRoomMessageEvent.java
new file mode 100644
index 0000000..af978a0
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokRoomMessageEvent.java
@@ -0,0 +1,44 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.annotations.Nullable;
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.events.objects.User;
+import io.github.jwdeveloper.tiktok.messages.RoomMessage;
+import io.github.jwdeveloper.tiktok.messages.SystemMessage;
+import io.github.jwdeveloper.tiktok.messages.WebcastLiveIntroMessage;
+import io.github.jwdeveloper.tiktok.messages.WebcastRoomMessage;
+import lombok.Getter;
+
+@Getter
+public class TikTokRoomMessageEvent extends TikTokEvent {
+ @Nullable
+ private User host;
+ @Nullable
+ private String hostLanguage;
+ private final String message;
+
+ public TikTokRoomMessageEvent(WebcastRoomMessage msg) {
+ super(msg.getHeader());
+ message = msg.getData();
+ }
+
+ public TikTokRoomMessageEvent(SystemMessage msg) {
+ super(msg.getHeader());
+ message = msg.getMessage();
+ }
+
+ public TikTokRoomMessageEvent(RoomMessage msg) {
+ super(msg.getHeader());
+ message = msg.getMessage();
+ }
+
+ public TikTokRoomMessageEvent(WebcastLiveIntroMessage msg) {
+ super(msg.getHeader());
+ if (msg.hasHost()) {
+ host = new User(msg.getHost());
+ }
+ message = msg.getDescription();
+ hostLanguage = msg.getLanguage();
+ }
+
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokRoomPinMessageEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokRoomPinMessageEvent.java
new file mode 100644
index 0000000..f7ee735
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokRoomPinMessageEvent.java
@@ -0,0 +1,18 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.messages.WebcastRoomPinMessage;
+import lombok.Getter;
+
+@Getter
+public class TikTokRoomPinMessageEvent extends TikTokEvent {
+ private final Long pinTimeStamp;
+ private final TikTokCommentEvent comment;
+
+ public TikTokRoomPinMessageEvent(WebcastRoomPinMessage msg) {
+ super(msg.getHeader());
+ this.pinTimeStamp = msg.getTimestamp();
+ this.comment = new TikTokCommentEvent(msg.getPinData1());
+ }
+
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokRoomViewerDataEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokRoomViewerDataEvent.java
new file mode 100644
index 0000000..a15d54c
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokRoomViewerDataEvent.java
@@ -0,0 +1,23 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.events.objects.TopViewer;
+import io.github.jwdeveloper.tiktok.messages.WebcastRoomUserSeqMessage;
+import lombok.Getter;
+
+import java.util.List;
+
+@Getter
+public class TikTokRoomViewerDataEvent extends TikTokEvent {
+ private final Integer viewerCount;
+ private final List topViewers;
+
+ public TikTokRoomViewerDataEvent(WebcastRoomUserSeqMessage msg) {
+ super(msg.getHeader());
+
+ //TODO sorting by rank TopViewers = msg?.TopViewers?.Select(t => new Objects.TopViewer(t))?.OrderBy(t => t.Rank)?
+ viewerCount = msg.getViewerCount();
+ topViewers = msg.getTopViewersList().stream().map(TopViewer::new).toList();
+ }
+
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokShareEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokShareEvent.java
new file mode 100644
index 0000000..2fe5080
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokShareEvent.java
@@ -0,0 +1,32 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.events.objects.User;
+import io.github.jwdeveloper.tiktok.messages.WebcastSocialMessage;
+import lombok.Getter;
+
+@Getter
+public class TikTokShareEvent extends TikTokEvent {
+ private User user;
+
+ private Integer amount;
+
+ public TikTokShareEvent(WebcastSocialMessage msg, Integer amount) {
+ super(msg.getHeader());;
+ if(msg.hasSender())
+ {
+ user = new User(msg.getSender());
+ }
+ this.amount = amount;
+ }
+
+ public TikTokShareEvent(WebcastSocialMessage msg) {
+ super(msg.getHeader());
+ if(msg.hasSender())
+ {
+ user = new User(msg.getSender());
+ }
+ amount = 1;
+ }
+
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokShopMessageEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokShopMessageEvent.java
new file mode 100644
index 0000000..62e383b
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokShopMessageEvent.java
@@ -0,0 +1,30 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.events.objects.Picture;
+import io.github.jwdeveloper.tiktok.messages.WebcastOecLiveShoppingMessage;
+import lombok.Getter;
+
+@Getter
+public class TikTokShopMessageEvent extends TikTokEvent {
+ private final String title;
+
+ private final String price;
+
+ private final Picture picture;
+
+ private final String shopUrl;
+
+ private final String shopName;
+
+ public TikTokShopMessageEvent(WebcastOecLiveShoppingMessage msg) {
+ super(msg.getHeader());
+ var data = msg.getShopData();
+ title = data.getTitle();
+ price = data.getPriceString();
+ picture = new Picture(data.getImageUrl());
+ shopUrl = data.getShopUrl();
+ shopName = data.getShopName();
+ }
+
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokSubNotifyEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokSubNotifyEvent.java
new file mode 100644
index 0000000..298ce1a
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokSubNotifyEvent.java
@@ -0,0 +1,21 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.events.objects.User;
+import io.github.jwdeveloper.tiktok.messages.WebcastSubNotifyMessage;
+import lombok.Getter;
+
+@Getter
+public class TikTokSubNotifyEvent extends TikTokEvent {
+ private User user;
+
+ public TikTokSubNotifyEvent(WebcastSubNotifyMessage msg) {
+ super(msg.getHeader());
+
+ if (msg.hasSender()) {
+ user = new User(msg.getSender());
+ }
+
+ }
+
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokSubscribeEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokSubscribeEvent.java
new file mode 100644
index 0000000..7a3f792
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokSubscribeEvent.java
@@ -0,0 +1,21 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.events.objects.User;
+import io.github.jwdeveloper.tiktok.messages.WebcastMemberMessage;
+import lombok.Getter;
+
+@Getter
+public class TikTokSubscribeEvent extends TikTokEvent {
+ private User newSubscriber;
+
+ public TikTokSubscribeEvent(WebcastMemberMessage msg) {
+ super(msg.getHeader());
+
+ if(msg.hasUser())
+ {
+ newSubscriber = new User(msg.getUser());
+ }
+ }
+
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokUnauthorizedMemberEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokUnauthorizedMemberEvent.java
new file mode 100644
index 0000000..8ca9075
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokUnauthorizedMemberEvent.java
@@ -0,0 +1,33 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.messages.WebcastUnauthorizedMemberMessage;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+public class TikTokUnauthorizedMemberEvent extends TikTokEvent {
+ private final String data;
+
+ private final UnauthorizedMemberData event;
+
+ private final UnauthorizedMemberData underlying;
+
+ public TikTokUnauthorizedMemberEvent(WebcastUnauthorizedMemberMessage msg) {
+ super(msg.getHeader());
+
+ data = msg.getData2();
+ event = new UnauthorizedMemberData(msg.getDetails1().getType(), msg.getDetails1().getLabel());
+ underlying = new UnauthorizedMemberData(msg.getDetails2().getType(), msg.getDetails2().getLabel());
+ }
+
+
+ @Getter
+ @AllArgsConstructor
+ public class UnauthorizedMemberData {
+ private final String data1;
+
+ private final String data2;
+ }
+
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokUnhandledControlEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokUnhandledControlEvent.java
new file mode 100644
index 0000000..3704279
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokUnhandledControlEvent.java
@@ -0,0 +1,13 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.messages.WebcastControlMessage;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public class TikTokUnhandledControlEvent extends TikTokEvent {
+
+ private final WebcastControlMessage message;
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokUnhandledEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokUnhandledEvent.java
new file mode 100644
index 0000000..9045111
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokUnhandledEvent.java
@@ -0,0 +1,14 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.messages.WebcastResponse;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+
+@Getter
+@AllArgsConstructor
+public class TikTokUnhandledEvent extends TikTokEvent
+{
+ private final WebcastResponse.Message message;
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokUnhandledMemberEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokUnhandledMemberEvent.java
new file mode 100644
index 0000000..5478d15
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokUnhandledMemberEvent.java
@@ -0,0 +1,13 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.messages.WebcastMemberMessage;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public class TikTokUnhandledMemberEvent extends TikTokEvent
+{
+ private final WebcastMemberMessage message;
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokUnhandledSocialEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokUnhandledSocialEvent.java
new file mode 100644
index 0000000..c92b5fb
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokUnhandledSocialEvent.java
@@ -0,0 +1,13 @@
+package io.github.jwdeveloper.tiktok.events.messages;
+
+import io.github.jwdeveloper.tiktok.events.TikTokEvent;
+import io.github.jwdeveloper.tiktok.messages.WebcastSocialMessage;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public class TikTokUnhandledSocialEvent extends TikTokEvent
+{
+ private final WebcastSocialMessage message;
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/objects/Badge.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/objects/Badge.java
new file mode 100644
index 0000000..3cbd35d
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/objects/Badge.java
@@ -0,0 +1,41 @@
+package io.github.jwdeveloper.tiktok.events.objects;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.List;
+
+@Getter
+public class Badge {
+ private final ComboBadge comboBadges;
+ private final List textBadges;
+ private final List imageBadges;
+
+ public Badge(io.github.jwdeveloper.tiktok.messages.Badge badge) {
+ textBadges = badge.getTextBadgesList().stream().map(b -> new TextBadge(b.getType(), b.getName())).toList();
+ imageBadges = badge.getImageBadgesList().stream().map(b -> new ImageBadge(b.getDisplayType(), new Picture(b.getImage()))).toList();
+ comboBadges = new ComboBadge(new Picture(badge.getComplexBadge().getImageUrl()), badge.getComplexBadge().getData());
+ }
+
+
+ @AllArgsConstructor
+ @Getter
+ public class TextBadge {
+ private final String type;
+ private final String name;
+ }
+
+ @AllArgsConstructor
+ @Getter
+ public class ImageBadge {
+ private final Integer displayType;
+ private final Picture image;
+ }
+
+ @AllArgsConstructor
+ @Getter
+ public class ComboBadge {
+ private final Picture image;
+ private final String data;
+ }
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/objects/BarrageData.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/objects/BarrageData.java
new file mode 100644
index 0000000..a32ac3a
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/objects/BarrageData.java
@@ -0,0 +1,29 @@
+package io.github.jwdeveloper.tiktok.events.objects;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.List;
+
+@Getter
+public class BarrageData {
+ private final String eventType;
+ private final String label;
+ private final List users;
+
+ public BarrageData(String eventType, String label, List users)
+ {
+ this.eventType = eventType;
+ this.label = label;
+ this.users = users;
+ }
+
+ @Getter
+ @AllArgsConstructor
+ public static final class BarrageUser
+ {
+ private final User user;
+
+ private final String data;
+ }
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/objects/Gift.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/objects/Gift.java
new file mode 100644
index 0000000..f1f0bad
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/objects/Gift.java
@@ -0,0 +1,27 @@
+package io.github.jwdeveloper.tiktok.events.objects;
+
+import lombok.Getter;
+
+@Getter
+public class Gift {
+ private final Long id;
+
+ private final String name;
+
+ private final String description;
+
+ private final Integer diamondCost;
+
+ private final Integer type;
+
+ private final Picture picture;
+
+ public Gift(io.github.jwdeveloper.tiktok.messages.Gift gift) {
+ id = gift.getId();
+ name = gift.getName();
+ description = gift.getDescription();
+ diamondCost = gift.getCoinCount();
+ type = gift.getGiftType();
+ picture = new Picture(gift.getImage());
+ }
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/objects/LinkMicArmy.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/objects/LinkMicArmy.java
new file mode 100644
index 0000000..c402e06
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/objects/LinkMicArmy.java
@@ -0,0 +1,31 @@
+package io.github.jwdeveloper.tiktok.events.objects;
+
+import io.github.jwdeveloper.tiktok.messages.LinkMicArmiesItems;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.List;
+
+@Getter
+public class LinkMicArmy {
+ private final Long armyId;
+ private final List armies;
+
+ public LinkMicArmy(LinkMicArmiesItems army) {
+ armyId = army.getHostUserId();
+ armies = army.getBattleGroupsList()
+ .stream()
+ .map(x -> new Army(x.getUsersList()
+ .stream()
+ .map(User::new).toList(), x.getPoints()))
+ .toList();
+ }
+
+
+ @Getter
+ @AllArgsConstructor
+ public final class Army {
+ private final List Users;
+ private final Integer Points;
+ }
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/objects/LinkMicBattleTeam.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/objects/LinkMicBattleTeam.java
new file mode 100644
index 0000000..f46975a
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/objects/LinkMicBattleTeam.java
@@ -0,0 +1,18 @@
+package io.github.jwdeveloper.tiktok.events.objects;
+
+
+import io.github.jwdeveloper.tiktok.messages.WebcastLinkMicBattle;
+import lombok.Getter;
+
+import java.util.List;
+
+@Getter
+public class LinkMicBattleTeam {
+ private final Long teamId;
+ private final List users;
+
+ public LinkMicBattleTeam(WebcastLinkMicBattle.LinkMicBattleTeam team) {
+ this.teamId = team.getId();
+ this.users = team.getUsersList().stream().map(User::new).toList();
+ }
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/objects/Picture.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/objects/Picture.java
new file mode 100644
index 0000000..1048a6b
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/objects/Picture.java
@@ -0,0 +1,25 @@
+package io.github.jwdeveloper.tiktok.events.objects;
+
+import lombok.Getter;
+
+import java.util.Arrays;
+import java.util.List;
+
+@Getter
+public class Picture {
+
+ public final List urls;
+
+ public Picture(io.github.jwdeveloper.tiktok.messages.Picture profilePicture) {
+ this.urls = profilePicture.getUrlsList();
+ }
+
+ public Picture(List urls) {
+ this.urls = urls;
+ }
+
+ public Picture(String ... urls)
+ {
+ this.urls = Arrays.stream(urls).toList();
+ }
+}
diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/objects/PollOption.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/objects/PollOption.java
new file mode 100644
index 0000000..d5b30a7
--- /dev/null
+++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/objects/PollOption.java
@@ -0,0 +1,22 @@
+package io.github.jwdeveloper.tiktok.events.objects;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.List;
+
+@Getter
+@AllArgsConstructor
+public class PollOption {
+
+ private final User user;
+ private final List