From 6e092dd3626236b074d2a20c21c069b3356e53d8 Mon Sep 17 00:00:00 2001 From: JW Date: Wed, 13 Sep 2023 06:32:36 +0200 Subject: [PATCH] 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 --- .github/workflows/maven-publish.yml | 9 +-- .gitignore | 63 +++++++++++++++- .../jwdeveloper/tiktok/ClientSettings.java | 74 ++++++++++--------- .../github/jwdeveloper/tiktok/Constants.java | 61 ++++++++------- .../events/messages/TikTokCommentEvent.java | 23 +++--- .../events/messages/TikTokJoinEvent.java | 1 - .../tiktok/listener/ListenersManager.java | 8 +- .../tiktok/listener/TikTokEventListener.java | 46 ++++++++++++ .../jwdeveloper/tiktok/live/GiftManager.java | 24 +++++- .../jwdeveloper/tiktok/live/LiveClient.java | 23 +++++- .../jwdeveloper/tiktok/live/LiveRoomInfo.java | 1 + API/src/main/proto/tiktokSchema.proto | 62 +++++++++++++--- .../jwdeveloper/tiktok/TikTokGiftManager.java | 1 + .../TikTokMessageHandlerRegistration.java | 3 +- .../listener/TikTokListenersManager.java | 2 +- FUNDING.yml | 3 + .../jwdeveloper/tiktok/ListenerExample.java | 6 ++ .../io/github/jwdeveloper/tiktok/Main.java | 5 +- .../{Main.java => RunCollector.java} | 59 +++++++-------- .../tools/collector/db/TikTokDatabase.java | 10 ++- .../collector/db/TikTokErrorModelDAO.java | 9 +++ .../collector/tables/TikTokErrorModel.java | 2 - .../collector/tables/TikTokMessageModel.java | 2 - .../tiktok/tools/tester/RunTester.java | 51 +++++++++++++ Tools-ReadmeGenerator/pom.xml | 13 +++- .../jwdeveloper/tiktok/ReadmeGenerator.java | 23 +----- pom.xml | 1 + 27 files changed, 413 insertions(+), 172 deletions(-) create mode 100644 FUNDING.yml rename Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/{Main.java => RunCollector.java} (61%) create mode 100644 Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/tester/RunTester.java diff --git a/.github/workflows/maven-publish.yml b/.github/workflows/maven-publish.yml index d8da098..f11138d 100644 --- a/.github/workflows/maven-publish.yml +++ b/.github/workflows/maven-publish.yml @@ -72,13 +72,8 @@ jobs: run: | git config --local user.email "action@github.com" git config --local user.name "GitHub Action" - git add pom.xml - git add API/pom.xml - git add Client/pom.xml - git add TestApplication/pom.xml - git add Tools-EventsCollector/pom.xml - git add Tools-ReadmeGenerator/pom.xml - git add Tools/pom.xml + git add README.MD + git add pom.xml && git add '**/pom.xml' git commit -m "Update version in pom.xml" - name: Push changes uses: ad-m/github-push-action@master diff --git a/.gitignore b/.gitignore index 4d9f763..58ead33 100644 --- a/.gitignore +++ b/.gitignore @@ -79,4 +79,65 @@ fabric.properties .idea/httpRequests # Android studio 3.1+ serialized cache file -.idea/caches/build_file_checksums.ser \ No newline at end of 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 diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/ClientSettings.java b/API/src/main/java/io/github/jwdeveloper/tiktok/ClientSettings.java index f4821be..cb72473 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/ClientSettings.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/ClientSettings.java @@ -3,69 +3,75 @@ package io.github.jwdeveloper.tiktok; import lombok.Data; import java.time.Duration; -import java.util.HashMap; import java.util.Map; import java.util.logging.Level; @Data public class ClientSettings { - /// - /// Timeout for Connections - /// + /** + * Timeout for Connections + */ private Duration timeout; // public RotatingProxy Proxy; - /// - /// ISO-Language for Client - /// + /** + * ISO-Language for Client + */ private String clientLanguage; - /// - /// Whether to Retry if Connection Fails - /// + /** + * Whether to Retry if Connection Fails + */ private boolean retryOnConnectionFailure; - /// - /// Wait to connect again for selected amount of time - /// + /** + * Wait to connect again for selected amount of time + */ private Duration retryConnectionTimeout; - /// - /// Whether to handle Messages received from Room when Connecting - /// + /** + * Whether to handle Messages received from Room when Connecting + */ private boolean handleExistingMessagesOnConnect; - /// - /// Whether to download List of Gifts for Room when Connecting - /// + /** + * Whether to download List of Gifts for Room when Connecting + */ private boolean downloadGiftInfo; - /// - /// Whether to print Logs to Console - /// + /** + * Whether to print Logs to Console + */ private boolean printToConsole; - /// - /// LoggingLevel for Logs - /// + /** + * LoggingLevel for Logs + */ private Level logLevel; - /// - /// Whether to print Base64-Data for Messages to Console - /// + /** + * Whether to print Base64-Data for Messages to Console + */ private boolean printMessageData; - /// - /// Tiktok user name - /// + /** + * Tiktok user name + */ private String hostName; - /// - /// Parameters used in requests to tiktok api - /// + /** + * Parameters used in requests to Tiktok api + */ private Map 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; + } diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/Constants.java b/API/src/main/java/io/github/jwdeveloper/tiktok/Constants.java index d959207..dc1878e 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/Constants.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/Constants.java @@ -8,33 +8,32 @@ import java.util.logging.Level; public class Constants { - /// - /// Web-URL for TikTok - /// + /** + * Web-URL for TikTok + */ public static final String TIKTOK_URL_WEB = "https://www.tiktok.com/"; - /// - /// WebCast-BaseURL for TikTok - /// + /** + * WebCast-BaseURL for TikTok + */ public static final String TIKTOK_URL_WEBCAST = "https://webcast.tiktok.com/webcast/"; - /// - /// Signing API by Isaac Kogan - /// https://github-wiki-see.page/m/isaackogan/TikTokLive/wiki/All-About-Signatures - /// + /** + * Signing API by Isaac Kogan + * https://github-wiki-see.page/m/isaackogan/TikTokLive/wiki/All-About-Signatures + */ public static final String TIKTOK_SIGN_API = "https://tiktok.eulerstream.com/webcast/sign_url"; - /// - /// Default TimeOut for Connections - /// + /** + * Default TimeOut for Connections + */ public static final int DEFAULT_TIMEOUT = 20; - /// - /// Default Polling-Time for Socket-Connection - /// + /** + * Default Polling-Time for Socket-Connection + */ public static final int DEFAULT_POLLTIME = 1; - /// - /// Default Settings for Client - /// - + /** + * Default Settings for Client + */ public static ClientSettings DefaultClientSettings() { @@ -53,15 +52,13 @@ public class Constants { } + /** + * Default Parameters for HTTP-Request + */ - /// - /// Default Parameters for HTTP-Request - /// - - - public static Map DefaultClientParams() { - var clientParams = new TreeMap(); + public static Map DefaultClientParams() { + var clientParams = new TreeMap(); clientParams.put("aid", 1988); clientParams.put("app_language", "en-US"); clientParams.put("app_name", "tiktok_web"); @@ -100,11 +97,11 @@ public class Constants { } - /// - /// Default Headers for HTTP-Request - /// - public static Map DefaultRequestHeaders() { - var headers = new HashMap(); + /** + * Default Headers for HTTP-Request + */ + public static Map DefaultRequestHeaders() { + var headers = new HashMap(); headers.put("Connection", "keep-alive"); headers.put("Cache-Control", "max-age=0"); diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokCommentEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokCommentEvent.java index 840d7eb..1a66ef6 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokCommentEvent.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokCommentEvent.java @@ -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.messages.WebcastChatMessage; import io.github.jwdeveloper.tiktok.messages.WebcastRoomPinMessage; -import lombok.Getter; import lombok.Value; import java.util.ArrayList; @@ -16,11 +15,11 @@ import java.util.List; @Value @EventMeta(eventType = EventType.Message) public class TikTokCommentEvent extends TikTokHeaderEvent { - User user; - String text; - String language; - List mentionedUsers; - List pictures; + User user; + String text; + String language; + List mentionedUsers; + List pictures; public TikTokCommentEvent(WebcastRoomPinMessage.RoomPinMessageData data) { super(data.getDetails().getRoomId(), data.getDetails().getMessageId(), data.getDetails().getServerTime()); @@ -32,11 +31,11 @@ public class TikTokCommentEvent extends TikTokHeaderEvent { } public TikTokCommentEvent(WebcastChatMessage msg) { - super(msg.getHeader()); - user = User.MapOrEmpty(msg.getSender()); - text = msg.getComment(); - language = msg.getLanguage(); - mentionedUsers = msg.getMentionedUsersList().stream().map(User::new).toList(); - pictures = msg.getImagesList().stream().map(e -> new Picture(e.getImage())).toList(); + super(msg.getCommon()); + user = User.MapOrEmpty(msg.getUser()); + text = msg.getContent(); + language = msg.getContentLanguage(); + mentionedUsers = List.of(User.MapOrEmpty(msg.getAtUser())); + pictures = msg.getEmotesListList().stream().map(e -> new Picture(e.getEmote().getImage())).toList(); } } diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokJoinEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokJoinEvent.java index 240fa25..e201ffd 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokJoinEvent.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/messages/TikTokJoinEvent.java @@ -12,7 +12,6 @@ import lombok.Getter; @EventMeta(eventType = EventType.Custom) public class TikTokJoinEvent extends TikTokHeaderEvent { private User user; - private final Long totalViewers; public TikTokJoinEvent(WebcastSocialMessage msg) { diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/listener/ListenersManager.java b/API/src/main/java/io/github/jwdeveloper/tiktok/listener/ListenersManager.java index 599a494..9a73e30 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/listener/ListenersManager.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/listener/ListenersManager.java @@ -2,9 +2,15 @@ package io.github.jwdeveloper.tiktok.listener; import java.util.List; +/** + * You can dynamically add or removing TikTokEventListener + * + * @see TikTokEventListener + * + */ public interface ListenersManager { - List getBindingModels(); + List getListeners(); void addListener(TikTokEventListener listener); void removeListener(TikTokEventListener listener); diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/listener/TikTokEventListener.java b/API/src/main/java/io/github/jwdeveloper/tiktok/listener/TikTokEventListener.java index 1a51822..6ed0838 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/listener/TikTokEventListener.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/listener/TikTokEventListener.java @@ -1,5 +1,51 @@ 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 { diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/live/GiftManager.java b/API/src/main/java/io/github/jwdeveloper/tiktok/live/GiftManager.java index 1e20618..de9c04c 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/live/GiftManager.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/live/GiftManager.java @@ -6,9 +6,25 @@ import io.github.jwdeveloper.tiktok.models.gifts.TikTokGiftInfo; import java.util.Map; -public interface GiftManager -{ - Map getGiftsInfo(); +public interface GiftManager { - Map 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 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 getActiveGifts(); } diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveClient.java b/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveClient.java index c48e089..75f5465 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveClient.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveClient.java @@ -1,19 +1,34 @@ package io.github.jwdeveloper.tiktok.live; import io.github.jwdeveloper.tiktok.listener.ListenersManager; +import io.github.jwdeveloper.tiktok.listener.TikTokEventListener; public interface LiveClient { - // Connects to the live stream. + /** + * Connects to the live stream. + */ void connect(); - // Disconnects the connection. + /** + * Disconnects the connection. + */ void disconnect(); - // Gets the meta information about all gifts. + + /** + * Get information about gifts + */ 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(); + + /** + * Manage TikTokEventListener + * @see TikTokEventListener + */ ListenersManager getListenersManager(); } diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveRoomInfo.java b/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveRoomInfo.java index c6cd428..6d4ea43 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveRoomInfo.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveRoomInfo.java @@ -5,4 +5,5 @@ public interface LiveRoomInfo int getViewersCount(); String getRoomId(); String getUserName(); + ConnectionState getConnectionState(); } diff --git a/API/src/main/proto/tiktokSchema.proto b/API/src/main/proto/tiktokSchema.proto index 8df018e..9130ad3 100644 --- a/API/src/main/proto/tiktokSchema.proto +++ b/API/src/main/proto/tiktokSchema.proto @@ -1348,19 +1348,57 @@ message ModerationData { // Comment sent by User message WebcastChatMessage { - MessageHeader header = 1; - User sender = 2; // User who sent message - string comment = 3; // Text for Chat-Message - uint64 data1 = 11; - repeated User mentionedUsers = 12; // Users mentioned in comment - repeated ChatImage images = 13; - string language = 14; // Language for sender - DataContainer chatData = 18; - repeated ModerationData moderationData = 19; + Common common = 1; + User user = 2; + string content = 3; + bool visibleToSender = 4; + Image backgroundImage = 5; + string fullScreenTextColor = 6; + Image backgroundImageV2 = 7; + Image giftImage = 10; + int32 inputType = 11; + User atUser = 12; + repeated EmoteWithIndex emotesList = 13; + string contentLanguage = 14; + int32 quickChatScene = 16; + int32 communityFlaggedStatus = 17; - message ChatImage { - uint64 data1 = 1; - Image Image = 2; + // @EmoteWithIndex + // proto.webcast.im.ChatMessage + // 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; } } diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokGiftManager.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokGiftManager.java index 27f8c5b..1b5551a 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokGiftManager.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokGiftManager.java @@ -14,6 +14,7 @@ public class TikTokGiftManager implements GiftManager { @Getter private final Map giftsInfo; + @Getter private final Map activeGifts; diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/handlers/TikTokMessageHandlerRegistration.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/handlers/TikTokMessageHandlerRegistration.java index fd0dc72..c7804b6 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/handlers/TikTokMessageHandlerRegistration.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/handlers/TikTokMessageHandlerRegistration.java @@ -108,12 +108,11 @@ public class TikTokMessageHandlerRegistration extends TikTokMessageHandler { if (matcher.find()) { - var value = matcher.group(0); + var value = matcher.group(1); var number = Integer.parseInt(value); return new TikTokShareEvent(message, number); } - return switch (socialType) { case SocialTypes.LikeType -> new TikTokLikeEvent(message); case SocialTypes.FollowType -> new TikTokFollowEvent(message); diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/listener/TikTokListenersManager.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/listener/TikTokListenersManager.java index 53bc61c..d3a8e94 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/listener/TikTokListenersManager.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/listener/TikTokListenersManager.java @@ -24,7 +24,7 @@ public class TikTokListenersManager implements ListenersManager { @Override - public List getBindingModels() { + public List getListeners() { return bindingModels.stream().map(ListenerBindingModel::getListener).toList(); } diff --git a/FUNDING.yml b/FUNDING.yml new file mode 100644 index 0000000..84549c6 --- /dev/null +++ b/FUNDING.yml @@ -0,0 +1,3 @@ +github: [jwdeveloper] +patreon: jwdeveloper +custom: ["https://www.buymeacoffee.com/jwdev"] \ No newline at end of file diff --git a/TestApplication/src/main/java/io/github/jwdeveloper/tiktok/ListenerExample.java b/TestApplication/src/main/java/io/github/jwdeveloper/tiktok/ListenerExample.java index 497d587..b4f39a5 100644 --- a/TestApplication/src/main/java/io/github/jwdeveloper/tiktok/ListenerExample.java +++ b/TestApplication/src/main/java/io/github/jwdeveloper/tiktok/ListenerExample.java @@ -5,6 +5,7 @@ import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.messages.TikTokCommentEvent; import io.github.jwdeveloper.tiktok.events.messages.TikTokErrorEvent; import io.github.jwdeveloper.tiktok.events.messages.TikTokGiftMessageEvent; +import io.github.jwdeveloper.tiktok.events.messages.TikTokLikeEvent; import io.github.jwdeveloper.tiktok.listener.TikTokEventListener; import io.github.jwdeveloper.tiktok.live.LiveClient; @@ -34,6 +35,11 @@ public class ListenerExample public static class CustomListener implements TikTokEventListener { + @TikTokEventHandler + public void onLike(LiveClient liveClient, TikTokLikeEvent event) + { + System.out.println(event.toString()); + } @TikTokEventHandler public void onError(LiveClient liveClient, TikTokErrorEvent event) diff --git a/TestApplication/src/main/java/io/github/jwdeveloper/tiktok/Main.java b/TestApplication/src/main/java/io/github/jwdeveloper/tiktok/Main.java index 53f51e5..40b6459 100644 --- a/TestApplication/src/main/java/io/github/jwdeveloper/tiktok/Main.java +++ b/TestApplication/src/main/java/io/github/jwdeveloper/tiktok/Main.java @@ -17,6 +17,7 @@ public class Main { { clientSettings.setRetryConnectionTimeout(Duration.ofSeconds(5)); clientSettings.setRetryOnConnectionFailure(true); + clientSettings.setDownloadGiftInfo(true); }) .onConnected(Main::onConnected) .onDisconnected(Main::onDisconnected) @@ -29,10 +30,6 @@ public class Main { .onLike(Main::onLike) .onGiftMessage(Main::onGiftMessage) .onEmote(Main::onEmote) - .onEvent((liveClient, event) -> - { - - }) .onError((_client, error) -> { error.getException().printStackTrace(); diff --git a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/Main.java b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/RunCollector.java similarity index 61% rename from Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/Main.java rename to Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/RunCollector.java index 35c9300..2d3f55d 100644 --- a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/Main.java +++ b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/RunCollector.java @@ -1,7 +1,6 @@ package io.github.jwdeveloper.tiktok.tools.collector; 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.tools.collector.db.TikTokDatabase; import io.github.jwdeveloper.tiktok.tools.collector.tables.ExceptionInfoModel; @@ -13,9 +12,10 @@ import java.util.ArrayList; import java.util.Base64; import java.util.List; -public class Main { +public class RunCollector { //https://protobuf-decoder.netlify.app/ + //https://streamdps.com/tiktok-widgets/gifts/ /* mia_tattoo moniczkka @@ -25,8 +25,6 @@ public class Main { public static List ignoredEvents; public static void main(String[] args) throws SQLException { - - ignoredEvents = new ArrayList<>(); //ignoredEvents = List.of("TikTokJoinEvent","TikTokLikeEvent"); @@ -34,27 +32,26 @@ public class Main { var db = new TikTokDatabase("test"); db.init(); + var errors = db.selectErrors(); + var users = new ArrayList(); - // users.add("mia_tattoo"); - // users.add("moniczkka"); - // users.add("besin1276"); - users.add("jackwoln"); - for(var user : users) - { + // users.add("mia_tattoo"); + // users.add("moniczkka"); + // users.add("besin1276"); + users.add("evequinte96"); + for (var user : users) { runTikTokLiveInstance(user, db); } } - private static void runTikTokLiveInstance(String tiktokUser, TikTokDatabase tikTokDatabase) - { + private static void runTikTokLiveInstance(String tiktokUser, TikTokDatabase tikTokDatabase) { TikTokLive.newClient(tiktokUser) .onWebsocketMessage((liveClient, event) -> { var eventName = event.getEvent().getClass().getSimpleName(); - if(ignoredEvents.contains(eventName)) - { + if (ignoredEvents.contains(eventName)) { return; } @@ -67,32 +64,32 @@ public class Main { .build(); tikTokDatabase.insertMessage(model); - System.out.println("EVENT: ["+tiktokUser+"] " + eventName); + System.out.println("EVENT: [" + tiktokUser + "] " + eventName); }) .onError((liveClient, event) -> { var exception = event.getException(); var exceptionContent = ExceptionInfoModel.getStackTraceAsString(exception); - var builder = TikTokErrorModel.builder(); + var errorModel = new TikTokErrorModel(); if (exception instanceof TikTokLiveMessageException ex) { - builder.hostName(tiktokUser) - .errorName(ex.messageName()) - .errorType("error-message") - .exceptionContent(exceptionContent) - .message(ex.messageToBase64()) - .response(ex.webcastResponseToBase64()); + errorModel.setHostName(tiktokUser); + errorModel.setErrorName(ex.messageName()); + errorModel.setErrorType("error-message"); + errorModel.setExceptionContent(exceptionContent); + errorModel.setMessage(ex.messageToBase64()); + errorModel.setResponse(ex.webcastResponseToBase64()); } else { - builder.hostName(tiktokUser) - .errorName(exception.getClass().getSimpleName()) - .errorType("error-system") - .exceptionContent(exceptionContent) - .message("") - .response(""); + errorModel.setHostName(tiktokUser); + errorModel.setErrorName(exception.getClass().getSimpleName()); + errorModel.setErrorType("error-system"); + errorModel.setExceptionContent(exceptionContent); + errorModel.setMessage(""); + errorModel.setResponse(""); } - var error = builder.build(); - tikTokDatabase.insertError(error); - System.out.println("ERROR: "+error.getErrorName()); + + tikTokDatabase.insertError(errorModel); + System.out.println("ERROR: " + errorModel.getErrorName()); exception.printStackTrace(); }) diff --git a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/db/TikTokDatabase.java b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/db/TikTokDatabase.java index f688d00..1b881f9 100644 --- a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/db/TikTokDatabase.java +++ b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/db/TikTokDatabase.java @@ -5,11 +5,11 @@ import io.github.jwdeveloper.tiktok.tools.collector.tables.TikTokMessageModel; import org.jdbi.v3.core.Jdbi; import org.jdbi.v3.sqlobject.SqlObjectPlugin; -import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.List; public class TikTokDatabase { @@ -24,12 +24,13 @@ public class TikTokDatabase public void init() throws SQLException { var jdbcUrl ="jdbc:sqlite:"+database+".db"; var connection = DriverManager.getConnection(jdbcUrl); - Jdbi jdbi = Jdbi.create(jdbcUrl) + var jdbi = Jdbi.create(jdbcUrl) .installPlugin(new SqlObjectPlugin()); jdbi.useHandle(handle -> { handle.execute(SqlConsts.CREATE_MESSAGES_TABLE); handle.execute(SqlConsts.CREATE_ERROR_TABLE); }); + // jdbi.registerRowMapper(new TikTokErrorModelMapper()); messagesTable = jdbi.onDemand(TikTokMessageModelDAO.class); errorTable = jdbi.onDemand(TikTokErrorModelDAO.class); } @@ -47,4 +48,9 @@ public class TikTokDatabase message.setCreatedAt(dateFormat.format(new Date())); errorTable.insertTikTokMessage(message); } + + public List selectErrors() + { + return errorTable.selectErrors(); + } } diff --git a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/db/TikTokErrorModelDAO.java b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/db/TikTokErrorModelDAO.java index 3bb206f..3f803d8 100644 --- a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/db/TikTokErrorModelDAO.java +++ b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/db/TikTokErrorModelDAO.java @@ -2,12 +2,21 @@ package io.github.jwdeveloper.tiktok.tools.collector.db; 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.statement.SqlQuery; import org.jdbi.v3.sqlobject.statement.SqlUpdate; +import java.util.List; + + +@RegisterBeanMapper(TikTokErrorModel.class) public interface TikTokErrorModelDAO { @SqlUpdate("INSERT INTO TikTokErrorModel (hostName, errorName, errorType, exceptionContent, message, response, createdAt) " + "VALUES (:hostName, :errorName, :errorType, :exceptionContent, :message, :response, :createdAt)") void insertTikTokMessage(@BindBean TikTokErrorModel message); + + @SqlQuery("SELECT * FROM TikTokErrorModel") + List selectErrors(); } diff --git a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/tables/TikTokErrorModel.java b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/tables/TikTokErrorModel.java index 1c5a98f..2a391a9 100644 --- a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/tables/TikTokErrorModel.java +++ b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/tables/TikTokErrorModel.java @@ -1,10 +1,8 @@ package io.github.jwdeveloper.tiktok.tools.collector.tables; -import lombok.Builder; import lombok.Data; @Data -@Builder public class TikTokErrorModel { private Integer id; diff --git a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/tables/TikTokMessageModel.java b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/tables/TikTokMessageModel.java index f2bb335..0ee5809 100644 --- a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/tables/TikTokMessageModel.java +++ b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/tables/TikTokMessageModel.java @@ -3,8 +3,6 @@ package io.github.jwdeveloper.tiktok.tools.collector.tables; import lombok.Builder; import lombok.Data; -import java.util.Date; - @Data @Builder diff --git a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/tester/RunTester.java b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/tester/RunTester.java new file mode 100644 index 0000000..1e00958 --- /dev/null +++ b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/tester/RunTester.java @@ -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.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); + } +} diff --git a/Tools-ReadmeGenerator/pom.xml b/Tools-ReadmeGenerator/pom.xml index dc5fffc..ce4a2cd 100644 --- a/Tools-ReadmeGenerator/pom.xml +++ b/Tools-ReadmeGenerator/pom.xml @@ -10,7 +10,12 @@ 4.0.0 Tools-ReadmeGenerator - + + + jitpack.io + https://jitpack.io + + 16 16 @@ -24,5 +29,11 @@ ${project.version} compile + + com.github.jwdeveloper.Descrabble + Descrabble-Full + 0.0.7-Release + compile + \ No newline at end of file diff --git a/Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/ReadmeGenerator.java b/Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/ReadmeGenerator.java index 7216bc5..3021d11 100644 --- a/Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/ReadmeGenerator.java +++ b/Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/ReadmeGenerator.java @@ -14,10 +14,7 @@ public class ReadmeGenerator var template = FilesUtility.getFileFromResource(Main.class,"template.md"); var variables = new HashMap(); - var pomPath = "C:\\Users\\ja\\IdeaProjects\\TikTokLiveJava\\Tools-ReadmeGenerator\\pom.xml"; - - variables.put("version", getCurrentVersion(pomPath)); - + variables.put("version", getCurrentVersion()); var exampleCodePath = "C:\\Users\\ja\\IdeaProjects\\TikTokLiveJava\\TestApplication\\src\\main\\java\\io\\github\\jwdeveloper\\tiktok\\SimpleExample.java"; variables.put("Code-Example", getCodeExample(exampleCodePath)); @@ -39,23 +36,11 @@ public class ReadmeGenerator FilesUtility.saveFile(outputPath, template); } - public String getCurrentVersion(String path) + public String getCurrentVersion() { - var content = FilesUtility.loadFileContent(path); - var pattern = "(.*?)<\\/version>"; + var version = System.getenv("version");; - // Create a Pattern object - 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"; + return version == null?"NOT_FOUND":version; } public String getCodeExample(String path) diff --git a/pom.xml b/pom.xml index 04a3a32..5f628de 100644 --- a/pom.xml +++ b/pom.xml @@ -48,6 +48,7 @@ maven-shade-plugin 3.5.0 + package