Compare commits

...

93 Commits

Author SHA1 Message Date
JW
ff9e75505d Bugs:
TikTokEventListener method with parameter TikTokEvent was invalid
2023-09-07 15:49:45 +02:00
GitHub Action
08379994fd Update version in pom.xml 2023-09-07 13:12:35 +00:00
GitHub Action
cc871c70f6 Update version in pom.xml 2023-09-07 12:56:38 +00:00
JW
32294cc3ec Merge remote-tracking branch 'origin/master' 2023-09-07 14:55:02 +02:00
JW
cea19abda7 Bugs:
Method for listeners was throwing exception
  TikTokListenersManager.removeListener() was not working

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

Bugs:
 - Fixed bug: Websocket was sending ping after it was closed
2023-09-07 03:19:25 +02:00
JW
defebc92ce Update README.md 2023-09-04 12:09:39 +02:00
GitHub Action
c267392888 Update version in pom.xml 2023-09-04 10:07:55 +00:00
JW
818c4cb364 Update maven-publish.yml 2023-09-04 12:06:33 +02:00
JW
911e2b12a5 Merge remote-tracking branch 'origin/master' 2023-09-04 12:05:19 +02:00
JW
1aff710523 Changes:
`onWebsocketMessage()` TikTokWebsocketMessageEvent new event that is
   triggered when new ProtocolBuffer message come from TikTok server.
   Should be mainly use for debuging purpose

Bugs:
 - Fixed bug: WebcastSocialMessage was always triggering `TikTokShareEvent` events such as `TikTokLikeEvent`, `TikTokFollowEvent`, `TikTokShareEvent`, `TikTokJoinEvent` was ignored

 - Fixed bug: Websocket was disconnecting when there was no incoming events for the while. Fixed by implementing background loop that pinging TikTok server every few ms.

 - Fixed bug: Disconnect method was not working
2023-09-04 12:05:13 +02:00
JW
c0f8e6d904 Update README.md 2023-09-04 11:41:33 +02:00
JW
b059afd621 Update README.md 2023-08-31 00:22:45 +02:00
JW
1275878822 Merge pull request #3 from isaackogan/patch-1
Update README.md
2023-08-30 22:39:44 +02:00
Isaac Kogan
761f3ab633 Update README.md 2023-08-30 15:58:50 -04:00
Jacek Wolniewicz
66def92316 quick fix 2023-08-30 21:50:25 +02:00
Jacek Wolniewicz
cc85d7c124 Changes:
- New event `onSuccessResponseMapping`
  triggered when Webcast.Message was  successfully mapped to TikTokEvent

- New Project Tools-collector:
  Tool generates instance of SqlLite
  database and collect to it both to
 events and exceptions occurred while TikTokLive client was running
2023-08-30 21:47:57 +02:00
Jacek Wolniewicz
384cfade5a Changes:
- New event `onSuccessResponseMapping`
  triggered when Webcast.Message was  successfully mapped to TikTokEvent

- New Project Tools-collector:
  Tool generates instance of SqlLite
  database and collect to it both to
 events and exceptions occurred while TikTokLive client was running
2023-08-30 21:47:45 +02:00
JW
483dceadcf Update README.md 2023-08-27 14:23:25 +02:00
JW
5f8cba5126 Update README.md 2023-08-26 03:42:09 +02:00
JW
f9966c9a5f Update README.md 2023-08-26 01:34:43 +02:00
JW
48a79736ad Update README.md 2023-08-26 01:34:19 +02:00
JW
eb82d0df78 Update README.md 2023-08-25 21:03:51 +02:00
GitHub Action
4ed821925d Update version in pom.xml 2023-08-25 19:03:24 +00:00
JW
6e9244aa67 Changes:
- Fixed bug: WebcastSocialMessage was always triggering `TikTokShareEvent` events such as `TikTokLikeEvent`, `TikTokFollowEvent`, `TikTokShareEvent`, `TikTokJoinEvent` was ignored
2023-08-25 21:01:56 +02:00
JW
fadb1ab267 changeing client name 2023-08-24 22:37:56 +02:00
JW
4273375eb9 Update README.md 2023-08-24 16:51:04 +02:00
JW
3daeee6316 Update README.md 2023-08-24 16:45:25 +02:00
GitHub Action
cde38df1b3 Update version in pom.xml 2023-08-24 14:38:53 +00:00
JW
15d6351d65 Changes:
- Fixed bug: library was not working on certain java versions
   due to different WebSocket implementation. Instead of using java websocket api now there is `org.java-websocket`
2023-08-24 16:36:40 +02:00
JW
44ba999b83 Update README.md 2023-08-23 21:56:08 +02:00
JW
5cf0d30962 Update README.md 2023-08-23 21:10:12 +02:00
JW
71ebc6e05e Update README.md 2023-08-23 21:00:37 +02:00
GitHub Action
c6d09927a0 Update version in pom.xml 2023-08-23 18:57:15 +00:00
JW
f03cb14262 Merge remote-tracking branch 'origin/master' 2023-08-23 20:55:46 +02:00
JW
d9ef60ccad Changes:
- Implementation on all features in `clientSettings`
  - Code optimization
  - More detail exceptions
  - Downloading gifts
2023-08-23 20:55:40 +02:00
JW
6fb89e72d4 Update README.md 2023-08-22 21:10:34 +02:00
JW
230764ed6a Update README.md 2023-08-22 21:08:38 +02:00
JW
b9a4fb193e Update README.md 2023-08-22 21:03:55 +02:00
JW
af209fc2ca Update README.md 2023-08-22 21:00:16 +02:00
JW
74bfe0b9e7 Merge remote-tracking branch 'origin/master' 2023-08-22 20:58:50 +02:00
JW
3545167873 Update example project 2023-08-22 20:58:45 +02:00
JW
c22483043d Update README.md 2023-08-22 20:51:17 +02:00
GitHub Action
8155d49366 Update version in pom.xml 2023-08-22 18:49:05 +00:00
JW
321b7c0eda Merge remote-tracking branch 'origin/master' 2023-08-22 20:47:33 +02:00
JW
26c7db8f99 Fix messages
- WebcastSocialMessage
  - ImDeleteMessage
2023-08-22 20:47:27 +02:00
JW
5f7ead2f05 Update README.md 2023-08-22 20:01:05 +02:00
GitHub Action
dffae3a521 Update version in pom.xml 2023-08-22 18:00:21 +00:00
JW
6254443755 Merge remote-tracking branch 'origin/master' 2023-08-22 19:58:51 +02:00
JW
c001eacbce Remove old test 2023-08-22 19:58:46 +02:00
JW
1bbb704d14 Update README.md 2023-08-22 19:54:56 +02:00
JW
8c3a5c6627 Remove old test 2023-08-22 19:54:10 +02:00
JW
470b154c5e Merge remote-tracking branch 'origin/master' 2023-08-22 19:53:39 +02:00
JW
2391b12598 Fix Message parsing for
- LikeMessage
- MessageWebcastGiftMessage
- MessageWebcastChatMessage
2023-08-22 19:53:33 +02:00
JW
cb68050e24 Update README.md 2023-08-22 19:14:46 +02:00
JW
a9e347b8da Update README.md 2023-08-22 17:50:22 +02:00
JW
73823c82ea Update README.md 2023-08-22 17:49:35 +02:00
JW
e0542d39af Update README.md 2023-08-22 17:46:42 +02:00
GitHub Action
d33dab0a98 Update version in pom.xml 2023-08-22 15:40:34 +00:00
JW
32cb1e0d8f Update pom.xml 2023-08-22 17:39:22 +02:00
JW
3210707bce Update maven-publish.yml 2023-08-22 17:39:04 +02:00
JW
e7f9d6e9d5 Update maven-publish.yml 2023-08-22 17:38:48 +02:00
GitHub Action
03001d607d Update version in pom.xml 2023-08-22 15:33:39 +00:00
JW
cbabad0888 Update pom.xml 2023-08-22 17:32:34 +02:00
JW
09c531e9f4 Update maven-publish.yml 2023-08-22 17:32:17 +02:00
GitHub Action
997c8d399e Update version in pom.xml 2023-08-22 15:30:36 +00:00
JW
668f28e357 Update maven-publish.yml 2023-08-22 17:29:30 +02:00
JW
b332c2f5d8 Update pom.xml 2023-08-22 17:27:57 +02:00
GitHub Action
5be113cbc8 Update version in pom.xml 2023-08-22 15:26:05 +00:00
JW
e0287aaa96 Update pom.xml 2023-08-22 17:24:52 +02:00
JW
8e2759cb1e Update maven-publish.yml 2023-08-22 17:23:32 +02:00
JW
fb9a48376b Update README.md 2023-08-22 14:24:20 +02:00
JW
3741351b7b Update README.md 2023-08-22 14:22:55 +02:00
GitHub Action
7eed221bab Update version in pom.xml 2023-08-22 11:55:25 +00:00
JW
e6089a99a1 Update pom 2023-08-22 13:54:01 +02:00
GitHub Action
7e77b06b93 Update version in pom.xml 2023-08-22 11:47:12 +00:00
JW
8594c0c3a2 Update pom 2023-08-22 13:45:55 +02:00
JW
48e03d960e Merge remote-tracking branch 'origin/master' 2023-08-22 13:44:01 +02:00
JW
fe9deac73a Update pom 2023-08-22 13:43:54 +02:00
GitHub Action
f7c67845eb Update version in pom.xml 2023-08-22 11:36:58 +00:00
JW
55a04b2439 Update pom 2023-08-22 13:35:51 +02:00
JW
9fdab77e5b Update pom 2023-08-22 13:30:46 +02:00
JW
2d6333a817 Update jitpack file 2023-08-22 13:18:13 +02:00
Jacek Wolniewicz
dd0dcb43d2 Merge remote-tracking branch 'origin/master' 2023-08-18 01:41:43 +02:00
Jacek Wolniewicz
77ac427b84 Fix maven 2023-08-18 01:41:35 +02:00
GitHub Action
d2999147a4 Update version in pom.xml 2023-08-17 23:18:12 +00:00
162 changed files with 4336 additions and 1563 deletions

View File

@@ -1,4 +1,4 @@
name: Publish Artifacts
name: Publish New Version
on:
workflow_dispatch:
@@ -32,7 +32,6 @@ jobs:
change_path: "."
short_tags: false
bump_each_commit: false
- name: 2.7 Update version in pom.xml (Release only)
@@ -74,6 +73,12 @@ jobs:
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 commit -m "Update version in pom.xml"
- name: Push changes
uses: ad-m/github-push-action@master

81
.gitignore vendored
View File

@@ -1,3 +1,82 @@
# Project exclude paths
/API/target/
/Client/target/
/Client/target/
*.db
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
# AWS User-specific
.idea/**/aws.xml
# Generated files
.idea/**/contentModel.xml
# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
# Gradle
.idea/**/gradle.xml
.idea/**/libraries
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/artifacts
# .idea/compiler.xml
# .idea/jarRepositories.xml
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr
# CMake
cmake-build-*/
# Mongo Explorer plugin
.idea/**/mongoSettings.xml
# File-based project format
*.iws
# IntelliJ
out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# SonarLint plugin
.idea/sonarlint/
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
# Editor-based Rest Client
.idea/httpRequests
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser

View File

@@ -5,19 +5,21 @@
<parent>
<artifactId>TikTokLiveJava</artifactId>
<groupId>io.github.jwdeveloper.tiktok</groupId>
<version>1.0.0</version>
<version>0.0.18-Release</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>API</artifactId>
<properties>
<maven.compiler.source>16</maven.compiler.source>
<maven.compiler.target>16</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.24.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>kr.motd.maven</groupId>

View File

@@ -3,6 +3,8 @@ 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
@@ -10,62 +12,60 @@ public class ClientSettings {
/// <summary>
/// Timeout for Connections
/// </summary>
private Duration Timeout;
/// <summary>
/// Polling-Interval for Socket-Connection
/// </summary
private Duration PollingInterval;
/// <summary>
/// Proxy for Connection
/// </summary>
private Duration timeout;
// public RotatingProxy Proxy;
/// <summary>
/// ISO-Language for Client
/// </summary>
private String ClientLanguage;
/// <summary>
/// Size for Buffer for Socket-Connection
/// </summary>
private int SocketBufferSize;
private String clientLanguage;
/// <summary>
/// Whether to Retry if Connection Fails
/// </summary>
private boolean RetryOnConnectionFailure;
private boolean retryOnConnectionFailure;
/// <summary>
/// Wait to connect again for selected amount of time
/// </summary>
private Duration retryConnectionTimeout;
/// <summary>
/// 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
/// </summary>
private boolean DownloadGiftInfo;
private boolean downloadGiftInfo;
/// <summary>
/// Whether to print Logs to Console
/// </summary>
private boolean PrintToConsole;
private boolean printToConsole;
/// <summary>
/// LoggingLevel for Logs
/// </summary>
private Level LogLevel;
private Level logLevel;
/// <summary>
/// Whether to print Base64-Data for Messages to Console
/// </summary>
private boolean PrintMessageData;
private boolean printMessageData;
/// <summary>
/// Whether to check Messages for Unparsed Data
/// Tiktok user name
/// </summary>
private boolean CheckForUnparsedData;
private String hostName;
/// <summary>
/// Parameters used in requests to tiktok api
/// </summary>
private Map<String, Object> clientParameters;
}

View File

@@ -39,18 +39,16 @@ public class Constants {
public static ClientSettings DefaultClientSettings() {
var clientSettings = new ClientSettings();
clientSettings.setTimeout(Duration.ofSeconds(DEFAULT_TIMEOUT));
clientSettings.setPollingInterval(Duration.ofSeconds(DEFAULT_POLLTIME));
clientSettings.setClientLanguage("en-US");
clientSettings.setHandleExistingMessagesOnConnect(true);
clientSettings.setDownloadGiftInfo(true);
clientSettings.setRetryOnConnectionFailure(true);
clientSettings.setSocketBufferSize(500_000);
clientSettings.setPrintToConsole(true);
clientSettings.setRetryOnConnectionFailure(false);
clientSettings.setRetryConnectionTimeout(Duration.ofSeconds(1));
clientSettings.setPrintToConsole(false);
clientSettings.setLogLevel(Level.ALL);
clientSettings.setCheckForUnparsedData(false);
clientSettings.setPrintMessageData(false);
clientSettings.setClientParameters(Constants.DefaultClientParams());
return clientSettings;
}

View File

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

View File

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

View File

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

View File

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

View File

@@ -3,39 +3,11 @@ package io.github.jwdeveloper.tiktok.events;
import io.github.jwdeveloper.tiktok.messages.*;
import lombok.Getter;
/*
Base class for all events
*/
@Getter
public class TikTokEvent {
private long messageId;
private long roomId;
private long timeStamp;
public abstract class TikTokEvent
{
public TikTokEvent(MessageHeader header) {
this(header.getMessageId(),header.getRoomId(), header.getTimeStamp1());
}
public TikTokEvent(GiftMessageHeader header) {
this(header.getMessageId(),header.getRoomId(), header.getTimeStamp1());
}
public TikTokEvent(MemberMessageHeader header) {
this(header.getMessageId(),header.getRoomId(), header.getTimeStamp1());
}
public TikTokEvent(SocialMessageHeader header) {
this(header.getMessageId(),header.getRoomId(), header.getTimeStamp1());
}
public TikTokEvent(LikeMessageHeader header) {
this(header.getMessageId(),header.getRoomId(), header.getTimeStamp1());
}
public TikTokEvent(long messageId, long roomId, long timeStamp) {
this.messageId = messageId;
this.roomId = roomId;
this.timeStamp = timeStamp;
}
public TikTokEvent() {
}
}

View File

@@ -2,94 +2,94 @@ package io.github.jwdeveloper.tiktok.events;
import io.github.jwdeveloper.tiktok.events.messages.*;
import java.util.function.Consumer;
public interface TikTokEventBuilder<T> {
T onUnhandledSocial(Consumer<TikTokUnhandledSocialEvent> event);
T onUnhandledSocial(TikTokEventConsumer<TikTokUnhandledSocialEvent> event);
T onLinkMicFanTicket(Consumer<TikTokLinkMicFanTicketEvent> event);
T onLinkMicFanTicket(TikTokEventConsumer<TikTokLinkMicFanTicketEvent> event);
T onEnvelope(Consumer<TikTokEnvelopeEvent> event);
T onEnvelope(TikTokEventConsumer<TikTokEnvelopeEvent> event);
T onShopMessage(Consumer<TikTokShopMessageEvent> event);
T onShopMessage(TikTokEventConsumer<TikTokShopMessageEvent> event);
T onDetectMessage(Consumer<TikTokDetectMessageEvent> event);
T onDetectMessage(TikTokEventConsumer<TikTokDetectMessageEvent> event);
T onLinkLayerMessage(Consumer<TikTokLinkLayerMessageEvent> event);
T onLinkLayerMessage(TikTokEventConsumer<TikTokLinkLayerMessageEvent> event);
T onConnected(Consumer<TikTokConnectedEvent> event);
T onConnected(TikTokEventConsumer<TikTokConnectedEvent> event);
T onCaption(Consumer<TikTokCaptionEvent> event);
T onCaption(TikTokEventConsumer<TikTokCaptionEvent> event);
T onQuestion(Consumer<TikTokQuestionEvent> event);
T onQuestion(TikTokEventConsumer<TikTokQuestionEvent> event);
T onRoomPinMessage(Consumer<TikTokRoomPinMessageEvent> event);
T onRoomPinMessage(TikTokEventConsumer<TikTokRoomPinMessageEvent> event);
T onRoomMessage(Consumer<TikTokRoomMessageEvent> event);
T onRoomMessage(TikTokEventConsumer<TikTokRoomMessageEvent> event);
T onLivePaused(Consumer<TikTokLivePausedEvent> event);
T onLivePaused(TikTokEventConsumer<TikTokLivePausedEvent> event);
T onLike(Consumer<TikTokLikeEvent> event);
T onLike(TikTokEventConsumer<TikTokLikeEvent> event);
T onLinkMessage(Consumer<TikTokLinkMessageEvent> event);
T onLinkMessage(TikTokEventConsumer<TikTokLinkMessageEvent> event);
T onBarrageMessage(Consumer<TikTokBarrageMessageEvent> event);
T onBarrageMessage(TikTokEventConsumer<TikTokBarrageMessageEvent> event);
T onGiftMessage(Consumer<TikTokGiftMessageEvent> event);
T onGiftMessage(TikTokEventConsumer<TikTokGiftMessageEvent> event);
T onLinkMicArmies(Consumer<TikTokLinkMicArmiesEvent> event);
T onLinkMicArmies(TikTokEventConsumer<TikTokLinkMicArmiesEvent> event);
T onEmote(Consumer<TikTokEmoteEvent> event);
T onEmote(TikTokEventConsumer<TikTokEmoteEvent> event);
T onUnauthorizedMember(Consumer<TikTokUnauthorizedMemberEvent> event);
T onUnauthorizedMember(TikTokEventConsumer<TikTokUnauthorizedMemberEvent> event);
T onInRoomBanner(Consumer<TikTokInRoomBannerEvent> event);
T onInRoomBanner(TikTokEventConsumer<TikTokInRoomBannerEvent> event);
T onLinkMicMethod(Consumer<TikTokLinkMicMethodEvent> event);
T onLinkMicMethod(TikTokEventConsumer<TikTokLinkMicMethodEvent> event);
T onSubscribe(Consumer<TikTokSubscribeEvent> event);
T onSubscribe(TikTokEventConsumer<TikTokSubscribeEvent> event);
T onPollMessage(Consumer<TikTokPollMessageEvent> event);
T onPollMessage(TikTokEventConsumer<TikTokPollMessageEvent> event);
T onFollow(Consumer<TikTokFollowEvent> event);
T onFollow(TikTokEventConsumer<TikTokFollowEvent> event);
T onRoomViewerData(Consumer<TikTokRoomViewerDataEvent> event);
T onRoomViewerData(TikTokEventConsumer<TikTokRoomViewerDataEvent> event);
T onGoalUpdate(Consumer<TikTokGoalUpdateEvent> event);
T onGoalUpdate(TikTokEventConsumer<TikTokGoalUpdateEvent> event);
T onComment(Consumer<TikTokCommentEvent> event);
T onComment(TikTokEventConsumer<TikTokCommentEvent> event);
T onRankUpdate(Consumer<TikTokRankUpdateEvent> event);
T onRankUpdate(TikTokEventConsumer<TikTokRankUpdateEvent> event);
T onIMDelete(Consumer<TikTokIMDeleteEvent> event);
T onIMDelete(TikTokEventConsumer<TikTokIMDeleteEvent> event);
T onLiveEnded(Consumer<TikTokLiveEndedEvent> event);
T onLiveEnded(TikTokEventConsumer<TikTokLiveEndedEvent> event);
T onError(Consumer<TikTokErrorEvent> event);
T onError(TikTokEventConsumer<TikTokErrorEvent> event);
T onUnhandled(Consumer<TikTokUnhandledEvent> event);
T onUnhandled(TikTokEventConsumer<TikTokUnhandledWebsocketMessageEvent> event);
T onJoin(Consumer<TikTokJoinEvent> event);
T onJoin(TikTokEventConsumer<TikTokJoinEvent> event);
T onRankText(Consumer<TikTokRankTextEvent> event);
T onRankText(TikTokEventConsumer<TikTokRankTextEvent> event);
T onShare(Consumer<TikTokShareEvent> event);
T onShare(TikTokEventConsumer<TikTokShareEvent> event);
T onUnhandledMember(Consumer<TikTokUnhandledMemberEvent> event);
T onUnhandledMember(TikTokEventConsumer<TikTokUnhandledMemberEvent> event);
T onSubNotify(Consumer<TikTokSubNotifyEvent> event);
T onSubNotify(TikTokEventConsumer<TikTokSubNotifyEvent> event);
T onLinkMicBattle(Consumer<TikTokLinkMicBattleEvent> event);
T onLinkMicBattle(TikTokEventConsumer<TikTokLinkMicBattleEvent> event);
T onDisconnected(Consumer<TikTokDisconnectedEvent> event);
T onDisconnected(TikTokEventConsumer<TikTokDisconnectedEvent> event);
T onGiftBroadcast(Consumer<TikTokGiftBroadcastEvent> event);
T onGiftBroadcast(TikTokEventConsumer<TikTokGiftBroadcastEvent> event);
T onUnhandledControl(Consumer<TikTokUnhandledControlEvent> event);
T onUnhandledControl(TikTokEventConsumer<TikTokUnhandledControlEvent> event);
T onEvent(TikTokEventConsumer<TikTokEvent> event);
T onWebsocketMessage(TikTokEventConsumer<TikTokWebsocketMessageEvent> event);
T onEvent(Consumer<TikTokEvent> event);
}

View File

@@ -2,7 +2,7 @@ package io.github.jwdeveloper.tiktok.events;
import io.github.jwdeveloper.tiktok.live.LiveClient;
public interface TikTokLiveEvent<T extends TikTokEvent>
public interface TikTokEventConsumer<T extends TikTokEvent>
{
void onEvent(LiveClient liveClient, T event);
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,30 +1,30 @@
package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.Nullable;
import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.events.objects.Picture;
import io.github.jwdeveloper.tiktok.events.objects.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;
import java.util.List;
@Getter
public class TikTokCommentEvent extends TikTokEvent
{
@Nullable
private User user;
private final String text;
private final String language;
private final List<User> mentionedUsers;
private final List<Picture> pictures;
@Value
@EventMeta(eventType = EventType.Message)
public class TikTokCommentEvent extends TikTokHeaderEvent {
User user;
String text;
String language;
List<User> mentionedUsers;
List<Picture> pictures;
public TikTokCommentEvent(WebcastRoomPinMessage.RoomPinMessageData data) {
super(data.getDetails().getRoomId(), data.getDetails().getMessageId(), data.getDetails().getServerTime());
if (data.hasSender())
user = new User(data.getSender());
user = User.MapOrEmpty(data.getSender());
text = data.getComment();
language = data.getLanguage();
mentionedUsers = new ArrayList<>();
@@ -33,11 +33,10 @@ public class TikTokCommentEvent extends TikTokEvent
public TikTokCommentEvent(WebcastChatMessage msg) {
super(msg.getHeader());
if (msg.hasSender())
user = new User(msg.getSender());
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.getPicture())).toList();
pictures = msg.getImagesList().stream().map(e -> new Picture(e.getImage())).toList();
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,17 +1,19 @@
package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.messages.WebcastImDeleteMessage;
import lombok.Getter;
@Getter
public class TikTokIMDeleteEvent extends TikTokEvent {
private final String data1;
private final String data2;
@EventMeta(eventType = EventType.Message)
public class TikTokIMDeleteEvent extends TikTokHeaderEvent {
private final byte[] data;
public TikTokIMDeleteEvent(WebcastImDeleteMessage msg) {
super(msg.getHeader());;
data1 = msg.getData1();
data2 = msg.getData2();
}
public TikTokIMDeleteEvent(WebcastImDeleteMessage msg) {
super(msg.getHeader());
data = msg.getData().toByteArray();
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,12 +1,16 @@
package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.messages.WebcastHourlyRankMessage;
import io.github.jwdeveloper.tiktok.messages.WebcastRankUpdateMessage;
import lombok.Getter;
@Getter
public class TikTokRankUpdateEvent extends TikTokEvent {
@EventMeta(eventType = EventType.Message)
public class TikTokRankUpdateEvent extends TikTokHeaderEvent {
private final String eventType;
private final String label;
@@ -20,10 +24,15 @@ public class TikTokRankUpdateEvent extends TikTokEvent {
var rankData = msg.getData().getRankings();
eventType = rankData.getType();
label = rankData.getLabel();
rank = rankData.getDetails(0).getLabel();
if(rankData.getDetailsList().isEmpty())
{
rank = "";
}
else
{
rank = rankData.getDetails(0).getLabel();
}
color = rankData.getColor().getColor();
}
public TikTokRankUpdateEvent(WebcastRankUpdateMessage msg) {
@@ -31,7 +40,14 @@ public class TikTokRankUpdateEvent extends TikTokEvent {
var rankData = msg.getData().getRankData();
eventType = rankData.getType();
label = rankData.getLabel();
rank = rankData.getDetails(0).getLabel();
if(rankData.getDetailsList().isEmpty())
{
rank = "";
}
else
{
rank = rankData.getDetails(0).getLabel();
}
color = rankData.getColor().getColor();
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,14 +0,0 @@
package io.github.jwdeveloper.tiktok.events.messages;
import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.messages.WebcastResponse;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public class TikTokUnhandledEvent extends TikTokEvent
{
private final WebcastResponse.Message message;
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,38 @@
package io.github.jwdeveloper.tiktok.exceptions;
import io.github.jwdeveloper.tiktok.messages.WebcastResponse;
import lombok.Getter;
import java.util.Base64;
public class TikTokLiveMessageException extends TikTokLiveException {
@Getter
private final WebcastResponse.Message webcastMessage;
@Getter
private final WebcastResponse webcastResponse;
public TikTokLiveMessageException(WebcastResponse.Message message,
WebcastResponse webcastResponse,
Throwable cause) {
super("Error while handling Message: " + message.getType() + ": \n", cause);
this.webcastMessage = message;
this.webcastResponse = webcastResponse;
}
public String messageName()
{
return webcastMessage.getType();
}
public String messageToBase64()
{
return Base64.getEncoder().encodeToString(webcastMessage.getBinary().toByteArray());
}
public String webcastResponseToBase64()
{
return Base64.getEncoder().encodeToString(webcastResponse.toByteArray());
}
}

View File

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

View File

@@ -0,0 +1,8 @@
package io.github.jwdeveloper.tiktok.exceptions;
public class TikTokLiveOfflineHostException extends TikTokLiveException
{
public TikTokLiveOfflineHostException(String message) {
super(message);
}
}

View File

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

View File

@@ -0,0 +1,15 @@
package io.github.jwdeveloper.tiktok.exceptions;
public class TikTokMessageMappingException extends TikTokLiveException
{
public TikTokMessageMappingException(Class<?> inputClazz, Class<?> outputClass, Throwable throwable)
{
super("Unable to handle mapping from class: " + inputClazz.getSimpleName() + " to class " + outputClass.getSimpleName(),throwable);
}
public TikTokMessageMappingException(Class<?> inputClazz, Class<?> outputClass, String message)
{
super("Unable to handle mapping from class: " + inputClazz.getSimpleName() + " to class " + outputClass.getSimpleName()+": "+message);
}
}

View File

@@ -0,0 +1,15 @@
package io.github.jwdeveloper.tiktok.exceptions;
import lombok.Getter;
public class TikTokProtocolBufferException extends TikTokLiveException
{
@Getter
private final byte[] bytes;
public TikTokProtocolBufferException(String message, byte[] bytes, Throwable cause)
{
super(message, cause);
this.bytes = bytes;
}
}

View File

@@ -0,0 +1,10 @@
package io.github.jwdeveloper.tiktok.handler;
import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.messages.WebcastResponse;
public interface TikTokMessageHandler
{
TikTokEvent handle(WebcastResponse.Message message) throws Exception;
}

View File

@@ -1,7 +0,0 @@
package io.github.jwdeveloper.tiktok.http.Resource;
import lombok.Data;
@Data
public class ClientFetchDataResponse {
}

View File

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

View File

@@ -0,0 +1,11 @@
package io.github.jwdeveloper.tiktok.listener;
import java.util.List;
public interface ListenersManager
{
List<TikTokEventListener> getBindingModels();
void addListener(TikTokEventListener listener);
void removeListener(TikTokEventListener listener);
}

View File

@@ -0,0 +1,6 @@
package io.github.jwdeveloper.tiktok.listener;
public interface TikTokEventListener
{
}

View File

@@ -0,0 +1,14 @@
package io.github.jwdeveloper.tiktok.live;
import io.github.jwdeveloper.tiktok.events.objects.TikTokGift;
import io.github.jwdeveloper.tiktok.models.GiftId;
import io.github.jwdeveloper.tiktok.models.gifts.TikTokGiftInfo;
import java.util.Map;
public interface GiftManager
{
Map<Integer, TikTokGiftInfo> getGiftsInfo();
Map<GiftId, TikTokGift> getActiveGifts();
}

View File

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

View File

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

View File

@@ -7,7 +7,7 @@ import lombok.Data;
@AllArgsConstructor
public class GiftId
{
public long Gift;
private long giftId;
public String UserName;
private String userName;
}

View File

@@ -0,0 +1,6 @@
package io.github.jwdeveloper.tiktok.models;
public enum GiftStrike
{
BEGIN, UPDATE, ENDED
}

View File

@@ -3,14 +3,13 @@ package io.github.jwdeveloper.tiktok.models.gifts;
import lombok.Data;
@Data
public class DefaultFormat
{
private boolean bold ;
private String color ;
private int font_size ;
private boolean italic ;
private int italic_angle ;
private boolean use_highlight_color ;
private boolean use_remote_color ;
private int weight ;
public class DefaultFormat {
private boolean bold;
private String color;
private int font_size;
private boolean italic;
private int italic_angle;
private boolean use_highlight_color;
private boolean use_remote_color;
private int weight;
}

View File

@@ -5,10 +5,9 @@ import lombok.Data;
import java.util.List;
@Data
public class DisplayText
{
private DefaultFormat default_format ;
private String default_pattern ;
private String key ;
private List<Object> pieces ;
public class DisplayText {
private DefaultFormat default_format;
private String default_pattern;
private String key;
private List<Object> pieces;
}

View File

@@ -5,14 +5,13 @@ import lombok.Data;
import java.util.List;
@Data
public class GiftLabelIcon
{
private String avg_color ;
private int height ;
private int image_type ;
private boolean is_animated ;
private String open_web_url ;
private String uri ;
private List<String> url_list ;
private int width ;
public class GiftLabelIcon {
private String avg_color;
private int height;
private int image_type;
private boolean is_animated;
private String open_web_url;
private String uri;
private List<String> url_list;
private int width;
}

View File

@@ -6,10 +6,9 @@ import java.util.List;
@Data
public class GiftPanelBanner
{
private List<Object> bg_color_values ;
private DisplayText display_text ;
private LeftIcon left_icon ;
private String schema_url ;
public class GiftPanelBanner {
private List<Object> bg_color_values;
private DisplayText display_text;
private LeftIcon left_icon;
private String schema_url;
}

View File

@@ -5,14 +5,13 @@ import lombok.Data;
import java.util.List;
@Data
public class Image
{
private String avg_color ;
private int height ;
private int image_type ;
private boolean is_animated ;
private String open_web_url ;
private String uri ;
private List<String> url_list ;
private int width ;
public class Image {
private String avg_color;
private int height;
private int image_type;
private boolean is_animated;
private String open_web_url;
private String uri;
private List<String> url_list;
private int width;
}

View File

@@ -5,16 +5,15 @@ import lombok.Data;
import java.util.List;
@Data
public class LeftIcon
{
private String avg_color ;
private int height ;
private int image_type ;
private boolean is_animated ;
private String open_web_url ;
private String uri ;
private List<String> url_list ;
private int width ;
public class LeftIcon {
private String avg_color;
private int height;
private int image_type;
private boolean is_animated;
private String open_web_url;
private String uri;
private List<String> url_list;
private int width;
}

View File

@@ -1,6 +1,9 @@
package io.github.jwdeveloper.tiktok.models.gifts;
import lombok.Data;
@Data
public class LockInfo
{
public int lock_type;
private int lock_type;
}

View File

@@ -5,7 +5,7 @@ import lombok.Data;
import java.util.List;
@Data
public class TikTokGift
public class TikTokGiftInfo
{
private int action_type;
private int app_id;

View File

@@ -0,0 +1,38 @@
package io.github.jwdeveloper.tiktok.utils;
import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException;
public class CancelationToken
{
private boolean isCanceled =false;
public void cancel()
{
isCanceled =true;
}
public boolean isCancel()
{
return isCanceled;
}
public void throwIfCancel()
{
if(!isCanceled)
{
return;
}
throw new TikTokLiveException("Token requested cancelation");
}
public boolean isNotCancel()
{
return !isCancel();
}
public static CancelationToken create()
{
return new CancelationToken();
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -5,7 +5,7 @@
<parent>
<artifactId>TikTokLiveJava</artifactId>
<groupId>io.github.jwdeveloper.tiktok</groupId>
<version>1.0.0</version>
<version>0.0.18-Release</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -13,8 +13,6 @@
<dependencies>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
@@ -26,6 +24,35 @@
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.24.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>2.0.7</version>
</dependency>
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>1.5.4</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>2.0.7</version>
<scope>runtime</scope>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>16</maven.compiler.source>
<maven.compiler.target>16</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>

View File

@@ -1,45 +1,48 @@
package io.github.jwdeveloper.tiktok;
import io.github.jwdeveloper.tiktok.events.objects.TikTokGift;
import io.github.jwdeveloper.tiktok.http.TikTokApiService;
import io.github.jwdeveloper.tiktok.live.GiftManager;
import io.github.jwdeveloper.tiktok.messages.WebcastGiftMessage;
import io.github.jwdeveloper.tiktok.models.GiftId;
import io.github.jwdeveloper.tiktok.models.gifts.TikTokGiftInfo;
import lombok.Getter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
public class TikTokGiftManager {
private Logger logger;
private ClientSettings clientSettings;
private TikTokApiService apiService;
private Map<Integer, TikTokGift> gifts;
public class TikTokGiftManager implements GiftManager {
@Getter
private Map<GiftId, TikTokGift> activeGifts;
private final Map<Integer, TikTokGiftInfo> giftsInfo;
@Getter
private final Map<GiftId, TikTokGift> activeGifts;
public TikTokGiftManager(Logger logger, TikTokApiService apiService, ClientSettings clientSettings) {
this.logger = logger;
this.clientSettings = clientSettings;
this.apiService = apiService;
this.gifts = new HashMap<>();
public TikTokGiftManager() {
giftsInfo = new HashMap<>();
activeGifts = new HashMap<>();
}
public void loadGifts() {
if (!clientSettings.isDownloadGiftInfo()) {
return;
public TikTokGift updateActiveGift(WebcastGiftMessage giftMessage) {
var giftId = new GiftId(giftMessage.getGiftId(), giftMessage.getUser().getIdStr());
if (activeGifts.containsKey(giftId)) {
var gift = activeGifts.get(giftId);
gift.setAmount(giftMessage.getComboCount());
} else {
var newGift = new TikTokGift(giftMessage);
activeGifts.put(giftId, newGift);
}
logger.info("Fetching gifts");
//TODO gifts =apiService.fetchAvailableGifts();
var gift = activeGifts.get(giftId);
if (giftMessage.getRepeatEnd() > 0)
{
gift.setStreakFinished(true);
activeGifts.remove(giftId);
}
return gift;
}
public List<TikTokGift> getGifts()
{
return gifts.values().stream().toList();
public void loadGifsInfo(Map<Integer, TikTokGiftInfo> gifts) {
this.giftsInfo.putAll(gifts);
}
}

View File

@@ -8,6 +8,4 @@ public class TikTokLive
{
return new TikTokLiveClientBuilder(userName);
}
}

View File

@@ -1,94 +1,127 @@
package io.github.jwdeveloper.tiktok;
import io.github.jwdeveloper.tiktok.events.messages.TikTokDisconnectedEvent;
import io.github.jwdeveloper.tiktok.events.messages.TikTokErrorEvent;
import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException;
import io.github.jwdeveloper.tiktok.handlers.TikTokEventHandler;
import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveOfflineHostException;
import io.github.jwdeveloper.tiktok.handlers.TikTokEventObserver;
import io.github.jwdeveloper.tiktok.http.TikTokApiService;
import io.github.jwdeveloper.tiktok.listener.ListenersManager;
import io.github.jwdeveloper.tiktok.listener.TikTokListenersManager;
import io.github.jwdeveloper.tiktok.live.ConnectionState;
import io.github.jwdeveloper.tiktok.live.GiftManager;
import io.github.jwdeveloper.tiktok.live.LiveClient;
import io.github.jwdeveloper.tiktok.live.LiveRoomInfo;
import io.github.jwdeveloper.tiktok.live.TikTokRoomInfo;
import io.github.jwdeveloper.tiktok.websocket.TikTokWebsocketClient;
import io.github.jwdeveloper.tiktok.websocket.TikTokWebSocketClient;
import java.util.logging.Logger;
public class TikTokLiveClient implements LiveClient {
private final TikTokRoomInfo meta;
private final TikTokGiftManager giftManager;
private final TikTokApiService apiClient;
private final TikTokWebsocketClient webSocketClient;
private final TikTokEventHandler tikTokEventHandler;
private final TikTokRoomInfo liveRoomInfo;
private final TikTokGiftManager tikTokGiftManager;
private final TikTokApiService apiService;
private final TikTokWebSocketClient webSocketClient;
private final TikTokEventObserver tikTokEventHandler;
private final ClientSettings clientSettings;
private final TikTokListenersManager listenersManager;
private final Logger logger;
public TikTokLiveClient(TikTokRoomInfo tikTokLiveMeta,
TikTokApiService tikTokApiService,
TikTokWebsocketClient webSocketClient,
TikTokWebSocketClient webSocketClient,
TikTokGiftManager tikTokGiftManager,
TikTokEventHandler tikTokEventHandler,
TikTokEventObserver tikTokEventHandler,
ClientSettings clientSettings,
TikTokListenersManager listenersManager,
Logger logger) {
this.meta = tikTokLiveMeta;
this.giftManager = tikTokGiftManager;
this.apiClient = tikTokApiService;
this.liveRoomInfo = tikTokLiveMeta;
this.tikTokGiftManager = tikTokGiftManager;
this.apiService = tikTokApiService;
this.webSocketClient = webSocketClient;
this.logger = logger;
this.tikTokEventHandler = tikTokEventHandler;
this.clientSettings = clientSettings;
this.listenersManager = listenersManager;
this.logger = logger;
}
public void connect() {
try {
tryConnect();
} catch (Exception e) {
e.printStackTrace();
}
catch (TikTokLiveException e)
{
setState(ConnectionState.DISCONNECTED);
tikTokEventHandler.publish(this, new TikTokErrorEvent(e));
tikTokEventHandler.publish(this, new TikTokDisconnectedEvent());
if(e instanceof TikTokLiveOfflineHostException && clientSettings.isRetryOnConnectionFailure())
{
try {
Thread.sleep(clientSettings.getRetryConnectionTimeout().toMillis());
}
catch (Exception ignored){}
logger.info("Reconnecting");
this.connect();
}
throw e;
}
}
public void disconnect() {
if (!meta.hasConnectionState(ConnectionState.CONNECTED)) {
if (!liveRoomInfo.hasConnectionState(ConnectionState.CONNECTED)) {
return;
}
webSocketClient.stop();
setState(ConnectionState.DISCONNECTED);
}
public void tryConnect() {
if (meta.hasConnectionState(ConnectionState.CONNECTED))
throw new RuntimeException("Already connected");
if (meta.hasConnectionState(ConnectionState.CONNECTING))
throw new RuntimeException("Already connecting");
if (liveRoomInfo.hasConnectionState(ConnectionState.CONNECTED))
throw new TikTokLiveException("Already connected");
if (liveRoomInfo.hasConnectionState(ConnectionState.CONNECTING))
throw new TikTokLiveException("Already connecting");
logger.info("Connecting");
setState(ConnectionState.CONNECTING);
var roomId = apiClient.fetchRoomId(meta.getUserName());
meta.setRoomId(roomId);
var roomData =apiClient.fetchRoomInfo();
if (roomData.getStatus() == 0 || roomData.getStatus() == 4)
{
throw new TikTokLiveException("LiveStream for HostID could not be found. Is the Host online?");
var roomId = apiService.fetchRoomId(liveRoomInfo.getUserName());
liveRoomInfo.setRoomId(roomId);
var roomData = apiService.fetchRoomInfo();
if (roomData.getStatus() == 0 || roomData.getStatus() == 4) {
throw new TikTokLiveOfflineHostException("LiveStream for HostID could not be found. Is the Host online?");
}
// giftManager.loadGifts();
var clientData = apiClient.fetchClientData();
webSocketClient.start(clientData);
if (clientSettings.isDownloadGiftInfo())
{
logger.info("Fetch Gift info");
var gifts = apiService.fetchAvailableGifts();
tikTokGiftManager.loadGifsInfo(gifts);
}
var clientData = apiService.fetchClientData();
webSocketClient.start(clientData, this);
setState(ConnectionState.CONNECTED);
}
public LiveRoomInfo getRoomInfo() {
return meta;
return liveRoomInfo;
}
@Override
public ListenersManager getListenersManager()
{
return listenersManager;
}
@Override
public GiftManager getGiftManager() {
return tikTokGiftManager;
}
private void setState(ConnectionState connectionState) {
logger.info("TikTokLive client state: " + connectionState.name());
meta.setConnectionState(connectionState);
liveRoomInfo.setConnectionState(connectionState);
}

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