Compare commits

...

29 Commits

Author SHA1 Message Date
JW
5b91e7f4c9 Fixed bugs:
[20:28:38] [WebSocketConnectReadThread-34/INFO] (Minecraft) [STDERR]: java.nio.ReadOnlyBufferException
[20:28:38] [WebSocketConnectReadThread-34/INFO] (Minecraft) [STDERR]: 	at java.base/java.nio.ByteBuffer.array(ByteBuffer.java:1473)
[20:28:38] [WebSocketConnectReadThread-34/INFO] (Minecraft) [STDERR]: 	at org.java_websocket.drafts.Draft_6455.createBinaryFrame(Draft_6455.java:473)
[20:28:38] [WebSocketConnectReadThread-34/INFO] (Minecraft) [STDERR]: 	at org.java_websocket.WebSocketImpl.send(WebSocketImpl.java:682)
[20:28:38] [WebSocketConnectReadThread-34/INFO] (Minecraft) [STDERR]: 	at org.java_websocket.WebSocketImpl.send(WebSocketImpl.java:664)
[20:28:38] [WebSocketConnectReadThread-34/INFO] (Minecraft) [STDERR]: 	at org.java_websocket.client.WebSocketClient.send(WebSocketClient.java:928)
[20:28:38] [WebSocketConnectReadThread-34/INFO] (Minecraft) [STDERR]: 	at io.github.jwdeveloper.tiktok.websocket.TikTokWebSocketListener.sendAckId(TikTokWebSocketListener.java:127)
[20:28:38] [WebSocketConnectReadThread-34/INFO] (Minecraft) [STDERR]: 	at io.github.jwdeveloper.tiktok.websocket.TikTokWebSocketListener.handleBinary(TikTokWebSocketListener.java:86)
[20:28:38] [WebSocketConnectReadThread-34/INFO] (Minecraft) [STDERR]: 	at io.github.jwdeveloper.tiktok.websocket.TikTokWebSocketListener.onMessage(TikTokWebSocketListener.java:56)
[20:28:38] [WebSocketConnectReadThread-34/INFO] (Minecraft) [STDERR]: 	at org.java_websocket.client.WebSocketClient.onWebsocketMessage(WebSocketClient.java:641)
[20:28:38] [WebSocketConnectReadThread-34/INFO] (Minecraft) [STDERR]: 	at org.java_websocket.drafts.Draft_6455.processFrameBinary(Draft_6455.java:959)
[20:28:38] [WebSocketConnectReadThread-34/INFO] (Minecraft) [STDERR]: 	at org.java_websocket.drafts.Draft_6455.processFrame(Draft_6455.java:912)
[20:28:38] [WebSocketConnectReadThread-34/INFO] (Minecraft) [STDERR]: 	at org.java_websocket.WebSocketImpl.decodeFrames(WebSocketImpl.java:402)
[20:28:38] [WebSocketConnectReadThread-34/INFO] (Minecraft) [STDERR]: 	at org.java_websocket.WebSocketImpl.decode(WebSocketImpl.java:234)
[20:28:38] [WebSocketConnectReadThread-34/INFO] (Minecraft) [STDERR]: 	at org.java_websocket.client.WebSocketClient.run(WebSocketClient.java:516)
2023-09-22 02:15:49 +02:00
Jacek W
0cf8edfefe Update README.md 2023-09-19 02:56:21 +02:00
GitHub Action
6c401f32b9 Update version in pom.xml 2023-09-19 00:55:11 +00:00
JW
84bbfa97e9 Fixed bugs:
- addListeners() was throwing exception
  - 404 response code was return while connecting to tiktok for some users
  - configure.setRoomId() method for people that want to set roomId manually
  - client.roomInfo().isAgeRestricted() check if live has age restriction
2023-09-19 02:53:04 +02:00
Just wolololololololo
a2da5169db Update README.md 2023-09-19 02:39:53 +02:00
Just wolololololololo
bf8defbe3c Update README.md 2023-09-19 02:30:40 +02:00
Just wolololololololo
5ba935efaf Update README.md 2023-09-19 02:30:31 +02:00
Just wolololololololo
0a244a4a58 Update README.md 2023-09-19 02:29:58 +02:00
Just wolololololololo
ac911de6b3 Merge pull request #7 from abdurrahmanekr/bugfix-403
fix: 403 get response error
2023-09-18 22:51:46 +02:00
abdurrahmanekr
74208361fd fix: 403 get response error 2023-09-18 23:32:17 +03:00
JW
a6cb2be1a7 Update FUNDING.yml 2023-09-13 06:48:11 +02:00
GitHub Action
9267217ebd Update version in pom.xml 2023-09-13 04:40:49 +00:00
JW
7641d4d33d Fix for maven versions 2023-09-13 06:38:46 +02:00
JW
05ce745dc8 Changes:
LiveRoomInfo
    + new method getConnectionState() getting current state of connection
   + ListenersManager
     getBindingModels() renamed to getListeners()

  + Introducing documentation, each public interface got small documentation

  + New property in config .setSessionId()

  + New event: onReconnecting()

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

  + Introducing documentation, each public interface got small documentation

  + New property in config .setSessionId()

  + New event: onReconnecting()

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

- fix pom
2023-09-07 14:54:57 +02:00
JW
30117917de Update maven-publish.yml 2023-09-07 14:54:33 +02:00
JW
11da8bf009 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	README.md
2023-09-07 14:52:01 +02:00
JW
97f57912ad Bugs:
Method for listeners was throwing exception
  TikTokListenersManager.removeListener() was not working
2023-09-07 14:51:51 +02:00
JW
e2ccfee399 Update README.md 2023-09-07 03:25:57 +02:00
GitHub Action
edba573ecc Update version in pom.xml 2023-09-07 01:25:21 +00:00
49 changed files with 653 additions and 294 deletions

View File

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

63
.gitignore vendored
View File

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

View File

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

View File

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

View File

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

View File

@@ -90,6 +90,8 @@ public interface TikTokEventBuilder<T> {
T onWebsocketMessage(TikTokEventConsumer<TikTokWebsocketMessageEvent> event); T onWebsocketMessage(TikTokEventConsumer<TikTokWebsocketMessageEvent> event);
T onReconnecting(TikTokEventConsumer<TikTokReconnectingEvent> event);
} }

View File

@@ -7,7 +7,6 @@ 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 lombok.Value;
import java.util.ArrayList; import java.util.ArrayList;
@@ -16,11 +15,11 @@ import java.util.List;
@Value @Value
@EventMeta(eventType = EventType.Message) @EventMeta(eventType = EventType.Message)
public class TikTokCommentEvent extends TikTokHeaderEvent { public class TikTokCommentEvent extends TikTokHeaderEvent {
User user; User user;
String text; String text;
String language; String language;
List<User> mentionedUsers; List<User> mentionedUsers;
List<Picture> pictures; 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());
@@ -32,11 +31,11 @@ public class TikTokCommentEvent extends TikTokHeaderEvent {
} }
public TikTokCommentEvent(WebcastChatMessage msg) { public TikTokCommentEvent(WebcastChatMessage msg) {
super(msg.getHeader()); super(msg.getCommon());
user = User.MapOrEmpty(msg.getSender()); user = User.MapOrEmpty(msg.getUser());
text = msg.getComment(); text = msg.getContent();
language = msg.getLanguage(); language = msg.getContentLanguage();
mentionedUsers = msg.getMentionedUsersList().stream().map(User::new).toList(); mentionedUsers = List.of(User.MapOrEmpty(msg.getAtUser()));
pictures = msg.getImagesList().stream().map(e -> new Picture(e.getImage())).toList(); pictures = msg.getEmotesListList().stream().map(e -> new Picture(e.getEmote().getImage())).toList();
} }
} }

View File

@@ -12,7 +12,6 @@ import lombok.Getter;
@EventMeta(eventType = EventType.Custom) @EventMeta(eventType = EventType.Custom)
public class TikTokJoinEvent extends TikTokHeaderEvent { public class TikTokJoinEvent extends TikTokHeaderEvent {
private User user; private User user;
private final Long totalViewers; private final Long totalViewers;
public TikTokJoinEvent(WebcastSocialMessage msg) { public TikTokJoinEvent(WebcastSocialMessage msg) {

View File

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

View File

@@ -7,11 +7,10 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@Value @Getter
public class Picture { public class Picture {
List<String> urls; List<String> urls;
public Picture(io.github.jwdeveloper.tiktok.messages.Image profilePicture) { public Picture(io.github.jwdeveloper.tiktok.messages.Image profilePicture) {
this.urls = profilePicture.getUrlListList(); this.urls = profilePicture.getUrlListList();
} }
@@ -24,15 +23,6 @@ public class Picture {
this.urls = Arrays.stream(urls).toList(); this.urls = Arrays.stream(urls).toList();
} }
public void downlaod()
{
}
public void downloadAsync()
{
}
public static Picture Map(io.github.jwdeveloper.tiktok.messages.Image profilePicture) public static Picture Map(io.github.jwdeveloper.tiktok.messages.Image profilePicture)
{ {

View File

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

View File

@@ -1,5 +1,51 @@
package io.github.jwdeveloper.tiktok.listener; 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 public interface TikTokEventListener
{ {

View File

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

View File

@@ -1,19 +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.ListenersManager;
import io.github.jwdeveloper.tiktok.listener.TikTokEventListener;
public interface LiveClient { public interface LiveClient {
// Connects to the live stream. /**
* Connects to the live stream.
*/
void connect(); void connect();
// Disconnects the connection. /**
* Disconnects the connection.
*/
void disconnect(); void disconnect();
// Gets the meta information about all gifts.
/**
* Get information about gifts
*/
GiftManager getGiftManager(); GiftManager getGiftManager();
// Gets the current room info from TikTok API including streamer info, room status and statistics. /**
* 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(); ListenersManager getListenersManager();
} }

View File

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

View File

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

View File

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

View File

@@ -1348,19 +1348,57 @@ message ModerationData {
// Comment sent by User // Comment sent by User
message WebcastChatMessage { message WebcastChatMessage {
MessageHeader header = 1; Common common = 1;
User sender = 2; // User who sent message User user = 2;
string comment = 3; // Text for Chat-Message string content = 3;
uint64 data1 = 11; bool visibleToSender = 4;
repeated User mentionedUsers = 12; // Users mentioned in comment Image backgroundImage = 5;
repeated ChatImage images = 13; string fullScreenTextColor = 6;
string language = 14; // Language for sender Image backgroundImageV2 = 7;
DataContainer chatData = 18; Image giftImage = 10;
repeated ModerationData moderationData = 19; int32 inputType = 11;
User atUser = 12;
repeated EmoteWithIndex emotesList = 13;
string contentLanguage = 14;
int32 quickChatScene = 16;
int32 communityFlaggedStatus = 17;
message ChatImage { // @EmoteWithIndex
uint64 data1 = 1; // proto.webcast.im.ChatMessage
Image Image = 2; // C:\Users\ja\RiderProjects\TikTokProBufferGenerator\Application\output\sources\test.js
message EmoteWithIndex {
int64 index = 1;
Emote emote = 2;
}
message Emote {
string emoteId = 1;
Image image = 2;
AuditStatus auditStatus = 3; // Enum
string uuid = 4;
EmoteType emoteType = 5; // Enum
ContentSource contentSource = 6; // Enum
EmotePrivateType emotePrivateType = 7; // Enum
}
enum AuditStatus {
AUDITSTATUSUNKNOWN = 0;
AUDITSTATUSPASS = 1;
AUDITSTATUSFAILED = 2;
AUDITSTATUSREVIEWING = 3;
AUDITSTATUSFORBIDDEN = 4;
}
enum EmoteType {
EMOTETYPENORMAL = 0;
EMOTETYPEWITHSTICKER = 1;
}
enum ContentSource {
CONTENTSOURCEUNKNOWN = 0;
CONTENTSOURCENORMAL = 1;
CONTENTSOURCECAMERA = 2;
}
enum EmotePrivateType {
EMOTE_PRIVATE_TYPE_NORMAL = 0;
EMOTE_PRIVATE_TYPE_SUB_WAVE = 1;
} }
} }

View File

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

View File

@@ -14,6 +14,7 @@ public class TikTokGiftManager implements GiftManager {
@Getter @Getter
private final Map<Integer, TikTokGiftInfo> giftsInfo; private final Map<Integer, TikTokGiftInfo> giftsInfo;
@Getter @Getter
private final Map<GiftId, TikTokGift> activeGifts; private final Map<GiftId, TikTokGift> activeGifts;

View File

@@ -2,6 +2,7 @@ package io.github.jwdeveloper.tiktok;
import io.github.jwdeveloper.tiktok.events.messages.TikTokDisconnectedEvent; import io.github.jwdeveloper.tiktok.events.messages.TikTokDisconnectedEvent;
import io.github.jwdeveloper.tiktok.events.messages.TikTokErrorEvent; import io.github.jwdeveloper.tiktok.events.messages.TikTokErrorEvent;
import io.github.jwdeveloper.tiktok.events.messages.TikTokReconnectingEvent;
import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException; import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException;
import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveOfflineHostException; import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveOfflineHostException;
import io.github.jwdeveloper.tiktok.handlers.TikTokEventObserver; import io.github.jwdeveloper.tiktok.handlers.TikTokEventObserver;
@@ -62,6 +63,7 @@ public class TikTokLiveClient implements LiveClient {
} }
catch (Exception ignored){} catch (Exception ignored){}
logger.info("Reconnecting"); logger.info("Reconnecting");
tikTokEventHandler.publish(this, new TikTokReconnectingEvent());
this.connect(); this.connect();
} }
throw e; throw e;
@@ -85,8 +87,22 @@ public class TikTokLiveClient implements LiveClient {
logger.info("Connecting"); logger.info("Connecting");
setState(ConnectionState.CONNECTING); setState(ConnectionState.CONNECTING);
var roomId = apiService.fetchRoomId(liveRoomInfo.getUserName());
liveRoomInfo.setRoomId(roomId); apiService.updateSessionId();
if(clientSettings.getRoomId() != null)
{
liveRoomInfo.setRoomId(clientSettings.getRoomId());
logger.info("Using roomID from settings: "+clientSettings.getRoomId());
}
else
{
var roomId = apiService.fetchRoomId(liveRoomInfo.getUserName());
liveRoomInfo.setRoomId(roomId);
}
var roomData = apiService.fetchRoomInfo(); 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?");

View File

@@ -344,6 +344,13 @@ public class TikTokLiveClientBuilder implements TikTokEventBuilder<TikTokLiveCli
tikTokEventHandler.subscribe(TikTokWebsocketMessageEvent.class, event); tikTokEventHandler.subscribe(TikTokWebsocketMessageEvent.class, event);
return this; return this;
} }
@Override
public TikTokLiveClientBuilder onReconnecting(TikTokEventConsumer<TikTokReconnectingEvent> event)
{
tikTokEventHandler.subscribe(TikTokReconnectingEvent.class, event);
return this;
}
} }

View File

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

View File

@@ -44,4 +44,11 @@ public class TikTokEventObserver {
public <T extends TikTokEvent> void unsubscribeAll(Class<?> clazz) { public <T extends TikTokEvent> void unsubscribeAll(Class<?> clazz) {
events.remove(clazz); events.remove(clazz);
} }
public <T extends TikTokEvent> void unsubscribe(TikTokEventConsumer<T> consumer) {
for(var entry : events.entrySet())
{
entry.getValue().remove(consumer);
}
}
} }

View File

@@ -108,12 +108,11 @@ public class TikTokMessageHandlerRegistration extends TikTokMessageHandler {
if (matcher.find()) if (matcher.find())
{ {
var value = matcher.group(0); var value = matcher.group(1);
var number = Integer.parseInt(value); var number = Integer.parseInt(value);
return new TikTokShareEvent(message, number); return new TikTokShareEvent(message, number);
} }
return switch (socialType) { return switch (socialType) {
case SocialTypes.LikeType -> new TikTokLikeEvent(message); case SocialTypes.LikeType -> new TikTokLikeEvent(message);
case SocialTypes.FollowType -> new TikTokFollowEvent(message); case SocialTypes.FollowType -> new TikTokFollowEvent(message);

View File

@@ -6,6 +6,7 @@ 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.mappers.LiveRoomMetaMapper;
import io.github.jwdeveloper.tiktok.messages.WebcastResponse; import io.github.jwdeveloper.tiktok.messages.WebcastResponse;
import io.github.jwdeveloper.tiktok.models.gifts.TikTokGiftInfo; import io.github.jwdeveloper.tiktok.models.gifts.TikTokGiftInfo;
@@ -26,45 +27,19 @@ public class TikTokApiService {
this.clientSettings = clientSettings; this.clientSettings = clientSettings;
} }
/*
if (sessionId) { public void updateSessionId()
// Update sessionId {
this.#options.sessionId = sessionId; if(clientSettings.getSessionId() == null)
{
return;
} }
if(clientSettings.getSessionId().isEmpty())
if (!this.#options.sessionId) { {
throw new Error('Missing SessionId. Please provide your current SessionId to use this feature.'); return;
} }
tiktokHttpClient.setSessionId(clientSettings.getSessionId());
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) { public boolean sendMessage(String message, String sessionId) {
if (sessionId.isEmpty()) { if (sessionId.isEmpty()) {
@@ -126,22 +101,10 @@ public class TikTokApiService {
logger.info("Fetch RoomInfo"); logger.info("Fetch RoomInfo");
try { try {
var response = tiktokHttpClient.getJObjectFromWebcastAPI("room/info/", clientSettings.getClientParameters()); var response = tiktokHttpClient.getJObjectFromWebcastAPI("room/info/", clientSettings.getClientParameters());
if (!response.has("data")) { var mapper = new LiveRoomMetaMapper();
return new LiveRoomMeta(); var liveRoomMeta = mapper.mapFrom(response);
} logger.info("RoomInfo status -> " + liveRoomMeta.getStatus());
return liveRoomMeta;
var data = response.getAsJsonObject("data");
if (!data.has("status")) {
return new LiveRoomMeta();
}
var status = data.get("status");
var info = new LiveRoomMeta();
info.setStatus(status.getAsInt());
logger.info("RoomInfo status -> " + info.getStatus());
return info;
} catch (Exception e) { } catch (Exception e) {
throw new TikTokLiveRequestException("Failed to fetch room info from WebCast, see stacktrace for more info.", e); throw new TikTokLiveRequestException("Failed to fetch room info from WebCast, see stacktrace for more info.", e);
} }

View File

@@ -38,6 +38,14 @@ public class TikTokHttpRequestFactory implements TikTokHttpRequest {
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();
for (var header : defaultHeaders.entrySet())
{
if(header.getKey().equals("Connection") || header.getKey().equals("Accept-Encoding"))
{
continue;
}
request.setHeader(header.getKey(), header.getValue());
}
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);

View File

@@ -4,7 +4,6 @@ package io.github.jwdeveloper.tiktok.listener;
import io.github.jwdeveloper.tiktok.annotations.TikTokEventHandler; import io.github.jwdeveloper.tiktok.annotations.TikTokEventHandler;
import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.TikTokEventConsumer; import io.github.jwdeveloper.tiktok.events.TikTokEventConsumer;
import io.github.jwdeveloper.tiktok.events.messages.TikTokWebsocketMessageEvent;
import io.github.jwdeveloper.tiktok.exceptions.TikTokEventListenerMethodException; import io.github.jwdeveloper.tiktok.exceptions.TikTokEventListenerMethodException;
import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException; import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException;
import io.github.jwdeveloper.tiktok.handlers.TikTokEventObserver; import io.github.jwdeveloper.tiktok.handlers.TikTokEventObserver;
@@ -20,12 +19,11 @@ public class TikTokListenersManager implements ListenersManager {
public TikTokListenersManager(List<TikTokEventListener> listeners, TikTokEventObserver tikTokEventHandler) { public TikTokListenersManager(List<TikTokEventListener> listeners, TikTokEventObserver tikTokEventHandler) {
this.eventObserver = tikTokEventHandler; this.eventObserver = tikTokEventHandler;
this.bindingModels = listeners.stream().map(this::bindToEvents).toList(); this.bindingModels = new ArrayList<>(listeners.stream().map(this::bindToEvents).toList());
} }
@Override @Override
public List<TikTokEventListener> getBindingModels() { public List<TikTokEventListener> getListeners() {
return bindingModels.stream().map(ListenerBindingModel::getListener).toList(); return bindingModels.stream().map(ListenerBindingModel::getListener).toList();
} }
@@ -45,6 +43,13 @@ public class TikTokListenersManager implements ListenersManager {
if (optional.isEmpty()) { if (optional.isEmpty()) {
return; return;
} }
var bindingModel =optional.get();
for(var consumer : bindingModel.getEvents())
{
eventObserver.unsubscribe(consumer);
}
bindingModels.remove(optional.get()); bindingModels.remove(optional.get());
} }
@@ -61,9 +66,9 @@ public class TikTokListenersManager implements ListenersManager {
for (var method : methods) for (var method : methods)
{ {
var eventClazz = method.getParameterTypes()[1]; var eventClazz = method.getParameterTypes()[1];
if(!eventClazz.isAssignableFrom(TikTokEvent.class)) if(eventClazz.isAssignableFrom(TikTokEvent.class) && !eventClazz.equals(TikTokEvent.class))
{ {
throw new TikTokEventListenerMethodException("Method "+method.getName()+" 2nd parameter must instance of "+TikTokEvent.class.getName()); throw new TikTokEventListenerMethodException("Method "+method.getName()+"() 2nd parameter must instance of "+TikTokEvent.class.getName());
} }
var tikTokEventConsumer = new TikTokEventConsumer() { var tikTokEventConsumer = new TikTokEventConsumer() {
@Override @Override

View File

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

View File

@@ -124,7 +124,7 @@ public class TikTokWebSocketListener extends WebSocketClient {
.build(); .build();
if(isNotClosing()) if(isNotClosing())
{ {
send(serverInfo.toByteString().asReadOnlyByteBuffer()); send(serverInfo.toByteString().toByteArray());
} }
} }

2
FUNDING.yml Normal file
View File

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

113
README.md
View File

@@ -27,25 +27,25 @@ Do you prefer other programming languages?
```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>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>com.github.jwdeveloper.TikTok-Live-Java</groupId> <groupId>com.github.jwdeveloper.TikTok-Live-Java</groupId>
<artifactId>Client</artifactId> <artifactId>Client</artifactId>
<version>0.0.14-Release</version> <version>0.0.25-Release</version>
<scope>compile</scope> <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> </dependencies>
``` ```
2. Create your first chat connection 2. Create your first chat connection
@@ -77,7 +77,7 @@ public class SimpleExample {
}) })
.onComment((client, event) -> .onComment((client, event) ->
{ {
System.out.println(event.getUser().getUniqueId() + ": " + event.getText()); System.out.println(event.getUser().getUniqueId() + ": " + event.getText());
}) })
.onEvent((client, event) -> .onEvent((client, event) ->
{ {
@@ -118,6 +118,13 @@ public class ConfigurationExample {
clientSettings.setHandleExistingMessagesOnConnect(true); // Invokes all TikTok events that had occurred before connection clientSettings.setHandleExistingMessagesOnConnect(true); // Invokes all TikTok events that had occurred before connection
clientSettings.setRetryOnConnectionFailure(true); // Reconnecting if TikTok user is offline clientSettings.setRetryOnConnectionFailure(true); // Reconnecting if TikTok user is offline
clientSettings.setRetryConnectionTimeout(Duration.ofSeconds(1)); // Timeout before next reconnection clientSettings.setRetryConnectionTimeout(Duration.ofSeconds(1)); // Timeout before next reconnection
//Optional: Sometimes not every message from chat are send to TikTokLiveJava to fix this issue you can set sessionId
// documentation how to obtain sessionId https://github.com/isaackogan/TikTok-Live-Connector#send-chat-messages
clientSettings.setSessionId("86c3c8bf4b17ebb2d74bb7fa66fd0000");
//Optional:
clientSettings.setRoomId("XXXXXXXXXXXXXXXXX");
}) })
.buildAndRun(); .buildAndRun();
System.in.read(); System.in.read();
@@ -131,9 +138,11 @@ public class ConfigurationExample {
package io.github.jwdeveloper.tiktok; package io.github.jwdeveloper.tiktok;
import io.github.jwdeveloper.tiktok.annotations.TikTokEventHandler; 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.TikTokCommentEvent;
import io.github.jwdeveloper.tiktok.events.messages.TikTokErrorEvent; import io.github.jwdeveloper.tiktok.events.messages.TikTokErrorEvent;
import io.github.jwdeveloper.tiktok.events.messages.TikTokGiftMessageEvent; import io.github.jwdeveloper.tiktok.events.messages.TikTokGiftMessageEvent;
import io.github.jwdeveloper.tiktok.events.messages.TikTokLikeEvent;
import io.github.jwdeveloper.tiktok.listener.TikTokEventListener; import io.github.jwdeveloper.tiktok.listener.TikTokEventListener;
import io.github.jwdeveloper.tiktok.live.LiveClient; import io.github.jwdeveloper.tiktok.live.LiveClient;
@@ -146,16 +155,29 @@ public class ListenerExample
CustomListener customListener = new CustomListener(); CustomListener customListener = new CustomListener();
// set tiktok username // set tiktok username
TikTokLive.newClient(Main.TEST_TIKTOK_USER) var client = TikTokLive.newClient(Main.TEST_TIKTOK_USER)
.addListener(customListener) .addListener(customListener)
.buildAndRun(); .buildAndRun();
System.in.read(); 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 public static class CustomListener implements TikTokEventListener
{ {
@TikTokEventHandler
public void onLike(LiveClient liveClient, TikTokLikeEvent event)
{
System.out.println(event.toString());
}
@TikTokEventHandler @TikTokEventHandler
public void onError(LiveClient liveClient, TikTokErrorEvent event) public void onError(LiveClient liveClient, TikTokErrorEvent event)
{ {
@@ -173,6 +195,13 @@ public class ListenerExample
{ {
System.out.println(event.getGift().getDescription()); System.out.println(event.getGift().getDescription());
} }
@TikTokEventHandler
public void onAnyEvent(LiveClient liveClient, TikTokEvent event)
{
System.out.println(event.getClass().getSimpleName());
}
} }
} }
@@ -181,7 +210,7 @@ public class ListenerExample
## Methods ## Methods
A `client (LiveClient)` object contains the following methods. A `client (LiveClient)` object contains the following methods.
{{methods}}
| Method Name | Description | | Method Name | Description |
|---------------------| ----------- | |---------------------| ----------- |
@@ -190,32 +219,11 @@ A `client (LiveClient)` object contains the following methods.
| getGiftManager | Gets the meta informations about all gifts. | | getGiftManager | Gets the meta informations about all gifts. |
| getRoomInfo | Gets the current room info from TikTok API including streamer info, room status and statistics. | | getRoomInfo | Gets the current room info from TikTok API including streamer info, room status and statistics. |
| getListenersManager | Gets and manage TikTokEventListeners | | getListenersManager | Gets and manage TikTokEventListeners |
## Events ## Events
A `TikTokLive` object has the following events A `TikTokLive` object has the following 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)
- [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**: **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)
@@ -247,6 +255,27 @@ A `TikTokLive` object has the following events
- [TikTokGiftBroadcastEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokGiftBroadcastEvent.java) - [TikTokGiftBroadcastEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokGiftBroadcastEvent.java)
- [TikTokUnhandledWebsocketMessageEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokUnhandledWebsocketMessageEvent.java) - [TikTokUnhandledWebsocketMessageEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokUnhandledWebsocketMessageEvent.java)
**Control**:
- [TikTokConnectedEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokConnectedEvent.java)
- [TikTokReconnectingEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokReconnectingEvent.java)
- [TikTokErrorEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokErrorEvent.java)
- [TikTokDisconnectedEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokDisconnectedEvent.java)
**Custom**:
- [TikTokHeaderEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokHeaderEvent.java)
- [TikTokUnhandledSocialEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokUnhandledSocialEvent.java)
- [TikTokLivePausedEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLivePausedEvent.java)
- [TikTokLikeEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLikeEvent.java)
- [TikTokWebsocketMessageEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokWebsocketMessageEvent.java)
- [TikTokSubscribeEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokSubscribeEvent.java)
- [TikTokFollowEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokFollowEvent.java)
- [TikTokLiveClientEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLiveClientEvent.java)
- [TikTokUnhandledEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokUnhandledEvent.java)
- [TikTokLiveEndedEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokLiveEndedEvent.java)
- [TikTokJoinEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokJoinEvent.java)
- [TikTokShareEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokShareEvent.java)
- [TikTokUnhandledControlEvent](https://github.com/jwdeveloper/TikTok-Live-Java/blob/master/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokUnhandledControlEvent.java)
<br><br> <br><br>

View File

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

View File

@@ -20,6 +20,13 @@ public class ConfigurationExample {
clientSettings.setHandleExistingMessagesOnConnect(true); // Invokes all TikTok events that had occurred before connection clientSettings.setHandleExistingMessagesOnConnect(true); // Invokes all TikTok events that had occurred before connection
clientSettings.setRetryOnConnectionFailure(true); // Reconnecting if TikTok user is offline clientSettings.setRetryOnConnectionFailure(true); // Reconnecting if TikTok user is offline
clientSettings.setRetryConnectionTimeout(Duration.ofSeconds(1)); // Timeout before next reconnection clientSettings.setRetryConnectionTimeout(Duration.ofSeconds(1)); // Timeout before next reconnection
//Optional: Sometimes not every message from chat are send to TikTokLiveJava to fix this issue you can set sessionId
// documentation how to obtain sessionId https://github.com/isaackogan/TikTok-Live-Connector#send-chat-messages
clientSettings.setSessionId("86c3c8bf4b17ebb2d74bb7fa66fd0000");
//Optional:
clientSettings.setRoomId("XXXXXXXXXXXXXXXXX");
}) })
.buildAndRun(); .buildAndRun();
System.in.read(); System.in.read();

View File

@@ -1,9 +1,11 @@
package io.github.jwdeveloper.tiktok; package io.github.jwdeveloper.tiktok;
import io.github.jwdeveloper.tiktok.annotations.TikTokEventHandler; 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.TikTokCommentEvent;
import io.github.jwdeveloper.tiktok.events.messages.TikTokErrorEvent; import io.github.jwdeveloper.tiktok.events.messages.TikTokErrorEvent;
import io.github.jwdeveloper.tiktok.events.messages.TikTokGiftMessageEvent; import io.github.jwdeveloper.tiktok.events.messages.TikTokGiftMessageEvent;
import io.github.jwdeveloper.tiktok.events.messages.TikTokLikeEvent;
import io.github.jwdeveloper.tiktok.listener.TikTokEventListener; import io.github.jwdeveloper.tiktok.listener.TikTokEventListener;
import io.github.jwdeveloper.tiktok.live.LiveClient; import io.github.jwdeveloper.tiktok.live.LiveClient;
@@ -16,16 +18,29 @@ public class ListenerExample
CustomListener customListener = new CustomListener(); CustomListener customListener = new CustomListener();
// set tiktok username // set tiktok username
TikTokLive.newClient(Main.TEST_TIKTOK_USER) var client = TikTokLive.newClient(Main.TEST_TIKTOK_USER)
.addListener(customListener) .addListener(customListener)
.buildAndRun(); .buildAndRun();
System.in.read(); 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 public static class CustomListener implements TikTokEventListener
{ {
@TikTokEventHandler
public void onLike(LiveClient liveClient, TikTokLikeEvent event)
{
System.out.println(event.toString());
}
@TikTokEventHandler @TikTokEventHandler
public void onError(LiveClient liveClient, TikTokErrorEvent event) public void onError(LiveClient liveClient, TikTokErrorEvent event)
{ {
@@ -43,5 +58,12 @@ public class ListenerExample
{ {
System.out.println(event.getGift().getDescription()); System.out.println(event.getGift().getDescription());
} }
@TikTokEventHandler
public void onAnyEvent(LiveClient liveClient, TikTokEvent event)
{
System.out.println(event.getClass().getSimpleName());
}
} }
} }

View File

@@ -17,6 +17,7 @@ public class Main {
{ {
clientSettings.setRetryConnectionTimeout(Duration.ofSeconds(5)); clientSettings.setRetryConnectionTimeout(Duration.ofSeconds(5));
clientSettings.setRetryOnConnectionFailure(true); clientSettings.setRetryOnConnectionFailure(true);
clientSettings.setDownloadGiftInfo(true);
}) })
.onConnected(Main::onConnected) .onConnected(Main::onConnected)
.onDisconnected(Main::onDisconnected) .onDisconnected(Main::onDisconnected)
@@ -29,10 +30,6 @@ public class Main {
.onLike(Main::onLike) .onLike(Main::onLike)
.onGiftMessage(Main::onGiftMessage) .onGiftMessage(Main::onGiftMessage)
.onEmote(Main::onEmote) .onEmote(Main::onEmote)
.onEvent((liveClient, event) ->
{
})
.onError((_client, error) -> .onError((_client, error) ->
{ {
error.getException().printStackTrace(); error.getException().printStackTrace();

View File

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

View File

@@ -1,7 +1,6 @@
package io.github.jwdeveloper.tiktok.tools.collector; package io.github.jwdeveloper.tiktok.tools.collector;
import io.github.jwdeveloper.tiktok.TikTokLive; import io.github.jwdeveloper.tiktok.TikTokLive;
import io.github.jwdeveloper.tiktok.events.objects.Badge;
import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveMessageException; import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveMessageException;
import io.github.jwdeveloper.tiktok.tools.collector.db.TikTokDatabase; import io.github.jwdeveloper.tiktok.tools.collector.db.TikTokDatabase;
import io.github.jwdeveloper.tiktok.tools.collector.tables.ExceptionInfoModel; import io.github.jwdeveloper.tiktok.tools.collector.tables.ExceptionInfoModel;
@@ -13,9 +12,10 @@ import java.util.ArrayList;
import java.util.Base64; import java.util.Base64;
import java.util.List; import java.util.List;
public class Main { public class RunCollector {
//https://protobuf-decoder.netlify.app/ //https://protobuf-decoder.netlify.app/
//https://streamdps.com/tiktok-widgets/gifts/
/* /*
mia_tattoo mia_tattoo
moniczkka moniczkka
@@ -25,8 +25,6 @@ public class Main {
public static List<String> ignoredEvents; public static List<String> ignoredEvents;
public static void main(String[] args) throws SQLException { public static void main(String[] args) throws SQLException {
ignoredEvents = new ArrayList<>(); ignoredEvents = new ArrayList<>();
//ignoredEvents = List.of("TikTokJoinEvent","TikTokLikeEvent"); //ignoredEvents = List.of("TikTokJoinEvent","TikTokLikeEvent");
@@ -34,27 +32,26 @@ public class Main {
var db = new TikTokDatabase("test"); var db = new TikTokDatabase("test");
db.init(); db.init();
var errors = db.selectErrors();
var users = new ArrayList<String>(); var users = new ArrayList<String>();
// users.add("mia_tattoo"); // users.add("mia_tattoo");
// users.add("moniczkka"); // users.add("moniczkka");
// users.add("besin1276"); // users.add("besin1276");
users.add("jackwoln"); users.add("evequinte96");
for(var user : users) for (var user : users) {
{
runTikTokLiveInstance(user, db); runTikTokLiveInstance(user, db);
} }
} }
private static void runTikTokLiveInstance(String tiktokUser, TikTokDatabase tikTokDatabase) private static void runTikTokLiveInstance(String tiktokUser, TikTokDatabase tikTokDatabase) {
{
TikTokLive.newClient(tiktokUser) TikTokLive.newClient(tiktokUser)
.onWebsocketMessage((liveClient, event) -> .onWebsocketMessage((liveClient, event) ->
{ {
var eventName = event.getEvent().getClass().getSimpleName(); var eventName = event.getEvent().getClass().getSimpleName();
if(ignoredEvents.contains(eventName)) if (ignoredEvents.contains(eventName)) {
{
return; return;
} }
@@ -67,32 +64,32 @@ public class Main {
.build(); .build();
tikTokDatabase.insertMessage(model); tikTokDatabase.insertMessage(model);
System.out.println("EVENT: ["+tiktokUser+"] " + eventName); System.out.println("EVENT: [" + tiktokUser + "] " + eventName);
}) })
.onError((liveClient, event) -> .onError((liveClient, event) ->
{ {
var exception = event.getException(); var exception = event.getException();
var exceptionContent = ExceptionInfoModel.getStackTraceAsString(exception); var exceptionContent = ExceptionInfoModel.getStackTraceAsString(exception);
var builder = TikTokErrorModel.builder(); var errorModel = new TikTokErrorModel();
if (exception instanceof TikTokLiveMessageException ex) { if (exception instanceof TikTokLiveMessageException ex) {
builder.hostName(tiktokUser) errorModel.setHostName(tiktokUser);
.errorName(ex.messageName()) errorModel.setErrorName(ex.messageName());
.errorType("error-message") errorModel.setErrorType("error-message");
.exceptionContent(exceptionContent) errorModel.setExceptionContent(exceptionContent);
.message(ex.messageToBase64()) errorModel.setMessage(ex.messageToBase64());
.response(ex.webcastResponseToBase64()); errorModel.setResponse(ex.webcastResponseToBase64());
} else { } else {
builder.hostName(tiktokUser) errorModel.setHostName(tiktokUser);
.errorName(exception.getClass().getSimpleName()) errorModel.setErrorName(exception.getClass().getSimpleName());
.errorType("error-system") errorModel.setErrorType("error-system");
.exceptionContent(exceptionContent) errorModel.setExceptionContent(exceptionContent);
.message("") errorModel.setMessage("");
.response(""); errorModel.setResponse("");
} }
var error = builder.build();
tikTokDatabase.insertError(error); tikTokDatabase.insertError(errorModel);
System.out.println("ERROR: "+error.getErrorName()); System.out.println("ERROR: " + errorModel.getErrorName());
exception.printStackTrace(); exception.printStackTrace();
}) })

View File

@@ -5,11 +5,11 @@ import io.github.jwdeveloper.tiktok.tools.collector.tables.TikTokMessageModel;
import org.jdbi.v3.core.Jdbi; import org.jdbi.v3.core.Jdbi;
import org.jdbi.v3.sqlobject.SqlObjectPlugin; import org.jdbi.v3.sqlobject.SqlObjectPlugin;
import java.sql.Connection;
import java.sql.DriverManager; import java.sql.DriverManager;
import java.sql.SQLException; import java.sql.SQLException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.List;
public class TikTokDatabase public class TikTokDatabase
{ {
@@ -24,12 +24,13 @@ public class TikTokDatabase
public void init() throws SQLException { public void init() throws SQLException {
var jdbcUrl ="jdbc:sqlite:"+database+".db"; var jdbcUrl ="jdbc:sqlite:"+database+".db";
var connection = DriverManager.getConnection(jdbcUrl); var connection = DriverManager.getConnection(jdbcUrl);
Jdbi jdbi = Jdbi.create(jdbcUrl) var jdbi = Jdbi.create(jdbcUrl)
.installPlugin(new SqlObjectPlugin()); .installPlugin(new SqlObjectPlugin());
jdbi.useHandle(handle -> { jdbi.useHandle(handle -> {
handle.execute(SqlConsts.CREATE_MESSAGES_TABLE); handle.execute(SqlConsts.CREATE_MESSAGES_TABLE);
handle.execute(SqlConsts.CREATE_ERROR_TABLE); handle.execute(SqlConsts.CREATE_ERROR_TABLE);
}); });
// jdbi.registerRowMapper(new TikTokErrorModelMapper());
messagesTable = jdbi.onDemand(TikTokMessageModelDAO.class); messagesTable = jdbi.onDemand(TikTokMessageModelDAO.class);
errorTable = jdbi.onDemand(TikTokErrorModelDAO.class); errorTable = jdbi.onDemand(TikTokErrorModelDAO.class);
} }
@@ -47,4 +48,9 @@ public class TikTokDatabase
message.setCreatedAt(dateFormat.format(new Date())); message.setCreatedAt(dateFormat.format(new Date()));
errorTable.insertTikTokMessage(message); errorTable.insertTikTokMessage(message);
} }
public List<TikTokErrorModel> selectErrors()
{
return errorTable.selectErrors();
}
} }

View File

@@ -2,12 +2,21 @@ package io.github.jwdeveloper.tiktok.tools.collector.db;
import io.github.jwdeveloper.tiktok.tools.collector.tables.TikTokErrorModel; import io.github.jwdeveloper.tiktok.tools.collector.tables.TikTokErrorModel;
import org.jdbi.v3.sqlobject.config.RegisterBeanMapper;
import org.jdbi.v3.sqlobject.customizer.BindBean; import org.jdbi.v3.sqlobject.customizer.BindBean;
import org.jdbi.v3.sqlobject.statement.SqlQuery;
import org.jdbi.v3.sqlobject.statement.SqlUpdate; import org.jdbi.v3.sqlobject.statement.SqlUpdate;
import java.util.List;
@RegisterBeanMapper(TikTokErrorModel.class)
public interface TikTokErrorModelDAO public interface TikTokErrorModelDAO
{ {
@SqlUpdate("INSERT INTO TikTokErrorModel (hostName, errorName, errorType, exceptionContent, message, response, createdAt) " + @SqlUpdate("INSERT INTO TikTokErrorModel (hostName, errorName, errorType, exceptionContent, message, response, createdAt) " +
"VALUES (:hostName, :errorName, :errorType, :exceptionContent, :message, :response, :createdAt)") "VALUES (:hostName, :errorName, :errorType, :exceptionContent, :message, :response, :createdAt)")
void insertTikTokMessage(@BindBean TikTokErrorModel message); void insertTikTokMessage(@BindBean TikTokErrorModel message);
@SqlQuery("SELECT * FROM TikTokErrorModel")
List<TikTokErrorModel> selectErrors();
} }

View File

@@ -1,10 +1,8 @@
package io.github.jwdeveloper.tiktok.tools.collector.tables; package io.github.jwdeveloper.tiktok.tools.collector.tables;
import lombok.Builder;
import lombok.Data; import lombok.Data;
@Data @Data
@Builder
public class TikTokErrorModel public class TikTokErrorModel
{ {
private Integer id; private Integer id;

View File

@@ -3,8 +3,6 @@ package io.github.jwdeveloper.tiktok.tools.collector.tables;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
import java.util.Date;
@Data @Data
@Builder @Builder

View File

@@ -0,0 +1,51 @@
package io.github.jwdeveloper.tiktok.tools.tester;
import com.google.protobuf.InvalidProtocolBufferException;
import io.github.jwdeveloper.tiktok.ClientSettings;
import io.github.jwdeveloper.tiktok.TikTokGiftManager;
import io.github.jwdeveloper.tiktok.TikTokRoomInfo;
import io.github.jwdeveloper.tiktok.events.messages.TikTokErrorEvent;
import io.github.jwdeveloper.tiktok.handlers.TikTokEventObserver;
import io.github.jwdeveloper.tiktok.handlers.TikTokMessageHandlerRegistration;
import io.github.jwdeveloper.tiktok.messages.WebcastResponse;
import io.github.jwdeveloper.tiktok.tools.collector.db.TikTokDatabase;
import java.sql.SQLException;
import java.util.Base64;
import java.util.logging.Logger;
public class RunTester {
public static void main(String[] args) throws SQLException, InvalidProtocolBufferException {
var db = new TikTokDatabase("test");
db.init();
var errors = db.selectErrors();
var handler = getMessageHandler();
for (var error : errors) {
var bytes = Base64.getDecoder().decode(error.getResponse());
var response = WebcastResponse.parseFrom(bytes);
handler.handle(null,response);
}
}
public static TikTokMessageHandlerRegistration getMessageHandler()
{
var observer = new TikTokEventObserver();
observer.<TikTokErrorEvent>subscribe(TikTokErrorEvent.class,(liveClient, event) ->
{
event.getException().printStackTrace();
});
var settings = new ClientSettings();
//settings.setPrintMessageData(true);
var logger = Logger.getGlobal();
var roomInfo = new TikTokRoomInfo();
var manager = new TikTokGiftManager();
return new TikTokMessageHandlerRegistration(observer,settings,logger,manager,roomInfo);
}
}

View File

@@ -5,12 +5,17 @@
<parent> <parent>
<artifactId>TikTokLiveJava</artifactId> <artifactId>TikTokLiveJava</artifactId>
<groupId>io.github.jwdeveloper.tiktok</groupId> <groupId>io.github.jwdeveloper.tiktok</groupId>
<version>0.0.15-Release</version> <version>0.0.24-Release</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>Tools-ReadmeGenerator</artifactId> <artifactId>Tools-ReadmeGenerator</artifactId>
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<properties> <properties>
<maven.compiler.source>16</maven.compiler.source> <maven.compiler.source>16</maven.compiler.source>
<maven.compiler.target>16</maven.compiler.target> <maven.compiler.target>16</maven.compiler.target>
@@ -24,5 +29,17 @@
<version>${project.version}</version> <version>${project.version}</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency>
<groupId>com.github.jwdeveloper.Descrabble</groupId>
<artifactId>Descrabble-Full</artifactId>
<version>0.0.7-Release</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>0.9.12</version>
<scope>compile</scope>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@@ -6,5 +6,6 @@ public class Main {
{ {
var generator = new ReadmeGenerator(); var generator = new ReadmeGenerator();
generator.generate(); generator.generate();
} }
} }

View File

@@ -14,10 +14,7 @@ public class ReadmeGenerator
var template = FilesUtility.getFileFromResource(Main.class,"template.md"); var template = FilesUtility.getFileFromResource(Main.class,"template.md");
var variables = new HashMap<String,Object>(); var variables = new HashMap<String,Object>();
var pomPath = "C:\\Users\\ja\\IdeaProjects\\TikTokLiveJava\\Tools-ReadmeGenerator\\pom.xml"; variables.put("version", getCurrentVersion());
variables.put("version", getCurrentVersion(pomPath));
var exampleCodePath = "C:\\Users\\ja\\IdeaProjects\\TikTokLiveJava\\TestApplication\\src\\main\\java\\io\\github\\jwdeveloper\\tiktok\\SimpleExample.java"; var exampleCodePath = "C:\\Users\\ja\\IdeaProjects\\TikTokLiveJava\\TestApplication\\src\\main\\java\\io\\github\\jwdeveloper\\tiktok\\SimpleExample.java";
variables.put("Code-Example", getCodeExample(exampleCodePath)); variables.put("Code-Example", getCodeExample(exampleCodePath));
@@ -39,23 +36,11 @@ public class ReadmeGenerator
FilesUtility.saveFile(outputPath, template); FilesUtility.saveFile(outputPath, template);
} }
public String getCurrentVersion(String path) public String getCurrentVersion()
{ {
var content = FilesUtility.loadFileContent(path); var version = System.getenv("version");;
var pattern = "<version>(.*?)<\\/version>";
// Create a Pattern object return version == null?"NOT_FOUND":version;
var regex = Pattern.compile(pattern);
// Create a Matcher object
var matcher = regex.matcher(content);
// Find the first match
if (matcher.find()) {
// Extract and print the version
return matcher.group(1);
}
return "VERSION NOT FOUND";
} }
public String getCodeExample(String path) public String getCodeExample(String path)

View File

@@ -67,7 +67,7 @@ Do you prefer other programming languages?
## Methods ## Methods
A `client (LiveClient)` object contains the following methods. A `client (LiveClient)` object contains the following methods.
{{methods}}
| Method Name | Description | | Method Name | Description |
|---------------------| ----------- | |---------------------| ----------- |
@@ -76,7 +76,6 @@ A `client (LiveClient)` object contains the following methods.
| getGiftManager | Gets the meta informations about all gifts. | | getGiftManager | Gets the meta informations about all gifts. |
| getRoomInfo | Gets the current room info from TikTok API including streamer info, room status and statistics. | | getRoomInfo | Gets the current room info from TikTok API including streamer info, room status and statistics. |
| getListenersManager | Gets and manage TikTokEventListeners | | getListenersManager | Gets and manage TikTokEventListeners |
## Events ## Events
A `TikTokLive` object has the following events A `TikTokLive` object has the following events

View File

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

View File

@@ -7,7 +7,7 @@
<groupId>io.github.jwdeveloper.tiktok</groupId> <groupId>io.github.jwdeveloper.tiktok</groupId>
<artifactId>TikTokLiveJava</artifactId> <artifactId>TikTokLiveJava</artifactId>
<packaging>pom</packaging> <packaging>pom</packaging>
<version>0.0.15-Release</version> <version>0.0.24-Release</version>
<modules> <modules>
<module>API</module> <module>API</module>
<module>Client</module> <module>Client</module>
@@ -48,6 +48,7 @@
<artifactId>maven-shade-plugin</artifactId> <artifactId>maven-shade-plugin</artifactId>
<version>3.5.0</version> <!-- Use the latest version --> <version>3.5.0</version> <!-- Use the latest version -->
<executions> <executions>
<execution> <execution>
<phase>package</phase> <phase>package</phase>
<goals> <goals>