mirror of
https://github.com/jwdeveloper/TikTokLiveJava.git
synced 2026-02-28 09:19:40 -05:00
Compare commits
46 Commits
0.0.12-Rel
...
0.0.22-Rel
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6e092dd362 | ||
|
|
bc045d49dc | ||
|
|
e6dcc8f5fd | ||
|
|
d87506da88 | ||
|
|
084e787838 | ||
|
|
ff9e75505d | ||
|
|
08379994fd | ||
|
|
cc871c70f6 | ||
|
|
32294cc3ec | ||
|
|
cea19abda7 | ||
|
|
30117917de | ||
|
|
11da8bf009 | ||
|
|
97f57912ad | ||
|
|
e2ccfee399 | ||
|
|
edba573ecc | ||
|
|
d61697dbff | ||
|
|
daf8242f6e | ||
|
|
4a157143ec | ||
|
|
defebc92ce | ||
|
|
c267392888 | ||
|
|
818c4cb364 | ||
|
|
911e2b12a5 | ||
|
|
1aff710523 | ||
|
|
c0f8e6d904 | ||
|
|
b059afd621 | ||
|
|
1275878822 | ||
|
|
761f3ab633 | ||
|
|
66def92316 | ||
|
|
cc85d7c124 | ||
|
|
384cfade5a | ||
|
|
483dceadcf | ||
|
|
5f8cba5126 | ||
|
|
f9966c9a5f | ||
|
|
48a79736ad | ||
|
|
eb82d0df78 | ||
|
|
4ed821925d | ||
|
|
6e9244aa67 | ||
|
|
fadb1ab267 | ||
|
|
4273375eb9 | ||
|
|
3daeee6316 | ||
|
|
cde38df1b3 | ||
|
|
15d6351d65 | ||
|
|
44ba999b83 | ||
|
|
5cf0d30962 | ||
|
|
71ebc6e05e | ||
|
|
c6d09927a0 |
9
.github/workflows/maven-publish.yml
vendored
9
.github/workflows/maven-publish.yml
vendored
@@ -1,4 +1,4 @@
|
|||||||
name: Publish Artifacts
|
name: Publish New Version
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
@@ -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
|
||||||
|
|||||||
142
.gitignore
vendored
142
.gitignore
vendored
@@ -1,3 +1,143 @@
|
|||||||
# Project exclude paths
|
# Project exclude paths
|
||||||
/API/target/
|
/API/target/
|
||||||
/Client/target/
|
/Client/target/
|
||||||
|
*.db
|
||||||
|
|
||||||
|
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
|
||||||
|
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||||
|
|
||||||
|
# User-specific stuff
|
||||||
|
.idea/**/workspace.xml
|
||||||
|
.idea/**/tasks.xml
|
||||||
|
.idea/**/usage.statistics.xml
|
||||||
|
.idea/**/dictionaries
|
||||||
|
.idea/**/shelf
|
||||||
|
|
||||||
|
# AWS User-specific
|
||||||
|
.idea/**/aws.xml
|
||||||
|
|
||||||
|
# Generated files
|
||||||
|
.idea/**/contentModel.xml
|
||||||
|
|
||||||
|
# Sensitive or high-churn files
|
||||||
|
.idea/**/dataSources/
|
||||||
|
.idea/**/dataSources.ids
|
||||||
|
.idea/**/dataSources.local.xml
|
||||||
|
.idea/**/sqlDataSources.xml
|
||||||
|
.idea/**/dynamic.xml
|
||||||
|
.idea/**/uiDesigner.xml
|
||||||
|
.idea/**/dbnavigator.xml
|
||||||
|
|
||||||
|
# Gradle
|
||||||
|
.idea/**/gradle.xml
|
||||||
|
.idea/**/libraries
|
||||||
|
|
||||||
|
# Gradle and Maven with auto-import
|
||||||
|
# When using Gradle or Maven with auto-import, you should exclude module files,
|
||||||
|
# since they will be recreated, and may cause churn. Uncomment if using
|
||||||
|
# auto-import.
|
||||||
|
# .idea/artifacts
|
||||||
|
# .idea/compiler.xml
|
||||||
|
# .idea/jarRepositories.xml
|
||||||
|
# .idea/modules.xml
|
||||||
|
# .idea/*.iml
|
||||||
|
# .idea/modules
|
||||||
|
# *.iml
|
||||||
|
# *.ipr
|
||||||
|
|
||||||
|
# CMake
|
||||||
|
cmake-build-*/
|
||||||
|
|
||||||
|
# Mongo Explorer plugin
|
||||||
|
.idea/**/mongoSettings.xml
|
||||||
|
|
||||||
|
# File-based project format
|
||||||
|
*.iws
|
||||||
|
|
||||||
|
# IntelliJ
|
||||||
|
out/
|
||||||
|
|
||||||
|
# mpeltonen/sbt-idea plugin
|
||||||
|
.idea_modules/
|
||||||
|
|
||||||
|
# JIRA plugin
|
||||||
|
atlassian-ide-plugin.xml
|
||||||
|
|
||||||
|
# Cursive Clojure plugin
|
||||||
|
.idea/replstate.xml
|
||||||
|
|
||||||
|
# SonarLint plugin
|
||||||
|
.idea/sonarlint/
|
||||||
|
|
||||||
|
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||||
|
com_crashlytics_export_strings.xml
|
||||||
|
crashlytics.properties
|
||||||
|
crashlytics-build.properties
|
||||||
|
fabric.properties
|
||||||
|
|
||||||
|
# Editor-based Rest Client
|
||||||
|
.idea/httpRequests
|
||||||
|
|
||||||
|
# Android studio 3.1+ serialized cache file
|
||||||
|
.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
|
||||||
|
|||||||
@@ -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.11-Release</version>
|
<version>0.0.21-Release</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>API</artifactId>
|
<artifactId>API</artifactId>
|
||||||
|
|||||||
@@ -3,67 +3,75 @@ 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
|
* Tiktok user name
|
||||||
/// </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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
package io.github.jwdeveloper.tiktok.annotations;
|
|
||||||
|
|
||||||
public @interface Nullable {
|
|
||||||
}
|
|
||||||
@@ -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
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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() {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
package io.github.jwdeveloper.tiktok.events;
|
package io.github.jwdeveloper.tiktok.events;
|
||||||
|
|
||||||
import io.github.jwdeveloper.tiktok.events.messages.*;
|
import io.github.jwdeveloper.tiktok.events.messages.*;
|
||||||
import java.util.function.Consumer;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public interface TikTokEventBuilder<T> {
|
public interface TikTokEventBuilder<T> {
|
||||||
@@ -68,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);
|
||||||
|
|
||||||
@@ -89,6 +87,9 @@ public interface TikTokEventBuilder<T> {
|
|||||||
T onUnhandledControl(TikTokEventConsumer<TikTokUnhandledControlEvent> event);
|
T onUnhandledControl(TikTokEventConsumer<TikTokUnhandledControlEvent> event);
|
||||||
|
|
||||||
T onEvent(TikTokEventConsumer<TikTokEvent> event);
|
T onEvent(TikTokEventConsumer<TikTokEvent> event);
|
||||||
|
|
||||||
|
T onWebsocketMessage(TikTokEventConsumer<TikTokWebsocketMessageEvent> event);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package io.github.jwdeveloper.tiktok.events.base;
|
||||||
|
|
||||||
|
import io.github.jwdeveloper.tiktok.events.TikTokEvent;
|
||||||
|
|
||||||
|
|
||||||
|
public class TikTokLiveClientEvent extends TikTokEvent {
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -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(),
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());;
|
||||||
|
|||||||
@@ -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 {
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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());;
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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 {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
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.messages.WebcastResponse;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Happens when TikTok websocket receive message from server
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
@AllArgsConstructor
|
||||||
|
@EventMeta(eventType = EventType.Custom)
|
||||||
|
public class TikTokWebsocketMessageEvent extends TikTokEvent
|
||||||
|
{
|
||||||
|
private TikTokEvent event;
|
||||||
|
|
||||||
|
private WebcastResponse.Message message;
|
||||||
|
}
|
||||||
@@ -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>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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>();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -21,13 +21,18 @@ public class TikTokLiveMessageException extends TikTokLiveException {
|
|||||||
this.webcastResponse = webcastResponse;
|
this.webcastResponse = webcastResponse;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void messageToBase64()
|
public String messageName()
|
||||||
{
|
{
|
||||||
var decoded = Base64.getEncoder().encodeToString(webcastMessage.getBinary().toByteArray());
|
return webcastMessage.getType();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void webcastResponseToBase64()
|
public String messageToBase64()
|
||||||
{
|
{
|
||||||
var decoded = Base64.getEncoder().encodeToString(webcastResponse.toByteArray());
|
return Base64.getEncoder().encodeToString(webcastMessage.getBinary().toByteArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
public String webcastResponseToBase64()
|
||||||
|
{
|
||||||
|
return Base64.getEncoder().encodeToString(webcastResponse.toByteArray());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package io.github.jwdeveloper.tiktok.live;
|
|||||||
public interface LiveRoomInfo
|
public interface LiveRoomInfo
|
||||||
{
|
{
|
||||||
int getViewersCount();
|
int getViewersCount();
|
||||||
|
|
||||||
String getRoomId();
|
String getRoomId();
|
||||||
String getUserName();
|
String getUserName();
|
||||||
|
ConnectionState getConnectionState();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,38 @@
|
|||||||
|
package io.github.jwdeveloper.tiktok.utils;
|
||||||
|
|
||||||
|
import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException;
|
||||||
|
|
||||||
|
public class CancelationToken
|
||||||
|
{
|
||||||
|
private boolean isCanceled =false;
|
||||||
|
|
||||||
|
public void cancel()
|
||||||
|
{
|
||||||
|
isCanceled =true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isCancel()
|
||||||
|
{
|
||||||
|
|
||||||
|
return isCanceled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void throwIfCancel()
|
||||||
|
{
|
||||||
|
if(!isCanceled)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
throw new TikTokLiveException("Token requested cancelation");
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isNotCancel()
|
||||||
|
{
|
||||||
|
return !isCancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static CancelationToken create()
|
||||||
|
{
|
||||||
|
return new CancelationToken();
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -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.11-Release</version>
|
<version>0.0.21-Release</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
@@ -29,6 +29,23 @@
|
|||||||
<artifactId>protobuf-java</artifactId>
|
<artifactId>protobuf-java</artifactId>
|
||||||
<version>3.24.1</version>
|
<version>3.24.1</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.slf4j</groupId>
|
||||||
|
<artifactId>slf4j-simple</artifactId>
|
||||||
|
<version>2.0.7</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.java-websocket</groupId>
|
||||||
|
<artifactId>Java-WebSocket</artifactId>
|
||||||
|
<version>1.5.4</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.slf4j</groupId>
|
||||||
|
<artifactId>slf4j-simple</artifactId>
|
||||||
|
<version>2.0.7</version>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,8 +4,10 @@ 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.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 +19,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,8 +76,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 +85,9 @@ public class TikTokLiveClient implements LiveClient {
|
|||||||
logger.info("Connecting");
|
logger.info("Connecting");
|
||||||
setState(ConnectionState.CONNECTING);
|
setState(ConnectionState.CONNECTING);
|
||||||
|
|
||||||
var roomId = apiClient.fetchRoomId(liveRoomInfo.getUserName());
|
var roomId = apiService.fetchRoomId(liveRoomInfo.getUserName());
|
||||||
liveRoomInfo.setRoomId(roomId);
|
liveRoomInfo.setRoomId(roomId);
|
||||||
var roomData = apiClient.fetchRoomInfo();
|
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 +95,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 +107,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() {
|
||||||
|
|||||||
@@ -5,16 +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.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;
|
||||||
@@ -22,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,20 +82,28 @@ public class TikTokLiveClientBuilder implements TikTokEventBuilder<TikTokLiveCli
|
|||||||
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);
|
||||||
var webSocketClient = new TikTokWebSocketClient(logger,
|
var webSocketClient = new TikTokWebSocketClient(logger,
|
||||||
cookieJar,
|
cookieJar,
|
||||||
requestFactory,
|
|
||||||
clientSettings,
|
clientSettings,
|
||||||
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() {
|
||||||
@@ -260,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -319,6 +338,12 @@ public class TikTokLiveClientBuilder implements TikTokEventBuilder<TikTokLiveCli
|
|||||||
tikTokEventHandler.subscribe(TikTokEvent.class, event);
|
tikTokEventHandler.subscribe(TikTokEvent.class, event);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TikTokLiveClientBuilder onWebsocketMessage(TikTokEventConsumer<TikTokWebsocketMessageEvent> event) {
|
||||||
|
tikTokEventHandler.subscribe(TikTokWebsocketMessageEvent.class, event);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,7 +6,8 @@ import io.github.jwdeveloper.tiktok.ClientSettings;
|
|||||||
import io.github.jwdeveloper.tiktok.TikTokLiveClient;
|
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.TikTokUnhandledEvent;
|
import io.github.jwdeveloper.tiktok.events.messages.TikTokWebsocketMessageEvent;
|
||||||
|
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;
|
||||||
@@ -22,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;
|
||||||
@@ -64,11 +65,12 @@ 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());
|
||||||
var tiktokEvent = handler.handle(message);
|
var tiktokEvent = handler.handle(message);
|
||||||
|
tikTokEventHandler.publish(client, new TikTokWebsocketMessageEvent(tiktokEvent, message));
|
||||||
tikTokEventHandler.publish(client, tiktokEvent);
|
tikTokEventHandler.publish(client, tiktokEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
@@ -33,8 +30,8 @@ public class TikTokMessageHandlerRegistration extends TikTokMessageHandler {
|
|||||||
public void init() {
|
public void init() {
|
||||||
|
|
||||||
//ConnectionEvents events
|
//ConnectionEvents events
|
||||||
register(WebcastControlMessage.class, TikTokRoomMessageEvent.class);
|
register(WebcastControlMessage.class, this::handleWebcastControlMessage);
|
||||||
register(SystemMessage.class, this::handleWebcastControlMessage);
|
register(SystemMessage.class,TikTokRoomMessageEvent.class);
|
||||||
|
|
||||||
|
|
||||||
//Room status events
|
//Room status events
|
||||||
@@ -105,16 +102,17 @@ public class TikTokMessageHandlerRegistration extends TikTokMessageHandler {
|
|||||||
private TikTokEvent handleSocialMedia(WebcastResponse.Message msg) {
|
private TikTokEvent handleSocialMedia(WebcastResponse.Message msg) {
|
||||||
var message = WebcastSocialMessage.parseFrom(msg.getBinary());
|
var message = WebcastSocialMessage.parseFrom(msg.getBinary());
|
||||||
|
|
||||||
String type = message.getHeader().getSocialData().getType();
|
var socialType = message.getHeader().getSocialData().getType();
|
||||||
Pattern pattern = Pattern.compile("\\d+");
|
var pattern = Pattern.compile("pm_mt_guidance_viewer_([0-9]+)_share");
|
||||||
Matcher matcher = pattern.matcher(type);
|
var matcher = pattern.matcher(socialType);
|
||||||
if (matcher.find()) {
|
|
||||||
var value = matcher.group(0);
|
if (matcher.find())
|
||||||
|
{
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
var socialType = message.getHeader().getSocialData().getType();
|
|
||||||
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);
|
||||||
|
|||||||
@@ -2,11 +2,12 @@ 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.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 +16,96 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (sessionId) {
|
||||||
|
// Update sessionId
|
||||||
|
this.#options.sessionId = sessionId;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this.#options.sessionId) {
|
||||||
|
throw new Error('Missing SessionId. Please provide your current SessionId to use this feature.');
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Retrieve current room_id if not connected
|
||||||
|
if (!this.#isConnected) {
|
||||||
|
await this.#retrieveRoomId();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add the session cookie to the CookieJar
|
||||||
|
this.#httpClient.setSessionId(this.#options.sessionId);
|
||||||
|
|
||||||
|
// Submit the chat request
|
||||||
|
let requestParams = { ...this.#clientParams, content: text };
|
||||||
|
let response = await this.#httpClient.postFormDataToWebcastApi('room/chat/', requestParams, null);
|
||||||
|
|
||||||
|
// Success?
|
||||||
|
if (response?.status_code === 0) {
|
||||||
|
return response.data;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle errors
|
||||||
|
switch (response?.status_code) {
|
||||||
|
case 20003:
|
||||||
|
throw new Error('Your SessionId has expired. Please provide a new one.');
|
||||||
|
default:
|
||||||
|
throw new Error(`TikTok responded with status code ${response?.status_code}: ${response?.data?.message}`);
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
throw new Error(`Failed to send chat message. ${err.message}`);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
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 +117,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,7 +125,7 @@ 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")) {
|
if (!response.has("data")) {
|
||||||
return new LiveRoomMeta();
|
return new LiveRoomMeta();
|
||||||
}
|
}
|
||||||
@@ -77,48 +140,42 @@ public class TikTokApiService {
|
|||||||
var info = new LiveRoomMeta();
|
var info = new LiveRoomMeta();
|
||||||
info.setStatus(status.getAsInt());
|
info.setStatus(status.getAsInt());
|
||||||
|
|
||||||
logger.info("RoomInfo status -> "+info.getStatus());
|
logger.info("RoomInfo status -> " + info.getStatus());
|
||||||
return info;
|
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) {
|
||||||
|
|||||||
@@ -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,16 +108,16 @@ 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>();
|
||||||
singHeaders.put("client", "ttlive-net");
|
singHeaders.put("client", "ttlive-java");
|
||||||
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 {
|
||||||
@@ -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,13 +34,8 @@ 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) {
|
if (query != null) {
|
||||||
@@ -49,22 +44,35 @@ public class TikTokHttpRequestFactory implements TikTokHttpRequest {
|
|||||||
request.uri(requestUri);
|
request.uri(requestUri);
|
||||||
}
|
}
|
||||||
|
|
||||||
return GetContent(request.build());
|
return getContent(request.build());
|
||||||
}
|
}
|
||||||
|
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
public String Post(String url, HttpRequest.BodyPublisher data) {
|
public String post(String url) {
|
||||||
var uri = URI.create(url);
|
var uri = URI.create(url);
|
||||||
var request = HttpRequest.newBuilder().POST(data);
|
var request = HttpRequest.newBuilder().POST(HttpRequest.BodyPublishers.ofString(""));
|
||||||
for (var header : defaultHeaders.entrySet()) {
|
for (var header : defaultHeaders.entrySet())
|
||||||
|
{
|
||||||
|
if(header.getKey().equals("Connection"))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
request.setHeader(header.getKey(), header.getValue());
|
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) {
|
if (query != null) {
|
||||||
var baseUri = uri.toString();
|
var baseUri = uri.toString();
|
||||||
var requestUri = URI.create(baseUri + "?" + query);
|
var requestUri = URI.create(baseUri + "?" + query);
|
||||||
request.uri(requestUri);
|
request.uri(requestUri);
|
||||||
|
System.out.println(requestUri.toString());
|
||||||
}
|
}
|
||||||
return GetContent(request.build());
|
|
||||||
|
|
||||||
|
|
||||||
|
return getContent(request.build());
|
||||||
}
|
}
|
||||||
|
|
||||||
public TikTokHttpRequest setHeader(String key, String value) {
|
public TikTokHttpRequest setHeader(String key, String value) {
|
||||||
@@ -77,10 +85,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 +104,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");
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -0,0 +1,88 @@
|
|||||||
|
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 = 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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 java.net.URI;
|
import java.net.URI;
|
||||||
import java.net.http.WebSocket;
|
|
||||||
import java.time.Duration;
|
|
||||||
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;
|
||||||
@@ -23,24 +21,21 @@ public class TikTokWebSocketClient {
|
|||||||
private final Logger logger;
|
private final Logger logger;
|
||||||
private final ClientSettings clientSettings;
|
private final ClientSettings clientSettings;
|
||||||
private final TikTokCookieJar tikTokCookieJar;
|
private final TikTokCookieJar tikTokCookieJar;
|
||||||
private final TikTokHttpRequestFactory factory;
|
|
||||||
private final TikTokMessageHandlerRegistration webResponseHandler;
|
private final TikTokMessageHandlerRegistration webResponseHandler;
|
||||||
private final TikTokEventHandler tikTokEventHandler;
|
private final TikTokEventObserver tikTokEventHandler;
|
||||||
|
private WebSocketClient webSocketClient;
|
||||||
private WebSocket webSocket;
|
|
||||||
private boolean isConnected;
|
|
||||||
private TikTokLiveClient tikTokLiveClient;
|
private TikTokLiveClient tikTokLiveClient;
|
||||||
|
private TikTokWebSocketPingingTask pingingTask;
|
||||||
|
private boolean isConnected;
|
||||||
|
|
||||||
public TikTokWebSocketClient(Logger logger,
|
public TikTokWebSocketClient(Logger logger,
|
||||||
TikTokCookieJar tikTokCookieJar,
|
TikTokCookieJar tikTokCookieJar,
|
||||||
TikTokHttpRequestFactory factory,
|
|
||||||
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;
|
||||||
this.factory = factory;
|
|
||||||
this.webResponseHandler = webResponseHandler;
|
this.webResponseHandler = webResponseHandler;
|
||||||
this.tikTokEventHandler = tikTokEventHandler;
|
this.tikTokEventHandler = tikTokEventHandler;
|
||||||
isConnected = false;
|
isConnected = false;
|
||||||
@@ -56,13 +51,19 @@ public class TikTokWebSocketClient {
|
|||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
var url = getWebSocketUrl(webcastResponse);
|
var url = getWebSocketUrl(webcastResponse);
|
||||||
if (clientSettings.isHandleExistingMessagesOnConnect())
|
if (clientSettings.isHandleExistingMessagesOnConnect()) {
|
||||||
{
|
|
||||||
logger.info("Handling existing messages");
|
logger.info("Handling existing messages");
|
||||||
webResponseHandler.handle(tikTokLiveClient, webcastResponse);
|
webResponseHandler.handle(tikTokLiveClient, webcastResponse);
|
||||||
}
|
}
|
||||||
webSocket = startWebSocket(url);
|
webSocketClient = startWebSocket(url);
|
||||||
} catch (Exception e) {
|
webSocketClient.connect();
|
||||||
|
|
||||||
|
pingingTask = new TikTokWebSocketPingingTask();
|
||||||
|
pingingTask.run(webSocketClient);
|
||||||
|
isConnected = true;
|
||||||
|
} catch (Exception e)
|
||||||
|
{
|
||||||
|
isConnected =false;
|
||||||
throw new TikTokLiveException("Failed to connect to the websocket", e);
|
throw new TikTokLiveException("Failed to connect to the websocket", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -82,20 +83,26 @@ public class TikTokWebSocketClient {
|
|||||||
return HttpUtils.parseParametersEncode(url, clone);
|
return HttpUtils.parseParametersEncode(url, clone);
|
||||||
}
|
}
|
||||||
|
|
||||||
private WebSocket startWebSocket(String url) throws Exception {
|
private WebSocketClient startWebSocket(String url) {
|
||||||
var cookie = tikTokCookieJar.parseCookies();
|
var cookie = tikTokCookieJar.parseCookies();
|
||||||
var map = new HashMap<String, String>();
|
var map = new HashMap<String, String>();
|
||||||
map.put("Cookie", cookie);
|
map.put("Cookie", cookie);
|
||||||
return factory.openSocket()
|
return new TikTokWebSocketListener(URI.create(url),
|
||||||
.subprotocols("echo-protocol")
|
map,
|
||||||
.connectTimeout(Duration.ofSeconds(15))
|
3000,
|
||||||
.header("Cookie", cookie)
|
webResponseHandler,
|
||||||
.buildAsync(URI.create(url), new TikTokWebSocketListener(webResponseHandler, tikTokEventHandler, tikTokLiveClient)).get();
|
tikTokEventHandler,
|
||||||
|
tikTokLiveClient);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void stop() {
|
public void stop()
|
||||||
if (isConnected && webSocket != null) {
|
{
|
||||||
webSocket.sendClose(WebSocket.NORMAL_CLOSURE, "ok");
|
if (isConnected && webSocketClient != null)
|
||||||
|
{
|
||||||
|
webSocketClient.closeConnection(0,"");
|
||||||
}
|
}
|
||||||
|
webSocketClient = null;
|
||||||
|
pingingTask = null;
|
||||||
|
isConnected = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,82 +1,89 @@
|
|||||||
package io.github.jwdeveloper.tiktok.websocket;
|
package io.github.jwdeveloper.tiktok.websocket;
|
||||||
|
|
||||||
|
|
||||||
import com.google.protobuf.ByteString;
|
import com.google.protobuf.ByteString;
|
||||||
import io.github.jwdeveloper.tiktok.TikTokLiveClient;
|
import io.github.jwdeveloper.tiktok.TikTokLiveClient;
|
||||||
import io.github.jwdeveloper.tiktok.events.messages.TikTokConnectedEvent;
|
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;
|
||||||
import io.github.jwdeveloper.tiktok.messages.WebcastWebsocketMessage;
|
import io.github.jwdeveloper.tiktok.messages.WebcastWebsocketMessage;
|
||||||
|
import org.java_websocket.client.WebSocketClient;
|
||||||
|
import org.java_websocket.drafts.Draft_6455;
|
||||||
|
import org.java_websocket.handshake.ServerHandshake;
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.net.URI;
|
||||||
import java.net.http.WebSocket;
|
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.concurrent.CompletionStage;
|
|
||||||
|
|
||||||
|
public class TikTokWebSocketListener extends WebSocketClient {
|
||||||
|
|
||||||
public class TikTokWebSocketListener implements java.net.http.WebSocket.Listener {
|
|
||||||
|
|
||||||
private final ByteArrayOutputStream accumulatedData = new ByteArrayOutputStream();
|
|
||||||
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(TikTokMessageHandlerRegistration webResponseHandler,
|
public TikTokWebSocketListener(URI serverUri,
|
||||||
TikTokEventHandler tikTokEventHandler,
|
Map<String, String> httpHeaders,
|
||||||
|
int connectTimeout,
|
||||||
|
TikTokMessageHandlerRegistration webResponseHandler,
|
||||||
|
TikTokEventObserver tikTokEventHandler,
|
||||||
TikTokLiveClient tikTokLiveClient) {
|
TikTokLiveClient tikTokLiveClient) {
|
||||||
|
super(serverUri, new Draft_6455(), httpHeaders,connectTimeout);
|
||||||
this.webResponseHandler = webResponseHandler;
|
this.webResponseHandler = webResponseHandler;
|
||||||
this.tikTokEventHandler = tikTokEventHandler;
|
this.tikTokEventHandler = tikTokEventHandler;
|
||||||
this.tikTokLiveClient = tikTokLiveClient;
|
this.tikTokLiveClient = tikTokLiveClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletionStage<?> onBinary(WebSocket webSocket, ByteBuffer data, boolean last) {
|
public void onOpen(ServerHandshake serverHandshake) {
|
||||||
|
tikTokEventHandler.publish(tikTokLiveClient,new TikTokConnectedEvent());
|
||||||
|
if(isNotClosing())
|
||||||
|
{
|
||||||
|
sendPing();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onMessage(ByteBuffer bytes)
|
||||||
|
{
|
||||||
try {
|
try {
|
||||||
var bytes = new byte[data.remaining()];
|
handleBinary(bytes.array());
|
||||||
data.get(bytes);
|
|
||||||
accumulatedData.write(bytes);
|
|
||||||
if (last) {
|
|
||||||
handleBinary(webSocket, accumulatedData.toByteArray());
|
|
||||||
accumulatedData.reset();
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
tikTokEventHandler.publish(tikTokLiveClient, new TikTokErrorEvent(e));
|
tikTokEventHandler.publish(tikTokLiveClient, new TikTokErrorEvent(e));
|
||||||
}
|
}
|
||||||
webSocket.request(1);
|
if(isNotClosing())
|
||||||
return null;
|
{
|
||||||
|
sendPing();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onOpen(java.net.http.WebSocket webSocket) {
|
public void onClose(int i, String s, boolean b) {
|
||||||
tikTokEventHandler.publish(tikTokLiveClient,new TikTokConnectedEvent());
|
|
||||||
webSocket.request(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onError(java.net.http.WebSocket webSocket, Throwable error) {
|
|
||||||
tikTokEventHandler.publish(tikTokLiveClient,new TikTokErrorEvent(error));
|
|
||||||
webSocket.request(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public CompletionStage<?> onClose(java.net.http.WebSocket webSocket, int statusCode, String reason) {
|
|
||||||
tikTokEventHandler.publish(tikTokLiveClient,new TikTokDisconnectedEvent());
|
tikTokEventHandler.publish(tikTokLiveClient,new TikTokDisconnectedEvent());
|
||||||
return java.net.http.WebSocket.Listener.super.onClose(webSocket, statusCode, reason);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleBinary(WebSocket webSocket, byte[] buffer) {
|
@Override
|
||||||
|
public void onError(Exception error) {
|
||||||
|
tikTokEventHandler.publish(tikTokLiveClient,new TikTokErrorEvent(error));
|
||||||
|
if(isNotClosing())
|
||||||
|
{
|
||||||
|
sendPing();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void handleBinary(byte[] buffer) {
|
||||||
var websocketMessageOptional = getWebcastWebsocketMessage(buffer);
|
var websocketMessageOptional = getWebcastWebsocketMessage(buffer);
|
||||||
if (websocketMessageOptional.isEmpty()) {
|
if (websocketMessageOptional.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var websocketMessage = websocketMessageOptional.get();
|
var websocketMessage = websocketMessageOptional.get();
|
||||||
sendAckId(webSocket, websocketMessage.getId());
|
sendAckId(websocketMessage.getId());
|
||||||
|
|
||||||
var webResponse = getWebResponseMessage(websocketMessage.getBinary());
|
var webResponse = getWebResponseMessage(websocketMessage.getBinary());
|
||||||
webResponseHandler.handle(tikTokLiveClient, webResponse);
|
webResponseHandler.handle(tikTokLiveClient, webResponse);
|
||||||
@@ -102,25 +109,29 @@ public class TikTokWebSocketListener implements java.net.http.WebSocket.Listener
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void pingTask(WebSocket webSocket) throws InterruptedException {
|
private boolean isNotClosing()
|
||||||
while (true) {
|
{
|
||||||
byte[] message = new byte[]{58, 2, 104, 98};
|
return !isClosed() && !isClosing();
|
||||||
ByteBuffer buffer = ByteBuffer.wrap(message);
|
|
||||||
while (buffer.hasRemaining()) {
|
|
||||||
webSocket.sendPing(buffer);
|
|
||||||
}
|
|
||||||
buffer.clear();
|
|
||||||
Thread.sleep(10);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sendAckId(WebSocket webSocket, long id) {
|
|
||||||
|
|
||||||
|
private void sendAckId(long id) {
|
||||||
var serverInfo = WebcastWebsocketAck
|
var serverInfo = WebcastWebsocketAck
|
||||||
.newBuilder()
|
.newBuilder()
|
||||||
.setType("ack")
|
.setType("ack")
|
||||||
.setId(id)
|
.setId(id)
|
||||||
.build();
|
.build();
|
||||||
webSocket.sendBinary(serverInfo.toByteString().asReadOnlyByteBuffer(), true);
|
if(isNotClosing())
|
||||||
|
{
|
||||||
|
send(serverInfo.toByteString().asReadOnlyByteBuffer());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onMessage(String s) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,58 @@
|
|||||||
|
package io.github.jwdeveloper.tiktok.websocket;
|
||||||
|
|
||||||
|
import org.java_websocket.WebSocket;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class TikTokWebSocketPingingTask
|
||||||
|
{
|
||||||
|
private Thread thread;
|
||||||
|
|
||||||
|
private boolean isRunning = false;
|
||||||
|
private final int MIN_TIMEOUT = 5;
|
||||||
|
private final int MAX_TIMEOUT = 100;
|
||||||
|
|
||||||
|
|
||||||
|
public void run(WebSocket webSocket)
|
||||||
|
{
|
||||||
|
var thread = new Thread(() ->
|
||||||
|
{
|
||||||
|
pingTask(webSocket);
|
||||||
|
});
|
||||||
|
isRunning =true;
|
||||||
|
thread.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stop()
|
||||||
|
{
|
||||||
|
if(thread != null)
|
||||||
|
{
|
||||||
|
thread.interrupt();
|
||||||
|
}
|
||||||
|
isRunning = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void pingTask(WebSocket webSocket)
|
||||||
|
{
|
||||||
|
var random = new Random();
|
||||||
|
while (isRunning)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if(!webSocket.isOpen())
|
||||||
|
{
|
||||||
|
Thread.sleep(100);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
webSocket.sendPing();
|
||||||
|
var timeout = random.nextInt(MAX_TIMEOUT)+MIN_TIMEOUT;
|
||||||
|
Thread.sleep(timeout);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
isRunning = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -40,4 +40,10 @@ public class ParseMessagesTests extends TikTokBaseTest
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void ShouldParseMessageWebcastMemberMessage() throws InvalidProtocolBufferException {
|
||||||
|
var bytes = getFileBytesUtf("WebcastMemberMessage.bin");
|
||||||
|
var message = WebcastMemberMessage.parseFrom(bytes);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
1
Client/src/test/resources/WebcastMemberMessage.bin
Normal file
1
Client/src/test/resources/WebcastMemberMessage.bin
Normal file
File diff suppressed because one or more lines are too long
3
FUNDING.yml
Normal file
3
FUNDING.yml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
github: [jwdeveloper]
|
||||||
|
patreon: jwdeveloper
|
||||||
|
custom: ["https://www.buymeacoffee.com/jwdev"]
|
||||||
252
README.md
252
README.md
@@ -1,12 +1,13 @@
|
|||||||
[](https://jitpack.io/#jwdeveloper/TikTok-Live-Java)
|
[](https://jitpack.io/#jwdeveloper/TikTok-Live-Java)
|
||||||
|
|
||||||
|
|
||||||
# TikTok-Live-Java
|
# TikTokLive Java
|
||||||
A Java library based on [TikTok-Connector](https://github.com/isaackogan/TikTok-Live-Connector) and [TikTokLiveSharp](https://github.com/sebheron/TikTokLiveSharp). Use it to receive live stream events such as comments and gifts in realtime from [TikTok LIVE](https://www.tiktok.com/live) by connecting to TikTok's internal WebCast push service. The package includes a wrapper that connects to the WebCast service using just the username (`uniqueId`). This allows you to connect to your own live chat as well as the live chat of other streamers. No credentials are required. Besides [Chat Comments](#chat), other events such as [Members Joining](#member), [Gifts](#gift), [Subscriptions](#subscribe), [Viewers](#roomuser), [Follows](#social), [Shares](#social), [Questions](#questionnew), [Likes](#like) and [Battles](#linkmicbattle) can be tracked. You can also send [automatic messages](#send-chat-messages) into the chat by providing your Session ID.
|
A Java library based on [TikTokLive](https://github.com/isaackogan/TikTokLive) and [TikTokLiveSharp](https://github.com/sebheron/TikTokLiveSharp). Use it to receive live stream events such as comments and gifts in realtime from [TikTok LIVE](https://www.tiktok.com/live) by connecting to TikTok's internal WebCast push service. The package includes a wrapper that connects to the WebCast service using just the username (`uniqueId`). This allows you to connect to your own live chat as well as the live chat of other streamers. No credentials are required. Besides [Chat Comments](#chat), other events such as [Members Joining](#member), [Gifts](#gift), [Subscriptions](#subscribe), [Viewers](#roomuser), [Follows](#social), [Shares](#social), [Questions](#questionnew), [Likes](#like) and [Battles](#linkmicbattle) can be tracked. You can also send [automatic messages](#send-chat-messages) into the chat by providing your Session ID.
|
||||||
|
|
||||||
|
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 [@isaackogan](https://github.com/isaackogan)
|
- **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)
|
||||||
@@ -15,130 +16,232 @@ Do you prefer other programming languages?
|
|||||||
|
|
||||||
#### Overview
|
#### Overview
|
||||||
- [Getting started](#getting-started)
|
- [Getting started](#getting-started)
|
||||||
- [Params and options](#params-and-options)
|
- [Configuration](#configuration)
|
||||||
- [Methods](#methods)
|
- [Methods](#methods)
|
||||||
- [Events](#events)
|
- [Events](#events)
|
||||||
- [Examples](#examples)
|
|
||||||
- [Contributing](#contributing)
|
- [Contributing](#contributing)
|
||||||
|
|
||||||
## Getting started
|
## Getting started
|
||||||
|
|
||||||
1. Install the package via Maven
|
1. Install the package via Maven
|
||||||
|
|
||||||
```xml
|
```xml
|
||||||
<repositories>
|
<repositories>
|
||||||
<repository>
|
<repository>
|
||||||
<id>jitpack.io</id>
|
<id>jitpack.io</id>
|
||||||
<url>https://jitpack.io</url>
|
<url>https://jitpack.io</url>
|
||||||
</repository>
|
</repository>
|
||||||
</repositories>
|
</repositories>
|
||||||
```
|
|
||||||
|
|
||||||
```xml
|
<dependencies>
|
||||||
<dependencies>
|
<dependency>
|
||||||
<dependency>
|
<groupId>com.github.jwdeveloper.TikTok-Live-Java</groupId>
|
||||||
<groupId>com.google.protobuf</groupId>
|
<artifactId>Client</artifactId>
|
||||||
<artifactId>protobuf-java</artifactId>
|
<version>0.0.20-Release</version>
|
||||||
<version>3.24.1</version>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
<dependency>
|
<groupId>com.google.code.gson</groupId>
|
||||||
<groupId>com.google.code.gson</groupId>
|
<artifactId>gson</artifactId>
|
||||||
<artifactId>gson</artifactId>
|
<version>2.10.1</version>
|
||||||
<version>2.10.1</version>
|
</dependency>
|
||||||
</dependency>
|
</dependencies>
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.github.jwdeveloper</groupId>
|
|
||||||
<artifactId>TikTok-Live-Java</artifactId>
|
|
||||||
<version>0.0.11-Release</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
```
|
```
|
||||||
|
|
||||||
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 {
|
||||||
.onConnected(event ->
|
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) ->
|
||||||
{
|
{
|
||||||
System.out.println("Connected");
|
System.out.println("Connected");
|
||||||
})
|
})
|
||||||
.onJoin(event ->
|
.onJoin((client, event) ->
|
||||||
{
|
{
|
||||||
System.out.println("User joined -> " + event.getUser().getNickName());
|
System.out.println("User joined -> " + event.getUser().getNickName());
|
||||||
})
|
})
|
||||||
.onComment(event ->
|
.onComment((client, event) ->
|
||||||
{
|
{
|
||||||
System.out.println(event.getUser().getUniqueId() + ": " + event.getText());
|
System.out.println(event.getUser().getUniqueId() + ": " + event.getText());
|
||||||
})
|
})
|
||||||
.onError(event ->
|
.onEvent((client, event) ->
|
||||||
|
{
|
||||||
|
System.out.println("Viewers count: "+client.getRoomInfo().getViewersCount());
|
||||||
|
})
|
||||||
|
.onError((client, event) ->
|
||||||
{
|
{
|
||||||
event.getException().printStackTrace();
|
event.getException().printStackTrace();
|
||||||
})
|
})
|
||||||
.buildAndRun();
|
.buildAndRun();
|
||||||
|
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 {
|
||||||
|
|
||||||
|
TikTokLive.newClient(Main.TEST_TIKTOK_USER)
|
||||||
|
.configure(clientSettings ->
|
||||||
|
{
|
||||||
|
clientSettings.setHostName(Main.TEST_TIKTOK_USER); // TikTok user name
|
||||||
|
clientSettings.setClientLanguage("en"); // Language
|
||||||
|
clientSettings.setTimeout(Duration.ofSeconds(2)); // Connection timeout
|
||||||
|
clientSettings.setLogLevel(Level.ALL); // Log level
|
||||||
|
clientSettings.setDownloadGiftInfo(true); // Downloading meta information about gifts. You can access it by client.getGiftManager().getGiftsInfo();
|
||||||
|
clientSettings.setPrintMessageData(true); // Printing TikTok Protocol buffer messages in Base64 format
|
||||||
|
clientSettings.setPrintToConsole(true); // Printing all logs to console even if log level is Level.OFF
|
||||||
|
clientSettings.setHandleExistingMessagesOnConnect(true); // Invokes all TikTok events that had occurred before connection
|
||||||
|
clientSettings.setRetryOnConnectionFailure(true); // Reconnecting if TikTok user is offline
|
||||||
|
clientSettings.setRetryConnectionTimeout(Duration.ofSeconds(1)); // Timeout before next reconnection
|
||||||
|
})
|
||||||
|
.buildAndRun();
|
||||||
|
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.listener.TikTokEventListener;
|
||||||
|
import io.github.jwdeveloper.tiktok.live.LiveClient;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class ListenerExample
|
||||||
{
|
{
|
||||||
public static void main(String[] args) throws IOException {
|
public static void main(String[] args) throws IOException {
|
||||||
|
|
||||||
TikTokLive.newClient("jwdevtiktok")
|
CustomListener customListener = new CustomListener();
|
||||||
.configure(clientSettings ->
|
|
||||||
{
|
// set tiktok username
|
||||||
clientSettings.setHostName("jwdevtiktok"); //tiktok user
|
TikTokLive.newClient(Main.TEST_TIKTOK_USER)
|
||||||
clientSettings.setClientLanguage("en"); //language
|
.addListener(customListener)
|
||||||
clientSettings.setTimeout(Duration.ofSeconds(2)); //connection timeout
|
|
||||||
clientSettings.setLogLevel(Level.ALL); //log level
|
|
||||||
clientSettings.setDownloadGiftInfo(true); //TODO
|
|
||||||
clientSettings.setCheckForUnparsedData(true); //TODO
|
|
||||||
clientSettings.setPollingInterval(Duration.ofSeconds(1)); //TODO
|
|
||||||
clientSettings.setPrintMessageData(true); //TODO
|
|
||||||
clientSettings.setPrintToConsole(true); //TODO
|
|
||||||
clientSettings.setHandleExistingMessagesOnConnect(true); //TODO
|
|
||||||
clientSettings.setRetryOnConnectionFailure(true); //TODO
|
|
||||||
})
|
|
||||||
.buildAndRun();
|
.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 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());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Methods
|
## Methods
|
||||||
A `TikTokLive` object contains the following methods.
|
A `client (LiveClient)` object contains the following methods.
|
||||||
|
|
||||||
| Method Name | Description |
|
{{methods}}
|
||||||
| ----------- | ----------- |
|
|
||||||
| connect | Connects to the live stream chat.<br>Returns a `Promise` which will be resolved when the connection is successfully established. |
|
| Method Name | Description |
|
||||||
| disconnect | Disconnects the connection. |
|
|---------------------| ----------- |
|
||||||
| getRoomInfo | Gets the current room info from TikTok API including streamer info, room status and statistics. |
|
| 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:
|
|
||||||
|
**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)
|
- [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)
|
||||||
|
|
||||||
|
**Control**:
|
||||||
|
- [TikTokConnectedEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokConnectedEvent.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)
|
||||||
|
|
||||||
|
**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)
|
||||||
@@ -147,27 +250,18 @@ 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)
|
||||||
- [TikTokUnhandledControlEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokUnhandledControlEvent.java)
|
- [TikTokUnhandledWebsocketMessageEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokUnhandledWebsocketMessageEvent.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>
|
||||||
|
|||||||
@@ -2,11 +2,48 @@
|
|||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
|
||||||
|
<!-- READ ME
|
||||||
|
This POM file is configured to run only inside TikTokLiveJava project
|
||||||
|
In case you have copied it follows this stets to fix console errors
|
||||||
|
|
||||||
|
1. Remember to remove
|
||||||
|
<parent>
|
||||||
|
<artifactId>TikTokLiveJava</artifactId>
|
||||||
|
<groupId>io.github.jwdeveloper.tiktok</groupId>
|
||||||
|
<version>0.0.13-Release</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
2. Paste
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>jitpack.io</id>
|
||||||
|
<url>https://jitpack.io</url>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.jwdeveloper.TikTok-Live-Java</groupId>
|
||||||
|
<artifactId>Client</artifactId>
|
||||||
|
<version>0.0.14-Release</version> <- Change with latest version of TikTokJava
|
||||||
|
<scope>compile</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.code.gson</groupId>
|
||||||
|
<artifactId>gson</artifactId>
|
||||||
|
<version>2.10.1</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
I hope it will help you :)
|
||||||
|
-->
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<artifactId>TikTokLiveJava</artifactId>
|
<artifactId>TikTokLiveJava</artifactId>
|
||||||
<groupId>io.github.jwdeveloper.tiktok</groupId>
|
<groupId>io.github.jwdeveloper.tiktok</groupId>
|
||||||
<version>0.0.11-Release</version>
|
<version>0.0.21-Release</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
<artifactId>TestApplication</artifactId>
|
<artifactId>TestApplication</artifactId>
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user