Compare commits

..

31 Commits

Author SHA1 Message Date
JW
84bbfa97e9 Fixed bugs:
- addListeners() was throwing exception
  - 404 response code was return while connecting to tiktok for some users
  - configure.setRoomId() method for people that want to set roomId manually
  - client.roomInfo().isAgeRestricted() check if live has age restriction
2023-09-19 02:53:04 +02:00
Just wolololololololo
a2da5169db Update README.md 2023-09-19 02:39:53 +02:00
Just wolololololololo
bf8defbe3c Update README.md 2023-09-19 02:30:40 +02:00
Just wolololololololo
5ba935efaf Update README.md 2023-09-19 02:30:31 +02:00
Just wolololololololo
0a244a4a58 Update README.md 2023-09-19 02:29:58 +02:00
Just wolololololololo
ac911de6b3 Merge pull request #7 from abdurrahmanekr/bugfix-403
fix: 403 get response error
2023-09-18 22:51:46 +02:00
abdurrahmanekr
74208361fd fix: 403 get response error 2023-09-18 23:32:17 +03:00
JW
a6cb2be1a7 Update FUNDING.yml 2023-09-13 06:48:11 +02:00
GitHub Action
9267217ebd Update version in pom.xml 2023-09-13 04:40:49 +00:00
JW
7641d4d33d Fix for maven versions 2023-09-13 06:38:46 +02:00
JW
05ce745dc8 Changes:
LiveRoomInfo
    + new method getConnectionState() getting current state of connection
   + ListenersManager
     getBindingModels() renamed to getListeners()

  + Introducing documentation, each public interface got small documentation

  + New property in config .setSessionId()

  + New event: onReconnecting()

Bugs:
   CommentEvent was throwing mapping exception
2023-09-13 06:32:51 +02:00
JW
6e092dd362 Changes:
LiveRoomInfo
    + new method getConnectionState() getting current state of connection
   + ListenersManager
     getBindingModels() renamed to getListeners()

  + Introducing documentation, each public interface got small documentation

  + New property in config .setSessionId()

  + New event: onReconnecting()

Bugs:
   CommentEvent was throwing mapping exception
2023-09-13 06:32:36 +02:00
GitHub Action
bc045d49dc Update version in pom.xml 2023-09-07 16:24:10 +00:00
GitHub Action
e6dcc8f5fd Update version in pom.xml 2023-09-07 14:00:03 +00:00
JW
d87506da88 Bugs:
TikTokEventListener method with parameter TikTokEvent was invalid
2023-09-07 15:58:25 +02:00
GitHub Action
084e787838 Update version in pom.xml 2023-09-07 13:51:38 +00:00
JW
ff9e75505d Bugs:
TikTokEventListener method with parameter TikTokEvent was invalid
2023-09-07 15:49:45 +02:00
GitHub Action
08379994fd Update version in pom.xml 2023-09-07 13:12:35 +00:00
GitHub Action
cc871c70f6 Update version in pom.xml 2023-09-07 12:56:38 +00:00
JW
32294cc3ec Merge remote-tracking branch 'origin/master' 2023-09-07 14:55:02 +02:00
JW
cea19abda7 Bugs:
Method for listeners was throwing exception
  TikTokListenersManager.removeListener() was not working

- fix pom
2023-09-07 14:54:57 +02:00
JW
30117917de Update maven-publish.yml 2023-09-07 14:54:33 +02:00
JW
11da8bf009 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	README.md
2023-09-07 14:52:01 +02:00
JW
97f57912ad Bugs:
Method for listeners was throwing exception
  TikTokListenersManager.removeListener() was not working
2023-09-07 14:51:51 +02:00
JW
e2ccfee399 Update README.md 2023-09-07 03:25:57 +02:00
GitHub Action
edba573ecc Update version in pom.xml 2023-09-07 01:25:21 +00:00
JW
d61697dbff Fixing Pom files 2023-09-07 03:23:40 +02:00
JW
daf8242f6e Merge remote-tracking branch 'origin/master'
# Conflicts:
#	README.md
2023-09-07 03:19:35 +02:00
JW
4a157143ec Changes:
`TikTokEventListener` new method of listening events
   see it at TestApplication/ListenerExample.java

Bugs:
 - Fixed bug: Websocket was sending ping after it was closed
2023-09-07 03:19:25 +02:00
JW
defebc92ce Update README.md 2023-09-04 12:09:39 +02:00
GitHub Action
c267392888 Update version in pom.xml 2023-09-04 10:07:55 +00:00
122 changed files with 3087 additions and 931 deletions

View File

@@ -72,11 +72,8 @@ jobs:
run: | run: |
git config --local user.email "action@github.com" git config --local user.email "action@github.com"
git config --local user.name "GitHub Action" git config --local user.name "GitHub Action"
git add pom.xml git add README.md
git add API/pom.xml git add pom.xml && git add '**/pom.xml'
git add Client/pom.xml
git add TestApplication/pom.xml
git add Tools/pom.xml
git commit -m "Update version in pom.xml" git commit -m "Update version in pom.xml"
- name: Push changes - name: Push changes
uses: ad-m/github-push-action@master uses: ad-m/github-push-action@master

63
.gitignore vendored
View File

@@ -79,4 +79,65 @@ fabric.properties
.idea/httpRequests .idea/httpRequests
# Android studio 3.1+ serialized cache file # Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser .idea/caches/build_file_checksums.ser
/.idea/.gitignore
/.idea/.name
/.idea/compiler.xml
/TestApplication/target/classes/io/github/jwdeveloper/tiktok/ConfigurationExample.class
/TestApplication/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
/TestApplication/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst
/Tools/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
/Tools/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst
/Tools-EventsCollector/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
/Tools-ReadmeGenerator/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
/Tools-ReadmeGenerator/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst
/.idea/encodings.xml
/Tools-ReadmeGenerator/target/classes/io/github/jwdeveloper/tiktok/EventsListGenerator$EventTypeComparator.class
/Tools-ReadmeGenerator/target/classes/io/github/jwdeveloper/tiktok/EventsListGenerator.class
/Tools-EventsCollector/target/classes/io/github/jwdeveloper/tiktok/tools/collector/tables/ExceptionInfoModel.class
/Tools/target/classes/io/github/jwdeveloper/tiktok/utils/FilesUtility.class
/TestApplication/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
/TestApplication/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
/Tools/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
/Tools/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
/Tools-EventsCollector/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
/Tools-ReadmeGenerator/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
/Tools-ReadmeGenerator/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
/.idea/jarRepositories.xml
/TestApplication/target/classes/io/github/jwdeveloper/tiktok/ListenerExample$CustomListener.class
/TestApplication/target/classes/io/github/jwdeveloper/tiktok/ListenerExample.class
/Tools-ReadmeGenerator/target/classes/io/github/jwdeveloper/tiktok/LiveClientMethodsGenerator.class
/TestApplication/target/classes/io/github/jwdeveloper/tiktok/Main.class
/Tools-EventsCollector/target/classes/io/github/jwdeveloper/tiktok/tools/collector/Main.class
/Tools-ReadmeGenerator/target/classes/io/github/jwdeveloper/tiktok/Main.class
/.idea/misc.xml
/Tools-ReadmeGenerator/src/main/resources/output.md
/Tools-ReadmeGenerator/target/classes/output.md
/TestApplication/target/maven-archiver/pom.properties
/Tools/target/maven-archiver/pom.properties
/Tools-EventsCollector/target/maven-archiver/pom.properties
/Tools-ReadmeGenerator/target/maven-archiver/pom.properties
/.idea/inspectionProfiles/Project_Default.xml
/Tools/target/classes/io/github/jwdeveloper/tiktok/protocol/ProtocolGenerator.class
/Tools-ReadmeGenerator/target/classes/io/github/jwdeveloper/tiktok/ReadmeGenerator.class
/TestApplication/target/classes/io/github/jwdeveloper/tiktok/SimpleExample.class
/Tools-EventsCollector/target/classes/io/github/jwdeveloper/tiktok/tools/collector/db/SqlConsts.class
/Tools-ReadmeGenerator/target/classes/template.md
/Tools/target/classes/io/github/jwdeveloper/tiktok/utils/TemplateUtility.class
/TestApplication/target/TestApplication-0.0.18-Release.jar
/TestApplication/target/TestApplication-0.0.18-Release-all.jar
/Tools-EventsCollector/target/classes/io/github/jwdeveloper/tiktok/tools/collector/db/TikTokDatabase.class
/Tools-EventsCollector/target/classes/io/github/jwdeveloper/tiktok/tools/collector/tables/TikTokErrorModel$TikTokErrorModelBuilder.class
/Tools-EventsCollector/target/classes/io/github/jwdeveloper/tiktok/tools/collector/tables/TikTokErrorModel.class
/Tools-EventsCollector/target/classes/io/github/jwdeveloper/tiktok/tools/collector/db/TikTokErrorModelDAO.class
/target/TikTokLiveJava-0.0.18-Release-all.pom
/Tools-EventsCollector/target/classes/io/github/jwdeveloper/tiktok/tools/collector/tables/TikTokMessageModel$TikTokMessageModelBuilder.class
/Tools-EventsCollector/target/classes/io/github/jwdeveloper/tiktok/tools/collector/tables/TikTokMessageModel.class
/Tools-EventsCollector/target/classes/io/github/jwdeveloper/tiktok/tools/collector/db/TikTokMessageModelDAO.class
/Tools/target/Tools-0.0.18-Release.jar
/Tools/target/Tools-0.0.18-Release-all.jar
/Tools-EventsCollector/target/Tools-EventsCollector-0.0.18-Release.jar
/Tools-EventsCollector/target/Tools-EventsCollector-0.0.18-Release-all.jar
/Tools-ReadmeGenerator/target/Tools-ReadmeGenerator-0.0.18-Release.jar
/Tools-ReadmeGenerator/target/Tools-ReadmeGenerator-0.0.18-Release-all.jar
/.idea/vcs.xml

View File

@@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>TikTokLiveJava</artifactId> <artifactId>TikTokLiveJava</artifactId>
<groupId>io.github.jwdeveloper.tiktok</groupId> <groupId>io.github.jwdeveloper.tiktok</groupId>
<version>0.0.14-Release</version> <version>0.0.23-Release</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>API</artifactId> <artifactId>API</artifactId>

View File

@@ -3,67 +3,81 @@ package io.github.jwdeveloper.tiktok;
import lombok.Data; import lombok.Data;
import java.time.Duration; import java.time.Duration;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.logging.Level; import java.util.logging.Level;
@Data @Data
public class ClientSettings { public class ClientSettings {
/// <summary> /**
/// Timeout for Connections * Timeout for Connections
/// </summary> */
private Duration timeout; private Duration timeout;
// public RotatingProxy Proxy; // public RotatingProxy Proxy;
/// <summary> /**
/// ISO-Language for Client * ISO-Language for Client
/// </summary> */
private String clientLanguage; private String clientLanguage;
/// <summary> /**
/// Whether to Retry if Connection Fails * Whether to Retry if Connection Fails
/// </summary> */
private boolean retryOnConnectionFailure; private boolean retryOnConnectionFailure;
/// <summary>
/// Wait to connect again for selected amount of time /**
/// </summary> * Wait to connect again for selected amount of time
*/
private Duration retryConnectionTimeout; private Duration retryConnectionTimeout;
/// <summary> /**
/// Whether to handle Messages received from Room when Connecting * Whether to handle Messages received from Room when Connecting
/// </summary> */
private boolean handleExistingMessagesOnConnect; private boolean handleExistingMessagesOnConnect;
/// <summary> /**
/// Whether to download List of Gifts for Room when Connecting * Whether to download List of Gifts for Room when Connecting
/// </summary> */
private boolean downloadGiftInfo; private boolean downloadGiftInfo;
/// <summary> /**
/// Whether to print Logs to Console * Whether to print Logs to Console
/// </summary> */
private boolean printToConsole; private boolean printToConsole;
/// <summary> /**
/// LoggingLevel for Logs * LoggingLevel for Logs
/// </summary> */
private Level logLevel; private Level logLevel;
/// <summary> /**
/// Whether to print Base64-Data for Messages to Console * Whether to print Base64-Data for Messages to Console
/// </summary> */
private boolean printMessageData; private boolean printMessageData;
/// <summary> /**
/// Tiktok user name * Optional: Use it if you need to change tiktok live hostname in builder
/// </summary> */
private String hostName; private String hostName;
/// <summary> /**
/// Parameters used in requests to tiktok api * Parameters used in requests to Tiktok api
/// </summary> */
private Map<String, Object> clientParameters; private Map<String, Object> clientParameters;
/*
* 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
*/
private String sessionId;
/*
* Optional: By default roomID is fetched before connect to live, but you can set it manually
*
*/
private String roomId;
} }

View File

@@ -8,33 +8,32 @@ import java.util.logging.Level;
public class Constants { public class Constants {
/// <summary> /**
/// Web-URL for TikTok * Web-URL for TikTok
/// </summary> */
public static final String TIKTOK_URL_WEB = "https://www.tiktok.com/"; public static final String TIKTOK_URL_WEB = "https://www.tiktok.com/";
/// <summary> /**
/// WebCast-BaseURL for TikTok * WebCast-BaseURL for TikTok
/// </summary> */
public static final String TIKTOK_URL_WEBCAST = "https://webcast.tiktok.com/webcast/"; public static final String TIKTOK_URL_WEBCAST = "https://webcast.tiktok.com/webcast/";
/// <summary> /**
/// Signing API by Isaac Kogan * Signing API by Isaac Kogan
/// https://github-wiki-see.page/m/isaackogan/TikTokLive/wiki/All-About-Signatures * https://github-wiki-see.page/m/isaackogan/TikTokLive/wiki/All-About-Signatures
/// </summary> */
public static final String TIKTOK_SIGN_API = "https://tiktok.eulerstream.com/webcast/sign_url"; public static final String TIKTOK_SIGN_API = "https://tiktok.eulerstream.com/webcast/sign_url";
/// <summary> /**
/// Default TimeOut for Connections * Default TimeOut for Connections
/// </summary> */
public static final int DEFAULT_TIMEOUT = 20; public static final int DEFAULT_TIMEOUT = 20;
/// <summary> /**
/// Default Polling-Time for Socket-Connection * Default Polling-Time for Socket-Connection
/// </summary> */
public static final int DEFAULT_POLLTIME = 1; public static final int DEFAULT_POLLTIME = 1;
/// <summary> /**
/// Default Settings for Client * Default Settings for Client
/// </summary> */
public static ClientSettings DefaultClientSettings() { public static ClientSettings DefaultClientSettings() {
@@ -53,15 +52,13 @@ public class Constants {
} }
/**
* Default Parameters for HTTP-Request
*/
/// <summary> public static Map<String, Object> DefaultClientParams() {
/// Default Parameters for HTTP-Request var clientParams = new TreeMap<String, Object>();
/// </summary>
public static Map<String,Object> DefaultClientParams() {
var clientParams = new TreeMap<String,Object>();
clientParams.put("aid", 1988); clientParams.put("aid", 1988);
clientParams.put("app_language", "en-US"); clientParams.put("app_language", "en-US");
clientParams.put("app_name", "tiktok_web"); clientParams.put("app_name", "tiktok_web");
@@ -100,11 +97,11 @@ public class Constants {
} }
/// <summary> /**
/// Default Headers for HTTP-Request * Default Headers for HTTP-Request
/// </summary> */
public static Map<String,String> DefaultRequestHeaders() { public static Map<String, String> DefaultRequestHeaders() {
var headers = new HashMap<String,String>(); var headers = new HashMap<String, String>();
headers.put("Connection", "keep-alive"); headers.put("Connection", "keep-alive");
headers.put("Cache-Control", "max-age=0"); headers.put("Cache-Control", "max-age=0");

View File

@@ -0,0 +1,10 @@
package io.github.jwdeveloper.tiktok.annotations;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface EventMeta
{
EventType eventType();
}

View File

@@ -0,0 +1,10 @@
package io.github.jwdeveloper.tiktok.annotations;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
public enum EventType
{
Control, Message, Custom
}

View File

@@ -1,4 +0,0 @@
package io.github.jwdeveloper.tiktok.annotations;
public @interface Nullable {
}

View File

@@ -0,0 +1,10 @@
package io.github.jwdeveloper.tiktok.annotations;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface TikTokEventHandler
{
}

View File

@@ -3,39 +3,11 @@ package io.github.jwdeveloper.tiktok.events;
import io.github.jwdeveloper.tiktok.messages.*; import io.github.jwdeveloper.tiktok.messages.*;
import lombok.Getter; import lombok.Getter;
/*
Base class for all events
*/
@Getter @Getter
public class TikTokEvent { public abstract 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() {
}
} }

View File

@@ -66,7 +66,7 @@ public interface TikTokEventBuilder<T> {
T onError(TikTokEventConsumer<TikTokErrorEvent> event); T onError(TikTokEventConsumer<TikTokErrorEvent> event);
T onUnhandled(TikTokEventConsumer<TikTokUnhandledEvent> event); T onUnhandled(TikTokEventConsumer<TikTokUnhandledWebsocketMessageEvent> event);
T onJoin(TikTokEventConsumer<TikTokJoinEvent> event); T onJoin(TikTokEventConsumer<TikTokJoinEvent> event);
@@ -90,6 +90,8 @@ public interface TikTokEventBuilder<T> {
T onWebsocketMessage(TikTokEventConsumer<TikTokWebsocketMessageEvent> event); T onWebsocketMessage(TikTokEventConsumer<TikTokWebsocketMessageEvent> event);
T onReconnecting(TikTokEventConsumer<TikTokReconnectingEvent> event);
} }

View File

@@ -0,0 +1,48 @@
package io.github.jwdeveloper.tiktok.events.base;
import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.messages.*;
import lombok.Getter;
@Getter
public class TikTokHeaderEvent extends TikTokEvent {
private final long messageId;
private final long roomId;
private final long timeStamp;
public TikTokHeaderEvent(Common header) {
this(header.getMsgId(), header.getRoomId(), header.getCreateTime());
}
public TikTokHeaderEvent(MessageHeader header) {
this(header.getMessageId(), header.getRoomId(), header.getTimeStamp1());
}
public TikTokHeaderEvent(GiftMessageHeader header) {
this(header.getMessageId(), header.getRoomId(), header.getTimeStamp1());
}
public TikTokHeaderEvent(MemberMessageHeader header) {
this(header.getMessageId(), header.getRoomId(), header.getTimeStamp1());
}
public TikTokHeaderEvent(SocialMessageHeader header) {
this(header.getMessageId(), header.getRoomId(), header.getTimeStamp1());
}
public TikTokHeaderEvent(LikeMessageHeader header) {
this(header.getMessageId(), header.getRoomId(), header.getTimeStamp1());
}
public TikTokHeaderEvent(long messageId, long roomId, long timeStamp) {
this.messageId = messageId;
this.roomId = roomId;
this.timeStamp = timeStamp;
}
public TikTokHeaderEvent() {
messageId = 0;
roomId = 0;
timeStamp = 0;
}
}

View File

@@ -0,0 +1,7 @@
package io.github.jwdeveloper.tiktok.events.base;
import io.github.jwdeveloper.tiktok.events.TikTokEvent;
public class TikTokLiveClientEvent extends TikTokEvent {
}

View File

@@ -0,0 +1,12 @@
package io.github.jwdeveloper.tiktok.events.base;
import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public class TikTokUnhandledEvent<T> extends TikTokEvent
{
private final T data;
}

View File

@@ -1,29 +1,28 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.events.objects.BarrageData; import io.github.jwdeveloper.tiktok.events.objects.BarrageData;
import io.github.jwdeveloper.tiktok.events.objects.Picture; import io.github.jwdeveloper.tiktok.events.objects.Picture;
import io.github.jwdeveloper.tiktok.events.objects.User; import io.github.jwdeveloper.tiktok.events.objects.User;
import io.github.jwdeveloper.tiktok.messages.WebcastBarrageMessage; import io.github.jwdeveloper.tiktok.messages.WebcastBarrageMessage;
import lombok.Getter; import lombok.Value;
@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;
@Value
@EventMeta(eventType = EventType.Message)
public class TikTokBarrageMessageEvent extends TikTokHeaderEvent {
Picture picture;
Picture picture2;
Picture picture3;
User user;
BarrageData barrageData;
public TikTokBarrageMessageEvent(WebcastBarrageMessage msg) { public TikTokBarrageMessageEvent(WebcastBarrageMessage msg) {
super(msg.getHeader()); super(msg.getHeader());
picture = new Picture(msg.getPicture()); picture = new Picture(msg.getImage());
picture2 = new Picture(msg.getPicture2()); picture2 = new Picture(msg.getImage2());
picture3 = new Picture(msg.getPicture3()); picture3 = new Picture(msg.getImage3());
user = new User(msg.getUserData().getUser()); user = new User(msg.getUserData().getUser());
barrageData = new BarrageData(msg.getMessage().getEventType(), barrageData = new BarrageData(msg.getMessage().getEventType(),
msg.getMessage().getLabel(), msg.getMessage().getLabel(),

View File

@@ -1,16 +1,19 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.messages.WebcastCaptionMessage; import io.github.jwdeveloper.tiktok.messages.WebcastCaptionMessage;
import lombok.Getter; import lombok.Value;
@Getter @Value
public class TikTokCaptionEvent extends TikTokEvent { @EventMeta(eventType = EventType.Message)
private final Long captionTimeStamp; public class TikTokCaptionEvent extends TikTokHeaderEvent {
Long captionTimeStamp;
private final String iSOLanguage; String iSOLanguage;
private final String text; String text;
public TikTokCaptionEvent(WebcastCaptionMessage msg) { public TikTokCaptionEvent(WebcastCaptionMessage msg) {
super(msg.getHeader()); super(msg.getHeader());

View File

@@ -1,30 +1,29 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.Nullable; import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.events.objects.Picture; import io.github.jwdeveloper.tiktok.events.objects.Picture;
import io.github.jwdeveloper.tiktok.events.objects.User; import io.github.jwdeveloper.tiktok.events.objects.User;
import io.github.jwdeveloper.tiktok.messages.WebcastChatMessage; import io.github.jwdeveloper.tiktok.messages.WebcastChatMessage;
import io.github.jwdeveloper.tiktok.messages.WebcastRoomPinMessage; import io.github.jwdeveloper.tiktok.messages.WebcastRoomPinMessage;
import lombok.Getter; import lombok.Value;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@Getter @Value
public class TikTokCommentEvent extends TikTokEvent @EventMeta(eventType = EventType.Message)
{ public class TikTokCommentEvent extends TikTokHeaderEvent {
@Nullable User user;
private User user; String text;
private final String text; String language;
private final String language; List<User> mentionedUsers;
private final List<User> mentionedUsers; List<Picture> pictures;
private final List<Picture> pictures;
public TikTokCommentEvent(WebcastRoomPinMessage.RoomPinMessageData data) { public TikTokCommentEvent(WebcastRoomPinMessage.RoomPinMessageData data) {
super(data.getDetails().getRoomId(), data.getDetails().getMessageId(), data.getDetails().getServerTime()); super(data.getDetails().getRoomId(), data.getDetails().getMessageId(), data.getDetails().getServerTime());
if (data.hasSender()) user = User.MapOrEmpty(data.getSender());
user = new User(data.getSender());
text = data.getComment(); text = data.getComment();
language = data.getLanguage(); language = data.getLanguage();
mentionedUsers = new ArrayList<>(); mentionedUsers = new ArrayList<>();
@@ -32,12 +31,11 @@ public class TikTokCommentEvent extends TikTokEvent
} }
public TikTokCommentEvent(WebcastChatMessage msg) { public TikTokCommentEvent(WebcastChatMessage msg) {
super(msg.getHeader()); super(msg.getCommon());
if (msg.hasSender()) user = User.MapOrEmpty(msg.getUser());
user = new User(msg.getSender()); text = msg.getContent();
text = msg.getComment(); language = msg.getContentLanguage();
language = msg.getLanguage(); mentionedUsers = List.of(User.MapOrEmpty(msg.getAtUser()));
mentionedUsers = msg.getMentionedUsersList().stream().map(User::new).toList(); pictures = msg.getEmotesListList().stream().map(e -> new Picture(e.getEmote().getImage())).toList();
pictures = msg.getImagesList().stream().map(e -> new Picture(e.getPicture())).toList();
} }
} }

View File

@@ -1,8 +1,9 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.base.TikTokLiveClientEvent;
public class TikTokConnectedEvent extends TikTokEvent @EventMeta(eventType = EventType.Control)
public class TikTokConnectedEvent extends TikTokLiveClientEvent
{ {
} }

View File

@@ -1,18 +1,22 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.messages.WebcastMsgDetectMessage; import io.github.jwdeveloper.tiktok.messages.WebcastMsgDetectMessage;
import lombok.Getter; import lombok.Getter;
import java.util.List; import java.util.List;
@Getter @Getter
public class TikTokDetectMessageEvent extends TikTokEvent { @EventMeta(eventType = EventType.Message)
private final String language; public class TikTokDetectMessageEvent extends TikTokHeaderEvent {
String language;
private final List<Number> data; List<Number> data;
private final List<Number> timings; List<Number> timings;
public TikTokDetectMessageEvent(WebcastMsgDetectMessage msg) { public TikTokDetectMessageEvent(WebcastMsgDetectMessage msg) {
super(msg.getHeader());; super(msg.getHeader());;

View File

@@ -1,6 +1,8 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.base.TikTokLiveClientEvent;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; @EventMeta(eventType = EventType.Control)
public class TikTokDisconnectedEvent extends TikTokLiveClientEvent {
public class TikTokDisconnectedEvent extends TikTokEvent {
} }

View File

@@ -1,25 +1,23 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.Nullable; import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.events.objects.Picture; import io.github.jwdeveloper.tiktok.events.objects.Picture;
import io.github.jwdeveloper.tiktok.events.objects.User; import io.github.jwdeveloper.tiktok.events.objects.User;
import io.github.jwdeveloper.tiktok.messages.WebcastEmoteChatMessage; import io.github.jwdeveloper.tiktok.messages.WebcastEmoteChatMessage;
import lombok.Getter; import lombok.Value;
@Getter @Value
public class TikTokEmoteEvent extends TikTokEvent @EventMeta(eventType = EventType.Message)
{ public class TikTokEmoteEvent extends TikTokHeaderEvent {
@Nullable User user;
private User user; String emoteId;
private final String emoteId; Picture picture;
private final Picture picture;
public TikTokEmoteEvent(WebcastEmoteChatMessage msg) { public TikTokEmoteEvent(WebcastEmoteChatMessage msg) {
super(msg.getHeader()); super(msg.getHeader());
if (msg.hasSender()) { user = User.MapOrEmpty(msg.getSender());
user = new User(msg.getSender());
}
emoteId = msg.getDetails().getId(); emoteId = msg.getDetails().getId();
picture = new Picture(msg.getDetails().getImage().getUrl()); picture = new Picture(msg.getDetails().getImage().getUrl());
} }

View File

@@ -1,14 +1,18 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.events.objects.User; import io.github.jwdeveloper.tiktok.events.objects.User;
import io.github.jwdeveloper.tiktok.messages.WebcastEnvelopeMessage; import io.github.jwdeveloper.tiktok.messages.WebcastEnvelopeMessage;
import lombok.Getter; import lombok.Getter;
import lombok.Value;
@Getter @Value
public class TikTokEnvelopeEvent extends TikTokEvent { @EventMeta(eventType = EventType.Message)
private final User user; public class TikTokEnvelopeEvent extends TikTokHeaderEvent {
User user;
public TikTokEnvelopeEvent(WebcastEnvelopeMessage msg) { public TikTokEnvelopeEvent(WebcastEnvelopeMessage msg) {
super(msg.getHeader()); super(msg.getHeader());
user = new User(msg.getUser().getId(), msg.getUser().getUsername()); user = new User(msg.getUser().getId(), msg.getUser().getUsername());

View File

@@ -1,12 +1,16 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.base.TikTokLiveClientEvent;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
@Getter @Getter
@AllArgsConstructor @AllArgsConstructor
public class TikTokErrorEvent extends TikTokEvent @EventMeta(eventType = EventType.Control)
public class TikTokErrorEvent extends TikTokLiveClientEvent
{ {
private final Throwable exception; private final Throwable exception;
} }

View File

@@ -1,25 +1,22 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.Nullable; import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.events.objects.User; import io.github.jwdeveloper.tiktok.events.objects.User;
import io.github.jwdeveloper.tiktok.messages.WebcastSocialMessage; import io.github.jwdeveloper.tiktok.messages.WebcastSocialMessage;
import lombok.Getter; import lombok.Value;
@Getter @Value
public class TikTokFollowEvent extends TikTokEvent @EventMeta(eventType = EventType.Custom)
public class TikTokFollowEvent extends TikTokHeaderEvent
{ {
@Nullable User newFollower;
private User newFollower; Long totalFollowers;
private final Long totalFollowers;
public TikTokFollowEvent(WebcastSocialMessage msg) { public TikTokFollowEvent(WebcastSocialMessage msg) {
super(msg.getHeader()); super(msg.getHeader());
if(msg.hasSender()) newFollower = User.MapOrEmpty(msg.getSender());
{
newFollower = new User(msg.getSender());
}
totalFollowers = msg.getTotalFollowers(); totalFollowers = msg.getTotalFollowers();
} }
} }

View File

@@ -1,27 +1,32 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.events.objects.Picture; import io.github.jwdeveloper.tiktok.events.objects.Picture;
import io.github.jwdeveloper.tiktok.messages.WebcastGiftBroadcastMessage; import io.github.jwdeveloper.tiktok.messages.WebcastGiftBroadcastMessage;
import lombok.Getter; import lombok.Getter;
import lombok.Value;
@Getter @Value
public class TikTokGiftBroadcastEvent extends TikTokEvent @EventMeta(eventType = EventType.Message)
public class TikTokGiftBroadcastEvent extends TikTokHeaderEvent
{ {
private final Picture picture; Picture picture;
private final String shortURL; String shortURL;
private final String notifyEventType; String notifyEventType;
private final String notifyLabel; String notifyLabel;
private final String notifyType; String notifyType;
public TikTokGiftBroadcastEvent(WebcastGiftBroadcastMessage msg) public TikTokGiftBroadcastEvent(WebcastGiftBroadcastMessage msg)
{ {
super(msg.getHeader()); super(msg.getHeader());
picture = new Picture(msg.getPicture()); picture = new Picture(msg.getImage());
var data = msg.getData(); var data = msg.getData();
shortURL = data.getUri(); shortURL = data.getUri();
notifyEventType = data.getRoomNotifyMessage().getData().getType(); notifyEventType = data.getRoomNotifyMessage().getData().getType();

View File

@@ -1,41 +1,33 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.Nullable; import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.events.objects.Gift; import io.github.jwdeveloper.tiktok.events.objects.Gift;
import io.github.jwdeveloper.tiktok.events.objects.TikTokGift;
import io.github.jwdeveloper.tiktok.events.objects.User; import io.github.jwdeveloper.tiktok.events.objects.User;
import io.github.jwdeveloper.tiktok.messages.WebcastGiftMessage; import io.github.jwdeveloper.tiktok.messages.WebcastGiftMessage;
import lombok.Getter; import lombok.Value;
@Getter @Value
public class TikTokGiftMessageEvent extends TikTokEvent { @EventMeta(eventType = EventType.Message)
public class TikTokGiftMessageEvent extends TikTokHeaderEvent {
private final Gift gift; Gift gift;
User sender;
@Nullable String purchaseId;
private User sender; String receipt;
Long comboCount;
private final String purchaseId; Boolean streakFinished;
Long streakIndex;
private final String receipt;
private final Integer amount;
private final Boolean streakFinished;
private final Integer streakIndex;
public TikTokGiftMessageEvent(WebcastGiftMessage msg) { public TikTokGiftMessageEvent(WebcastGiftMessage msg) {
super(msg.getHeader()); super(msg.getCommon());
gift = new Gift(msg.getGiftDetails()); gift = new Gift(msg.getGift());
if (msg.hasSender()) { sender = User.MapOrEmpty(msg.getUser());
sender = new User(msg.getSender());
}
purchaseId = msg.getLogId(); purchaseId = msg.getLogId();
receipt = msg.getReceiptJson(); receipt = msg.getMonitorExtra();
amount = msg.getAmount(); comboCount = msg.getComboCount();
streakFinished = msg.getRepeatEnd(); streakFinished = msg.getRepeatEnd() > 0; //todo check values
streakIndex = msg.getRepeatCount(); streakIndex = msg.getRepeatCount();
} }
} }

View File

@@ -1,6 +1,9 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.events.objects.Picture; import io.github.jwdeveloper.tiktok.events.objects.Picture;
import io.github.jwdeveloper.tiktok.events.objects.User; import io.github.jwdeveloper.tiktok.events.objects.User;
@@ -10,7 +13,8 @@ import lombok.Getter;
import java.util.List; import java.util.List;
@Getter @Getter
public class TikTokGoalUpdateEvent extends TikTokEvent @EventMeta(eventType = EventType.Message)
public class TikTokGoalUpdateEvent extends TikTokHeaderEvent
{ {
private final Long goalId; private final Long goalId;
private final Picture picture; private final Picture picture;
@@ -20,10 +24,10 @@ public class TikTokGoalUpdateEvent extends TikTokEvent
public TikTokGoalUpdateEvent(WebcastGoalUpdateMessage msg) { public TikTokGoalUpdateEvent(WebcastGoalUpdateMessage msg) {
super(msg.getHeader()); super(msg.getHeader());
picture = new Picture(msg.getPicture()); picture = new Picture(msg.getImage());
goalId = msg.getId(); goalId = msg.getId();
eventType = msg.getData().getType(); eventType = msg.getData().getType();
label = msg.getUpdateData().getLabel(); label = msg.getUpdateData().getLabel();
users = msg.getUpdateData().getUsersList().stream().map(u ->new User(u.getId(),u.getNickname(),new Picture(u.getProfilePicture()))).toList(); users = msg.getUpdateData().getUsersList().stream().map(u ->new User(u.getId(),u.getNickname(),new Picture(u.getProfileImage()))).toList();
} }
} }

View File

@@ -1,11 +1,15 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.messages.WebcastImDeleteMessage; import io.github.jwdeveloper.tiktok.messages.WebcastImDeleteMessage;
import lombok.Getter; import lombok.Getter;
@Getter @Getter
public class TikTokIMDeleteEvent extends TikTokEvent { @EventMeta(eventType = EventType.Message)
public class TikTokIMDeleteEvent extends TikTokHeaderEvent {
private final byte[] data; private final byte[] data;
public TikTokIMDeleteEvent(WebcastImDeleteMessage msg) { public TikTokIMDeleteEvent(WebcastImDeleteMessage msg) {

View File

@@ -1,12 +1,16 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.messages.WebcastInRoomBannerMessage; import io.github.jwdeveloper.tiktok.messages.WebcastInRoomBannerMessage;
import lombok.Getter; import lombok.Getter;
@Getter @Getter
public class TikTokInRoomBannerEvent extends TikTokEvent { @EventMeta(eventType = EventType.Message)
private String jSON; public class TikTokInRoomBannerEvent extends TikTokHeaderEvent {
private final String jSON;
public TikTokInRoomBannerEvent(WebcastInRoomBannerMessage msg) { public TikTokInRoomBannerEvent(WebcastInRoomBannerMessage msg) {
super(msg.getHeader());; super(msg.getHeader());;

View File

@@ -1,17 +1,17 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.Nullable; import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.events.objects.User; import io.github.jwdeveloper.tiktok.events.objects.User;
import io.github.jwdeveloper.tiktok.messages.WebcastMemberMessage; import io.github.jwdeveloper.tiktok.messages.WebcastMemberMessage;
import io.github.jwdeveloper.tiktok.messages.WebcastSocialMessage; import io.github.jwdeveloper.tiktok.messages.WebcastSocialMessage;
import lombok.Getter; import lombok.Getter;
@Getter @Getter
public class TikTokJoinEvent extends TikTokEvent { @EventMeta(eventType = EventType.Custom)
@Nullable public class TikTokJoinEvent extends TikTokHeaderEvent {
private User user; private User user;
private final Long totalViewers; private final Long totalViewers;
public TikTokJoinEvent(WebcastSocialMessage msg) { public TikTokJoinEvent(WebcastSocialMessage msg) {

View File

@@ -1,16 +1,17 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.Nullable; import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.events.objects.User; import io.github.jwdeveloper.tiktok.events.objects.User;
import io.github.jwdeveloper.tiktok.messages.WebcastLikeMessage; import io.github.jwdeveloper.tiktok.messages.WebcastLikeMessage;
import io.github.jwdeveloper.tiktok.messages.WebcastSocialMessage; import io.github.jwdeveloper.tiktok.messages.WebcastSocialMessage;
import lombok.Getter; import lombok.Getter;
@Getter @Getter
public class TikTokLikeEvent extends TikTokEvent @EventMeta(eventType = EventType.Custom)
public class TikTokLikeEvent extends TikTokHeaderEvent
{ {
@Nullable
private User sender; private User sender;
private final Integer count; private final Integer count;

View File

@@ -1,12 +1,16 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.messages.WebcastLinkLayerMessage; import io.github.jwdeveloper.tiktok.messages.WebcastLinkLayerMessage;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
@Getter @Getter
public class TikTokLinkLayerMessageEvent extends TikTokEvent { @EventMeta(eventType = EventType.Message)
public class TikTokLinkLayerMessageEvent extends TikTokHeaderEvent {
private final Long linkId; private final Long linkId;
private final LinkData link1; private final LinkData link1;
private final LinkData link2; private final LinkData link2;

View File

@@ -1,7 +1,8 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.Nullable; import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.events.objects.User; import io.github.jwdeveloper.tiktok.events.objects.User;
import io.github.jwdeveloper.tiktok.messages.WebcastLinkMessage; import io.github.jwdeveloper.tiktok.messages.WebcastLinkMessage;
import lombok.Getter; import lombok.Getter;
@@ -9,10 +10,10 @@ import lombok.Getter;
import java.util.List; import java.util.List;
@Getter @Getter
public class TikTokLinkMessageEvent extends TikTokEvent { @EventMeta(eventType = EventType.Message)
public class TikTokLinkMessageEvent extends TikTokHeaderEvent {
private final String token; private final String token;
@Nullable
private User user; private User user;
private final List<User> otherUsers; private final List<User> otherUsers;

View File

@@ -1,6 +1,9 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.events.objects.LinkMicArmy; import io.github.jwdeveloper.tiktok.events.objects.LinkMicArmy;
import io.github.jwdeveloper.tiktok.events.objects.Picture; import io.github.jwdeveloper.tiktok.events.objects.Picture;
import io.github.jwdeveloper.tiktok.messages.WebcastLinkMicArmies; import io.github.jwdeveloper.tiktok.messages.WebcastLinkMicArmies;
@@ -9,7 +12,8 @@ import lombok.Getter;
import java.util.List; import java.util.List;
@Getter @Getter
public class TikTokLinkMicArmiesEvent extends TikTokEvent { @EventMeta(eventType = EventType.Message)
public class TikTokLinkMicArmiesEvent extends TikTokHeaderEvent {
private final Long battleId; private final Long battleId;
private final Integer battleStatus; private final Integer battleStatus;
@@ -22,7 +26,7 @@ public class TikTokLinkMicArmiesEvent extends TikTokEvent {
super(msg.getHeader()); super(msg.getHeader());
battleId = msg.getId(); battleId = msg.getId();
armies = msg.getBattleItemsList().stream().map(LinkMicArmy::new).toList(); armies = msg.getBattleItemsList().stream().map(LinkMicArmy::new).toList();
picture = new Picture(msg.getPicture()); picture = new Picture(msg.getImage());
battleStatus = msg.getBattleStatus(); battleStatus = msg.getBattleStatus();
} }
} }

View File

@@ -1,6 +1,9 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.events.objects.LinkMicBattleTeam; import io.github.jwdeveloper.tiktok.events.objects.LinkMicBattleTeam;
import io.github.jwdeveloper.tiktok.messages.WebcastLinkMicBattle; import io.github.jwdeveloper.tiktok.messages.WebcastLinkMicBattle;
import lombok.Getter; import lombok.Getter;
@@ -8,7 +11,8 @@ import lombok.Getter;
import java.util.List; import java.util.List;
@Getter @Getter
public class TikTokLinkMicBattleEvent extends TikTokEvent { @EventMeta(eventType = EventType.Message)
public class TikTokLinkMicBattleEvent extends TikTokHeaderEvent {
private final Long battleId; private final Long battleId;
private final List<LinkMicBattleTeam> team1; private final List<LinkMicBattleTeam> team1;
private final List<LinkMicBattleTeam> team2; private final List<LinkMicBattleTeam> team2;

View File

@@ -1,11 +1,15 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.messages.WebcastLinkMicFanTicketMethod; import io.github.jwdeveloper.tiktok.messages.WebcastLinkMicFanTicketMethod;
import lombok.Getter; import lombok.Getter;
@Getter @Getter
public class TikTokLinkMicFanTicketEvent extends TikTokEvent { @EventMeta(eventType = EventType.Message)
public class TikTokLinkMicFanTicketEvent extends TikTokHeaderEvent {
private final Long id; private final Long id;
private final Integer data1; private final Integer data1;
private final Integer data2; private final Integer data2;

View File

@@ -1,12 +1,16 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.messages.LinkMicMethod; import io.github.jwdeveloper.tiktok.messages.LinkMicMethod;
import io.github.jwdeveloper.tiktok.messages.WebcastLinkMicMethod; import io.github.jwdeveloper.tiktok.messages.WebcastLinkMicMethod;
import lombok.Getter; import lombok.Getter;
@Getter @Getter
public class TikTokLinkMicMethodEvent extends TikTokEvent { @EventMeta(eventType = EventType.Message)
public class TikTokLinkMicMethodEvent extends TikTokHeaderEvent {
private final String jSON; private final String jSON;
public TikTokLinkMicMethodEvent(WebcastLinkMicMethod msg) { public TikTokLinkMicMethodEvent(WebcastLinkMicMethod msg) {

View File

@@ -1,6 +1,8 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.TikTokEvent;
@EventMeta(eventType = EventType.Custom)
public class TikTokLiveEndedEvent extends TikTokEvent { public class TikTokLiveEndedEvent extends TikTokEvent {
} }

View File

@@ -1,6 +1,9 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.TikTokEvent;
@EventMeta(eventType = EventType.Custom)
public class TikTokLivePausedEvent extends TikTokEvent { public class TikTokLivePausedEvent extends TikTokEvent {
} }

View File

@@ -1,6 +1,9 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.events.objects.PollOption; import io.github.jwdeveloper.tiktok.events.objects.PollOption;
import io.github.jwdeveloper.tiktok.events.objects.User; import io.github.jwdeveloper.tiktok.events.objects.User;
import io.github.jwdeveloper.tiktok.messages.WebcastPollMessage; import io.github.jwdeveloper.tiktok.messages.WebcastPollMessage;
@@ -9,7 +12,8 @@ import lombok.Getter;
import java.util.List; import java.util.List;
@Getter @Getter
public class TikTokPollMessageEvent extends TikTokEvent { @EventMeta(eventType = EventType.Message)
public class TikTokPollMessageEvent extends TikTokHeaderEvent {
private final Long id; private final Long id;
private final PollOption option1; private final PollOption option1;

View File

@@ -1,12 +1,16 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.events.objects.User; import io.github.jwdeveloper.tiktok.events.objects.User;
import io.github.jwdeveloper.tiktok.messages.WebcastQuestionNewMessage; import io.github.jwdeveloper.tiktok.messages.WebcastQuestionNewMessage;
import lombok.Getter; import lombok.Getter;
@Getter @Getter
public class TikTokQuestionEvent extends TikTokEvent { @EventMeta(eventType = EventType.Message)
public class TikTokQuestionEvent extends TikTokHeaderEvent {
private final Long questionId; private final Long questionId;
private final String text; private final String text;

View File

@@ -1,14 +1,18 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.messages.WebcastRankTextMessage; import io.github.jwdeveloper.tiktok.messages.WebcastRankTextMessage;
import lombok.Getter; import lombok.Getter;
@Getter @Getter
public class TikTokRankTextEvent extends TikTokEvent { @EventMeta(eventType = EventType.Message)
private String eventType; public class TikTokRankTextEvent extends TikTokHeaderEvent {
private final String eventType;
private String label; private final String label;
public TikTokRankTextEvent(WebcastRankTextMessage msg) { public TikTokRankTextEvent(WebcastRankTextMessage msg) {

View File

@@ -1,12 +1,16 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.messages.WebcastHourlyRankMessage; import io.github.jwdeveloper.tiktok.messages.WebcastHourlyRankMessage;
import io.github.jwdeveloper.tiktok.messages.WebcastRankUpdateMessage; import io.github.jwdeveloper.tiktok.messages.WebcastRankUpdateMessage;
import lombok.Getter; import lombok.Getter;
@Getter @Getter
public class TikTokRankUpdateEvent extends TikTokEvent { @EventMeta(eventType = EventType.Message)
public class TikTokRankUpdateEvent extends TikTokHeaderEvent {
private final String eventType; private final String eventType;
private final String label; private final String label;

View File

@@ -0,0 +1,13 @@
package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.base.TikTokLiveClientEvent;
import lombok.Getter;
@Getter
@EventMeta(eventType = EventType.Control)
public class TikTokReconnectingEvent extends TikTokLiveClientEvent
{
}

View File

@@ -1,7 +1,8 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.Nullable; import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.events.objects.User; import io.github.jwdeveloper.tiktok.events.objects.User;
import io.github.jwdeveloper.tiktok.messages.RoomMessage; import io.github.jwdeveloper.tiktok.messages.RoomMessage;
import io.github.jwdeveloper.tiktok.messages.SystemMessage; import io.github.jwdeveloper.tiktok.messages.SystemMessage;
@@ -10,10 +11,9 @@ import io.github.jwdeveloper.tiktok.messages.WebcastRoomMessage;
import lombok.Getter; import lombok.Getter;
@Getter @Getter
public class TikTokRoomMessageEvent extends TikTokEvent { @EventMeta(eventType = EventType.Message)
@Nullable public class TikTokRoomMessageEvent extends TikTokHeaderEvent {
private User host; private User host;
@Nullable
private String hostLanguage; private String hostLanguage;
private final String message; private final String message;

View File

@@ -1,11 +1,15 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.messages.WebcastRoomPinMessage; import io.github.jwdeveloper.tiktok.messages.WebcastRoomPinMessage;
import lombok.Getter; import lombok.Getter;
@Getter @Getter
public class TikTokRoomPinMessageEvent extends TikTokEvent { @EventMeta(eventType = EventType.Message)
public class TikTokRoomPinMessageEvent extends TikTokHeaderEvent {
private final Long pinTimeStamp; private final Long pinTimeStamp;
private final TikTokCommentEvent comment; private final TikTokCommentEvent comment;

View File

@@ -1,6 +1,9 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.events.objects.TopViewer; import io.github.jwdeveloper.tiktok.events.objects.TopViewer;
import io.github.jwdeveloper.tiktok.messages.WebcastRoomUserSeqMessage; import io.github.jwdeveloper.tiktok.messages.WebcastRoomUserSeqMessage;
import lombok.Getter; import lombok.Getter;
@@ -8,7 +11,8 @@ import lombok.Getter;
import java.util.List; import java.util.List;
@Getter @Getter
public class TikTokRoomViewerDataEvent extends TikTokEvent { @EventMeta(eventType = EventType.Message)
public class TikTokRoomViewerDataEvent extends TikTokHeaderEvent {
private final Integer viewerCount; private final Integer viewerCount;
private final List<TopViewer> topViewers; private final List<TopViewer> topViewers;

View File

@@ -1,31 +1,28 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.events.objects.User; import io.github.jwdeveloper.tiktok.events.objects.User;
import io.github.jwdeveloper.tiktok.messages.WebcastSocialMessage; import io.github.jwdeveloper.tiktok.messages.WebcastSocialMessage;
import lombok.Getter; import lombok.Getter;
@Getter @Getter
public class TikTokShareEvent extends TikTokEvent { @EventMeta(eventType = EventType.Custom)
private User user; public class TikTokShareEvent extends TikTokHeaderEvent {
private final User user;
private Integer amount; private final Integer amount;
public TikTokShareEvent(WebcastSocialMessage msg, Integer amount) { public TikTokShareEvent(WebcastSocialMessage msg, Integer amount) {
super(msg.getHeader());; super(msg.getHeader());;
if(msg.hasSender()) user = User.MapOrEmpty(msg.getSender());
{
user = new User(msg.getSender());
}
this.amount = amount; this.amount = amount;
} }
public TikTokShareEvent(WebcastSocialMessage msg) { public TikTokShareEvent(WebcastSocialMessage msg) {
super(msg.getHeader()); super(msg.getHeader());
if(msg.hasSender()) user = User.MapOrEmpty(msg.getSender());
{
user = new User(msg.getSender());
}
amount = 1; amount = 1;
} }

View File

@@ -1,12 +1,16 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.events.objects.Picture; import io.github.jwdeveloper.tiktok.events.objects.Picture;
import io.github.jwdeveloper.tiktok.messages.WebcastOecLiveShoppingMessage; import io.github.jwdeveloper.tiktok.messages.WebcastOecLiveShoppingMessage;
import lombok.Getter; import lombok.Getter;
@Getter @Getter
public class TikTokShopMessageEvent extends TikTokEvent { @EventMeta(eventType = EventType.Message)
public class TikTokShopMessageEvent extends TikTokHeaderEvent {
private final String title; private final String title;
private final String price; private final String price;

View File

@@ -1,12 +1,16 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.events.objects.User; import io.github.jwdeveloper.tiktok.events.objects.User;
import io.github.jwdeveloper.tiktok.messages.WebcastSubNotifyMessage; import io.github.jwdeveloper.tiktok.messages.WebcastSubNotifyMessage;
import lombok.Getter; import lombok.Getter;
@Getter @Getter
public class TikTokSubNotifyEvent extends TikTokEvent { @EventMeta(eventType = EventType.Message)
public class TikTokSubNotifyEvent extends TikTokHeaderEvent {
private User user; private User user;
public TikTokSubNotifyEvent(WebcastSubNotifyMessage msg) { public TikTokSubNotifyEvent(WebcastSubNotifyMessage msg) {

View File

@@ -1,12 +1,16 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.events.objects.User; import io.github.jwdeveloper.tiktok.events.objects.User;
import io.github.jwdeveloper.tiktok.messages.WebcastMemberMessage; import io.github.jwdeveloper.tiktok.messages.WebcastMemberMessage;
import lombok.Getter; import lombok.Getter;
@Getter @Getter
public class TikTokSubscribeEvent extends TikTokEvent { @EventMeta(eventType = EventType.Custom)
public class TikTokSubscribeEvent extends TikTokHeaderEvent {
private User newSubscriber; private User newSubscriber;
public TikTokSubscribeEvent(WebcastMemberMessage msg) { public TikTokSubscribeEvent(WebcastMemberMessage msg) {

View File

@@ -1,12 +1,16 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.messages.WebcastUnauthorizedMemberMessage; import io.github.jwdeveloper.tiktok.messages.WebcastUnauthorizedMemberMessage;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
@Getter @Getter
public class TikTokUnauthorizedMemberEvent extends TikTokEvent { @EventMeta(eventType = EventType.Message)
public class TikTokUnauthorizedMemberEvent extends TikTokHeaderEvent {
private final String data; private final String data;
private final UnauthorizedMemberData event; private final UnauthorizedMemberData event;

View File

@@ -1,13 +1,18 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.base.TikTokUnhandledEvent;
import io.github.jwdeveloper.tiktok.messages.WebcastControlMessage; import io.github.jwdeveloper.tiktok.messages.WebcastControlMessage;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
@Getter @Getter
@AllArgsConstructor @EventMeta(eventType = EventType.Custom)
public class TikTokUnhandledControlEvent extends TikTokEvent { public class TikTokUnhandledControlEvent extends TikTokUnhandledEvent<WebcastControlMessage> {
private final WebcastControlMessage message; public TikTokUnhandledControlEvent(WebcastControlMessage data) {
super(data);
}
} }

View File

@@ -1,14 +0,0 @@
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;
}

View File

@@ -1,13 +1,18 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.base.TikTokUnhandledEvent;
import io.github.jwdeveloper.tiktok.messages.WebcastMemberMessage; import io.github.jwdeveloper.tiktok.messages.WebcastMemberMessage;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
@Getter @Getter
@AllArgsConstructor @EventMeta(eventType = EventType.Message)
public class TikTokUnhandledMemberEvent extends TikTokEvent public class TikTokUnhandledMemberEvent extends TikTokUnhandledEvent<WebcastMemberMessage>
{ {
private final WebcastMemberMessage message; public TikTokUnhandledMemberEvent(WebcastMemberMessage data) {
super(data);
}
} }

View File

@@ -1,13 +1,19 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.base.TikTokUnhandledEvent;
import io.github.jwdeveloper.tiktok.messages.WebcastMemberMessage;
import io.github.jwdeveloper.tiktok.messages.WebcastSocialMessage; import io.github.jwdeveloper.tiktok.messages.WebcastSocialMessage;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
@Getter @Getter
@AllArgsConstructor @EventMeta(eventType = EventType.Custom)
public class TikTokUnhandledSocialEvent extends TikTokEvent public class TikTokUnhandledSocialEvent extends TikTokUnhandledEvent<WebcastSocialMessage>
{ {
private final WebcastSocialMessage message; public TikTokUnhandledSocialEvent(WebcastSocialMessage data) {
super(data);
}
} }

View File

@@ -0,0 +1,19 @@
package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.base.TikTokUnhandledEvent;
import io.github.jwdeveloper.tiktok.messages.WebcastResponse;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@EventMeta(eventType = EventType.Message)
public class TikTokUnhandledWebsocketMessageEvent extends TikTokUnhandledEvent<WebcastResponse.Message>
{
public TikTokUnhandledWebsocketMessageEvent(WebcastResponse.Message data) {
super(data);
}
}

View File

@@ -1,16 +1,20 @@
package io.github.jwdeveloper.tiktok.events.messages; package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.messages.WebcastResponse; import io.github.jwdeveloper.tiktok.messages.WebcastResponse;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.Getter;
/** /**
* Happens when TikTok websocket receive message from server * Happens when TikTok websocket receive message from server
*/ */
@Data @Getter
@AllArgsConstructor @AllArgsConstructor
@EventMeta(eventType = EventType.Custom)
public class TikTokWebsocketMessageEvent extends TikTokEvent public class TikTokWebsocketMessageEvent extends TikTokEvent
{ {
private TikTokEvent event; private TikTokEvent event;

View File

@@ -1,41 +1,77 @@
package io.github.jwdeveloper.tiktok.events.objects; package io.github.jwdeveloper.tiktok.events.objects;
import lombok.AllArgsConstructor; import io.github.jwdeveloper.tiktok.messages.BadgeStruct;
import lombok.Getter; import lombok.Value;
import java.util.ArrayList;
import java.util.List; import java.util.List;
@Getter @Value
public class Badge { public class Badge {
private ComboBadge comboBadges; ComboBadge comboBadges;
private final List<TextBadge> textBadges; List<TextBadge> textBadges;
private final List<ImageBadge> imageBadges; List<ImageBadge> imageBadges;
public Badge(io.github.jwdeveloper.tiktok.messages.Badge badge) { public Badge(ComboBadge comboBadges, List<TextBadge> textBadges, List<ImageBadge> imageBadges) {
textBadges = badge.getTextBadgesList().stream().map(b -> new TextBadge(b.getType(), b.getName())).toList(); this.comboBadges = comboBadges;
imageBadges = badge.getImageBadgesList().stream().map(b -> new ImageBadge(b.getDisplayType(), new Picture(b.getImage()))).toList(); this.textBadges = textBadges;
comboBadges = new ComboBadge(new Picture("badge.getComplexBadge().getImageUrl()"), badge.getComplexBadge().getData()); this.imageBadges = imageBadges;
} }
public Badge(io.github.jwdeveloper.tiktok.messages.BadgeStruct badge)
@AllArgsConstructor {
@Getter comboBadges = ComboBadge.map(badge.getCombine());
public class TextBadge { textBadges = TextBadge.mapAll(badge.getTextList());
private final String type; imageBadges = ImageBadge.mapAll(badge.getImageList());
private final String name;
} }
@AllArgsConstructor @Value
@Getter public static class TextBadge {
public class ImageBadge { EnumValue type;
private final Integer displayType; String name;
private final Picture image;
public static TextBadge map(BadgeStruct.TextBadge input) {
return new TextBadge(EnumValue.Map(input.getDisplayType()),input.getKey());
}
public static List<TextBadge> mapAll(List<BadgeStruct.TextBadge> list) {
return list.stream().map(TextBadge::map).toList();
}
} }
@AllArgsConstructor @Value
@Getter public static class ImageBadge {
public class ComboBadge { EnumValue displayType;
private final Picture image; Picture image;
private final String data;
public static ImageBadge map(BadgeStruct.ImageBadge input) {
return new ImageBadge(EnumValue.Map(input.getDisplayType()), Picture.Map(input.getImage()));
}
public static List<ImageBadge> mapAll(List<BadgeStruct.ImageBadge> list) {
return list.stream().map(ImageBadge::map).toList();
}
}
@Value
public static class ComboBadge {
Picture image;
String data;
public static ComboBadge map(BadgeStruct.CombineBadge input) {
return new ComboBadge(Picture.Map(input.getIcon()),input.getStr());
}
public static List<ComboBadge> mapAll(List<BadgeStruct.CombineBadge> list) {
return list.stream().map(ComboBadge::map).toList();
}
}
public static Badge Empty() {
var comboBadge = new ComboBadge(Picture.Empty(), "");
var textBadges = new ArrayList<TextBadge>();
var imageBadges = new ArrayList<ImageBadge>();
return new Badge(comboBadge, textBadges, imageBadges);
}
public static List<Badge> EmptyList() {
return new ArrayList<Badge>();
} }
} }

View File

@@ -2,14 +2,15 @@ package io.github.jwdeveloper.tiktok.events.objects;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import lombok.Value;
import java.util.List; import java.util.List;
@Getter @Value
public class BarrageData { public class BarrageData {
private final String eventType; String eventType;
private final String label; String label;
private final List<BarrageUser> users; List<BarrageUser> users;
public BarrageData(String eventType, String label, List<BarrageUser> users) public BarrageData(String eventType, String label, List<BarrageUser> users)
{ {
@@ -18,12 +19,11 @@ public class BarrageData {
this.users = users; this.users = users;
} }
@Getter @Value
@AllArgsConstructor public static class BarrageUser
public static final class BarrageUser
{ {
private final User user; User user;
private final String data; String data;
} }
} }

View File

@@ -0,0 +1,15 @@
package io.github.jwdeveloper.tiktok.events.objects;
import lombok.Value;
@Value
public class EnumValue
{
public int value;
public String name;
public static EnumValue Map(Enum<?> _enum)
{
return new EnumValue(_enum.ordinal() ,_enum.name());
}
}

View File

@@ -1,27 +1,22 @@
package io.github.jwdeveloper.tiktok.events.objects; package io.github.jwdeveloper.tiktok.events.objects;
import lombok.Getter; import lombok.Value;
@Getter @Value
public class Gift { public class Gift {
private final Long id; Long id;
String name;
String description;
Integer diamondCost;
Integer type;
Picture picture;
private final String name; public Gift(io.github.jwdeveloper.tiktok.messages.GiftStruct gift) {
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(); id = gift.getId();
name = gift.getName(); name = gift.getName();
description = gift.getDescription(); description = gift.getDescribe();
diamondCost = gift.getCoinCount(); diamondCost = gift.getDiamondCount();
type = gift.getGiftType(); type = gift.getType();
picture = new Picture(gift.getImage()); picture = new Picture(gift.getImage());
} }
} }

View File

@@ -1,31 +1,28 @@
package io.github.jwdeveloper.tiktok.events.objects; package io.github.jwdeveloper.tiktok.events.objects;
import io.github.jwdeveloper.tiktok.messages.LinkMicArmiesItems; import io.github.jwdeveloper.tiktok.messages.LinkMicArmiesItems;
import lombok.AllArgsConstructor; import lombok.Value;
import lombok.Getter;
import java.util.List; import java.util.List;
@Getter @Value
public class LinkMicArmy { public class LinkMicArmy {
private final Long armyId; Long armyId;
private final List<Army> armies; List<Army> armies;
public LinkMicArmy(LinkMicArmiesItems army) { public LinkMicArmy(LinkMicArmiesItems army) {
armyId = army.getHostUserId(); armyId = army.getHostUserId();
armies = army.getBattleGroupsList() armies = army.getBattleGroupsList()
.stream() .stream()
.map(x -> new Army(x.getUsersList() .map(x -> new Army(x.getUsersList().stream().map(User::MapOrEmpty).toList(), x.getPoints()))
.stream()
.map(User::new).toList(), x.getPoints()))
.toList(); .toList();
} }
@Value
@Getter public static class Army {
@AllArgsConstructor List<User> Users;
public final class Army { Integer Points;
private final List<User> Users;
private final Integer Points;
} }
} }

View File

@@ -3,13 +3,14 @@ package io.github.jwdeveloper.tiktok.events.objects;
import io.github.jwdeveloper.tiktok.messages.WebcastLinkMicBattle; import io.github.jwdeveloper.tiktok.messages.WebcastLinkMicBattle;
import lombok.Getter; import lombok.Getter;
import lombok.Value;
import java.util.List; import java.util.List;
@Getter @Value
public class LinkMicBattleTeam { public class LinkMicBattleTeam {
private final Long teamId; Long teamId;
private final List<User> users; List<User> users;
public LinkMicBattleTeam(WebcastLinkMicBattle.LinkMicBattleTeam team) { public LinkMicBattleTeam(WebcastLinkMicBattle.LinkMicBattleTeam team) {
this.teamId = team.getId(); this.teamId = team.getId();

View File

@@ -1,19 +1,19 @@
package io.github.jwdeveloper.tiktok.events.objects; package io.github.jwdeveloper.tiktok.events.objects;
import lombok.Getter; import lombok.Getter;
import lombok.Value;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@Getter @Getter
public class Picture { public class Picture {
public final List<String> urls; List<String> urls;
public Picture(io.github.jwdeveloper.tiktok.messages.Image profilePicture) {
public Picture(io.github.jwdeveloper.tiktok.messages.Picture profilePicture) { this.urls = profilePicture.getUrlListList();
this.urls = profilePicture.getUrlsList();
} }
public Picture(List<String> urls) { public Picture(List<String> urls) {
this.urls = urls; this.urls = urls;
} }
@@ -22,4 +22,20 @@ public class Picture {
{ {
this.urls = Arrays.stream(urls).toList(); this.urls = Arrays.stream(urls).toList();
} }
public static Picture Map(io.github.jwdeveloper.tiktok.messages.Image profilePicture)
{
return new Picture(profilePicture.getUrlListList());
}
public static Picture Empty()
{
return new Picture();
}
public static List<Picture> EmptyList()
{
return new ArrayList<Picture>();
}
} }

View File

@@ -2,18 +2,17 @@ package io.github.jwdeveloper.tiktok.events.objects;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import lombok.Value;
import java.util.List; import java.util.List;
@Getter @Value
@AllArgsConstructor
public class PollOption { public class PollOption {
private final User user; private final User user;
private final List<Option> options; private final List<Option> options;
@Getter @Value
@AllArgsConstructor
public static final class Option { public static final class Option {
private final String label; private final String label;

View File

@@ -7,19 +7,16 @@ import lombok.Setter;
@Getter @Getter
public class TikTokGift { public class TikTokGift {
private final Gift gift; private final Gift gift;
private User sender; private final User sender;
@Setter @Setter
private int amount; private long amount;
@Setter @Setter
private boolean streakFinished; private boolean streakFinished;
public TikTokGift(WebcastGiftMessage message) { public TikTokGift(WebcastGiftMessage message) {
gift = new Gift(message.getGiftDetails()); gift = new Gift(message.getGift());
if (message.hasSender()) { sender = User.MapOrEmpty(message.getUser());
sender = new User(message.getSender()); amount = message.getComboCount();
} streakFinished = message.getRepeatEnd() > 0;
amount = message.getAmount();
streakFinished = message.getRepeatEnd();
} }
} }

View File

@@ -1,22 +1,18 @@
package io.github.jwdeveloper.tiktok.events.objects; package io.github.jwdeveloper.tiktok.events.objects;
import lombok.Value;
import lombok.Getter; @Value
@Getter
public class TopViewer { public class TopViewer {
private Integer rank; Integer rank;
private User user; User user;
private Integer coinsGiven; Integer coinsGiven;
public TopViewer(io.github.jwdeveloper.tiktok.messages.TopViewer viewer) public TopViewer(io.github.jwdeveloper.tiktok.messages.TopViewer viewer)
{ {
rank = viewer.getRank(); rank = viewer.getRank();
if(viewer.hasUser()) user = User.MapOrEmpty(viewer.getUser());
{
user = new User(viewer.getUser());
}
coinsGiven = viewer.getCoinsGiven(); coinsGiven = viewer.getCoinsGiven();
} }
} }

View File

@@ -20,14 +20,14 @@ public class User {
private Picture picture1080; private Picture picture1080;
private Integer following; private long following;
private Integer followers; private long followers;
private Integer followsHost; private long followsHost;
public List<Picture> additionalPictures; private List<Picture> additionalPictures;
public List<Badge> badges; private List<Badge> badges;
public User(Long userId, public User(Long userId,
String uniqueId, String uniqueId,
@@ -71,17 +71,39 @@ public class User {
public User(io.github.jwdeveloper.tiktok.messages.User user) { public User(io.github.jwdeveloper.tiktok.messages.User user) {
assert user != null; assert user != null;
userId = user.getUserId(); userId = user.getId();
uniqueId = user.getUniqueId(); uniqueId = user.getSpecialId();
nickName = user.getNickname(); nickName = user.getNickname();
description = user.getDescription(); description = user.getBioDescription();
profilePicture = new Picture(user.getProfilePicture()); profilePicture = new Picture(user.getAvatarThumb());
picture720 = new Picture(user.getPicture720()); picture720 = new Picture(user.getAvatarMedium());
picture1080 = new Picture(user.getPicture1080()); picture1080 = new Picture(user.getAvatarLarge());
following = user.getFollowerData().getFollowing(); following = user.getFollowInfo().getFollowingCount();
followers = user.getFollowerData().getFollowers(); followers = user.getFollowInfo().getFollowerCount();
followsHost = user.getFollowerData().getFollowsHost(); followsHost = user.getFollowInfo().getFollowStatus();
badges = user.getBadgesList().stream().map(Badge::new).toList(); badges = user.getBadgeListList().stream().map(Badge::new).toList();
additionalPictures = new ArrayList<>(); additionalPictures = new ArrayList<>();
} }
public static User MapOrEmpty(io.github.jwdeveloper.tiktok.messages.User user)
{
if(user != null)
{
return new User(user);
}
return new User(0L,
"",
"",
"",
Picture.Empty(),
Picture.Empty(),
Picture.Empty(),
Picture.EmptyList(),
0,
0,
0,
Badge.EmptyList());
}
} }

View File

@@ -0,0 +1,23 @@
package io.github.jwdeveloper.tiktok.exceptions;
public class TikTokEventListenerMethodException extends TikTokLiveException
{
public TikTokEventListenerMethodException() {
}
public TikTokEventListenerMethodException(String message) {
super(message);
}
public TikTokEventListenerMethodException(String message, Throwable cause) {
super(message, cause);
}
public TikTokEventListenerMethodException(Throwable cause) {
super(cause);
}
public TikTokEventListenerMethodException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}

View File

@@ -1,13 +1,12 @@
package io.github.jwdeveloper.tiktok.http; package io.github.jwdeveloper.tiktok.http;
import java.net.http.HttpRequest;
import java.util.Map; import java.util.Map;
public interface TikTokHttpRequest { public interface TikTokHttpRequest {
TikTokHttpRequest SetQueries(Map<String, Object> queries); TikTokHttpRequest setQueries(Map<String, Object> queries);
TikTokHttpRequest setHeader(String key, String value); TikTokHttpRequest setHeader(String key, String value);
String Get(String url); String get(String url);
String Post(String url, HttpRequest.BodyPublisher data); String post(String url);
} }

View File

@@ -0,0 +1,17 @@
package io.github.jwdeveloper.tiktok.listener;
import java.util.List;
/**
* You can dynamically add or removing TikTokEventListener
*
* @see TikTokEventListener
*
*/
public interface ListenersManager
{
List<TikTokEventListener> getListeners();
void addListener(TikTokEventListener listener);
void removeListener(TikTokEventListener listener);
}

View File

@@ -0,0 +1,52 @@
package io.github.jwdeveloper.tiktok.listener;
/**
*
* @see ListenersManager
*
* TikTokEventListener is an alternative way of handing TikTok events.
*
* TikTokLive.newClient("someuser").addListener(listener)
*
* After registertion all listeners are kept in Listener manager
* that could be obtained by client.getListenerManager();
*
* Method in TikTokEventListener should meet 4 requirements to be detected
* - must have @TikTokEventHandler annotation
* - must have 2 parameters
* - first parameter must be LiveClient
* - second must be class that extending TikTokEvent
*
* public static class CustomListener implements TikTokEventListener
* {
* @TikTokEventHandler
* public void onError(LiveClient liveClient, TikTokErrorEvent event)
* {
* System.out.println(event.getException().getMessage());
* }
*
* @TikTokEventHandler
* public void onCommentMessage(LiveClient liveClient, TikTokCommentEvent event)
* {
* System.out.println(event.getText());
* }
*
* @TikTokEventHandler
* public void onGiftMessage(LiveClient liveClient, TikTokGiftMessageEvent event)
* {
* System.out.println(event.getGift().getDescription());
* }
*
* @TikTokEventHandler
* public void onAnyEvent(LiveClient liveClient, TikTokEvent event)
* {
* System.out.println(event.getClass().getSimpleName());
* }
* }
*
*/
public interface TikTokEventListener
{
}

View File

@@ -6,9 +6,25 @@ import io.github.jwdeveloper.tiktok.models.gifts.TikTokGiftInfo;
import java.util.Map; import java.util.Map;
public interface GiftManager public interface GiftManager {
{
Map<Integer, TikTokGiftInfo> getGiftsInfo();
Map<GiftId, TikTokGift> getActiveGifts(); /**
* Meta information about all TikTok available gifts such as, name, id, description, cost, etc
* TikTokGiftInfos are downloaded only if `clientSettings.setDownloadGiftInfo(true);`
*
* @return map of metainformations about gitfts where Integer is Gift Id and TikTokGiftInfo is gift data
* @see TikTokGiftInfo
*/
Map<Integer, TikTokGiftInfo> getGiftsInfo();
/**
* Active Gifts are updated after TikTokGiftMessageEvent. This map contains gifts that
* recently send to host and have active strike
*
* @return map of active gifts
* @see TikTokGift
* @see io.github.jwdeveloper.tiktok.events.messages.TikTokGiftMessageEvent
*/
Map<GiftId, TikTokGift> getActiveGifts();
} }

View File

@@ -1,11 +1,34 @@
package io.github.jwdeveloper.tiktok.live; package io.github.jwdeveloper.tiktok.live;
import io.github.jwdeveloper.tiktok.listener.ListenersManager;
import io.github.jwdeveloper.tiktok.listener.TikTokEventListener;
public interface LiveClient { public interface LiveClient {
/**
* Connects to the live stream.
*/
void connect(); void connect();
/**
* Disconnects the connection.
*/
void disconnect(); void disconnect();
/**
* Get information about gifts
*/
GiftManager getGiftManager(); GiftManager getGiftManager();
/**
* Gets the current room info from TikTok API including streamer info, room status and statistics.
*/
LiveRoomInfo getRoomInfo(); LiveRoomInfo getRoomInfo();
/**
* Manage TikTokEventListener
* @see TikTokEventListener
*/
ListenersManager getListenersManager();
} }

View File

@@ -3,6 +3,8 @@ package io.github.jwdeveloper.tiktok.live;
public interface LiveRoomInfo public interface LiveRoomInfo
{ {
int getViewersCount(); int getViewersCount();
boolean isAgeRestricted();
String getRoomId(); String getRoomId();
String getUserName(); String getUserName();
ConnectionState getConnectionState();
} }

View File

@@ -6,4 +6,6 @@ import lombok.Data;
public class LiveRoomMeta public class LiveRoomMeta
{ {
private int status; private int status;
private boolean ageRestricted;
} }

View File

@@ -0,0 +1,6 @@
package io.github.jwdeveloper.tiktok.mappers;
public interface Mapper<SOURCE,TARGET>
{
TARGET mapFrom(SOURCE source);
}

File diff suppressed because it is too large Load Diff

View File

@@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>TikTokLiveJava</artifactId> <artifactId>TikTokLiveJava</artifactId>
<groupId>io.github.jwdeveloper.tiktok</groupId> <groupId>io.github.jwdeveloper.tiktok</groupId>
<version>0.0.14-Release</version> <version>0.0.23-Release</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View File

@@ -14,6 +14,7 @@ public class TikTokGiftManager implements GiftManager {
@Getter @Getter
private final Map<Integer, TikTokGiftInfo> giftsInfo; private final Map<Integer, TikTokGiftInfo> giftsInfo;
@Getter @Getter
private final Map<GiftId, TikTokGift> activeGifts; private final Map<GiftId, TikTokGift> activeGifts;
@@ -23,10 +24,10 @@ public class TikTokGiftManager implements GiftManager {
} }
public TikTokGift updateActiveGift(WebcastGiftMessage giftMessage) { public TikTokGift updateActiveGift(WebcastGiftMessage giftMessage) {
var giftId = new GiftId(giftMessage.getGiftId(), giftMessage.getSender().getUniqueId()); var giftId = new GiftId(giftMessage.getGiftId(), giftMessage.getUser().getIdStr());
if (activeGifts.containsKey(giftId)) { if (activeGifts.containsKey(giftId)) {
var gift = activeGifts.get(giftId); var gift = activeGifts.get(giftId);
gift.setAmount(giftMessage.getAmount()); gift.setAmount(giftMessage.getComboCount());
} else { } else {
var newGift = new TikTokGift(giftMessage); var newGift = new TikTokGift(giftMessage);
activeGifts.put(giftId, newGift); activeGifts.put(giftId, newGift);
@@ -34,7 +35,8 @@ public class TikTokGiftManager implements GiftManager {
var gift = activeGifts.get(giftId); var gift = activeGifts.get(giftId);
if (giftMessage.getRepeatEnd()) { if (giftMessage.getRepeatEnd() > 0)
{
gift.setStreakFinished(true); gift.setStreakFinished(true);
activeGifts.remove(giftId); activeGifts.remove(giftId);
} }

View File

@@ -2,10 +2,13 @@ package io.github.jwdeveloper.tiktok;
import io.github.jwdeveloper.tiktok.events.messages.TikTokDisconnectedEvent; import io.github.jwdeveloper.tiktok.events.messages.TikTokDisconnectedEvent;
import io.github.jwdeveloper.tiktok.events.messages.TikTokErrorEvent; import io.github.jwdeveloper.tiktok.events.messages.TikTokErrorEvent;
import io.github.jwdeveloper.tiktok.events.messages.TikTokReconnectingEvent;
import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException; import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException;
import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveOfflineHostException; import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveOfflineHostException;
import io.github.jwdeveloper.tiktok.handlers.TikTokEventHandler; import io.github.jwdeveloper.tiktok.handlers.TikTokEventObserver;
import io.github.jwdeveloper.tiktok.http.TikTokApiService; import io.github.jwdeveloper.tiktok.http.TikTokApiService;
import io.github.jwdeveloper.tiktok.listener.ListenersManager;
import io.github.jwdeveloper.tiktok.listener.TikTokListenersManager;
import io.github.jwdeveloper.tiktok.live.ConnectionState; import io.github.jwdeveloper.tiktok.live.ConnectionState;
import io.github.jwdeveloper.tiktok.live.GiftManager; import io.github.jwdeveloper.tiktok.live.GiftManager;
import io.github.jwdeveloper.tiktok.live.LiveClient; import io.github.jwdeveloper.tiktok.live.LiveClient;
@@ -17,25 +20,28 @@ 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 TikTokGiftManager tikTokGiftManager; private final TikTokGiftManager tikTokGiftManager;
private final TikTokApiService apiClient; private final TikTokApiService apiService;
private final TikTokWebSocketClient webSocketClient; private final TikTokWebSocketClient webSocketClient;
private final TikTokEventHandler tikTokEventHandler; private final TikTokEventObserver tikTokEventHandler;
private final ClientSettings clientSettings; private final ClientSettings clientSettings;
private final TikTokListenersManager listenersManager;
private final Logger logger; private final Logger logger;
public TikTokLiveClient(TikTokRoomInfo tikTokLiveMeta, public TikTokLiveClient(TikTokRoomInfo tikTokLiveMeta,
TikTokApiService tikTokApiService, TikTokApiService tikTokApiService,
TikTokWebSocketClient webSocketClient, TikTokWebSocketClient webSocketClient,
TikTokGiftManager tikTokGiftManager, TikTokGiftManager tikTokGiftManager,
TikTokEventHandler tikTokEventHandler, TikTokEventObserver tikTokEventHandler,
ClientSettings clientSettings, ClientSettings clientSettings,
TikTokListenersManager listenersManager,
Logger logger) { Logger logger) {
this.liveRoomInfo = tikTokLiveMeta; this.liveRoomInfo = tikTokLiveMeta;
this.tikTokGiftManager = tikTokGiftManager; this.tikTokGiftManager = tikTokGiftManager;
this.apiClient = tikTokApiService; this.apiService = tikTokApiService;
this.webSocketClient = webSocketClient; this.webSocketClient = webSocketClient;
this.tikTokEventHandler = tikTokEventHandler; this.tikTokEventHandler = tikTokEventHandler;
this.clientSettings = clientSettings; this.clientSettings = clientSettings;
this.listenersManager = listenersManager;
this.logger = logger; this.logger = logger;
} }
@@ -57,6 +63,7 @@ public class TikTokLiveClient implements LiveClient {
} }
catch (Exception ignored){} catch (Exception ignored){}
logger.info("Reconnecting"); logger.info("Reconnecting");
tikTokEventHandler.publish(this, new TikTokReconnectingEvent());
this.connect(); this.connect();
} }
throw e; throw e;
@@ -71,8 +78,6 @@ public class TikTokLiveClient implements LiveClient {
setState(ConnectionState.DISCONNECTED); setState(ConnectionState.DISCONNECTED);
} }
public void tryConnect() { public void tryConnect() {
if (liveRoomInfo.hasConnectionState(ConnectionState.CONNECTED)) if (liveRoomInfo.hasConnectionState(ConnectionState.CONNECTED))
throw new TikTokLiveException("Already connected"); throw new TikTokLiveException("Already connected");
@@ -82,9 +87,23 @@ public class TikTokLiveClient implements LiveClient {
logger.info("Connecting"); logger.info("Connecting");
setState(ConnectionState.CONNECTING); setState(ConnectionState.CONNECTING);
var roomId = apiClient.fetchRoomId(liveRoomInfo.getUserName());
liveRoomInfo.setRoomId(roomId); apiService.updateSessionId();
var roomData = apiClient.fetchRoomInfo();
if(clientSettings.getRoomId() != null)
{
liveRoomInfo.setRoomId(clientSettings.getRoomId());
logger.info("Using roomID from settings: "+clientSettings.getRoomId());
}
else
{
var roomId = apiService.fetchRoomId(liveRoomInfo.getUserName());
liveRoomInfo.setRoomId(roomId);
}
var roomData = apiService.fetchRoomInfo();
if (roomData.getStatus() == 0 || roomData.getStatus() == 4) { if (roomData.getStatus() == 0 || roomData.getStatus() == 4) {
throw new TikTokLiveOfflineHostException("LiveStream for HostID could not be found. Is the Host online?"); throw new TikTokLiveOfflineHostException("LiveStream for HostID could not be found. Is the Host online?");
} }
@@ -92,10 +111,10 @@ public class TikTokLiveClient implements LiveClient {
if (clientSettings.isDownloadGiftInfo()) if (clientSettings.isDownloadGiftInfo())
{ {
logger.info("Fetch Gift info"); logger.info("Fetch Gift info");
var gifts = apiClient.fetchAvailableGifts(); var gifts = apiService.fetchAvailableGifts();
tikTokGiftManager.loadGifsInfo(gifts); tikTokGiftManager.loadGifsInfo(gifts);
} }
var clientData = apiClient.fetchClientData(); var clientData = apiService.fetchClientData();
webSocketClient.start(clientData, this); webSocketClient.start(clientData, this);
setState(ConnectionState.CONNECTED); setState(ConnectionState.CONNECTED);
} }
@@ -104,6 +123,11 @@ public class TikTokLiveClient implements LiveClient {
public LiveRoomInfo getRoomInfo() { public LiveRoomInfo getRoomInfo() {
return liveRoomInfo; return liveRoomInfo;
} }
@Override
public ListenersManager getListenersManager()
{
return listenersManager;
}
@Override @Override
public GiftManager getGiftManager() { public GiftManager getGiftManager() {

View File

@@ -5,17 +5,20 @@ import io.github.jwdeveloper.tiktok.events.TikTokEventBuilder;
import io.github.jwdeveloper.tiktok.events.TikTokEventConsumer; import io.github.jwdeveloper.tiktok.events.TikTokEventConsumer;
import io.github.jwdeveloper.tiktok.events.messages.*; import io.github.jwdeveloper.tiktok.events.messages.*;
import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException; import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException;
import io.github.jwdeveloper.tiktok.handlers.TikTokEventHandler; import io.github.jwdeveloper.tiktok.handlers.TikTokEventObserver;
import io.github.jwdeveloper.tiktok.handlers.TikTokMessageHandlerRegistration; import io.github.jwdeveloper.tiktok.handlers.TikTokMessageHandlerRegistration;
import io.github.jwdeveloper.tiktok.http.TikTokApiService; import io.github.jwdeveloper.tiktok.http.TikTokApiService;
import io.github.jwdeveloper.tiktok.http.TikTokCookieJar; import io.github.jwdeveloper.tiktok.http.TikTokCookieJar;
import io.github.jwdeveloper.tiktok.http.TikTokHttpApiClient; import io.github.jwdeveloper.tiktok.http.TikTokHttpClient;
import io.github.jwdeveloper.tiktok.http.TikTokHttpRequestFactory; import io.github.jwdeveloper.tiktok.http.TikTokHttpRequestFactory;
import io.github.jwdeveloper.tiktok.listener.TikTokEventListener;
import io.github.jwdeveloper.tiktok.listener.TikTokListenersManager;
import io.github.jwdeveloper.tiktok.live.LiveClient; import io.github.jwdeveloper.tiktok.live.LiveClient;
import io.github.jwdeveloper.tiktok.utils.CancelationToken;
import io.github.jwdeveloper.tiktok.websocket.TikTokWebSocketClient; import io.github.jwdeveloper.tiktok.websocket.TikTokWebSocketClient;
import java.time.Duration; import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@@ -23,19 +26,26 @@ import java.util.logging.Logger;
public class TikTokLiveClientBuilder implements TikTokEventBuilder<TikTokLiveClientBuilder> { public class TikTokLiveClientBuilder implements TikTokEventBuilder<TikTokLiveClientBuilder> {
private final ClientSettings clientSettings; private final ClientSettings clientSettings;
private final Logger logger; private final Logger logger;
private final TikTokEventHandler tikTokEventHandler; private final TikTokEventObserver tikTokEventHandler;
private final List<TikTokEventListener> listeners;
public TikTokLiveClientBuilder(String userName) { public TikTokLiveClientBuilder(String userName) {
this.tikTokEventHandler = new TikTokEventHandler(); this.tikTokEventHandler = new TikTokEventObserver();
this.clientSettings = Constants.DefaultClientSettings(); this.clientSettings = Constants.DefaultClientSettings();
this.clientSettings.setHostName(userName); this.clientSettings.setHostName(userName);
this.logger = Logger.getLogger(TikTokLive.class.getName()); this.logger = Logger.getLogger(TikTokLive.class.getName());
this.listeners = new ArrayList<>();
} }
public TikTokLiveClientBuilder configure(Consumer<ClientSettings> consumer) { public TikTokLiveClientBuilder configure(Consumer<ClientSettings> consumer) {
consumer.accept(clientSettings); consumer.accept(clientSettings);
return this; return this;
} }
public TikTokLiveClientBuilder addListener(TikTokEventListener listener)
{
listeners.add(listener);
return this;
}
private void validate() { private void validate() {
@@ -71,9 +81,12 @@ public class TikTokLiveClientBuilder implements TikTokEventBuilder<TikTokLiveCli
var tiktokRoomInfo = new TikTokRoomInfo(); var tiktokRoomInfo = new TikTokRoomInfo();
tiktokRoomInfo.setUserName(clientSettings.getHostName()); tiktokRoomInfo.setUserName(clientSettings.getHostName());
var listenerManager = new TikTokListenersManager(listeners, tikTokEventHandler);
var cookieJar = new TikTokCookieJar(); var cookieJar = new TikTokCookieJar();
var requestFactory = new TikTokHttpRequestFactory(cookieJar); var requestFactory = new TikTokHttpRequestFactory(cookieJar);
var apiClient = new TikTokHttpApiClient(cookieJar, requestFactory); var apiClient = new TikTokHttpClient(cookieJar, requestFactory);
var apiService = new TikTokApiService(apiClient, logger, clientSettings); var apiService = new TikTokApiService(apiClient, logger, clientSettings);
var giftManager = new TikTokGiftManager(); var giftManager = new TikTokGiftManager();
var webResponseHandler = new TikTokMessageHandlerRegistration(tikTokEventHandler, clientSettings, logger, giftManager, tiktokRoomInfo); var webResponseHandler = new TikTokMessageHandlerRegistration(tikTokEventHandler, clientSettings, logger, giftManager, tiktokRoomInfo);
@@ -83,7 +96,14 @@ public class TikTokLiveClientBuilder implements TikTokEventBuilder<TikTokLiveCli
webResponseHandler, webResponseHandler,
tikTokEventHandler); tikTokEventHandler);
return new TikTokLiveClient(tiktokRoomInfo, apiService, webSocketClient, giftManager, tikTokEventHandler, clientSettings, logger); return new TikTokLiveClient(tiktokRoomInfo,
apiService,
webSocketClient,
giftManager,
tikTokEventHandler,
clientSettings,
listenerManager,
logger);
} }
public LiveClient buildAndRun() { public LiveClient buildAndRun() {
@@ -259,8 +279,8 @@ public class TikTokLiveClientBuilder implements TikTokEventBuilder<TikTokLiveCli
return this; return this;
} }
public TikTokLiveClientBuilder onUnhandled(TikTokEventConsumer<TikTokUnhandledEvent> event) { public TikTokLiveClientBuilder onUnhandled(TikTokEventConsumer<TikTokUnhandledWebsocketMessageEvent> event) {
tikTokEventHandler.subscribe(TikTokUnhandledEvent.class, event); tikTokEventHandler.subscribe(TikTokUnhandledWebsocketMessageEvent.class, event);
return this; return this;
} }
@@ -324,6 +344,13 @@ public class TikTokLiveClientBuilder implements TikTokEventBuilder<TikTokLiveCli
tikTokEventHandler.subscribe(TikTokWebsocketMessageEvent.class, event); tikTokEventHandler.subscribe(TikTokWebsocketMessageEvent.class, event);
return this; return this;
} }
@Override
public TikTokLiveClientBuilder onReconnecting(TikTokEventConsumer<TikTokReconnectingEvent> event)
{
tikTokEventHandler.subscribe(TikTokReconnectingEvent.class, event);
return this;
}
} }

View File

@@ -11,7 +11,10 @@ public class TikTokRoomInfo implements LiveRoomInfo
private String roomId; private String roomId;
private boolean ageRestricted;
private String userName; private String userName;
private ConnectionState connectionState = ConnectionState.DISCONNECTED; private ConnectionState connectionState = ConnectionState.DISCONNECTED;
public boolean hasConnectionState(ConnectionState state) public boolean hasConnectionState(ConnectionState state)

View File

@@ -1,38 +0,0 @@
package io.github.jwdeveloper.tiktok.handlers;
import io.github.jwdeveloper.tiktok.TikTokLiveClient;
import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.TikTokEventConsumer;
import java.util.HashMap;
import java.util.Map;
public class TikTokEventHandler {
private final Map<String, TikTokEventConsumer> events;
public TikTokEventHandler() {
events = new HashMap<>();
}
public void publish(TikTokLiveClient tikTokLiveClient, TikTokEvent tikTokEvent) {
if (events.containsKey(TikTokEvent.class.getSimpleName())) {
var handler = events.get(TikTokEvent.class.getSimpleName());
handler.onEvent(tikTokLiveClient, tikTokEvent);
}
var name = tikTokEvent.getClass().getSimpleName();
if (!events.containsKey(name)) {
return;
}
var handler = events.get(name);
handler.onEvent(tikTokLiveClient, tikTokEvent);
}
public <T extends TikTokEvent> void subscribe(Class<?> clazz, TikTokEventConsumer<T> event) {
events.put(clazz.getSimpleName(), event);
}
public <T extends TikTokEvent> void unsubscribe(Class<?> clazz) {
events.remove(clazz);
}
}

View File

@@ -0,0 +1,54 @@
package io.github.jwdeveloper.tiktok.handlers;
import io.github.jwdeveloper.tiktok.TikTokLiveClient;
import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.TikTokEventConsumer;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class TikTokEventObserver {
private final Map<String, Set<TikTokEventConsumer>> events;
public TikTokEventObserver() {
events = new HashMap<>();
}
public void publish(TikTokLiveClient tikTokLiveClient, TikTokEvent tikTokEvent) {
if (events.containsKey(TikTokEvent.class.getSimpleName())) {
var handlers = events.get(TikTokEvent.class.getSimpleName());
for(var handle : handlers)
{
handle.onEvent(tikTokLiveClient, tikTokEvent);
}
}
var name = tikTokEvent.getClass().getSimpleName();
if (!events.containsKey(name)) {
return;
}
var handlers = events.get(name);
for(var handler : handlers)
{
handler.onEvent(tikTokLiveClient, tikTokEvent);
}
}
public <T extends TikTokEvent> void subscribe(Class<?> clazz, TikTokEventConsumer<T> event)
{
events.computeIfAbsent(clazz.getSimpleName(), e -> new HashSet<>()).add(event);
}
public <T extends TikTokEvent> void unsubscribeAll(Class<?> clazz) {
events.remove(clazz);
}
public <T extends TikTokEvent> void unsubscribe(TikTokEventConsumer<T> consumer) {
for(var entry : events.entrySet())
{
entry.getValue().remove(consumer);
}
}
}

View File

@@ -7,7 +7,7 @@ import io.github.jwdeveloper.tiktok.TikTokLiveClient;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.messages.TikTokErrorEvent; import io.github.jwdeveloper.tiktok.events.messages.TikTokErrorEvent;
import io.github.jwdeveloper.tiktok.events.messages.TikTokWebsocketMessageEvent; import io.github.jwdeveloper.tiktok.events.messages.TikTokWebsocketMessageEvent;
import io.github.jwdeveloper.tiktok.events.messages.TikTokUnhandledEvent; import io.github.jwdeveloper.tiktok.events.messages.TikTokUnhandledWebsocketMessageEvent;
import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveMessageException; import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveMessageException;
import io.github.jwdeveloper.tiktok.exceptions.TikTokMessageMappingException; import io.github.jwdeveloper.tiktok.exceptions.TikTokMessageMappingException;
import io.github.jwdeveloper.tiktok.messages.WebcastResponse; import io.github.jwdeveloper.tiktok.messages.WebcastResponse;
@@ -23,11 +23,11 @@ import java.util.logging.Logger;
public abstract class TikTokMessageHandler { public abstract class TikTokMessageHandler {
private final Map<String, io.github.jwdeveloper.tiktok.handler.TikTokMessageHandler> handlers; private final Map<String, io.github.jwdeveloper.tiktok.handler.TikTokMessageHandler> handlers;
private final TikTokEventHandler tikTokEventHandler; private final TikTokEventObserver tikTokEventHandler;
private final ClientSettings clientSettings; private final ClientSettings clientSettings;
protected final Logger logger; protected final Logger logger;
public TikTokMessageHandler(TikTokEventHandler tikTokEventHandler,ClientSettings clientSettings, Logger logger) { public TikTokMessageHandler(TikTokEventObserver tikTokEventHandler, ClientSettings clientSettings, Logger logger) {
handlers = new HashMap<>(); handlers = new HashMap<>();
this.tikTokEventHandler = tikTokEventHandler; this.tikTokEventHandler = tikTokEventHandler;
this.clientSettings = clientSettings; this.clientSettings = clientSettings;
@@ -65,7 +65,7 @@ public abstract class TikTokMessageHandler {
private void handleSingleMessage(TikTokLiveClient client, WebcastResponse.Message message) throws Exception { private void handleSingleMessage(TikTokLiveClient client, WebcastResponse.Message message) throws Exception {
if (!handlers.containsKey(message.getType())) { if (!handlers.containsKey(message.getType())) {
tikTokEventHandler.publish(client, new TikTokUnhandledEvent(message)); tikTokEventHandler.publish(client, new TikTokUnhandledWebsocketMessageEvent(message));
return; return;
} }
var handler = handlers.get(message.getType()); var handler = handlers.get(message.getType());

View File

@@ -5,21 +5,18 @@ import io.github.jwdeveloper.tiktok.TikTokGiftManager;
import io.github.jwdeveloper.tiktok.TikTokRoomInfo; import io.github.jwdeveloper.tiktok.TikTokRoomInfo;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.messages.*; import io.github.jwdeveloper.tiktok.events.messages.*;
import io.github.jwdeveloper.tiktok.events.objects.TikTokGift;
import io.github.jwdeveloper.tiktok.messages.*; import io.github.jwdeveloper.tiktok.messages.*;
import io.github.jwdeveloper.tiktok.models.GiftId;
import io.github.jwdeveloper.tiktok.models.SocialTypes; import io.github.jwdeveloper.tiktok.models.SocialTypes;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import java.util.logging.Logger; import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
public class TikTokMessageHandlerRegistration extends TikTokMessageHandler { public class TikTokMessageHandlerRegistration extends TikTokMessageHandler {
private final TikTokGiftManager giftManager; private final TikTokGiftManager giftManager;
private final TikTokRoomInfo roomInfo; private final TikTokRoomInfo roomInfo;
public TikTokMessageHandlerRegistration(TikTokEventHandler tikTokEventHandler, public TikTokMessageHandlerRegistration(TikTokEventObserver tikTokEventHandler,
ClientSettings clientSettings, ClientSettings clientSettings,
Logger logger, Logger logger,
TikTokGiftManager giftManager, TikTokGiftManager giftManager,
@@ -111,12 +108,11 @@ public class TikTokMessageHandlerRegistration extends TikTokMessageHandler {
if (matcher.find()) if (matcher.find())
{ {
var value = matcher.group(0); var value = matcher.group(1);
var number = Integer.parseInt(value); var number = Integer.parseInt(value);
return new TikTokShareEvent(message, number); return new TikTokShareEvent(message, number);
} }
return switch (socialType) { return switch (socialType) {
case SocialTypes.LikeType -> new TikTokLikeEvent(message); case SocialTypes.LikeType -> new TikTokLikeEvent(message);
case SocialTypes.FollowType -> new TikTokFollowEvent(message); case SocialTypes.FollowType -> new TikTokFollowEvent(message);

View File

@@ -2,11 +2,13 @@ package io.github.jwdeveloper.tiktok.http;
import com.google.gson.Gson; import com.google.gson.Gson;
import io.github.jwdeveloper.tiktok.ClientSettings; import io.github.jwdeveloper.tiktok.ClientSettings;
import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException;
import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveOfflineHostException; import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveOfflineHostException;
import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveRequestException; import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveRequestException;
import io.github.jwdeveloper.tiktok.live.LiveRoomMeta; import io.github.jwdeveloper.tiktok.live.LiveRoomMeta;
import io.github.jwdeveloper.tiktok.models.gifts.TikTokGiftInfo; import io.github.jwdeveloper.tiktok.mappers.LiveRoomMetaMapper;
import io.github.jwdeveloper.tiktok.messages.WebcastResponse; import io.github.jwdeveloper.tiktok.messages.WebcastResponse;
import io.github.jwdeveloper.tiktok.models.gifts.TikTokGiftInfo;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@@ -15,34 +17,70 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
public class TikTokApiService { public class TikTokApiService {
private final TikTokHttpApiClient apiClient; private final TikTokHttpClient tiktokHttpClient;
private final Logger logger; private final Logger logger;
private final ClientSettings clientSettings; private final ClientSettings clientSettings;
public TikTokApiService(TikTokHttpApiClient apiClient, Logger logger, ClientSettings clientSettings) { public TikTokApiService(TikTokHttpClient apiClient, Logger logger, ClientSettings clientSettings) {
this.apiClient = apiClient; this.tiktokHttpClient = apiClient;
this.logger = logger; this.logger = logger;
this.clientSettings = clientSettings; this.clientSettings = clientSettings;
} }
public void updateSessionId()
{
if(clientSettings.getSessionId() == null)
{
return;
}
if(clientSettings.getSessionId().isEmpty())
{
return;
}
tiktokHttpClient.setSessionId(clientSettings.getSessionId());
}
public boolean sendMessage(String message, String sessionId) {
if (sessionId.isEmpty()) {
throw new TikTokLiveException("Session ID must not be Empty");
}
var roomId = clientSettings.getClientParameters().get("room_id");
if (roomId == null) {
throw new TikTokLiveException("Room ID must not be Empty");
}
logger.info("Sending message to chat");
try {
var params = new HashMap<String, Object>(clientSettings.getClientParameters());
params.put("content", message);
params.put("channel", "tiktok_web");
params.remove("cursor");
tiktokHttpClient.setSessionId(sessionId);
tiktokHttpClient.postMessageToChat(params);
return true;
} catch (Exception e) {
throw new TikTokLiveRequestException("Failed to fetch room id from WebCast, see stacktrace for more info.", e);
}
}
public String fetchRoomId(String userName) { public String fetchRoomId(String userName) {
logger.info("Fetching room ID"); logger.info("Fetching room ID");
String html; String html;
try { try {
html = apiClient.GetLivestreamPage(userName); html = tiktokHttpClient.getLivestreamPage(userName);
} catch (Exception e) { } catch (Exception e) {
throw new TikTokLiveRequestException("Failed to fetch room id from WebCast, see stacktrace for more info.", e); throw new TikTokLiveRequestException("Failed to fetch room id from WebCast, see stacktrace for more info.", e);
} }
Pattern firstPattern = Pattern.compile("room_id=([0-9]*)"); var firstPattern = Pattern.compile("room_id=([0-9]*)");
Matcher firstMatcher = firstPattern.matcher(html); var firstMatcher = firstPattern.matcher(html);
String id = ""; var id = "";
if (firstMatcher.find()) { if (firstMatcher.find()) {
id = firstMatcher.group(1); id = firstMatcher.group(1);
} else { } else {
Pattern secondPattern = Pattern.compile("\"roomId\":\"([0-9]*)\""); var secondPattern = Pattern.compile("\"roomId\":\"([0-9]*)\"");
Matcher secondMatcher = secondPattern.matcher(html); var secondMatcher = secondPattern.matcher(html);
if (secondMatcher.find()) { if (secondMatcher.find()) {
id = secondMatcher.group(1); id = secondMatcher.group(1);
@@ -54,7 +92,7 @@ public class TikTokApiService {
} }
clientSettings.getClientParameters().put("room_id", id); clientSettings.getClientParameters().put("room_id", id);
logger.info("RoomID -> "+id); logger.info("RoomID -> " + id);
return id; return id;
} }
@@ -62,63 +100,45 @@ public class TikTokApiService {
public LiveRoomMeta fetchRoomInfo() { public LiveRoomMeta fetchRoomInfo() {
logger.info("Fetch RoomInfo"); logger.info("Fetch RoomInfo");
try { try {
var response = apiClient.GetJObjectFromWebcastAPI("room/info/", clientSettings.getClientParameters()); var response = tiktokHttpClient.getJObjectFromWebcastAPI("room/info/", clientSettings.getClientParameters());
if (!response.has("data")) { var mapper = new LiveRoomMetaMapper();
return new LiveRoomMeta(); var liveRoomMeta = mapper.mapFrom(response);
} logger.info("RoomInfo status -> " + liveRoomMeta.getStatus());
return liveRoomMeta;
var data = response.getAsJsonObject("data");
if (!data.has("status")) {
return new LiveRoomMeta();
}
var status = data.get("status");
var info = new LiveRoomMeta();
info.setStatus(status.getAsInt());
logger.info("RoomInfo status -> "+info.getStatus());
return info;
} catch (Exception e) { } catch (Exception e) {
throw new TikTokLiveRequestException("Failed to fetch room info from WebCast, see stacktrace for more info.", e); throw new TikTokLiveRequestException("Failed to fetch room info from WebCast, see stacktrace for more info.", e);
} }
} }
public WebcastResponse fetchClientData() public WebcastResponse fetchClientData() {
{
logger.info("Fetch ClientData"); logger.info("Fetch ClientData");
try { try {
var response = apiClient.GetDeserializedMessage("im/fetch/", clientSettings.getClientParameters()); var response = tiktokHttpClient.getDeserializedMessage("im/fetch/", clientSettings.getClientParameters());
clientSettings.getClientParameters().put("cursor",response.getCursor()); clientSettings.getClientParameters().put("cursor", response.getCursor());
clientSettings.getClientParameters().put("internal_ext", response.getAckIds()); clientSettings.getClientParameters().put("internal_ext", response.getAckIds());
return response; return response;
} } catch (Exception e) {
catch (Exception e)
{
throw new TikTokLiveRequestException("Failed to fetch client data", e); throw new TikTokLiveRequestException("Failed to fetch client data", e);
} }
} }
public Map<Integer, TikTokGiftInfo> fetchAvailableGifts() { public Map<Integer, TikTokGiftInfo> fetchAvailableGifts() {
try { try {
var response = apiClient.GetJObjectFromWebcastAPI("gift/list/", clientSettings.getClientParameters()); var response = tiktokHttpClient.getJObjectFromWebcastAPI("gift/list/", clientSettings.getClientParameters());
if(!response.has("data")) if (!response.has("data")) {
{
return new HashMap<>(); return new HashMap<>();
} }
var dataJson = response.getAsJsonObject("data"); var dataJson = response.getAsJsonObject("data");
if(!dataJson.has("gifts")) if (!dataJson.has("gifts")) {
{
return new HashMap<>(); return new HashMap<>();
} }
var giftsJsonList = dataJson.get("gifts").getAsJsonArray(); var giftsJsonList = dataJson.get("gifts").getAsJsonArray();
var gifts = new HashMap<Integer, TikTokGiftInfo>(); var gifts = new HashMap<Integer, TikTokGiftInfo>();
var gson = new Gson(); var gson = new Gson();
for(var jsonGift : giftsJsonList) for (var jsonGift : giftsJsonList) {
{
var gift = gson.fromJson(jsonGift, TikTokGiftInfo.class); var gift = gson.fromJson(jsonGift, TikTokGiftInfo.class);
logger.info("Found Available Gift "+ gift.getName()+ " with ID "+gift.getId()); logger.info("Found Available Gift " + gift.getName() + " with ID " + gift.getId());
gifts.put(gift.getId(),gift); gifts.put(gift.getId(), gift);
} }
return gifts; return gifts;
} catch (Exception e) { } catch (Exception e) {

View File

@@ -2,7 +2,6 @@ package io.github.jwdeveloper.tiktok.http;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.google.gson.JsonParser; import com.google.gson.JsonParser;
import io.github.jwdeveloper.tiktok.ClientSettings;
import io.github.jwdeveloper.tiktok.Constants; import io.github.jwdeveloper.tiktok.Constants;
import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveRequestException; import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveRequestException;
import io.github.jwdeveloper.tiktok.messages.WebcastResponse; import io.github.jwdeveloper.tiktok.messages.WebcastResponse;
@@ -15,30 +14,44 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.TreeMap; import java.util.TreeMap;
public class TikTokHttpApiClient { public class TikTokHttpClient {
private final TikTokHttpRequestFactory requestFactory; private final TikTokHttpRequestFactory requestFactory;
private final TikTokCookieJar tikTokCookieJar; private final TikTokCookieJar tikTokCookieJar;
public TikTokHttpApiClient(TikTokCookieJar tikTokCookieJar, TikTokHttpRequestFactory requestFactory) { public TikTokHttpClient(TikTokCookieJar tikTokCookieJar, TikTokHttpRequestFactory requestFactory) {
this.requestFactory = requestFactory; this.requestFactory = requestFactory;
this.tikTokCookieJar = tikTokCookieJar; this.tikTokCookieJar = tikTokCookieJar;
} }
public String GetLivestreamPage(String userName) { public void setSessionId(String sessionId)
{
tikTokCookieJar.set("sessionid", sessionId);
tikTokCookieJar.set("sessionid_ss", sessionId);
tikTokCookieJar.set("sid_tt", sessionId);
}
public String getLivestreamPage(String userName) {
var url = Constants.TIKTOK_URL_WEB + "@" + userName + "/live/"; var url = Constants.TIKTOK_URL_WEB + "@" + userName + "/live/";
var get = getRequest(url, null); var get = getRequest(url, null);
return get; return get;
} }
public JsonObject GetJObjectFromWebcastAPI(String path, Map<String, Object> parameters) { public String postMessageToChat(Map<String,Object> parameters)
{
var get = postRequest(Constants.TIKTOK_URL_WEBCAST + "room/chat/", parameters);
return get;
}
public JsonObject getJObjectFromWebcastAPI(String path, Map<String, Object> parameters) {
var get = getRequest(Constants.TIKTOK_URL_WEBCAST + path, parameters); var get = getRequest(Constants.TIKTOK_URL_WEBCAST + path, parameters);
var json = JsonParser.parseString(get); var json = JsonParser.parseString(get);
var jsonObject = json.getAsJsonObject(); var jsonObject = json.getAsJsonObject();
return jsonObject; return jsonObject;
} }
public WebcastResponse GetDeserializedMessage(String path, Map<String, Object> parameters) { public WebcastResponse getDeserializedMessage(String path, Map<String, Object> parameters) {
var bytes = getSignRequest(Constants.TIKTOK_URL_WEBCAST + path, parameters); var bytes = getSignRequest(Constants.TIKTOK_URL_WEBCAST + path, parameters);
try { try {
return WebcastResponse.parseFrom(bytes); return WebcastResponse.parseFrom(bytes);
@@ -49,16 +62,25 @@ public class TikTokHttpApiClient {
} }
} }
private String postRequest(String url, Map<String, Object> parameters) {
if (parameters == null) {
parameters = new HashMap<>();
}
System.out.println("RomMID: "+parameters.get("room_id"));
var request = requestFactory.setQueries(parameters);
return request.post(url);
}
private String getRequest(String url, Map<String, Object> parameters) { private String getRequest(String url, Map<String, Object> parameters) {
if (parameters == null) { if (parameters == null) {
parameters = new HashMap<>(); parameters = new HashMap<>();
} }
var request = requestFactory.SetQueries(parameters); var request = requestFactory.setQueries(parameters);
return request.Get(url); return request.get(url);
} }
private byte[] getSignRequest(String url, Map<String, Object> parameters) { private byte[] getSignRequest(String url, Map<String, Object> parameters) {
url = GetSignedUrl(url, parameters); url = getSignedUrl(url, parameters);
try { try {
var client = HttpClient.newHttpClient(); var client = HttpClient.newHttpClient();
var request = HttpRequest.newBuilder() var request = HttpRequest.newBuilder()
@@ -86,7 +108,7 @@ public class TikTokHttpApiClient {
} }
private String GetSignedUrl(String url, Map<String, Object> parameters) { private String getSignedUrl(String url, Map<String, Object> parameters) {
var fullUrl = HttpUtils.parseParameters(url,parameters); var fullUrl = HttpUtils.parseParameters(url,parameters);
var singHeaders = new TreeMap<String,Object>(); var singHeaders = new TreeMap<String,Object>();
@@ -94,8 +116,8 @@ public class TikTokHttpApiClient {
singHeaders.put("uuc", 1); singHeaders.put("uuc", 1);
singHeaders.put("url", fullUrl); singHeaders.put("url", fullUrl);
var request = requestFactory.SetQueries(singHeaders); var request = requestFactory.setQueries(singHeaders);
var content = request.Get(Constants.TIKTOK_SIGN_API); var content = request.get(Constants.TIKTOK_SIGN_API);
try { try {

View File

@@ -11,12 +11,12 @@ import java.net.URLEncoder;
import java.net.http.HttpClient; import java.net.http.HttpClient;
import java.net.http.HttpRequest; import java.net.http.HttpRequest;
import java.net.http.HttpResponse; import java.net.http.HttpResponse;
import java.net.http.WebSocket;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.time.Duration; import java.time.Duration;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.TreeMap;
public class TikTokHttpRequestFactory implements TikTokHttpRequest { public class TikTokHttpRequestFactory implements TikTokHttpRequest {
private final CookieManager cookieManager; private final CookieManager cookieManager;
@@ -34,29 +34,16 @@ public class TikTokHttpRequestFactory implements TikTokHttpRequest {
.connectTimeout(Duration.ofSeconds(2)) .connectTimeout(Duration.ofSeconds(2))
.build(); .build();
} }
public WebSocket.Builder openSocket() {
return client.newWebSocketBuilder();
}
@SneakyThrows @SneakyThrows
public String Get(String url) { public String get(String url) {
var uri = URI.create(url); var uri = URI.create(url);
var request = HttpRequest.newBuilder().GET(); var request = HttpRequest.newBuilder().GET();
if (query != null) { for (var header : defaultHeaders.entrySet())
var baseUri = uri.toString(); {
var requestUri = URI.create(baseUri + "?" + query); if(header.getKey().equals("Connection") || header.getKey().equals("Accept-Encoding"))
request.uri(requestUri); {
} continue;
}
return GetContent(request.build());
}
@SneakyThrows
public String Post(String url, HttpRequest.BodyPublisher data) {
var uri = URI.create(url);
var request = HttpRequest.newBuilder().POST(data);
for (var header : defaultHeaders.entrySet()) {
request.setHeader(header.getKey(), header.getValue()); request.setHeader(header.getKey(), header.getValue());
} }
if (query != null) { if (query != null) {
@@ -64,7 +51,36 @@ public class TikTokHttpRequestFactory implements TikTokHttpRequest {
var requestUri = URI.create(baseUri + "?" + query); var requestUri = URI.create(baseUri + "?" + query);
request.uri(requestUri); request.uri(requestUri);
} }
return GetContent(request.build());
return getContent(request.build());
}
@SneakyThrows
public String post(String url) {
var uri = URI.create(url);
var request = HttpRequest.newBuilder().POST(HttpRequest.BodyPublishers.ofString(""));
for (var header : defaultHeaders.entrySet())
{
if(header.getKey().equals("Connection"))
{
continue;
}
request.setHeader(header.getKey(), header.getValue());
}
request.setHeader("Content-type","application/x-www-form-urlencoded; charset=UTF-8");
request.setHeader("Cookie", tikTokCookieJar.parseCookies());
if (query != null) {
var baseUri = uri.toString();
var requestUri = URI.create(baseUri + "?" + query);
request.uri(requestUri);
System.out.println(requestUri.toString());
}
return getContent(request.build());
} }
public TikTokHttpRequest setHeader(String key, String value) { public TikTokHttpRequest setHeader(String key, String value) {
@@ -77,10 +93,11 @@ public class TikTokHttpRequestFactory implements TikTokHttpRequest {
return this; return this;
} }
public TikTokHttpRequest SetQueries(Map<String, Object> queries) { public TikTokHttpRequest setQueries(Map<String, Object> queries) {
if (queries == null) if (queries == null)
return this; return this;
query = String.join("&", queries.entrySet().stream().map(x -> var testMap = new TreeMap<String,Object>(queries);
query = String.join("&", testMap.entrySet().stream().map(x ->
{ {
var key = x.getKey(); var key = x.getKey();
var value = ""; var value = "";
@@ -95,7 +112,7 @@ public class TikTokHttpRequestFactory implements TikTokHttpRequest {
} }
private String GetContent(HttpRequest request) throws Exception { private String getContent(HttpRequest request) throws Exception {
var response = client.send(request, HttpResponse.BodyHandlers.ofString()); var response = client.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() == 404) { if (response.statusCode() == 404) {
throw new TikTokLiveRequestException("Request responded with 404 NOT_FOUND"); throw new TikTokLiveRequestException("Request responded with 404 NOT_FOUND");

View File

@@ -0,0 +1,17 @@
package io.github.jwdeveloper.tiktok.listener;
import io.github.jwdeveloper.tiktok.events.TikTokEventConsumer;
import lombok.Value;
import java.util.List;
@Value
public class ListenerBindingModel
{
TikTokEventListener listener;
List<TikTokEventConsumer<?>> events;
}

View File

@@ -0,0 +1,87 @@
package io.github.jwdeveloper.tiktok.listener;
import io.github.jwdeveloper.tiktok.annotations.TikTokEventHandler;
import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.TikTokEventConsumer;
import io.github.jwdeveloper.tiktok.exceptions.TikTokEventListenerMethodException;
import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException;
import io.github.jwdeveloper.tiktok.handlers.TikTokEventObserver;
import io.github.jwdeveloper.tiktok.live.LiveClient;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class TikTokListenersManager implements ListenersManager {
private final TikTokEventObserver eventObserver;
private final List<ListenerBindingModel> bindingModels;
public TikTokListenersManager(List<TikTokEventListener> listeners, TikTokEventObserver tikTokEventHandler) {
this.eventObserver = tikTokEventHandler;
this.bindingModels = new ArrayList<>(listeners.stream().map(this::bindToEvents).toList());
}
@Override
public List<TikTokEventListener> getListeners() {
return bindingModels.stream().map(ListenerBindingModel::getListener).toList();
}
@Override
public void addListener(TikTokEventListener listener) {
var alreadyExists = bindingModels.stream().filter(e -> e.getListener() == listener).findAny();
if (alreadyExists.isPresent()) {
throw new TikTokLiveException("Listener " + listener.getClass() + " has already been registered");
}
var bindingModel = bindToEvents(listener);
bindingModels.add(bindingModel);
}
@Override
public void removeListener(TikTokEventListener listener) {
var optional = bindingModels.stream().filter(e -> e.getListener() == listener).findAny();
if (optional.isEmpty()) {
return;
}
var bindingModel =optional.get();
for(var consumer : bindingModel.getEvents())
{
eventObserver.unsubscribe(consumer);
}
bindingModels.remove(optional.get());
}
private ListenerBindingModel bindToEvents(TikTokEventListener listener) {
var clazz = listener.getClass();
var methods = Arrays.stream(clazz.getDeclaredMethods()).filter(m ->
m.getParameterCount() == 2 &&
m.isAnnotationPresent(TikTokEventHandler.class) &&
m.getParameterTypes()[0].equals(LiveClient.class)).toList();
var eventConsumer = new ArrayList<TikTokEventConsumer<?>>();
for (var method : methods)
{
var eventClazz = method.getParameterTypes()[1];
if(eventClazz.isAssignableFrom(TikTokEvent.class) && !eventClazz.equals(TikTokEvent.class))
{
throw new TikTokEventListenerMethodException("Method "+method.getName()+"() 2nd parameter must instance of "+TikTokEvent.class.getName());
}
var tikTokEventConsumer = new TikTokEventConsumer() {
@Override
public void onEvent(LiveClient liveClient, TikTokEvent event) {
try {
method.invoke(listener, liveClient, event);
} catch (Exception e) {
throw new TikTokEventListenerMethodException(e);
}
}
};
eventObserver.subscribe(eventClazz, tikTokEventConsumer);
}
return new ListenerBindingModel(listener, eventConsumer);
}
}

View File

@@ -0,0 +1,30 @@
package io.github.jwdeveloper.tiktok.mappers;
import com.google.gson.JsonObject;
import io.github.jwdeveloper.tiktok.live.LiveRoomMeta;
public class LiveRoomMetaMapper implements Mapper<JsonObject, LiveRoomMeta>
{
@Override
public LiveRoomMeta mapFrom(JsonObject input) {
var liveRoomMeta = new LiveRoomMeta();
if (!input.has("data")) {
return liveRoomMeta;
}
var data = input.getAsJsonObject("data");
if (data.has("status")) {
var status = data.get("status");
liveRoomMeta.setStatus(status.getAsInt());
}
if(data.has("age_restricted"))
{
var element = data.getAsJsonObject("age_restricted");
var restricted= element.get("restricted").getAsBoolean();
liveRoomMeta.setAgeRestricted(restricted);
}
return liveRoomMeta;
}
}

View File

@@ -5,16 +5,14 @@ import io.github.jwdeveloper.tiktok.ClientSettings;
import io.github.jwdeveloper.tiktok.Constants; import io.github.jwdeveloper.tiktok.Constants;
import io.github.jwdeveloper.tiktok.TikTokLiveClient; import io.github.jwdeveloper.tiktok.TikTokLiveClient;
import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException; import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException;
import io.github.jwdeveloper.tiktok.handlers.TikTokEventHandler; import io.github.jwdeveloper.tiktok.handlers.TikTokEventObserver;
import io.github.jwdeveloper.tiktok.handlers.TikTokMessageHandlerRegistration; import io.github.jwdeveloper.tiktok.handlers.TikTokMessageHandlerRegistration;
import io.github.jwdeveloper.tiktok.http.HttpUtils; import io.github.jwdeveloper.tiktok.http.HttpUtils;
import io.github.jwdeveloper.tiktok.http.TikTokCookieJar; import io.github.jwdeveloper.tiktok.http.TikTokCookieJar;
import io.github.jwdeveloper.tiktok.http.TikTokHttpRequestFactory;
import io.github.jwdeveloper.tiktok.messages.WebcastResponse; import io.github.jwdeveloper.tiktok.messages.WebcastResponse;
import org.java_websocket.client.WebSocketClient; import org.java_websocket.client.WebSocketClient;
import java.net.URI; import java.net.URI;
import java.net.http.WebSocket;
import java.util.HashMap; import java.util.HashMap;
import java.util.TreeMap; import java.util.TreeMap;
import java.util.logging.Logger; import java.util.logging.Logger;
@@ -24,7 +22,7 @@ public class TikTokWebSocketClient {
private final ClientSettings clientSettings; private final ClientSettings clientSettings;
private final TikTokCookieJar tikTokCookieJar; private final TikTokCookieJar tikTokCookieJar;
private final TikTokMessageHandlerRegistration webResponseHandler; private final TikTokMessageHandlerRegistration webResponseHandler;
private final TikTokEventHandler tikTokEventHandler; private final TikTokEventObserver tikTokEventHandler;
private WebSocketClient webSocketClient; private WebSocketClient webSocketClient;
private TikTokLiveClient tikTokLiveClient; private TikTokLiveClient tikTokLiveClient;
private TikTokWebSocketPingingTask pingingTask; private TikTokWebSocketPingingTask pingingTask;
@@ -34,7 +32,7 @@ public class TikTokWebSocketClient {
TikTokCookieJar tikTokCookieJar, TikTokCookieJar tikTokCookieJar,
ClientSettings clientSettings, ClientSettings clientSettings,
TikTokMessageHandlerRegistration webResponseHandler, TikTokMessageHandlerRegistration webResponseHandler,
TikTokEventHandler tikTokEventHandler) { TikTokEventObserver tikTokEventHandler) {
this.logger = logger; this.logger = logger;
this.tikTokCookieJar = tikTokCookieJar; this.tikTokCookieJar = tikTokCookieJar;
this.clientSettings = clientSettings; this.clientSettings = clientSettings;
@@ -97,12 +95,11 @@ public class TikTokWebSocketClient {
tikTokLiveClient); tikTokLiveClient);
} }
public void stop() public void stop()
{ {
if (isConnected && webSocketClient != null) { if (isConnected && webSocketClient != null)
webSocketClient.close(1); {
webSocketClient.closeConnection(0,"");
} }
webSocketClient = null; webSocketClient = null;
pingingTask = null; pingingTask = null;

View File

@@ -6,7 +6,7 @@ import io.github.jwdeveloper.tiktok.events.messages.TikTokConnectedEvent;
import io.github.jwdeveloper.tiktok.events.messages.TikTokDisconnectedEvent; import io.github.jwdeveloper.tiktok.events.messages.TikTokDisconnectedEvent;
import io.github.jwdeveloper.tiktok.events.messages.TikTokErrorEvent; import io.github.jwdeveloper.tiktok.events.messages.TikTokErrorEvent;
import io.github.jwdeveloper.tiktok.exceptions.TikTokProtocolBufferException; import io.github.jwdeveloper.tiktok.exceptions.TikTokProtocolBufferException;
import io.github.jwdeveloper.tiktok.handlers.TikTokEventHandler; import io.github.jwdeveloper.tiktok.handlers.TikTokEventObserver;
import io.github.jwdeveloper.tiktok.handlers.TikTokMessageHandlerRegistration; import io.github.jwdeveloper.tiktok.handlers.TikTokMessageHandlerRegistration;
import io.github.jwdeveloper.tiktok.messages.WebcastResponse; import io.github.jwdeveloper.tiktok.messages.WebcastResponse;
import io.github.jwdeveloper.tiktok.messages.WebcastWebsocketAck; import io.github.jwdeveloper.tiktok.messages.WebcastWebsocketAck;
@@ -16,7 +16,6 @@ import org.java_websocket.drafts.Draft_6455;
import org.java_websocket.handshake.ServerHandshake; import org.java_websocket.handshake.ServerHandshake;
import java.net.URI; import java.net.URI;
import java.net.http.WebSocket;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
@@ -24,14 +23,14 @@ import java.util.Optional;
public class TikTokWebSocketListener extends WebSocketClient { public class TikTokWebSocketListener extends WebSocketClient {
private final TikTokMessageHandlerRegistration webResponseHandler; private final TikTokMessageHandlerRegistration webResponseHandler;
private final TikTokEventHandler tikTokEventHandler; private final TikTokEventObserver tikTokEventHandler;
private final TikTokLiveClient tikTokLiveClient; private final TikTokLiveClient tikTokLiveClient;
public TikTokWebSocketListener(URI serverUri, public TikTokWebSocketListener(URI serverUri,
Map<String, String> httpHeaders, Map<String, String> httpHeaders,
int connectTimeout, int connectTimeout,
TikTokMessageHandlerRegistration webResponseHandler, TikTokMessageHandlerRegistration webResponseHandler,
TikTokEventHandler tikTokEventHandler, TikTokEventObserver tikTokEventHandler,
TikTokLiveClient tikTokLiveClient) { TikTokLiveClient tikTokLiveClient) {
super(serverUri, new Draft_6455(), httpHeaders,connectTimeout); super(serverUri, new Draft_6455(), httpHeaders,connectTimeout);
this.webResponseHandler = webResponseHandler; this.webResponseHandler = webResponseHandler;
@@ -43,7 +42,10 @@ public class TikTokWebSocketListener extends WebSocketClient {
@Override @Override
public void onOpen(ServerHandshake serverHandshake) { public void onOpen(ServerHandshake serverHandshake) {
tikTokEventHandler.publish(tikTokLiveClient,new TikTokConnectedEvent()); tikTokEventHandler.publish(tikTokLiveClient,new TikTokConnectedEvent());
sendPing(); if(isNotClosing())
{
sendPing();
}
} }
@@ -55,7 +57,10 @@ public class TikTokWebSocketListener extends WebSocketClient {
} catch (Exception e) { } catch (Exception e) {
tikTokEventHandler.publish(tikTokLiveClient, new TikTokErrorEvent(e)); tikTokEventHandler.publish(tikTokLiveClient, new TikTokErrorEvent(e));
} }
sendPing(); if(isNotClosing())
{
sendPing();
}
} }
@Override @Override
@@ -66,7 +71,10 @@ public class TikTokWebSocketListener extends WebSocketClient {
@Override @Override
public void onError(Exception error) { public void onError(Exception error) {
tikTokEventHandler.publish(tikTokLiveClient,new TikTokErrorEvent(error)); tikTokEventHandler.publish(tikTokLiveClient,new TikTokErrorEvent(error));
sendPing(); if(isNotClosing())
{
sendPing();
}
} }
private void handleBinary(byte[] buffer) { private void handleBinary(byte[] buffer) {
@@ -101,6 +109,11 @@ public class TikTokWebSocketListener extends WebSocketClient {
} }
} }
private boolean isNotClosing()
{
return !isClosed() && !isClosing();
}
private void sendAckId(long id) { private void sendAckId(long id) {
@@ -109,7 +122,10 @@ public class TikTokWebSocketListener extends WebSocketClient {
.setType("ack") .setType("ack")
.setId(id) .setId(id)
.build(); .build();
send(serverInfo.toByteString().asReadOnlyByteBuffer()); if(isNotClosing())
{
send(serverInfo.toByteString().asReadOnlyByteBuffer());
}
} }

View File

@@ -1,7 +1,7 @@
package io.github.jwdeveloper.tiktok; package io.github.jwdeveloper.tiktok;
import io.github.jwdeveloper.tiktok.common.TikTokBaseTest; import io.github.jwdeveloper.tiktok.common.TikTokBaseTest;
import io.github.jwdeveloper.tiktok.handlers.TikTokEventHandler; import io.github.jwdeveloper.tiktok.handlers.TikTokEventObserver;
import io.github.jwdeveloper.tiktok.handlers.TikTokMessageHandlerRegistration; import io.github.jwdeveloper.tiktok.handlers.TikTokMessageHandlerRegistration;
import org.junit.Before; import org.junit.Before;
@@ -14,7 +14,7 @@ public class WebResponseHandlerTests extends TikTokBaseTest {
@Before @Before
public void before() { public void before() {
var mockEventHandler = mock(TikTokEventHandler.class); var mockEventHandler = mock(TikTokEventObserver.class);
var mockGiftManager = mock(TikTokGiftManager.class); var mockGiftManager = mock(TikTokGiftManager.class);
var mockRoomInfo = mock(TikTokRoomInfo.class); var mockRoomInfo = mock(TikTokRoomInfo.class);
var mockClientSettings = mock(ClientSettings.class); var mockClientSettings = mock(ClientSettings.class);

2
FUNDING.yml Normal file
View File

@@ -0,0 +1,2 @@
patreon: jwdeveloper
custom: ["https://www.buymeacoffee.com/jwdev"]

179
README.md
View File

@@ -1,4 +1,4 @@
[![](https://jitpack.io/v/jwdeveloper/TikTok-Live-Java.svg)](https://jitpack.io/#jwdeveloper/TikTok-Live-Java) [![](https://jitpack.io/v/jwdeveloper/TikTok-Live-Java.svg)](https://jitpack.io/#jwdeveloper/TikTok-Live-Java)
# TikTokLive Java # TikTokLive Java
@@ -7,7 +7,7 @@ A Java library based on [TikTokLive](https://github.com/isaackogan/TikTokLive) a
Join the support [discord](https://discord.gg/e2XwPNTBBr) and visit the `#java-support` channel for questions, contributions and ideas. Feel free to make pull requests with missing/new features, fixes, etc Join the support [discord](https://discord.gg/e2XwPNTBBr) and visit the `#java-support` channel for questions, contributions and ideas. Feel free to make pull requests with missing/new features, fixes, etc
Do you prefer other programming languages? Do you prefer other programming languages?
- **Node** orginal: [TikTok-Live-Connector](https://github.com/isaackogan/TikTok-Live-Connector) by [@zerodytrash](https://github.com/zerodytrash) - **Node** orginal: [TikTok-Live-Connector](https://github.com/isaackogan/TikTok-Live-Connector) by [@zerodytrash](https://github.com/zerodytrash)
- **Python** rewrite: [TikTokLive](https://github.com/isaackogan/TikTokLive) by [@isaackogan](https://github.com/isaackogan) - **Python** rewrite: [TikTokLive](https://github.com/isaackogan/TikTokLive) by [@isaackogan](https://github.com/isaackogan)
- **Go** rewrite: [GoTikTokLive](https://github.com/Davincible/gotiktoklive) by [@Davincible](https://github.com/Davincible) - **Go** rewrite: [GoTikTokLive](https://github.com/Davincible/gotiktoklive) by [@Davincible](https://github.com/Davincible)
- **C#** rewrite: [TikTokLiveSharp](https://github.com/frankvHoof93/TikTokLiveSharp) by [@frankvHoof93](https://github.com/frankvHoof93) - **C#** rewrite: [TikTokLiveSharp](https://github.com/frankvHoof93/TikTokLiveSharp) by [@frankvHoof93](https://github.com/frankvHoof93)
@@ -23,7 +23,7 @@ Do you prefer other programming languages?
## Getting started ## Getting started
1. Install the package via Maven 1. Install the package via Maven
```xml ```xml
<repositories> <repositories>
@@ -37,7 +37,7 @@ Do you prefer other programming languages?
<dependency> <dependency>
<groupId>com.github.jwdeveloper.TikTok-Live-Java</groupId> <groupId>com.github.jwdeveloper.TikTok-Live-Java</groupId>
<artifactId>Client</artifactId> <artifactId>Client</artifactId>
<version>0.0.14-Release</version> <version>0.0.23-Release</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
@@ -51,12 +51,22 @@ Do you prefer other programming languages?
2. Create your first chat connection 2. Create your first chat connection
```java ```java
public static void main(String[] args) package io.github.jwdeveloper.tiktok;
{ import java.io.IOException;
// Username of someone who is currently live
var tiktokUsername = "jwdevtiktok";
TikTokLive.newClient(tiktokUsername) public class SimpleExample {
public static void main(String[] args) throws IOException {
// set tiktok username
TikTokLive.newClient(Main.TEST_TIKTOK_USER)
.configure(clientSettings ->
{
})
.onFollow((liveClient, event) ->
{
System.out.println("Follow joined -> " + event.getNewFollower().getNickName());
})
.onConnected((client, event) -> .onConnected((client, event) ->
{ {
System.out.println("Connected"); System.out.println("Connected");
@@ -80,15 +90,22 @@ Do you prefer other programming languages?
.buildAndRun(); .buildAndRun();
System.in.read(); System.in.read();
} }
}
``` ```
## Configuration ## Configuration
```java ```java
public class ConfigurationExample package io.github.jwdeveloper.tiktok;
{
import java.io.IOException;
import java.time.Duration;
import java.util.logging.Level;
public class ConfigurationExample {
public static void main(String[] args) throws IOException { public static void main(String[] args) throws IOException {
var tiktokUsername = "jwdevtiktok";
TikTokLive.newClient(tiktokUsername) TikTokLive.newClient(Main.TEST_TIKTOK_USER)
.configure(clientSettings -> .configure(clientSettings ->
{ {
clientSettings.setHostName(Main.TEST_TIKTOK_USER); // TikTok user name clientSettings.setHostName(Main.TEST_TIKTOK_USER); // TikTok user name
@@ -101,9 +118,90 @@ public class ConfigurationExample
clientSettings.setHandleExistingMessagesOnConnect(true); // Invokes all TikTok events that had occurred before connection clientSettings.setHandleExistingMessagesOnConnect(true); // Invokes all TikTok events that had occurred before connection
clientSettings.setRetryOnConnectionFailure(true); // Reconnecting if TikTok user is offline clientSettings.setRetryOnConnectionFailure(true); // Reconnecting if TikTok user is offline
clientSettings.setRetryConnectionTimeout(Duration.ofSeconds(1)); // Timeout before next reconnection clientSettings.setRetryConnectionTimeout(Duration.ofSeconds(1)); // Timeout before next reconnection
//Optional: Sometimes not every message 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
clientSettings.setSessionId("86c3c8bf4b17ebb2d74bb7fa66fd0000");
//Optional:
clientSettings.setRoomId("XXXXXXXXXXXXXXXXX");
}) })
.buildAndRun(); .buildAndRun();
System.in.read(); System.in.read();
}
}
```
## Listener Example
```java
package io.github.jwdeveloper.tiktok;
import io.github.jwdeveloper.tiktok.annotations.TikTokEventHandler;
import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.messages.TikTokCommentEvent;
import io.github.jwdeveloper.tiktok.events.messages.TikTokErrorEvent;
import io.github.jwdeveloper.tiktok.events.messages.TikTokGiftMessageEvent;
import io.github.jwdeveloper.tiktok.events.messages.TikTokLikeEvent;
import io.github.jwdeveloper.tiktok.listener.TikTokEventListener;
import io.github.jwdeveloper.tiktok.live.LiveClient;
import java.io.IOException;
public class ListenerExample
{
public static void main(String[] args) throws IOException {
CustomListener customListener = new CustomListener();
// set tiktok username
var client = TikTokLive.newClient(Main.TEST_TIKTOK_USER)
.addListener(customListener)
.buildAndRun();
System.in.read();
}
/*
Method in TikTokEventListener should meet 4 requirements to be detected
- must have @TikTokEventHandler annotation
- must have 2 parameters
- first parameter must be LiveClient
- second must be class that extending TikTokEvent
*/
public static class CustomListener implements TikTokEventListener
{
@TikTokEventHandler
public void onLike(LiveClient liveClient, TikTokLikeEvent event)
{
System.out.println(event.toString());
}
@TikTokEventHandler
public void onError(LiveClient liveClient, TikTokErrorEvent event)
{
System.out.println(event.getException().getMessage());
}
@TikTokEventHandler
public void onCommentMessage(LiveClient liveClient, TikTokCommentEvent event)
{
System.out.println(event.getText());
}
@TikTokEventHandler
public void onGiftMessage(LiveClient liveClient, TikTokGiftMessageEvent event)
{
System.out.println(event.getGift().getDescription());
}
@TikTokEventHandler
public void onAnyEvent(LiveClient liveClient, TikTokEvent event)
{
System.out.println(event.getClass().getSimpleName());
}
} }
} }
@@ -112,31 +210,30 @@ public class ConfigurationExample
## Methods ## Methods
A `client (LiveClient)` object contains the following methods. A `client (LiveClient)` object contains the following methods.
| Method Name | Description |
| ----------- | ----------- |
| connect | Connects to the live stream. |
| disconnect | Disconnects the connection. |
| getGiftManager | Gets the meta informations about all gifts. |
| getRoomInfo | Gets the current room info from TikTok API including streamer info, room status and statistics. |
| Method Name | Description |
|---------------------| ----------- |
| connect | Connects to the live stream. |
| disconnect | Disconnects the connection. |
| getGiftManager | Gets the meta informations about all gifts. |
| getRoomInfo | Gets the current room info from TikTok API including streamer info, room status and statistics. |
| getListenersManager | Gets and manage TikTokEventListeners |
## Events ## Events
A `TikTokLive` object has the following events A `TikTokLive` object has the following events
Events:
- [TikTokUnhandledSocialEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokUnhandledSocialEvent.java) **Message**:
- [TikTokLinkMicFanTicketEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLinkMicFanTicketEvent.java) - [TikTokLinkMicFanTicketEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLinkMicFanTicketEvent.java)
- [TikTokEnvelopeEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokEnvelopeEvent.java) - [TikTokEnvelopeEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokEnvelopeEvent.java)
- [TikTokShopMessageEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokShopMessageEvent.java) - [TikTokShopMessageEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokShopMessageEvent.java)
- [TikTokDetectMessageEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokDetectMessageEvent.java) - [TikTokDetectMessageEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokDetectMessageEvent.java)
- [TikTokLinkLayerMessageEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLinkLayerMessageEvent.java) - [TikTokLinkLayerMessageEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLinkLayerMessageEvent.java)
- [TikTokConnectedEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokConnectedEvent.java)
- [TikTokCaptionEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokCaptionEvent.java) - [TikTokCaptionEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokCaptionEvent.java)
- [TikTokQuestionEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokQuestionEvent.java) - [TikTokQuestionEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokQuestionEvent.java)
- [TikTokRoomPinMessageEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokRoomPinMessageEvent.java) - [TikTokRoomPinMessageEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokRoomPinMessageEvent.java)
- [TikTokRoomMessageEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokRoomMessageEvent.java) - [TikTokRoomMessageEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokRoomMessageEvent.java)
- [TikTokLivePausedEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLivePausedEvent.java)
- [TikTokLikeEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLikeEvent.java)
- [TikTokLinkMessageEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLinkMessageEvent.java) - [TikTokLinkMessageEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLinkMessageEvent.java)
- [TikTokBarrageMessageEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokBarrageMessageEvent.java) - [TikTokBarrageMessageEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokBarrageMessageEvent.java)
- [TikTokGiftMessageEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokGiftMessageEvent.java) - [TikTokGiftMessageEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokGiftMessageEvent.java)
@@ -145,27 +242,39 @@ Events:
- [TikTokUnauthorizedMemberEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokUnauthorizedMemberEvent.java) - [TikTokUnauthorizedMemberEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokUnauthorizedMemberEvent.java)
- [TikTokInRoomBannerEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokInRoomBannerEvent.java) - [TikTokInRoomBannerEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokInRoomBannerEvent.java)
- [TikTokLinkMicMethodEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLinkMicMethodEvent.java) - [TikTokLinkMicMethodEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLinkMicMethodEvent.java)
- [TikTokSubscribeEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokSubscribeEvent.java)
- [TikTokPollMessageEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokPollMessageEvent.java) - [TikTokPollMessageEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokPollMessageEvent.java)
- [TikTokFollowEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokFollowEvent.java)
- [TikTokRoomViewerDataEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokRoomViewerDataEvent.java) - [TikTokRoomViewerDataEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokRoomViewerDataEvent.java)
- [TikTokGoalUpdateEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokGoalUpdateEvent.java) - [TikTokGoalUpdateEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokGoalUpdateEvent.java)
- [TikTokCommentEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokCommentEvent.java) - [TikTokCommentEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokCommentEvent.java)
- [TikTokRankUpdateEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokRankUpdateEvent.java) - [TikTokRankUpdateEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokRankUpdateEvent.java)
- [TikTokIMDeleteEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokIMDeleteEvent.java) - [TikTokIMDeleteEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokIMDeleteEvent.java)
- [TikTokLiveEndedEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLiveEndedEvent.java)
- [TikTokErrorEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokErrorEvent.java)
- [TikTokUnhandledEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokUnhandledEvent.java)
- [TikTokJoinEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokJoinEvent.java)
- [TikTokRankTextEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokRankTextEvent.java) - [TikTokRankTextEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokRankTextEvent.java)
- [TikTokShareEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokShareEvent.java)
- [TikTokUnhandledMemberEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokUnhandledMemberEvent.java) - [TikTokUnhandledMemberEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokUnhandledMemberEvent.java)
- [TikTokSubNotifyEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokSubNotifyEvent.java) - [TikTokSubNotifyEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokSubNotifyEvent.java)
- [TikTokLinkMicBattleEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLinkMicBattleEvent.java) - [TikTokLinkMicBattleEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLinkMicBattleEvent.java)
- [TikTokDisconnectedEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokDisconnectedEvent.java)
- [TikTokGiftBroadcastEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokGiftBroadcastEvent.java) - [TikTokGiftBroadcastEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokGiftBroadcastEvent.java)
- [TikTokUnhandledWebsocketMessageEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokUnhandledWebsocketMessageEvent.java)
**Control**:
- [TikTokConnectedEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokConnectedEvent.java)
- [TikTokReconnectingEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokReconnectingEvent.java)
- [TikTokErrorEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokErrorEvent.java)
- [TikTokDisconnectedEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokDisconnectedEvent.java)
**Custom**:
- [TikTokHeaderEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokHeaderEvent.java)
- [TikTokUnhandledSocialEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokUnhandledSocialEvent.java)
- [TikTokLivePausedEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLivePausedEvent.java)
- [TikTokLikeEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLikeEvent.java)
- [TikTokWebsocketMessageEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokWebsocketMessageEvent.java)
- [TikTokSubscribeEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokSubscribeEvent.java)
- [TikTokFollowEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokFollowEvent.java)
- [TikTokLiveClientEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLiveClientEvent.java)
- [TikTokUnhandledEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokUnhandledEvent.java)
- [TikTokLiveEndedEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLiveEndedEvent.java)
- [TikTokJoinEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokJoinEvent.java)
- [TikTokShareEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokShareEvent.java)
- [TikTokUnhandledControlEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokUnhandledControlEvent.java) - [TikTokUnhandledControlEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokUnhandledControlEvent.java)
- [TikTokEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokEvent.java)
<br><br> <br><br>

View File

@@ -41,7 +41,7 @@
<parent> <parent>
<artifactId>TikTokLiveJava</artifactId> <artifactId>TikTokLiveJava</artifactId>
<groupId>io.github.jwdeveloper.tiktok</groupId> <groupId>io.github.jwdeveloper.tiktok</groupId>
<version>0.0.14-Release</version> <version>0.0.23-Release</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

Some files were not shown because too many files have changed in this diff Show More