From c36b0f1f62cff3fc3216446e1d453785e1bcf5f4 Mon Sep 17 00:00:00 2001 From: kohlerpop1 Date: Mon, 1 Jul 2024 15:04:05 -0400 Subject: [PATCH 01/13] Fixed spelling mistake! --- .../tiktok/data/events/gift/TikTokGiftComboEvent.java | 4 ++-- README.md | 6 +++--- Tools-ReadmeGenerator/src/main/resources/output.md | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftComboEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftComboEvent.java index 6736566..f992ecb 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftComboEvent.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftComboEvent.java @@ -39,9 +39,9 @@ import lombok.Getter; *

>Combo: 1 -> comboState = GiftSendType.Begin

*

Combo: 4 -> comboState = GiftSendType.Active

*

Combo: 8 -> comboState = GiftSendType.Active

- *

Combo: 12 -> comboState = GiftSendType.Finsihed

+ *

Combo: 12 -> comboState = GiftSendType.Finished

*

- * Remember if comboState is Finsihed both TikTokGiftComboEvent and TikTokGiftEvent event gets triggered + * Remember if comboState is Finished both TikTokGiftComboEvent and TikTokGiftEvent event gets triggered */ @EventMeta(eventType = EventType.Message) @Getter diff --git a/README.md b/README.md index 5cfc0e9..4bac808 100644 --- a/README.md +++ b/README.md @@ -426,9 +426,9 @@ Triggered every time gift is sent

>Combo: 1 -> comboState = GiftSendType.Begin

Combo: 4 -> comboState = GiftSendType.Active

Combo: 8 -> comboState = GiftSendType.Active

-

Combo: 12 -> comboState = GiftSendType.Finsihed

+

Combo: 12 -> comboState = GiftSendType.Finished

- Remember if comboState is Finsihed both TikTokGiftComboEvent and TikTokGiftEvent event gets triggered + Remember if comboState is Finished both TikTokGiftComboEvent and TikTokGiftEvent event gets triggered ```java @@ -754,4 +754,4 @@ public static class CustomListener implements TikTokEventListener { [Library documentation for contributors](https://github.com/jwdeveloper/TikTokLiveJava/wiki) -Your improvements are welcome! Feel free to open an issue or pull request. +Your improvements are welcome! Feel free to open an issue or pull request. \ No newline at end of file diff --git a/Tools-ReadmeGenerator/src/main/resources/output.md b/Tools-ReadmeGenerator/src/main/resources/output.md index 64b3c22..427685a 100644 --- a/Tools-ReadmeGenerator/src/main/resources/output.md +++ b/Tools-ReadmeGenerator/src/main/resources/output.md @@ -405,9 +405,9 @@ TikTokLive.newClient("host-name")

>Combo: 1 -> comboState = GiftSendType.Begin

Combo: 4 -> comboState = GiftSendType.Active

Combo: 8 -> comboState = GiftSendType.Active

-

Combo: 12 -> comboState = GiftSendType.Finsihed

+

Combo: 12 -> comboState = GiftSendType.Finished

- Remember if comboState is Finsihed both TikTokGiftComboEvent and TikTokGiftEvent event gets triggered + Remember if comboState is Finished both TikTokGiftComboEvent and TikTokGiftEvent event gets triggered ```java @@ -729,4 +729,4 @@ my name is {{item.name}} ## Contributing -Your improvements are welcome! Feel free to open an issue or pull request. +Your improvements are welcome! Feel free to open an issue or pull request. \ No newline at end of file From 046d5f17566f9d17c2e2d571075f037a4cda3879 Mon Sep 17 00:00:00 2001 From: "jacek.wolniewicz" Date: Mon, 1 Jul 2024 21:25:30 +0200 Subject: [PATCH 02/13] Simplify adding events to TikTok Builder, checkout `EventsBuilder` --- .../tiktok/live/builder/EventsBuilder.java | 116 ++++-- .../tiktok/TikTokLiveClientBuilder.java | 360 +----------------- Tools-ReadmeGenerator/pom.xml | 8 +- .../jwdeveloper/tiktok/EventsDecorator.java | 12 + .../io/github/jwdeveloper/tiktok/Main.java | 37 ++ .../jwdeveloper/tiktok/ReadmeGenerator.java | 6 +- .../src/main/resources/readme-template.html | 66 ++++ 7 files changed, 216 insertions(+), 389 deletions(-) create mode 100644 Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/EventsDecorator.java create mode 100644 Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/Main.java create mode 100644 Tools-ReadmeGenerator/src/main/resources/readme-template.html diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/EventsBuilder.java b/API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/EventsBuilder.java index c5dfb7a..961ff49 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/EventsBuilder.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/EventsBuilder.java @@ -22,8 +22,8 @@ */ package io.github.jwdeveloper.tiktok.live.builder; -import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent; import io.github.jwdeveloper.tiktok.data.events.*; +import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent; import io.github.jwdeveloper.tiktok.data.events.control.TikTokPreConnectionEvent; import io.github.jwdeveloper.tiktok.data.events.gift.TikTokGiftComboEvent; import io.github.jwdeveloper.tiktok.data.events.gift.TikTokGiftEvent; @@ -55,7 +55,9 @@ public interface EventsBuilder { * @param action consumable action * @return self instance */ - T onEvent(EventConsumer action); + default T onEvent(EventConsumer action) { + return onEvent(TikTokEvent.class, action); + } /** * Invoked when information about room (live) got updated such as viewer count, etc.. @@ -63,113 +65,171 @@ public interface EventsBuilder { * @param action consumable action * @return self instance */ - T onRoomInfo(EventConsumer action); + default T onRoomInfo(EventConsumer action) { + return onEvent(TikTokRoomInfoEvent.class, action); + } /** * Invoked when someone send message to chat + * * @param action consumable action * @return self instance */ - T onComment(EventConsumer action); + default T onComment(EventConsumer action) { + return onEvent(TikTokCommentEvent.class, action); + } /** * Invoked when TikTokLiveJava makes http request and getting response + * * @param action consumable action * @return self instance */ - T onHttpResponse(EventConsumer action); + default T onHttpResponse(EventConsumer action) { + return onEvent(TikTokHttpResponseEvent.class, action); + } /** * Invoked when TikTok protocolBuffer data "message" was successfully mapped to event * events contains protocol-buffer "Message" and TikTokLiveJava "Event" + * * @param action consumable action * @return self instance */ - T onWebsocketMessage(EventConsumer action); + default T onWebsocketMessage(EventConsumer action) { + return onEvent(TikTokWebsocketMessageEvent.class, action); + } /** * Invoked when there was not found event mapper for TikTok protocolBuffer data "message" + * * @param action consumable action * @return self instance */ - T onWebsocketUnhandledMessage(EventConsumer action); + default T onWebsocketUnhandledMessage(EventConsumer action) { + return onEvent(TikTokWebsocketUnhandledMessageEvent.class, action); + } /** * Invoked every time TikTok sends protocolBuffer data to websocket * Response contains list of messages that are later mapped to events + * * @param action consumable action * @return self instance */ - T onWebsocketResponse(EventConsumer action); + default T onWebsocketResponse(EventConsumer action) { + return onEvent(TikTokWebsocketResponseEvent.class, action); + } /** * Invoked for gifts that has no combo, or when combo finishes + * * @param action consumable action * @return self instance */ - T onGift(EventConsumer action); + default T onGift(EventConsumer action) { + return onEvent(TikTokGiftEvent.class, action); + } /** * Invoked for gifts that has combo options such as roses + * * @param action consumable action * @return self instance */ - T onGiftCombo(EventConsumer action); + default T onGiftCombo(EventConsumer action) { + return onEvent(TikTokGiftComboEvent.class, action); + } - T onQuestion(EventConsumer action); + default T onQuestion(EventConsumer action) { + return onEvent(TikTokQuestionEvent.class, action); + } - T onSubscribe(EventConsumer action); + default T onSubscribe(EventConsumer action) { + return onEvent(TikTokSubscribeEvent.class, action); + } - T onFollow(EventConsumer action); + default T onFollow(EventConsumer action) { + return onEvent(TikTokFollowEvent.class, action); + } - T onLike(EventConsumer action); + default T onLike(EventConsumer action) { + return onEvent(TikTokLikeEvent.class, action); + } - T onEmote(EventConsumer action); + default T onEmote(EventConsumer action) { + return onEvent(TikTokEmoteEvent.class, action); + } - T onJoin(EventConsumer action); + default T onJoin(EventConsumer action) { + return onEvent(TikTokJoinEvent.class, action); + } - T onShare(EventConsumer action); + default T onShare(EventConsumer action) { + return onEvent(TikTokShareEvent.class, action); + } - T onLivePaused(EventConsumer action); + default T onLivePaused(EventConsumer action) { + return onEvent(TikTokLivePausedEvent.class, action); + } - T onLiveUnpaused(EventConsumer action); + default T onLiveUnpaused(EventConsumer action) { + return onEvent(TikTokLiveUnpausedEvent.class, action); + } - T onLiveEnded(EventConsumer action); + default T onLiveEnded(EventConsumer action) { + return onEvent(TikTokLiveEndedEvent.class, action); + } /** * Invoked when client has been successfully connected to live + * * @param action consumable action * @return self instance */ - T onConnected(EventConsumer action); + default T onConnected(EventConsumer action) { + return onEvent(TikTokConnectedEvent.class, action); + } /** * Invoked before client has been successfully connected to live + * * @param action consumable action * @return self instance */ - T onPreConnection(EventConsumer action); + default T onPreConnection(EventConsumer action) { + return onEvent(TikTokPreConnectionEvent.class, action); + } /** * Invoked when client tries to reconnect + * * @param action consumable action * @return self instance */ - T onReconnecting(EventConsumer action); + default T onReconnecting(EventConsumer action) { + return onEvent(TikTokReconnectingEvent.class, action); + } /** * Invoked when client disconnected + * * @param action consumable action * @return self instance */ - T onDisconnected(EventConsumer action); + default T onDisconnected(EventConsumer action) { + return onEvent(TikTokDisconnectedEvent.class, action); + } /** * Invoked when exception was throed inside client or event handler + * * @param action consumable action * @return self instance */ - T onError(EventConsumer action); + default T onError(EventConsumer action) { + return onEvent(TikTokErrorEvent.class, action); + } // TODO Figure out how those events works @@ -216,4 +276,10 @@ public interface EventsBuilder { //T onLinkMicBattle(TikTokEventConsumer event); //T onUnhandledControl(TikTokEventConsumer event); + + /** + * To do figure out how to use Annotation processor. + * Goal is to generates methods for all possible events, everytime library is compiled + */ + } \ No newline at end of file diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java index 1f2b7ce..f8a19ff 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java @@ -189,365 +189,9 @@ public class TikTokLiveClientBuilder implements LiveClientBuilder { return build().connectAsync(); } - /** - * To do figure out how to use Annotation processor. - * Goal is to generates methods for all possible events, everytime library is compiled - */ - public TikTokLiveClientBuilder onUnhandledSocial(EventConsumer event) { - eventHandler.subscribe(TikTokUnhandledSocialEvent.class, event); - return this; - } - - public LiveClientBuilder onChest(EventConsumer event) { - eventHandler.subscribe(TikTokChestEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onLinkMicFanTicket(EventConsumer event) { - eventHandler.subscribe(TikTokLinkMicFanTicketEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onEnvelope(EventConsumer event) { - eventHandler.subscribe(TikTokEnvelopeEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onShop(EventConsumer event) { - eventHandler.subscribe(TikTokShopEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onDetect(EventConsumer event) { - eventHandler.subscribe(TikTokDetectEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onLinkLayer(EventConsumer event) { - eventHandler.subscribe(TikTokLinkLayerEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onConnected(EventConsumer event) { - eventHandler.subscribe(TikTokConnectedEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onPreConnection(EventConsumer event) { - eventHandler.subscribe(TikTokPreConnectionEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onCaption(EventConsumer event) { - eventHandler.subscribe(TikTokCaptionEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onQuestion(EventConsumer event) { - eventHandler.subscribe(TikTokQuestionEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onRoomPin(EventConsumer event) { - eventHandler.subscribe(TikTokRoomPinEvent.class, event); - return this; - } - @Override - public LiveClientBuilder onEvent(Class eventClass, EventConsumer event) { - eventHandler.subscribe(eventClass, event); - return this; - } - - @Override - public TikTokLiveClientBuilder onRoomInfo(EventConsumer event) { - eventHandler.subscribe(TikTokRoomInfoEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onLivePaused(EventConsumer event) { - eventHandler.subscribe(TikTokLivePausedEvent.class, event); - return this; - } - - @Override - public TikTokLiveClientBuilder onLiveUnpaused(EventConsumer event) { - eventHandler.subscribe(TikTokLiveUnpausedEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onLike(EventConsumer event) { - eventHandler.subscribe(TikTokLikeEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onLink(EventConsumer event) { - eventHandler.subscribe(TikTokLinkEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onLinkInvite(EventConsumer event) { - eventHandler.subscribe(TikTokLinkInviteEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onLinkReply(EventConsumer event) { - eventHandler.subscribe(TikTokLinkReplyEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onLinkCreate(EventConsumer event) { - eventHandler.subscribe(TikTokLinkCreateEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onLinkClose(EventConsumer event) { - eventHandler.subscribe(TikTokLinkCloseEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onLinkEnter(EventConsumer event) { - eventHandler.subscribe(TikTokLinkEnterEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onLinkLeave(EventConsumer event) { - eventHandler.subscribe(TikTokLinkLeaveEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onLinkCancel(EventConsumer event) { - eventHandler.subscribe(TikTokLinkCancelEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onLinkKickOut(EventConsumer event) { - eventHandler.subscribe(TikTokLinkKickOutEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onLinkLinkedListChange(EventConsumer event) { - eventHandler.subscribe(TikTokLinkLinkedListChangeEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onLinkUpdateUser(EventConsumer event) { - eventHandler.subscribe(TikTokLinkUpdateUserEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onLinkWaitListChange(EventConsumer event) { - eventHandler.subscribe(TikTokLinkWaitListChangeEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onLinkMute(EventConsumer event) { - eventHandler.subscribe(TikTokLinkMuteEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onLinkRandomMatch(EventConsumer event) { - eventHandler.subscribe(TikTokLinkRandomMatchEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onLinkUpdateUserSettings(EventConsumer event) { - eventHandler.subscribe(TikTokLinkUpdateUserSettingEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onLinkMicIdxUpdate(EventConsumer event) { - eventHandler.subscribe(TikTokLinkMicIdxUpdateEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onLinkListChange(EventConsumer event) { - eventHandler.subscribe(TikTokLinkListChangeEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onLinkCohostListChange(EventConsumer event) { - eventHandler.subscribe(TikTokLinkCohostListChangeEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onLinkMediaChange(EventConsumer event) { - eventHandler.subscribe(TikTokLinkMediaChangeEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onLinkAcceptNotice(EventConsumer event) { - eventHandler.subscribe(TikTokLinkAcceptNoticeEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onLinkSysKickOut(EventConsumer event) { - eventHandler.subscribe(TikTokLinkSysKickOutEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onLinkUserToast(EventConsumer event) { - eventHandler.subscribe(TikTokLinkUserToastEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onBarrage(EventConsumer event) { - eventHandler.subscribe(TikTokBarrageEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onGift(EventConsumer event) { - eventHandler.subscribe(TikTokGiftEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onGiftCombo(EventConsumer event) { - eventHandler.subscribe(TikTokGiftComboEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onLinkMicArmies(EventConsumer event) { - eventHandler.subscribe(TikTokLinkMicArmiesEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onEmote(EventConsumer event) { - eventHandler.subscribe(TikTokEmoteEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onUnauthorizedMember(EventConsumer event) { - eventHandler.subscribe(TikTokUnauthorizedMemberEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onInRoomBanner(EventConsumer event) { - eventHandler.subscribe(TikTokInRoomBannerEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onLinkMicMethod(EventConsumer event) { - eventHandler.subscribe(TikTokLinkMicMethodEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onSubscribe(EventConsumer event) { - eventHandler.subscribe(TikTokSubscribeEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onPoll(EventConsumer event) { - eventHandler.subscribe(TikTokPollEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onFollow(EventConsumer event) { - eventHandler.subscribe(TikTokFollowEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onComment(EventConsumer event) { - eventHandler.subscribe(TikTokCommentEvent.class, event); - return this; - } - - @Override - public LiveClientBuilder onHttpResponse(EventConsumer action) { - eventHandler.subscribe(TikTokHttpResponseEvent.class, action); - return this; - } - - public TikTokLiveClientBuilder onGoalUpdate(EventConsumer event) { - eventHandler.subscribe(TikTokGoalUpdateEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onRankUpdate(EventConsumer event) { - eventHandler.subscribe(TikTokRankUpdateEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onIMDelete(EventConsumer event) { - eventHandler.subscribe(TikTokIMDeleteEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onLiveEnded(EventConsumer event) { - eventHandler.subscribe(TikTokLiveEndedEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onError(EventConsumer event) { - eventHandler.subscribe(TikTokErrorEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onJoin(EventConsumer event) { - eventHandler.subscribe(TikTokJoinEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onRankText(EventConsumer event) { - eventHandler.subscribe(TikTokRankTextEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onShare(EventConsumer event) { - eventHandler.subscribe(TikTokShareEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onUnhandledMember(EventConsumer event) { - eventHandler.subscribe(TikTokUnhandledMemberEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onSubNotify(EventConsumer event) { - eventHandler.subscribe(TikTokSubNotifyEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onLinkMicBattle(EventConsumer event) { - eventHandler.subscribe(TikTokLinkMicBattleEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onDisconnected(EventConsumer event) { - eventHandler.subscribe(TikTokDisconnectedEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onUnhandledControl(EventConsumer event) { - eventHandler.subscribe(TikTokUnhandledControlEvent.class, event); - return this; - } - - public TikTokLiveClientBuilder onEvent(EventConsumer event) { - eventHandler.subscribe(TikTokEvent.class, event); - return this; - } - - @Override - public TikTokLiveClientBuilder onWebsocketResponse(EventConsumer event) { - eventHandler.subscribe(TikTokWebsocketResponseEvent.class, event); - return this; - } - - @Override - public TikTokLiveClientBuilder onWebsocketMessage(EventConsumer event) { - eventHandler.subscribe(TikTokWebsocketMessageEvent.class, event); - return this; - } - - @Override - public TikTokLiveClientBuilder onWebsocketUnhandledMessage(EventConsumer event) { - eventHandler.subscribe(TikTokWebsocketUnhandledMessageEvent.class, event); - return this; - } - - @Override - public TikTokLiveClientBuilder onReconnecting(EventConsumer event) { - eventHandler.subscribe(TikTokReconnectingEvent.class, event); + public LiveClientBuilder onEvent(Class eventClass, EventConsumer action) { + eventHandler.subscribe(eventClass, action); return this; } } \ No newline at end of file diff --git a/Tools-ReadmeGenerator/pom.xml b/Tools-ReadmeGenerator/pom.xml index dacec7d..a74e215 100644 --- a/Tools-ReadmeGenerator/pom.xml +++ b/Tools-ReadmeGenerator/pom.xml @@ -23,10 +23,16 @@ + + commons-io + commons-io + 2.13.0 + compile + com.github.jwdeveloper.Descrabble Descrabble-Full - 0.0.7-Release + 0.0.11-Release compile diff --git a/Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/EventsDecorator.java b/Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/EventsDecorator.java new file mode 100644 index 0000000..1041f33 --- /dev/null +++ b/Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/EventsDecorator.java @@ -0,0 +1,12 @@ +package io.github.jwdeveloper.tiktok; + +import io.github.jwdeveloper.descrabble.api.DescriptionDecorator; +import io.github.jwdeveloper.descrabble.api.elements.Element; +import io.github.jwdeveloper.descrabble.api.elements.ElementFactory; + +public class EventsDecorator implements DescriptionDecorator { + @Override + public void decorate(Element root, ElementFactory factory) { + + } +} diff --git a/Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/Main.java b/Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/Main.java new file mode 100644 index 0000000..9f987cd --- /dev/null +++ b/Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/Main.java @@ -0,0 +1,37 @@ +package io.github.jwdeveloper.tiktok; + +import io.github.jwdeveloper.descrabble.api.DescriptionGenerator; +import io.github.jwdeveloper.descrabble.framework.Descrabble; +import io.github.jwdeveloper.descrabble.plugin.github.DescrabbleGithub; +import org.apache.commons.io.FileUtils; + +import java.io.File; +import java.io.IOException; + +public class Main +{ + public static void main(String[] args) throws IOException { + var version = System.getenv("VERSION"); + if (version == null || version.equals("")) { + version = "[Replace with current version]"; + } + + var inputStream = Main.class.getResourceAsStream("/readme-template.html"); + var targetFile = new File("temp.file"); + FileUtils.copyInputStreamToFile(inputStream, targetFile); + + var output = System.getProperty("user.dir"); + + DescriptionGenerator generator = Descrabble.create() + .withTemplate(targetFile) + .withVariable("version", version) + .withDecorator(new EventsDecorator()) + .withPlugin(DescrabbleGithub.plugin("README.md")) + .build(); + + + generator.generate(output); + targetFile.delete(); + inputStream.close(); + } +} 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 b61d883..19413c6 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 @@ -51,10 +51,6 @@ public class ReadmeGenerator { return version == null ? "NOT_FOUND" : version; } - public String getCodeExample(String path) { - var content = FilesUtility.loadFileContent(path); - content = content.substring(content.indexOf("*/") + 2); - return content; - } + } diff --git a/Tools-ReadmeGenerator/src/main/resources/readme-template.html b/Tools-ReadmeGenerator/src/main/resources/readme-template.html new file mode 100644 index 0000000..09257ce --- /dev/null +++ b/Tools-ReadmeGenerator/src/main/resources/readme-template.html @@ -0,0 +1,66 @@ + + + + + + + + TikTok Live Java +
+ *❤️❤️🎁 *Connect to TikTok live in 3 lines* 🎁❤️❤️* +
+ + + + + +
+ + +
+ + + + jitpack.io + https://jitpack.io + + + + com.github.jwdeveloper.TikTok-Live-Java + Client + {{version}} + compile + + +
+ + +Lightweight dependency injection container that is both small and performance efficient + +Features +
+- [x] Injecting object via constructor +
+- [x] Method object providers +
+- [x] Class Scanner to avoid manual registration [Scanner](#autoscan) +
+- [x] You need to get [List of objects](#lists) in the constructor, no problem +
+- [x] Create [object instance](#object-instances) by yourself and register it to container! +
+- [x] Object lifetimes [SINGLETON, TRANSIENT] [see](#basic) +
+- [x] [Generic types](#generic-types) +
+- [x] [Many constructors](#manyconstructors) +
+- [x] Highly customizable, adjust container with build in [events](#events) system +
+ +Tutorial + + From 87727070e9afed45306b151efd405f201dac0b32 Mon Sep 17 00:00:00 2001 From: "jacek.wolniewicz" Date: Mon, 1 Jul 2024 21:33:04 +0200 Subject: [PATCH 03/13] Move all events documentation to the 'EventsBuilder' --- .../data/events/TikTokCommentEvent.java | 4 +- .../data/events/TikTokConnectedEvent.java | 3 - .../data/events/TikTokDisconnectedEvent.java | 5 +- .../tiktok/data/events/TikTokErrorEvent.java | 3 - .../data/events/TikTokLiveEndedEvent.java | 4 +- .../data/events/TikTokQuestionEvent.java | 4 +- .../data/events/TikTokSubscribeEvent.java | 4 +- .../data/events/common/TikTokEvent.java | 3 - .../control/TikTokPreConnectionEvent.java | 4 +- .../events/gift/TikTokGiftComboEvent.java | 14 +--- .../data/events/gift/TikTokGiftEvent.java | 6 +- .../data/events/room/TikTokRoomInfoEvent.java | 4 +- .../data/events/social/TikTokFollowEvent.java | 4 +- .../data/events/social/TikTokLikeEvent.java | 4 +- .../data/events/social/TikTokShareEvent.java | 4 +- .../TikTokWebsocketMessageEvent.java | 5 +- .../TikTokWebsocketUnhandledMessageEvent.java | 4 +- .../tiktok/live/builder/EventsBuilder.java | 77 ++++++++++++++++++- 18 files changed, 88 insertions(+), 68 deletions(-) diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokCommentEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokCommentEvent.java index 16b51eb..91dd6a0 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokCommentEvent.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokCommentEvent.java @@ -32,9 +32,7 @@ import lombok.Getter; import java.util.List; -/** - * Triggered every time a new chat comment arrives. - */ + @Getter @EventMeta(eventType = EventType.Message) public class TikTokCommentEvent extends TikTokHeaderEvent { diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokConnectedEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokConnectedEvent.java index cf8e1ed..b81ccdb 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokConnectedEvent.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokConnectedEvent.java @@ -25,9 +25,6 @@ import io.github.jwdeveloper.tiktok.annotations.EventMeta; import io.github.jwdeveloper.tiktok.annotations.EventType; import io.github.jwdeveloper.tiktok.data.events.common.TikTokLiveClientEvent; -/** - * Triggered when the connection is successfully established. - */ @EventMeta(eventType = EventType.Control) public class TikTokConnectedEvent extends TikTokLiveClientEvent { diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokDisconnectedEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokDisconnectedEvent.java index 6e5d11a..d15e14a 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokDisconnectedEvent.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokDisconnectedEvent.java @@ -26,10 +26,7 @@ import io.github.jwdeveloper.tiktok.annotations.EventType; import io.github.jwdeveloper.tiktok.data.events.common.TikTokLiveClientEvent; import lombok.Getter; -/** - * Triggered when the connection gets disconnected. In that case you can call connect() again to have a reconnect logic. - * Note that you should wait a little bit before attempting a reconnect to to avoid being rate-limited. - */ + @Getter @EventMeta(eventType = EventType.Control) public class TikTokDisconnectedEvent extends TikTokLiveClientEvent { diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokErrorEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokErrorEvent.java index c3cedf7..1374eeb 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokErrorEvent.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokErrorEvent.java @@ -28,9 +28,6 @@ import io.github.jwdeveloper.tiktok.data.events.common.TikTokLiveClientEvent; import lombok.AllArgsConstructor; import lombok.Getter; -/** - * General error event. You should handle this. - */ @Getter @AllArgsConstructor @EventMeta(eventType = EventType.Control) diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokLiveEndedEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokLiveEndedEvent.java index 20a4e71..93af1f7 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokLiveEndedEvent.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokLiveEndedEvent.java @@ -26,9 +26,7 @@ import io.github.jwdeveloper.tiktok.annotations.EventType; import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent; -/** - * Triggered when the live stream gets terminated by the host. Will also trigger the TikTokDisconnectedEvent event. - */ + @EventMeta(eventType = EventType.Message) public class TikTokLiveEndedEvent extends TikTokEvent { } diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokQuestionEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokQuestionEvent.java index 3570463..56cb0a0 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokQuestionEvent.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokQuestionEvent.java @@ -29,9 +29,7 @@ import io.github.jwdeveloper.tiktok.data.models.users.User; import io.github.jwdeveloper.tiktok.messages.webcast.WebcastQuestionNewMessage; import lombok.Getter; -/* -Triggered every time someone asks a new question via the question feature. - */ + @Getter @EventMeta(eventType = EventType.Message) public class TikTokQuestionEvent extends TikTokHeaderEvent { diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokSubscribeEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokSubscribeEvent.java index fde3819..b4a07c1 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokSubscribeEvent.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokSubscribeEvent.java @@ -31,9 +31,7 @@ import io.github.jwdeveloper.tiktok.messages.webcast.WebcastMemberMessage; import io.github.jwdeveloper.tiktok.messages.webcast.WebcastSubNotifyMessage; import lombok.Getter; -/** - * Triggers when a user creates a subscription. - */ + @Getter @EventMeta(eventType = EventType.Message) public class TikTokSubscribeEvent extends TikTokHeaderEvent { diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/common/TikTokEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/common/TikTokEvent.java index 1c01ec5..36c7f23 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/common/TikTokEvent.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/common/TikTokEvent.java @@ -26,9 +26,6 @@ package io.github.jwdeveloper.tiktok.data.events.common; import io.github.jwdeveloper.tiktok.utils.JsonUtil; import lombok.Getter; -/** - * Base class for all events - */ @Getter public abstract class TikTokEvent { diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/control/TikTokPreConnectionEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/control/TikTokPreConnectionEvent.java index 64cf958..282772b 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/control/TikTokPreConnectionEvent.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/control/TikTokPreConnectionEvent.java @@ -27,9 +27,7 @@ import io.github.jwdeveloper.tiktok.data.events.common.TikTokLiveClientEvent; import io.github.jwdeveloper.tiktok.data.requests.*; import lombok.*; -/** - * Triggered before the connection is established. - */ + @Getter @EventMeta(eventType = EventType.Control) public class TikTokPreConnectionEvent extends TikTokLiveClientEvent diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftComboEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftComboEvent.java index f992ecb..849a12b 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftComboEvent.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftComboEvent.java @@ -30,19 +30,7 @@ import io.github.jwdeveloper.tiktok.messages.webcast.WebcastGiftMessage; import lombok.Getter; -/** - * Triggered every time gift is sent - * - * @see GiftComboStateType it has 3 states - * - *

Example when user sends gift with combo

- *

>Combo: 1 -> comboState = GiftSendType.Begin

- *

Combo: 4 -> comboState = GiftSendType.Active

- *

Combo: 8 -> comboState = GiftSendType.Active

- *

Combo: 12 -> comboState = GiftSendType.Finished

- *

- * Remember if comboState is Finished both TikTokGiftComboEvent and TikTokGiftEvent event gets triggered - */ + @EventMeta(eventType = EventType.Message) @Getter public class TikTokGiftComboEvent extends TikTokGiftEvent { diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftEvent.java index 3b3cd0b..caa3485 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftEvent.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftEvent.java @@ -32,11 +32,7 @@ import io.github.jwdeveloper.tiktok.messages.webcast.WebcastGiftMessage; import lombok.Getter; -/** - * Triggered when user sends gifts that has - * no combo (most of expensive gifts) - * or if combo has finished - */ + @EventMeta(eventType = EventType.Message) @Getter public class TikTokGiftEvent extends TikTokHeaderEvent { diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/room/TikTokRoomInfoEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/room/TikTokRoomInfoEvent.java index 186e577..9e36497 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/room/TikTokRoomInfoEvent.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/room/TikTokRoomInfoEvent.java @@ -30,9 +30,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; -/** -Triggered when LiveRoomInfo got updated such as likes, viewers, ranking .... - */ + @Getter @AllArgsConstructor @EventMeta(eventType = EventType.Message) diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokFollowEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokFollowEvent.java index 351b9a8..4a5fbce 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokFollowEvent.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokFollowEvent.java @@ -29,9 +29,7 @@ import io.github.jwdeveloper.tiktok.data.models.users.User; import io.github.jwdeveloper.tiktok.messages.webcast.WebcastSocialMessage; import lombok.Value; -/** - * Triggers when a user follows the streamer. Based on social event. - */ + @Value @EventMeta(eventType = EventType.Message) public class TikTokFollowEvent extends TikTokHeaderEvent diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokLikeEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokLikeEvent.java index ce93b44..c740928 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokLikeEvent.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokLikeEvent.java @@ -31,9 +31,7 @@ import io.github.jwdeveloper.tiktok.messages.webcast.WebcastSocialMessage; import lombok.Getter; -/** - * Triggered when a viewer sends likes to the streamer. For streams with many viewers, this event is not always triggered by TikTok. - */ + @Getter @EventMeta(eventType = EventType.Message) public class TikTokLikeEvent extends TikTokHeaderEvent diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokShareEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokShareEvent.java index 7b80e11..9d0f6f9 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokShareEvent.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/social/TikTokShareEvent.java @@ -29,9 +29,7 @@ import io.github.jwdeveloper.tiktok.data.models.users.User; import io.github.jwdeveloper.tiktok.messages.webcast.WebcastSocialMessage; import lombok.Getter; -/** - * Triggers when a user shares the stream. Based on social event. - */ + @Getter @EventMeta(eventType = EventType.Message) public class TikTokShareEvent extends TikTokHeaderEvent { diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/websocket/TikTokWebsocketMessageEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/websocket/TikTokWebsocketMessageEvent.java index 062db68..8aba618 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/websocket/TikTokWebsocketMessageEvent.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/websocket/TikTokWebsocketMessageEvent.java @@ -35,10 +35,7 @@ import lombok.Value; import java.time.Duration; -/** - * Triggered every time TikTok sends data. Data incoming as protobuf message. - * You can deserialize the binary object depending on the use case. - */ + @Getter @AllArgsConstructor @EventMeta(eventType = EventType.Debug) diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/websocket/TikTokWebsocketUnhandledMessageEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/websocket/TikTokWebsocketUnhandledMessageEvent.java index cdfccfc..acf1b48 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/websocket/TikTokWebsocketUnhandledMessageEvent.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/websocket/TikTokWebsocketUnhandledMessageEvent.java @@ -29,9 +29,7 @@ import io.github.jwdeveloper.tiktok.messages.webcast.WebcastResponse; import lombok.Getter; -/** - * Triggered every time a protobuf encoded webcast message arrives. You can deserialize the binary object depending on the use case. - */ + @Getter @EventMeta(eventType = EventType.Debug) public class TikTokWebsocketUnhandledMessageEvent extends TikTokUnhandledEvent diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/EventsBuilder.java b/API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/EventsBuilder.java index 961ff49..a6f4552 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/EventsBuilder.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/EventsBuilder.java @@ -36,6 +36,7 @@ import io.github.jwdeveloper.tiktok.data.events.social.TikTokShareEvent; import io.github.jwdeveloper.tiktok.data.events.websocket.TikTokWebsocketMessageEvent; import io.github.jwdeveloper.tiktok.data.events.websocket.TikTokWebsocketResponseEvent; import io.github.jwdeveloper.tiktok.data.events.websocket.TikTokWebsocketUnhandledMessageEvent; +import io.github.jwdeveloper.tiktok.data.models.gifts.GiftComboStateType; public interface EventsBuilder { @@ -101,7 +102,7 @@ public interface EventsBuilder { } /** - * Invoked when there was not found event mapper for TikTok protocolBuffer data "message" + * Triggered every time a protobuf encoded webcast message arrives. You can deserialize the binary object depending on the use case. * * @param action consumable action * @return self instance @@ -132,51 +133,120 @@ public interface EventsBuilder { } /** - * Invoked for gifts that has combo options such as roses + * Triggered every time gift is sent * * @param action consumable action * @return self instance + * @see GiftComboStateType it has 3 states + * + *

Example when user sends gift with combo

+ *

>Combo: 1 -> comboState = GiftSendType.Begin

+ *

Combo: 4 -> comboState = GiftSendType.Active

+ *

Combo: 8 -> comboState = GiftSendType.Active

+ *

Combo: 12 -> comboState = GiftSendType.Finished

+ *

+ * Remember if comboState is Finished both TikTokGiftComboEvent and TikTokGiftEvent event gets triggered */ default T onGiftCombo(EventConsumer action) { return onEvent(TikTokGiftComboEvent.class, action); } + /** + * Triggered every time someone asks a new question via the question feature. + * + * @param action consumable action + * @return self instance + */ default T onQuestion(EventConsumer action) { return onEvent(TikTokQuestionEvent.class, action); } + /** + * Triggers when a user subscribe the streamer. + * + * @param action consumable action + * @return self instance + */ default T onSubscribe(EventConsumer action) { return onEvent(TikTokSubscribeEvent.class, action); } + /** + * Triggers when a user follows the streamer. Based on social event. + * + * @param action consumable action + * @return self instance + */ default T onFollow(EventConsumer action) { return onEvent(TikTokFollowEvent.class, action); } + /** + * Triggered when a viewer sends likes to the streamer. For streams with many viewers, this event is not always triggered by TikTok. + * + * @param action consumable action + * @return self instance + */ default T onLike(EventConsumer action) { return onEvent(TikTokLikeEvent.class, action); } + /** + * Triggers when a user sends emote + * + * @param action consumable action + * @return self instance + */ default T onEmote(EventConsumer action) { return onEvent(TikTokEmoteEvent.class, action); } + /** + * Triggers when a user joins to the live + * + * @param action consumable action + * @return self instance + */ default T onJoin(EventConsumer action) { return onEvent(TikTokJoinEvent.class, action); } + /** + * Triggers when a user shares the stream. + * + * @param action consumable action + * @return self instance + */ default T onShare(EventConsumer action) { return onEvent(TikTokShareEvent.class, action); } + /** + * Triggered when the live stream gets paused + * + * @param action consumable action + * @return self instance + */ default T onLivePaused(EventConsumer action) { return onEvent(TikTokLivePausedEvent.class, action); } + /** + * Triggered when the live stream gets unpaused + * + * @param action consumable action + * @return self instance + */ default T onLiveUnpaused(EventConsumer action) { return onEvent(TikTokLiveUnpausedEvent.class, action); } + /** + * Triggered when the live stream gets terminated by the host. Will also trigger the TikTokDisconnectedEvent event. + * + * @param action consumable action + * @return self instance + */ default T onLiveEnded(EventConsumer action) { return onEvent(TikTokLiveEndedEvent.class, action); } @@ -212,7 +282,8 @@ public interface EventsBuilder { } /** - * Invoked when client disconnected + * Triggered when the connection gets disconnected. In that case you can call connect() again to have a reconnect logic. + * Note that you should wait a little bit before attempting a reconnect to avoid being rate-limited. * * @param action consumable action * @return self instance From 85d99ce4f1b09bbb087dfb7fb67385e0e73b86bd Mon Sep 17 00:00:00 2001 From: "jacek.wolniewicz" Date: Mon, 1 Jul 2024 21:57:07 +0200 Subject: [PATCH 04/13] TikTokLive client sevices customization --- .../live/builder/LiveClientBuilder.java | 16 ++++++- Client/pom.xml | 14 +----- .../tiktok/TikTokLiveClientBuilder.java | 11 +++++ .../tiktok/CusomizationExample.java | 48 +++++++++++++++++++ .../jwdeveloper/tiktok/EventsDecorator.java | 7 ++- pom.xml | 13 ++++- 6 files changed, 93 insertions(+), 16 deletions(-) create mode 100644 Examples/src/main/java/io/github/jwdeveloper/tiktok/CusomizationExample.java diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/LiveClientBuilder.java b/API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/LiveClientBuilder.java index 603de79..4d230ed 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/LiveClientBuilder.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/LiveClientBuilder.java @@ -22,6 +22,7 @@ */ package io.github.jwdeveloper.tiktok.live.builder; +import io.github.jwdeveloper.dependance.implementation.DependanceContainerBuilder; import io.github.jwdeveloper.tiktok.data.settings.LiveClientSettings; import io.github.jwdeveloper.tiktok.listener.TikTokEventListener; import io.github.jwdeveloper.tiktok.live.LiveClient; @@ -60,15 +61,26 @@ public interface LiveClientBuilder extends EventsBuilder { */ LiveClientBuilder addListener(TikTokEventListener listener); + /** + * Allows you to use own implementation of internal TikTokLive dependencies, + * when the default implementation does not meet your needs * + * + * @param onCustomizeDependencies access to dependency container + * @return + */ + LiveClientBuilder customize(Consumer onCustomizeDependencies); + + /** + * Builds new instance of the LiveClient * @return LiveClient object */ LiveClient build(); /** - * - * @return LiveClient object and connects to TikTok live + * Builds new instance of the LiveClient and connects to live + * @return LiveClient object */ LiveClient buildAndConnect(); diff --git a/Client/pom.xml b/Client/pom.xml index 82e38d9..34e9e11 100644 --- a/Client/pom.xml +++ b/Client/pom.xml @@ -11,12 +11,7 @@ Client - - - jitpack.io - https://jitpack.io - - + @@ -30,12 +25,7 @@ ${project.version} compile - - com.github.jwdeveloper.DepenDance - DepenDance-Full - 0.0.18-Release - compile - + com.google.protobuf protobuf-java diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java index f8a19ff..21fdfd7 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java @@ -24,6 +24,7 @@ package io.github.jwdeveloper.tiktok; import io.github.jwdeveloper.dependance.Dependance; import io.github.jwdeveloper.dependance.api.DependanceContainer; +import io.github.jwdeveloper.dependance.implementation.DependanceContainerBuilder; import io.github.jwdeveloper.tiktok.mappers.MessagesMapperFactory; import io.github.jwdeveloper.tiktok.common.LoggerFactory; import io.github.jwdeveloper.tiktok.data.events.*; @@ -63,6 +64,7 @@ public class TikTokLiveClientBuilder implements LiveClientBuilder { protected final TikTokLiveEventHandler eventHandler; protected final List listeners; protected final List> onCustomMappings; + protected final List> onCustomDependencies; public TikTokLiveClientBuilder(String userName) { this.clientSettings = LiveClientSettings.createDefault(); @@ -70,6 +72,7 @@ public class TikTokLiveClientBuilder implements LiveClientBuilder { this.eventHandler = new TikTokLiveEventHandler(); this.listeners = new ArrayList<>(); this.onCustomMappings = new ArrayList<>(); + this.onCustomDependencies = new ArrayList<>(); } public LiveClientBuilder onMapping(Consumer consumer) { @@ -88,6 +91,12 @@ public class TikTokLiveClientBuilder implements LiveClientBuilder { return this; } + @Override + public LiveClientBuilder customize(Consumer onCustomizeDependencies) { + this.onCustomDependencies.add(onCustomizeDependencies); + return this; + } + protected void validate() { if (clientSettings.getClientLanguage() == null || clientSettings.getClientLanguage().isEmpty()) clientSettings.setClientLanguage("en"); @@ -175,6 +184,8 @@ public class TikTokLiveClientBuilder implements LiveClientBuilder { //client dependance.registerSingleton(LiveClient.class, TikTokLiveClient.class); + onCustomDependencies.forEach(action -> action.accept(dependance)); + var container = dependance.build(); return container.find(LiveClient.class); } diff --git a/Examples/src/main/java/io/github/jwdeveloper/tiktok/CusomizationExample.java b/Examples/src/main/java/io/github/jwdeveloper/tiktok/CusomizationExample.java new file mode 100644 index 0000000..8b61618 --- /dev/null +++ b/Examples/src/main/java/io/github/jwdeveloper/tiktok/CusomizationExample.java @@ -0,0 +1,48 @@ +package io.github.jwdeveloper.tiktok; + +import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent; +import io.github.jwdeveloper.tiktok.data.events.gift.TikTokGiftEvent; +import io.github.jwdeveloper.tiktok.data.models.gifts.Gift; +import io.github.jwdeveloper.tiktok.live.GiftsManager; +import io.github.jwdeveloper.tiktok.live.LiveClient; + +import java.util.List; +import java.util.Map; +import java.util.function.Predicate; + +/** + * When the default implementation does not meet your needs, + * you can override it using `customize` method + */ +public class CusomizationExample { + public static void main(String[] args) { + + var client = TikTokLive.newClient("john") + .configure(liveClientSettings -> + { + liveClientSettings.setFetchGifts(false); + liveClientSettings.setOffline(true); + }) + .onError((liveClient, event) -> + { + event.getException().printStackTrace(); + }) + .customize(container -> + { + //overriding default implementation of GiftsManager, with own one + container.registerSingleton(TikTokLiveEventHandler.class, CustomEventsHandler.class); + }).build(); + + client.connect(); + client.publishEvent(TikTokGiftEvent.of("rose", 1, 12)); + client.publishEvent(TikTokGiftEvent.of("stone", 2, 12)); + } + + public static class CustomEventsHandler extends TikTokLiveEventHandler { + + @Override + public void publish(LiveClient tikTokLiveClient, TikTokEvent tikTokEvent) { + System.out.println("Hello from custom events handler: " + tikTokEvent.getClass().getSimpleName()); + } + } +} diff --git a/Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/EventsDecorator.java b/Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/EventsDecorator.java index 1041f33..441bdb9 100644 --- a/Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/EventsDecorator.java +++ b/Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/EventsDecorator.java @@ -5,8 +5,13 @@ import io.github.jwdeveloper.descrabble.api.elements.Element; import io.github.jwdeveloper.descrabble.api.elements.ElementFactory; public class EventsDecorator implements DescriptionDecorator { + + + + @Override - public void decorate(Element root, ElementFactory factory) { + public void decorate(Element root, ElementFactory factory) + { } } diff --git a/pom.xml b/pom.xml index 58bdfa4..8f6b0a8 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,12 @@ 16 UTF-8 - + + + jitpack.io + https://jitpack.io + + @@ -74,6 +79,12 @@ + + com.github.jwdeveloper.DepenDance + DepenDance-Full + 0.0.18-Release + compile + org.projectlombok lombok From 1736236ccf16041e51ad0774d1a5922791594fa4 Mon Sep 17 00:00:00 2001 From: "jacek.wolniewicz" Date: Mon, 1 Jul 2024 22:19:07 +0200 Subject: [PATCH 05/13] Due to convention, interfaces should not have TikTok name inside, but they should have prefix Live instead - rename TikTokMapper to LiveMapper - rename TikTokLiveMapperHelper to LiveMapperHelper Create interface: LiveEventsHandler for TikTokLiveEventHandler LiveMessagesHandler for TikTokLiveMessageHandler --- .../tiktok/live/LiveEventsHandler.java | 19 ++++++ .../tiktok/live/LiveMessagesHandler.java | 18 +++++ .../live/builder/LiveClientBuilder.java | 4 +- .../{TikTokMapper.java => LiveMapper.java} | 7 +- ...apperHelper.java => LiveMapperHelper.java} | 2 +- .../tiktok/mappers/data/MappingAction.java | 4 +- .../jwdeveloper/tiktok/TikTokLiveClient.java | 67 +++++++------------ .../tiktok/TikTokLiveClientBuilder.java | 25 +++---- .../tiktok/TikTokLiveEventHandler.java | 3 +- .../tiktok/TikTokLiveMessageHandler.java | 21 +++--- .../tiktok/http/HttpClientFactory.java | 9 --- .../listener/TikTokListenersManager.java | 5 +- .../tiktok/mappers/MessagesMapperFactory.java | 5 +- .../tiktok/mappers/TikTokLiveMapper.java | 6 +- .../mappers/TikTokLiveMapperHelper.java | 2 +- .../handlers/TikTokGiftEventHandler.java | 4 +- .../handlers/TikTokRoomInfoEventHandler.java | 6 +- .../websocket/TikTokWebSocketClient.java | 31 ++++++--- .../websocket/TikTokWebSocketListener.java | 10 +-- .../TikTokWebSocketOfflineClient.java | 5 +- .../websocket/TikTokWebSocketPingingTask.java | 20 +++--- .../tiktok/common/TikTokBaseTest.java | 55 --------------- .../tiktok/gifts/TikTokGiftManagerTest.java | 38 ----------- 23 files changed, 140 insertions(+), 226 deletions(-) create mode 100644 API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveEventsHandler.java create mode 100644 API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveMessagesHandler.java rename API/src/main/java/io/github/jwdeveloper/tiktok/mappers/{TikTokMapper.java => LiveMapper.java} (95%) rename API/src/main/java/io/github/jwdeveloper/tiktok/mappers/{TikTokMapperHelper.java => LiveMapperHelper.java} (98%) delete mode 100644 Client/src/test/java/io/github/jwdeveloper/tiktok/common/TikTokBaseTest.java delete mode 100644 Client/src/test/java/io/github/jwdeveloper/tiktok/gifts/TikTokGiftManagerTest.java diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveEventsHandler.java b/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveEventsHandler.java new file mode 100644 index 0000000..f3e589d --- /dev/null +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveEventsHandler.java @@ -0,0 +1,19 @@ +package io.github.jwdeveloper.tiktok.live; + +import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent; +import io.github.jwdeveloper.tiktok.live.builder.EventConsumer; + +import java.util.HashSet; +import java.util.Optional; + +public interface LiveEventsHandler { + void publish(LiveClient tikTokLiveClient, TikTokEvent tikTokEvent); + + void subscribe(Class clazz, EventConsumer event); + + void unsubscribeAll(Class clazz); + + void unsubscribe(EventConsumer consumer); + + void unsubscribe(Class clazz, EventConsumer consumer); +} diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveMessagesHandler.java b/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveMessagesHandler.java new file mode 100644 index 0000000..5c8ee90 --- /dev/null +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/live/LiveMessagesHandler.java @@ -0,0 +1,18 @@ +package io.github.jwdeveloper.tiktok.live; + +import io.github.jwdeveloper.tiktok.data.dto.MessageMetaData; +import io.github.jwdeveloper.tiktok.data.events.TikTokErrorEvent; +import io.github.jwdeveloper.tiktok.data.events.websocket.TikTokWebsocketMessageEvent; +import io.github.jwdeveloper.tiktok.data.events.websocket.TikTokWebsocketResponseEvent; +import io.github.jwdeveloper.tiktok.data.events.websocket.TikTokWebsocketUnhandledMessageEvent; +import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveMessageException; +import io.github.jwdeveloper.tiktok.messages.webcast.WebcastResponse; +import io.github.jwdeveloper.tiktok.utils.Stopwatch; + +import java.time.Duration; + +public interface LiveMessagesHandler { + void handle(LiveClient client, WebcastResponse webcastResponse); + + void handleSingleMessage(LiveClient client, WebcastResponse.Message message); +} diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/LiveClientBuilder.java b/API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/LiveClientBuilder.java index 4d230ed..26c6004 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/LiveClientBuilder.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/LiveClientBuilder.java @@ -26,7 +26,7 @@ import io.github.jwdeveloper.dependance.implementation.DependanceContainerBuilde import io.github.jwdeveloper.tiktok.data.settings.LiveClientSettings; import io.github.jwdeveloper.tiktok.listener.TikTokEventListener; import io.github.jwdeveloper.tiktok.live.LiveClient; -import io.github.jwdeveloper.tiktok.mappers.TikTokMapper; +import io.github.jwdeveloper.tiktok.mappers.LiveMapper; import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; @@ -42,7 +42,7 @@ public interface LiveClientBuilder extends EventsBuilder { * @param onCustomMappings lambda method * @return */ - LiveClientBuilder onMapping(Consumer onCustomMappings); + LiveClientBuilder onMapping(Consumer onCustomMappings); /** diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokMapper.java b/API/src/main/java/io/github/jwdeveloper/tiktok/mappers/LiveMapper.java similarity index 95% rename from API/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokMapper.java rename to API/src/main/java/io/github/jwdeveloper/tiktok/mappers/LiveMapper.java index 479a386..d77b04b 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokMapper.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/mappers/LiveMapper.java @@ -27,9 +27,10 @@ import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent; import io.github.jwdeveloper.tiktok.mappers.data.MappingAction; import io.github.jwdeveloper.tiktok.mappers.data.MappingResult; +import java.util.List; import java.util.function.Function; -public interface TikTokMapper { +public interface LiveMapper { /** * when mapper is not found for messageName, TikTokLiveException is thrown @@ -40,7 +41,6 @@ public interface TikTokMapper { TikTokMapperModel forMessage(String messageName); /** - * * @param mapperName protocol buffer class type * @return */ @@ -54,10 +54,9 @@ public interface TikTokMapper { TikTokMapperModel forAnyMessage(); + List handleMapping(String messageName, byte[] bytes); boolean isRegistered(String mapperName); boolean isRegistered(Class mapperName); - - } diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokMapperHelper.java b/API/src/main/java/io/github/jwdeveloper/tiktok/mappers/LiveMapperHelper.java similarity index 98% rename from API/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokMapperHelper.java rename to API/src/main/java/io/github/jwdeveloper/tiktok/mappers/LiveMapperHelper.java index 7ae5d9d..e03a1ac 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokMapperHelper.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/mappers/LiveMapperHelper.java @@ -26,7 +26,7 @@ import com.google.protobuf.GeneratedMessageV3; import io.github.jwdeveloper.tiktok.exceptions.TikTokMessageMappingException; import io.github.jwdeveloper.tiktok.utils.ProtoBufferObject; -public interface TikTokMapperHelper { +public interface LiveMapperHelper { /** * @param bytes protocol buffer data bytes diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/mappers/data/MappingAction.java b/API/src/main/java/io/github/jwdeveloper/tiktok/mappers/data/MappingAction.java index aefe059..e957cc0 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/mappers/data/MappingAction.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/mappers/data/MappingAction.java @@ -22,7 +22,7 @@ */ package io.github.jwdeveloper.tiktok.mappers.data; -import io.github.jwdeveloper.tiktok.mappers.TikTokMapperHelper; +import io.github.jwdeveloper.tiktok.mappers.LiveMapperHelper; @FunctionalInterface public interface MappingAction { @@ -33,6 +33,6 @@ public interface MappingAction { * @param mapperHelper utils and helper methods that can be use to debbug/display/deserialize protocol buffer data * @return */ - T onMapping(byte[] inputBytes, String messageName, TikTokMapperHelper mapperHelper); + T onMapping(byte[] inputBytes, String messageName, LiveMapperHelper mapperHelper); } diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java index b2aac4e..90bf1cf 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java @@ -23,7 +23,6 @@ package io.github.jwdeveloper.tiktok; import com.google.protobuf.ByteString; -import io.github.jwdeveloper.dependance.injector.api.annotations.Inject; import io.github.jwdeveloper.tiktok.data.events.*; import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent; import io.github.jwdeveloper.tiktok.data.events.control.*; @@ -38,22 +37,24 @@ import io.github.jwdeveloper.tiktok.live.*; import io.github.jwdeveloper.tiktok.messages.webcast.WebcastResponse; import io.github.jwdeveloper.tiktok.models.ConnectionState; import io.github.jwdeveloper.tiktok.websocket.SocketClient; +import lombok.Getter; import java.util.Base64; import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; import java.util.logging.Logger; +@Getter public class TikTokLiveClient implements LiveClient { - private final TikTokRoomInfo liveRoomInfo; + private final TikTokRoomInfo roomInfo; private final LiveHttpClient httpClient; private final SocketClient webSocketClient; - private final TikTokLiveEventHandler tikTokEventHandler; + private final LiveEventsHandler tikTokEventHandler; private final LiveClientSettings clientSettings; private final ListenersManager listenersManager; private final Logger logger; - private final GiftsManager giftsManager; + private final GiftsManager giftManager; private final TikTokLiveMessageHandler messageHandler; public TikTokLiveClient( @@ -67,8 +68,8 @@ public class TikTokLiveClient implements LiveClient ListenersManager listenersManager, Logger logger) { this.messageHandler = messageHandler; - this.giftsManager = giftsManager; - this.liveRoomInfo = tikTokLiveMeta; + this.giftManager = giftsManager; + this.roomInfo = tikTokLiveMeta; this.httpClient = tiktokHttpClient; this.webSocketClient = webSocketClient; this.tikTokEventHandler = tikTokEventHandler; @@ -119,45 +120,45 @@ public class TikTokLiveClient implements LiveClient } public void tryConnect() { - if (!liveRoomInfo.hasConnectionState(ConnectionState.DISCONNECTED)) { + if (!roomInfo.hasConnectionState(ConnectionState.DISCONNECTED)) { throw new TikTokLiveException("Already connected"); } setState(ConnectionState.CONNECTING); tikTokEventHandler.publish(this, new TikTokConnectingEvent()); - var userDataRequest = new LiveUserData.Request(liveRoomInfo.getHostName()); + var userDataRequest = new LiveUserData.Request(roomInfo.getHostName()); var userData = httpClient.fetchLiveUserData(userDataRequest); - liveRoomInfo.setStartTime(userData.getStartTime()); - liveRoomInfo.setRoomId(userData.getRoomId()); + roomInfo.setStartTime(userData.getStartTime()); + roomInfo.setRoomId(userData.getRoomId()); if (clientSettings.isFetchGifts()) - giftsManager.attachGiftsList(httpClient.fetchRoomGiftsData(userData.getRoomId()).getGifts()); + giftManager.attachGiftsList(httpClient.fetchRoomGiftsData(userData.getRoomId()).getGifts()); if (userData.getUserStatus() == LiveUserData.UserStatus.Offline) - throw new TikTokLiveOfflineHostException("User is offline: " + liveRoomInfo.getHostName()); + throw new TikTokLiveOfflineHostException("User is offline: " + roomInfo.getHostName()); if (userData.getUserStatus() == LiveUserData.UserStatus.NotFound) - throw new TikTokLiveOfflineHostException("User not found: " + liveRoomInfo.getHostName()); + throw new TikTokLiveOfflineHostException("User not found: " + roomInfo.getHostName()); var liveDataRequest = new LiveData.Request(userData.getRoomId()); var liveData = httpClient.fetchLiveData(liveDataRequest); if (liveData.isAgeRestricted() && clientSettings.isThrowOnAgeRestriction()) - throw new TikTokLiveException("Livestream for " + liveRoomInfo.getHostName() + " is 18+ or age restricted!"); + throw new TikTokLiveException("Livestream for " + roomInfo.getHostName() + " is 18+ or age restricted!"); if (liveData.getLiveStatus() == LiveData.LiveStatus.HostNotFound) - throw new TikTokLiveOfflineHostException("LiveStream for " + liveRoomInfo.getHostName() + " could not be found."); + throw new TikTokLiveOfflineHostException("LiveStream for " + roomInfo.getHostName() + " could not be found."); if (liveData.getLiveStatus() == LiveData.LiveStatus.HostOffline) - throw new TikTokLiveOfflineHostException("LiveStream for " + liveRoomInfo.getHostName() + " not found, is the Host offline?"); + throw new TikTokLiveOfflineHostException("LiveStream for " + roomInfo.getHostName() + " not found, is the Host offline?"); tikTokEventHandler.publish(this, new TikTokRoomDataResponseEvent(liveData)); - liveRoomInfo.setTitle(liveData.getTitle()); - liveRoomInfo.setViewersCount(liveData.getViewers()); - liveRoomInfo.setTotalViewersCount(liveData.getTotalViewers()); - liveRoomInfo.setAgeRestricted(liveData.isAgeRestricted()); - liveRoomInfo.setHost(liveData.getHost()); + roomInfo.setTitle(liveData.getTitle()); + roomInfo.setViewersCount(liveData.getViewers()); + roomInfo.setTotalViewersCount(liveData.getTotalViewers()); + roomInfo.setAgeRestricted(liveData.isAgeRestricted()); + roomInfo.setHost(liveData.getHost()); var preconnectEvent = new TikTokPreConnectionEvent(userData, liveData); tikTokEventHandler.publish(this, preconnectEvent); @@ -169,11 +170,11 @@ public class TikTokLiveClient implements LiveClient webSocketClient.start(liveConnectionData, this); setState(ConnectionState.CONNECTED); - tikTokEventHandler.publish(this, new TikTokRoomInfoEvent(liveRoomInfo)); + tikTokEventHandler.publish(this, new TikTokRoomInfoEvent(roomInfo)); } public void disconnect() { - if (liveRoomInfo.hasConnectionState(ConnectionState.DISCONNECTED)) { + if (roomInfo.hasConnectionState(ConnectionState.DISCONNECTED)) { return; } setState(ConnectionState.DISCONNECTED); @@ -182,7 +183,7 @@ public class TikTokLiveClient implements LiveClient private void setState(ConnectionState connectionState) { logger.info("TikTokLive client state: " + connectionState.name()); - liveRoomInfo.setConnectionState(connectionState); + roomInfo.setConnectionState(connectionState); } public void publishEvent(TikTokEvent event) { @@ -203,22 +204,4 @@ public class TikTokLiveClient implements LiveClient messageHandler.handleSingleMessage(this, message); } - @Override - public GiftsManager getGiftManager() { - return giftsManager; - } - - public LiveRoomInfo getRoomInfo() { - return liveRoomInfo; - } - - @Override - public ListenersManager getListenersManager() { - return listenersManager; - } - - @Override - public Logger getLogger() { - return logger; - } } \ No newline at end of file diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java index 21fdfd7..581b28b 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java @@ -27,17 +27,7 @@ import io.github.jwdeveloper.dependance.api.DependanceContainer; import io.github.jwdeveloper.dependance.implementation.DependanceContainerBuilder; import io.github.jwdeveloper.tiktok.mappers.MessagesMapperFactory; import io.github.jwdeveloper.tiktok.common.LoggerFactory; -import io.github.jwdeveloper.tiktok.data.events.*; import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent; -import io.github.jwdeveloper.tiktok.data.events.control.TikTokPreConnectionEvent; -import io.github.jwdeveloper.tiktok.data.events.envelop.TikTokChestEvent; -import io.github.jwdeveloper.tiktok.data.events.gift.*; -import io.github.jwdeveloper.tiktok.data.events.http.TikTokHttpResponseEvent; -import io.github.jwdeveloper.tiktok.data.events.link.*; -import io.github.jwdeveloper.tiktok.data.events.poll.TikTokPollEvent; -import io.github.jwdeveloper.tiktok.data.events.room.*; -import io.github.jwdeveloper.tiktok.data.events.social.*; -import io.github.jwdeveloper.tiktok.data.events.websocket.*; import io.github.jwdeveloper.tiktok.data.settings.LiveClientSettings; import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException; import io.github.jwdeveloper.tiktok.gifts.TikTokGiftsManager; @@ -61,9 +51,9 @@ import java.util.logging.Logger; public class TikTokLiveClientBuilder implements LiveClientBuilder { protected final LiveClientSettings clientSettings; - protected final TikTokLiveEventHandler eventHandler; + protected final LiveEventsHandler eventHandler; protected final List listeners; - protected final List> onCustomMappings; + protected final List> onCustomMappings; protected final List> onCustomDependencies; public TikTokLiveClientBuilder(String userName) { @@ -75,7 +65,7 @@ public class TikTokLiveClientBuilder implements LiveClientBuilder { this.onCustomDependencies = new ArrayList<>(); } - public LiveClientBuilder onMapping(Consumer consumer) { + public LiveClientBuilder onMapping(Consumer consumer) { this.onCustomMappings.add(consumer); return this; } @@ -133,8 +123,8 @@ public class TikTokLiveClientBuilder implements LiveClientBuilder { }); //messages - dependance.registerSingleton(TikTokLiveEventHandler.class, eventHandler); - dependance.registerSingleton(TikTokLiveMessageHandler.class); + dependance.registerSingleton(LiveEventsHandler.class, eventHandler); + dependance.registerSingleton(LiveMessagesHandler.class,TikTokLiveMessageHandler.class); //listeners dependance.registerSingletonList(TikTokEventListener.class, (e) -> listeners); @@ -142,6 +132,7 @@ public class TikTokLiveClientBuilder implements LiveClientBuilder { //networking dependance.registerSingleton(HttpClientFactory.class); + dependance.registerSingleton(TikTokWebSocketPingingTask.class); if (clientSettings.isOffline()) { dependance.registerSingleton(SocketClient.class, TikTokWebSocketOfflineClient.class); dependance.registerSingleton(LiveHttpClient.class, TikTokLiveHttpOfflineClient.class); @@ -166,8 +157,8 @@ public class TikTokLiveClientBuilder implements LiveClientBuilder { //mapper dependance.registerSingleton(TikTokGenericEventMapper.class); - dependance.registerSingleton(TikTokMapperHelper.class, TikTokLiveMapperHelper.class); - dependance.registerSingleton(TikTokMapper.class, (container) -> + dependance.registerSingleton(LiveMapperHelper.class, TikTokLiveMapperHelper.class); + dependance.registerSingleton(LiveMapper.class, (container) -> { var dependace = (DependanceContainer) container.find(DependanceContainer.class); var mapper = MessagesMapperFactory.create(dependace); diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveEventHandler.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveEventHandler.java index a53abbf..bbca3e4 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveEventHandler.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveEventHandler.java @@ -23,12 +23,13 @@ package io.github.jwdeveloper.tiktok; import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent; +import io.github.jwdeveloper.tiktok.live.LiveEventsHandler; import io.github.jwdeveloper.tiktok.live.builder.EventConsumer; import io.github.jwdeveloper.tiktok.live.LiveClient; import java.util.*; -public class TikTokLiveEventHandler { +public class TikTokLiveEventHandler implements LiveEventsHandler { private final Map, Set> events; public TikTokLiveEventHandler() { diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveMessageHandler.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveMessageHandler.java index 8bd374f..9b41d42 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveMessageHandler.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveMessageHandler.java @@ -30,21 +30,22 @@ import io.github.jwdeveloper.tiktok.data.events.websocket.TikTokWebsocketRespons import io.github.jwdeveloper.tiktok.data.events.websocket.TikTokWebsocketUnhandledMessageEvent; import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveMessageException; import io.github.jwdeveloper.tiktok.live.LiveClient; -import io.github.jwdeveloper.tiktok.mappers.TikTokLiveMapper; -import io.github.jwdeveloper.tiktok.mappers.TikTokMapper; +import io.github.jwdeveloper.tiktok.live.LiveEventsHandler; +import io.github.jwdeveloper.tiktok.live.LiveMessagesHandler; +import io.github.jwdeveloper.tiktok.mappers.LiveMapper; import io.github.jwdeveloper.tiktok.messages.webcast.WebcastResponse; import io.github.jwdeveloper.tiktok.utils.Stopwatch; import java.time.Duration; -public class TikTokLiveMessageHandler { +public class TikTokLiveMessageHandler implements LiveMessagesHandler { - private final TikTokLiveEventHandler tikTokEventHandler; - private final TikTokLiveMapper mapper; + private final LiveEventsHandler tikTokEventHandler; + private final LiveMapper mapper; - public TikTokLiveMessageHandler(TikTokLiveEventHandler tikTokEventHandler, TikTokMapper mapper) { + public TikTokLiveMessageHandler(TikTokLiveEventHandler tikTokEventHandler, LiveMapper mapper) { this.tikTokEventHandler = tikTokEventHandler; - this.mapper = (TikTokLiveMapper) mapper; + this.mapper = mapper; } public void handle(LiveClient client, WebcastResponse webcastResponse) { @@ -59,11 +60,9 @@ public class TikTokLiveMessageHandler { } } - public void handleSingleMessage(LiveClient client, WebcastResponse.Message message) - { + public void handleSingleMessage(LiveClient client, WebcastResponse.Message message) { var messageClassName = message.getMethod(); - if (!mapper.isRegistered(messageClassName)) - { + if (!mapper.isRegistered(messageClassName)) { tikTokEventHandler.publish(client, new TikTokWebsocketUnhandledMessageEvent(message)); return; } diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/HttpClientFactory.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/HttpClientFactory.java index 30fa1f1..06374ad 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/HttpClientFactory.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/HttpClientFactory.java @@ -36,13 +36,4 @@ public class HttpClientFactory { public HttpClientBuilder client(String url) { return new HttpClientBuilder(url, liveClientSettings.getHttpSettings().clone()); } - - - //Does not contains default httpClientSettings, Params, headers, etd - //Edit: Do we even use it? - public HttpClientBuilder clientEmpty(String url) { - var settings = new HttpClientSettings(); - settings.setProxyClientSettings(liveClientSettings.getHttpSettings().getProxyClientSettings()); - return new HttpClientBuilder(url, settings); - } } \ No newline at end of file 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 572e875..ca981b7 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 @@ -29,6 +29,7 @@ import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent; import io.github.jwdeveloper.tiktok.exceptions.TikTokEventListenerMethodException; import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException; import io.github.jwdeveloper.tiktok.live.LiveClient; +import io.github.jwdeveloper.tiktok.live.LiveEventsHandler; import io.github.jwdeveloper.tiktok.live.builder.EventConsumer; import java.util.ArrayList; @@ -37,10 +38,10 @@ import java.util.HashMap; import java.util.List; public class TikTokListenersManager implements ListenersManager { - private final TikTokLiveEventHandler eventObserver; + private final LiveEventsHandler eventObserver; private final List bindingModels; - public TikTokListenersManager(List listeners, TikTokLiveEventHandler tikTokEventHandler) { + public TikTokListenersManager(List listeners, LiveEventsHandler tikTokEventHandler) { this.eventObserver = tikTokEventHandler; this.bindingModels = new ArrayList<>(listeners.size()); for (var listener : listeners) { diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/MessagesMapperFactory.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/MessagesMapperFactory.java index 85c4ec3..c4f086c 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/MessagesMapperFactory.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/MessagesMapperFactory.java @@ -23,11 +23,8 @@ package io.github.jwdeveloper.tiktok.mappers; import io.github.jwdeveloper.dependance.api.DependanceContainer; -import io.github.jwdeveloper.dependance.injector.api.containers.Container; -import io.github.jwdeveloper.tiktok.TikTokRoomInfo; import io.github.jwdeveloper.tiktok.data.events.*; import io.github.jwdeveloper.tiktok.data.events.link.*; -import io.github.jwdeveloper.tiktok.live.GiftsManager; import io.github.jwdeveloper.tiktok.mappers.data.MappingResult; import io.github.jwdeveloper.tiktok.mappers.handlers.TikTokCommonEventHandler; import io.github.jwdeveloper.tiktok.mappers.handlers.TikTokGiftEventHandler; @@ -40,7 +37,7 @@ import static io.github.jwdeveloper.tiktok.messages.enums.LinkMessageType.*; public class MessagesMapperFactory { public static TikTokLiveMapper create(DependanceContainer container) { - var helper = container.find(TikTokMapperHelper.class); + var helper = container.find(LiveMapperHelper.class); var mapper = new TikTokLiveMapper(helper); //ConnectionEvents events diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokLiveMapper.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokLiveMapper.java index 4fe6dd4..e12f748 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokLiveMapper.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokLiveMapper.java @@ -29,13 +29,13 @@ import io.github.jwdeveloper.tiktok.mappers.data.*; import java.util.*; import java.util.function.Function; -public class TikTokLiveMapper implements TikTokMapper { +public class TikTokLiveMapper implements LiveMapper { private final Map mappers; - private final TikTokMapperHelper mapperUtils; + private final LiveMapperHelper mapperUtils; private final TikTokLiveMapperModel globalMapperModel; - public TikTokLiveMapper(TikTokMapperHelper mapperUtils) { + public TikTokLiveMapper(LiveMapperHelper mapperUtils) { this.mappers = new HashMap<>(); this.mapperUtils = mapperUtils; this.globalMapperModel = new TikTokLiveMapperModel("any message"); diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokLiveMapperHelper.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokLiveMapperHelper.java index 9c854f9..b7ea1eb 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokLiveMapperHelper.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokLiveMapperHelper.java @@ -28,7 +28,7 @@ import io.github.jwdeveloper.tiktok.utils.JsonUtil; import io.github.jwdeveloper.tiktok.utils.ProtoBufferObject; import io.github.jwdeveloper.tiktok.utils.ProtocolUtils; -public class TikTokLiveMapperHelper implements TikTokMapperHelper { +public class TikTokLiveMapperHelper implements LiveMapperHelper { private final TikTokGenericEventMapper genericMapper; public TikTokLiveMapperHelper(TikTokGenericEventMapper genericMapper) { diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/handlers/TikTokGiftEventHandler.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/handlers/TikTokGiftEventHandler.java index 0cda6ab..2e4f17d 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/handlers/TikTokGiftEventHandler.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/handlers/TikTokGiftEventHandler.java @@ -28,7 +28,7 @@ import io.github.jwdeveloper.tiktok.data.events.gift.*; import io.github.jwdeveloper.tiktok.data.models.Picture; import io.github.jwdeveloper.tiktok.data.models.gifts.*; import io.github.jwdeveloper.tiktok.live.GiftsManager; -import io.github.jwdeveloper.tiktok.mappers.TikTokMapperHelper; +import io.github.jwdeveloper.tiktok.mappers.LiveMapperHelper; import io.github.jwdeveloper.tiktok.mappers.data.MappingResult; import io.github.jwdeveloper.tiktok.messages.webcast.WebcastGiftMessage; import lombok.SneakyThrows; @@ -48,7 +48,7 @@ public class TikTokGiftEventHandler { } @SneakyThrows - public MappingResult handleGifts(byte[] msg, String name, TikTokMapperHelper helper) { + public MappingResult handleGifts(byte[] msg, String name, LiveMapperHelper helper) { var currentMessage = WebcastGiftMessage.parseFrom(msg); var gifts = handleGift(currentMessage); return MappingResult.of(currentMessage, gifts); diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/handlers/TikTokRoomInfoEventHandler.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/handlers/TikTokRoomInfoEventHandler.java index b8d14d9..c6a1f21 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/handlers/TikTokRoomInfoEventHandler.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/handlers/TikTokRoomInfoEventHandler.java @@ -31,7 +31,7 @@ import io.github.jwdeveloper.tiktok.data.events.social.TikTokJoinEvent; import io.github.jwdeveloper.tiktok.data.events.social.TikTokLikeEvent; import io.github.jwdeveloper.tiktok.data.models.RankingUser; import io.github.jwdeveloper.tiktok.data.models.users.User; -import io.github.jwdeveloper.tiktok.mappers.TikTokMapperHelper; +import io.github.jwdeveloper.tiktok.mappers.LiveMapperHelper; import io.github.jwdeveloper.tiktok.mappers.data.MappingResult; import io.github.jwdeveloper.tiktok.messages.webcast.WebcastLikeMessage; import io.github.jwdeveloper.tiktok.messages.webcast.WebcastLiveIntroMessage; @@ -86,7 +86,7 @@ public class TikTokRoomInfoEventHandler { } @SneakyThrows - public MappingResult handleMemberMessage(byte[] msg, String name, TikTokMapperHelper helper) { + public MappingResult handleMemberMessage(byte[] msg, String name, LiveMapperHelper helper) { var message = WebcastMemberMessage.parseFrom(msg); var event = switch (message.getAction()) { @@ -103,7 +103,7 @@ public class TikTokRoomInfoEventHandler { } @SneakyThrows - public MappingResult handleLike(byte[] msg, String name, TikTokMapperHelper helper) { + public MappingResult handleLike(byte[] msg, String name, LiveMapperHelper helper) { var message = WebcastLikeMessage.parseFrom(msg); var event = new TikTokLikeEvent(message); var roomInfoEvent = this.handleRoomInfo(tikTokRoomInfo -> diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketClient.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketClient.java index 5d5ea37..0b251b3 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketClient.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketClient.java @@ -29,6 +29,8 @@ import io.github.jwdeveloper.tiktok.data.requests.LiveConnectionData; import io.github.jwdeveloper.tiktok.data.settings.*; import io.github.jwdeveloper.tiktok.exceptions.*; import io.github.jwdeveloper.tiktok.live.LiveClient; +import io.github.jwdeveloper.tiktok.live.LiveEventsHandler; +import io.github.jwdeveloper.tiktok.live.LiveMessagesHandler; import org.java_websocket.client.WebSocketClient; import javax.net.ssl.*; @@ -38,22 +40,23 @@ import java.util.HashMap; public class TikTokWebSocketClient implements SocketClient { private final LiveClientSettings clientSettings; - private final TikTokLiveMessageHandler messageHandler; - private final TikTokLiveEventHandler tikTokEventHandler; - private WebSocketClient webSocketClient; - + private final LiveMessagesHandler messageHandler; + private final LiveEventsHandler tikTokEventHandler; private final TikTokWebSocketPingingTask pingingTask; + private WebSocketClient webSocketClient; private boolean isConnected; public TikTokWebSocketClient( LiveClientSettings clientSettings, - TikTokLiveMessageHandler messageHandler, - TikTokLiveEventHandler tikTokEventHandler) { + LiveMessagesHandler messageHandler, + LiveEventsHandler tikTokEventHandler, + TikTokWebSocketPingingTask pingingTask) + { this.clientSettings = clientSettings; this.messageHandler = messageHandler; this.tikTokEventHandler = tikTokEventHandler; + this.pingingTask = pingingTask; isConnected = false; - pingingTask = new TikTokWebSocketPingingTask(); } @Override @@ -64,7 +67,7 @@ public class TikTokWebSocketClient implements SocketClient { messageHandler.handle(liveClient, connectionData.getWebcastResponse()); - var headers = new HashMap<>(clientSettings.getHttpSettings().getHeaders()); + var headers = new HashMap<>(clientSettings.getHttpSettings().getHeaders()); headers.put("Cookie", connectionData.getWebsocketCookies()); webSocketClient = new TikTokWebSocketListener(connectionData.getWebsocketUrl(), headers, @@ -96,9 +99,15 @@ public class TikTokWebSocketClient implements SocketClient { if (proxySettings.getType() == Proxy.Type.SOCKS) { SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null, new TrustManager[]{new X509TrustManager() { - public void checkClientTrusted(X509Certificate[] x509Certificates, String s) {} - public void checkServerTrusted(X509Certificate[] x509Certificates, String s) {} - public X509Certificate[] getAcceptedIssuers() { return null; } + public void checkClientTrusted(X509Certificate[] x509Certificates, String s) { + } + + public void checkServerTrusted(X509Certificate[] x509Certificates, String s) { + } + + public X509Certificate[] getAcceptedIssuers() { + return null; + } }}, null); webSocketClient.setSocketFactory(sc.getSocketFactory()); } diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketListener.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketListener.java index 8f845a2..2699cd5 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketListener.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketListener.java @@ -27,6 +27,8 @@ import io.github.jwdeveloper.tiktok.*; import io.github.jwdeveloper.tiktok.data.events.*; import io.github.jwdeveloper.tiktok.exceptions.TikTokProtocolBufferException; import io.github.jwdeveloper.tiktok.live.LiveClient; +import io.github.jwdeveloper.tiktok.live.LiveEventsHandler; +import io.github.jwdeveloper.tiktok.live.LiveMessagesHandler; import io.github.jwdeveloper.tiktok.messages.webcast.*; import org.java_websocket.client.WebSocketClient; import org.java_websocket.drafts.Draft_6455; @@ -38,15 +40,15 @@ import java.util.*; public class TikTokWebSocketListener extends WebSocketClient { - private final TikTokLiveMessageHandler messageHandler; - private final TikTokLiveEventHandler tikTokEventHandler; + private final LiveMessagesHandler messageHandler; + private final LiveEventsHandler tikTokEventHandler; private final LiveClient tikTokLiveClient; public TikTokWebSocketListener(URI serverUri, Map httpHeaders, int connectTimeout, - TikTokLiveMessageHandler messageHandler, - TikTokLiveEventHandler tikTokEventHandler, + LiveMessagesHandler messageHandler, + LiveEventsHandler tikTokEventHandler, LiveClient tikTokLiveClient) { super(serverUri, new Draft_6455(), httpHeaders, connectTimeout); this.messageHandler = messageHandler; diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketOfflineClient.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketOfflineClient.java index 66d6ff5..993491b 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketOfflineClient.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketOfflineClient.java @@ -27,13 +27,14 @@ import io.github.jwdeveloper.tiktok.data.events.TikTokConnectedEvent; import io.github.jwdeveloper.tiktok.data.events.TikTokDisconnectedEvent; import io.github.jwdeveloper.tiktok.data.requests.LiveConnectionData; import io.github.jwdeveloper.tiktok.live.LiveClient; +import io.github.jwdeveloper.tiktok.live.LiveEventsHandler; public class TikTokWebSocketOfflineClient implements SocketClient { - private final TikTokLiveEventHandler handler; + private final LiveEventsHandler handler; private LiveClient liveClient; - public TikTokWebSocketOfflineClient(TikTokLiveEventHandler handler) { + public TikTokWebSocketOfflineClient(LiveEventsHandler handler) { this.handler = handler; } diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketPingingTask.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketPingingTask.java index 12e166e..ae2fbdb 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketPingingTask.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/websocket/TikTokWebSocketPingingTask.java @@ -22,41 +22,37 @@ */ package io.github.jwdeveloper.tiktok.websocket; +import io.github.jwdeveloper.tiktok.live.LiveEventsHandler; import org.java_websocket.WebSocket; -public class TikTokWebSocketPingingTask -{ +public class TikTokWebSocketPingingTask { private Thread thread; private boolean isRunning = false; private final int MAX_TIMEOUT = 250; private final int SLEEP_TIME = 500; - public void run(WebSocket webSocket, long pingTaskTime) - { + public void run(WebSocket webSocket, long pingTaskTime) { stop(); thread = new Thread(() -> pingTask(webSocket, pingTaskTime), "pinging-task"); isRunning = true; thread.start(); } - public void stop() - { + public void stop() { if (thread != null) thread.interrupt(); isRunning = false; } - private void pingTask(WebSocket webSocket, long pingTaskTime) - { + private void pingTask(WebSocket webSocket, long pingTaskTime) { while (isRunning) { try { if (webSocket.isOpen()) { webSocket.sendPing(); - Thread.sleep(pingTaskTime+(int)(Math.random() * MAX_TIMEOUT)); - } else + Thread.sleep(pingTaskTime + (int) (Math.random() * MAX_TIMEOUT)); + } else Thread.sleep(SLEEP_TIME); - } - catch (Exception e) { + } catch (Exception e) { //TODO we should display some kind of error message isRunning = false; } diff --git a/Client/src/test/java/io/github/jwdeveloper/tiktok/common/TikTokBaseTest.java b/Client/src/test/java/io/github/jwdeveloper/tiktok/common/TikTokBaseTest.java deleted file mode 100644 index 678ed32..0000000 --- a/Client/src/test/java/io/github/jwdeveloper/tiktok/common/TikTokBaseTest.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2023-2023 jwdeveloper jacekwoln@gmail.com - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ -package io.github.jwdeveloper.tiktok.common; - - - -import java.io.IOException; -import java.util.Base64; - -public class TikTokBaseTest -{ - public byte[] getFileBytes(String path) - { - try { - var stream = getClass().getClassLoader().getResourceAsStream(path); - var bytes= stream.readAllBytes(); - stream.close(); - return bytes; - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public byte[] getFileBytesUtf(String path) - { - try { - var stream = getClass().getClassLoader().getResourceAsStream(path); - var bytes= stream.readAllBytes(); - stream.close(); - return Base64.getDecoder().decode(bytes); - } catch (IOException e) { - throw new RuntimeException(e); - } - } -} diff --git a/Client/src/test/java/io/github/jwdeveloper/tiktok/gifts/TikTokGiftManagerTest.java b/Client/src/test/java/io/github/jwdeveloper/tiktok/gifts/TikTokGiftManagerTest.java deleted file mode 100644 index 4573678..0000000 --- a/Client/src/test/java/io/github/jwdeveloper/tiktok/gifts/TikTokGiftManagerTest.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2023-2023 jwdeveloper jacekwoln@gmail.com - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ -package io.github.jwdeveloper.tiktok.gifts; - -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.junit.jupiter.MockitoExtension; - - -@ExtendWith(MockitoExtension.class) - -public class TikTokGiftManagerTest { - - - - - - -} \ No newline at end of file From 8d715d4f50235e2e640c26555084d28c8d6e8283 Mon Sep 17 00:00:00 2001 From: kohlerpop1 Date: Mon, 1 Jul 2024 17:02:08 -0400 Subject: [PATCH 06/13] Added javadocs for clarity Optimized methods in TikTokGiftEventHandler and TikTokGenericEventMapper --- .../events/gift/TikTokGiftComboEvent.java | 13 +--- .../data/events/gift/TikTokGiftEvent.java | 3 - .../data/models/gifts/GiftComboStateType.java | 4 +- .../tiktok/live/builder/EventsBuilder.java | 27 ++++--- .../mappers/TikTokGenericEventMapper.java | 73 ++++++++----------- .../handlers/TikTokGiftEventHandler.java | 18 ++--- 6 files changed, 61 insertions(+), 77 deletions(-) diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftComboEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftComboEvent.java index 849a12b..d2f6add 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftComboEvent.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftComboEvent.java @@ -29,8 +29,6 @@ import io.github.jwdeveloper.tiktok.data.models.users.User; import io.github.jwdeveloper.tiktok.messages.webcast.WebcastGiftMessage; import lombok.Getter; - - @EventMeta(eventType = EventType.Message) @Getter public class TikTokGiftComboEvent extends TikTokGiftEvent { @@ -43,12 +41,9 @@ public class TikTokGiftComboEvent extends TikTokGiftEvent { public static TikTokGiftComboEvent of(Gift gift, int combo, GiftComboStateType comboState) { return new TikTokGiftComboEvent( - gift, - new User(0L, "Test", new Picture("")), - WebcastGiftMessage - .newBuilder() - .setComboCount(combo) - .build(), - comboState); + gift, + new User(0L, "Test", new Picture("")), + WebcastGiftMessage.newBuilder().setComboCount(combo).build(), + comboState); } } \ No newline at end of file diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftEvent.java index caa3485..7b98b7a 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftEvent.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/gift/TikTokGiftEvent.java @@ -22,7 +22,6 @@ */ package io.github.jwdeveloper.tiktok.data.events.gift; - import io.github.jwdeveloper.tiktok.annotations.*; import io.github.jwdeveloper.tiktok.data.events.common.TikTokHeaderEvent; import io.github.jwdeveloper.tiktok.data.models.Picture; @@ -31,8 +30,6 @@ import io.github.jwdeveloper.tiktok.data.models.users.User; import io.github.jwdeveloper.tiktok.messages.webcast.WebcastGiftMessage; import lombok.Getter; - - @EventMeta(eventType = EventType.Message) @Getter public class TikTokGiftEvent extends TikTokHeaderEvent { diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/gifts/GiftComboStateType.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/gifts/GiftComboStateType.java index cbb1b28..9f6f1d3 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/gifts/GiftComboStateType.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/gifts/GiftComboStateType.java @@ -23,9 +23,9 @@ package io.github.jwdeveloper.tiktok.data.models.gifts; public enum GiftComboStateType { - Finished, Begin, - Active; + Active, + Finished; public static GiftComboStateType fromNumber(long number) { return switch ((int) number) { diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/EventsBuilder.java b/API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/EventsBuilder.java index a6f4552..9f19a27 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/EventsBuilder.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/EventsBuilder.java @@ -123,8 +123,11 @@ public interface EventsBuilder { } /** - * Invoked for gifts that has no combo, or when combo finishes - * + * Triggers for these different reasons: + *

    + *
  1. User sends gifts that have no combo (most of expensive gifts)
  2. + *
  3. {@link TikTokGiftComboEvent} has combaState = {@link GiftComboStateType#Finished}
  4. + *
* @param action consumable action * @return self instance */ @@ -133,19 +136,19 @@ public interface EventsBuilder { } /** - * Triggered every time gift is sent + * Triggered every time a gift is sent + *

Example when user sends gift with combo

+ * + * Both {@link TikTokGiftComboEvent} and {@link TikTokGiftEvent} events are triggered when comboState is Finished * + * @apiNote {@link GiftComboStateType} has 3 states: {@link GiftComboStateType#Begin Begin}, {@link GiftComboStateType#Active Active}, & {@link GiftComboStateType#Finished Finished} * @param action consumable action * @return self instance - * @see GiftComboStateType it has 3 states - * - *

Example when user sends gift with combo

- *

>Combo: 1 -> comboState = GiftSendType.Begin

- *

Combo: 4 -> comboState = GiftSendType.Active

- *

Combo: 8 -> comboState = GiftSendType.Active

- *

Combo: 12 -> comboState = GiftSendType.Finished

- *

- * Remember if comboState is Finished both TikTokGiftComboEvent and TikTokGiftEvent event gets triggered */ default T onGiftCombo(EventConsumer action) { return onEvent(TikTokGiftComboEvent.class, action); diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokGenericEventMapper.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokGenericEventMapper.java index c2c1cda..a7e8a0c 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokGenericEventMapper.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokGenericEventMapper.java @@ -27,26 +27,24 @@ import io.github.jwdeveloper.tiktok.exceptions.TikTokMessageMappingException; import java.lang.reflect.Constructor; import java.lang.reflect.Method; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; +import java.util.*; /** * Goal of this class is to map ProtocolBuffer objects to TikTok Event in generic way - * - * First parameter is ProtocolBuffer class type - * Second parameters is TikTokEvent class type - * Third parameters is bytes payload - * - * mapToEvent(WebcastGiftMessage.class, TikTokGiftEvent.class, payload) - * - * How does it work? - * 1. Finds method `parseFrom(byte[] bytes)` inside ProtocolBuffer class - * 2. put payload to the method methods and create new instance of ProtcolBuffer object - * 3. Finds in TikTokEvent constructor that takes ProtocolBuffer type as parameter - * 4. create new Instance in TikTokEvents using object from step 2 and constructor from step 3 - * - * methodCache and constructorCache are used to boost performance + *

+ *

mapToEvent(WebcastGiftMessage.class, TikTokGiftEvent.class, payload)

+ *

How does it work?

+ *
    + *
  1. Finds method `parseFrom(byte[] bytes)` inside ProtocolBuffer class
  2. + *
  3. Put payload to the method methods and create new instance of ProtcolBuffer object
  4. + *
  5. Finds in TikTokEvent constructor that takes ProtocolBuffer type as parameter
  6. + *
  7. Create new Instance in TikTokEvents using object from step 2 and constructor from step 3
  8. + *
+ * methodCache and constructorCache are used to boost performance */ public class TikTokGenericEventMapper { @@ -74,34 +72,27 @@ public class TikTokGenericEventMapper { } } - public Method getParsingMethod(Class input) throws NoSuchMethodException { - if (methodCache.containsKey(input)) { - return methodCache.get(input); - } - var method = input.getDeclaredMethod("parseFrom", byte[].class); - methodCache.put(input, method); - return method; + public Method getParsingMethod(Class input) throws RuntimeException { + return methodCache.computeIfAbsent(input, aClass -> { + try { + return aClass.getDeclaredMethod("parseFrom", byte[].class); + } catch (NoSuchMethodException e) { + throw new RuntimeException(e); + } + }); } private Constructor getParsingConstructor(Class input, Class output) { - var pair = new TypePair(input, output); - if (constructorCache.containsKey(pair)) { - return constructorCache.get(pair); - } - - var optional = Arrays.stream(output.getConstructors()) + return constructorCache.computeIfAbsent(new TypePair(input, output), pair -> { + var optional = Arrays.stream(output.getConstructors()) .filter(ea -> Arrays.stream(ea.getParameterTypes()) - .toList() - .contains(input)) + .toList() + .contains(input)) .findFirst(); - if (optional.isEmpty()) { - throw new TikTokMessageMappingException(input, output, "Unable to find constructor with input class type"); - } - - constructorCache.put(pair, optional.get()); - return optional.get(); + if (optional.isEmpty()) + throw new TikTokMessageMappingException(input, output, "Unable to find constructor with input class type"); + return optional.get(); + }); } - - -} +} \ No newline at end of file diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/handlers/TikTokGiftEventHandler.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/handlers/TikTokGiftEventHandler.java index 2e4f17d..cd4293d 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/handlers/TikTokGiftEventHandler.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/handlers/TikTokGiftEventHandler.java @@ -55,11 +55,6 @@ public class TikTokGiftEventHandler { } public List handleGift(WebcastGiftMessage currentMessage) { - var userId = currentMessage.getUser().getId(); - var currentType = GiftComboStateType.fromNumber(currentMessage.getSendType()); - var containsPreviousMessage = giftsMessages.containsKey(userId); - - //If gift is not streakable just return onGift event if (currentMessage.getGift().getType() != 1) { var comboEvent = getGiftComboEvent(currentMessage, GiftComboStateType.Finished); @@ -67,7 +62,11 @@ public class TikTokGiftEventHandler { return List.of(comboEvent, giftEvent); } - if (!containsPreviousMessage) { + var userId = currentMessage.getUser().getId(); + var currentType = GiftComboStateType.fromNumber(currentMessage.getSendType()); + var previousMessage = giftsMessages.get(userId); + + if (previousMessage == null) { if (currentType == GiftComboStateType.Finished) { return List.of(getGiftEvent(currentMessage)); } else { @@ -76,7 +75,6 @@ public class TikTokGiftEventHandler { } } - var previousMessage = giftsMessages.get(userId); var previousType = GiftComboStateType.fromNumber(previousMessage.getSendType()); if (currentType == GiftComboStateType.Active && previousType == GiftComboStateType.Active) { @@ -114,9 +112,9 @@ public class TikTokGiftEventHandler { gift = giftsManager.getByName(giftMessage.getGift().getName()); if (gift == Gift.UNDEFINED) { gift = new Gift(giftId, - giftMessage.getGift().getName(), - giftMessage.getGift().getDiamondCount(), - Picture.map(giftMessage.getGift().getImage())); + giftMessage.getGift().getName(), + giftMessage.getGift().getDiamondCount(), + Picture.map(giftMessage.getGift().getImage())); giftsManager.attachGift(gift); } From b223651a8fc2269493d1fe9550fa3eaffa637d83 Mon Sep 17 00:00:00 2001 From: kohlerpop1 Date: Mon, 1 Jul 2024 17:22:23 -0400 Subject: [PATCH 07/13] Fixed injection type issue. --- .../java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java | 6 +++--- .../github/jwdeveloper/tiktok/TikTokLiveMessageHandler.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java index 90bf1cf..1ce47d6 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java @@ -55,15 +55,15 @@ public class TikTokLiveClient implements LiveClient private final ListenersManager listenersManager; private final Logger logger; private final GiftsManager giftManager; - private final TikTokLiveMessageHandler messageHandler; + private final LiveMessagesHandler messageHandler; public TikTokLiveClient( - TikTokLiveMessageHandler messageHandler, + LiveMessagesHandler messageHandler, GiftsManager giftsManager, TikTokRoomInfo tikTokLiveMeta, LiveHttpClient tiktokHttpClient, SocketClient webSocketClient, - TikTokLiveEventHandler tikTokEventHandler, + LiveEventsHandler tikTokEventHandler, LiveClientSettings clientSettings, ListenersManager listenersManager, Logger logger) { diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveMessageHandler.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveMessageHandler.java index 9b41d42..9b75652 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveMessageHandler.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveMessageHandler.java @@ -43,7 +43,7 @@ public class TikTokLiveMessageHandler implements LiveMessagesHandler { private final LiveEventsHandler tikTokEventHandler; private final LiveMapper mapper; - public TikTokLiveMessageHandler(TikTokLiveEventHandler tikTokEventHandler, LiveMapper mapper) { + public TikTokLiveMessageHandler(LiveEventsHandler tikTokEventHandler, LiveMapper mapper) { this.tikTokEventHandler = tikTokEventHandler; this.mapper = mapper; } From fed9de3fd00e66e1c00a98bbebd91063ba435649 Mon Sep 17 00:00:00 2001 From: "jacek.wolniewicz" Date: Mon, 1 Jul 2024 23:28:38 +0200 Subject: [PATCH 08/13] Due to convention, interfaces should not have TikTok name inside, but they should have prefix Live instead - rename TikTokMapper to LiveMapper - rename TikTokLiveMapperHelper to LiveMapperHelper Create interface: LiveEventsHandler for TikTokLiveEventHandler LiveMessagesHandler for TikTokLiveMessageHandler --- .../tiktok/CusomizationExample.java | 7 ++++- pom.xml | 2 +- .../pom.xml | 7 ++++- tools-readme/readme.md | 3 +++ .../jwdeveloper/tiktok/CodeExample.java | 0 .../tiktok/CodeExamplesGenerator.java | 0 .../jwdeveloper/tiktok/EventsDecorator.java | 0 .../tiktok/EventsInfoGenerator.java | 0 .../jwdeveloper/tiktok/FilesUtility.java | 0 .../tiktok/ListenerExampleGenerator.java | 0 .../io/github/jwdeveloper/tiktok/Main.java | 1 + .../io/github/jwdeveloper/tiktok/Main2.java | 27 +++++++++++++++++++ .../jwdeveloper/tiktok/ReadmeGenerator.java | 0 .../jwdeveloper/tiktok/TemplateUtility.java | 0 .../src/main/resources/logo.svg | 0 .../src/main/resources/output.md | 0 .../src/main/resources/readme-template.html | 6 ++++- .../src/main/resources/template.md | 6 ++--- 18 files changed, 52 insertions(+), 7 deletions(-) rename {Tools-ReadmeGenerator => tools-readme}/pom.xml (89%) create mode 100644 tools-readme/readme.md rename {Tools-ReadmeGenerator => tools-readme}/src/main/java/io/github/jwdeveloper/tiktok/CodeExample.java (100%) rename {Tools-ReadmeGenerator => tools-readme}/src/main/java/io/github/jwdeveloper/tiktok/CodeExamplesGenerator.java (100%) rename {Tools-ReadmeGenerator => tools-readme}/src/main/java/io/github/jwdeveloper/tiktok/EventsDecorator.java (100%) rename {Tools-ReadmeGenerator => tools-readme}/src/main/java/io/github/jwdeveloper/tiktok/EventsInfoGenerator.java (100%) rename {Tools-ReadmeGenerator => tools-readme}/src/main/java/io/github/jwdeveloper/tiktok/FilesUtility.java (100%) rename {Tools-ReadmeGenerator => tools-readme}/src/main/java/io/github/jwdeveloper/tiktok/ListenerExampleGenerator.java (100%) rename {Tools-ReadmeGenerator => tools-readme}/src/main/java/io/github/jwdeveloper/tiktok/Main.java (99%) create mode 100644 tools-readme/src/main/java/io/github/jwdeveloper/tiktok/Main2.java rename {Tools-ReadmeGenerator => tools-readme}/src/main/java/io/github/jwdeveloper/tiktok/ReadmeGenerator.java (100%) rename {Tools-ReadmeGenerator => tools-readme}/src/main/java/io/github/jwdeveloper/tiktok/TemplateUtility.java (100%) rename {Tools-ReadmeGenerator => tools-readme}/src/main/resources/logo.svg (100%) rename {Tools-ReadmeGenerator => tools-readme}/src/main/resources/output.md (100%) rename {Tools-ReadmeGenerator => tools-readme}/src/main/resources/readme-template.html (72%) rename {Tools-ReadmeGenerator => tools-readme}/src/main/resources/template.md (98%) diff --git a/Examples/src/main/java/io/github/jwdeveloper/tiktok/CusomizationExample.java b/Examples/src/main/java/io/github/jwdeveloper/tiktok/CusomizationExample.java index 8b61618..371784d 100644 --- a/Examples/src/main/java/io/github/jwdeveloper/tiktok/CusomizationExample.java +++ b/Examples/src/main/java/io/github/jwdeveloper/tiktok/CusomizationExample.java @@ -3,6 +3,9 @@ package io.github.jwdeveloper.tiktok; import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent; import io.github.jwdeveloper.tiktok.data.events.gift.TikTokGiftEvent; import io.github.jwdeveloper.tiktok.data.models.gifts.Gift; +import io.github.jwdeveloper.tiktok.data.settings.LiveClientSettings; +import io.github.jwdeveloper.tiktok.http.HttpClientBuilder; +import io.github.jwdeveloper.tiktok.http.HttpClientFactory; import io.github.jwdeveloper.tiktok.live.GiftsManager; import io.github.jwdeveloper.tiktok.live.LiveClient; @@ -17,6 +20,7 @@ import java.util.function.Predicate; public class CusomizationExample { public static void main(String[] args) { + var customEventHandler = new CustomEventsHandler(); var client = TikTokLive.newClient("john") .configure(liveClientSettings -> { @@ -30,7 +34,7 @@ public class CusomizationExample { .customize(container -> { //overriding default implementation of GiftsManager, with own one - container.registerSingleton(TikTokLiveEventHandler.class, CustomEventsHandler.class); + container.registerSingleton(TikTokLiveEventHandler.class, customEventHandler); }).build(); client.connect(); @@ -38,6 +42,7 @@ public class CusomizationExample { client.publishEvent(TikTokGiftEvent.of("stone", 2, 12)); } + public static class CustomEventsHandler extends TikTokLiveEventHandler { @Override diff --git a/pom.xml b/pom.xml index 8f6b0a8..07e272e 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ API Client Examples - Tools-ReadmeGenerator + tools-readme extension-recorder extension-collector diff --git a/Tools-ReadmeGenerator/pom.xml b/tools-readme/pom.xml similarity index 89% rename from Tools-ReadmeGenerator/pom.xml rename to tools-readme/pom.xml index a74e215..59ce99b 100644 --- a/Tools-ReadmeGenerator/pom.xml +++ b/tools-readme/pom.xml @@ -9,7 +9,7 @@ 4.0.0 - Tools-ReadmeGenerator + tools-readme jitpack.io @@ -23,6 +23,11 @@ + + com.hubspot.jinjava + jinjava + 2.7.2 + commons-io commons-io diff --git a/tools-readme/readme.md b/tools-readme/readme.md new file mode 100644 index 0000000..2ea9b92 --- /dev/null +++ b/tools-readme/readme.md @@ -0,0 +1,3 @@ +Generates documentation from template +that can be found under +- `src/main/resources/readme-template.html` diff --git a/Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/CodeExample.java b/tools-readme/src/main/java/io/github/jwdeveloper/tiktok/CodeExample.java similarity index 100% rename from Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/CodeExample.java rename to tools-readme/src/main/java/io/github/jwdeveloper/tiktok/CodeExample.java diff --git a/Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/CodeExamplesGenerator.java b/tools-readme/src/main/java/io/github/jwdeveloper/tiktok/CodeExamplesGenerator.java similarity index 100% rename from Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/CodeExamplesGenerator.java rename to tools-readme/src/main/java/io/github/jwdeveloper/tiktok/CodeExamplesGenerator.java diff --git a/Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/EventsDecorator.java b/tools-readme/src/main/java/io/github/jwdeveloper/tiktok/EventsDecorator.java similarity index 100% rename from Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/EventsDecorator.java rename to tools-readme/src/main/java/io/github/jwdeveloper/tiktok/EventsDecorator.java diff --git a/Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/EventsInfoGenerator.java b/tools-readme/src/main/java/io/github/jwdeveloper/tiktok/EventsInfoGenerator.java similarity index 100% rename from Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/EventsInfoGenerator.java rename to tools-readme/src/main/java/io/github/jwdeveloper/tiktok/EventsInfoGenerator.java diff --git a/Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/FilesUtility.java b/tools-readme/src/main/java/io/github/jwdeveloper/tiktok/FilesUtility.java similarity index 100% rename from Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/FilesUtility.java rename to tools-readme/src/main/java/io/github/jwdeveloper/tiktok/FilesUtility.java diff --git a/Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/ListenerExampleGenerator.java b/tools-readme/src/main/java/io/github/jwdeveloper/tiktok/ListenerExampleGenerator.java similarity index 100% rename from Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/ListenerExampleGenerator.java rename to tools-readme/src/main/java/io/github/jwdeveloper/tiktok/ListenerExampleGenerator.java diff --git a/Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/Main.java b/tools-readme/src/main/java/io/github/jwdeveloper/tiktok/Main.java similarity index 99% rename from Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/Main.java rename to tools-readme/src/main/java/io/github/jwdeveloper/tiktok/Main.java index 9f987cd..7968d22 100644 --- a/Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/Main.java +++ b/tools-readme/src/main/java/io/github/jwdeveloper/tiktok/Main.java @@ -22,6 +22,7 @@ public class Main var output = System.getProperty("user.dir"); + DescriptionGenerator generator = Descrabble.create() .withTemplate(targetFile) .withVariable("version", version) diff --git a/tools-readme/src/main/java/io/github/jwdeveloper/tiktok/Main2.java b/tools-readme/src/main/java/io/github/jwdeveloper/tiktok/Main2.java new file mode 100644 index 0000000..c811539 --- /dev/null +++ b/tools-readme/src/main/java/io/github/jwdeveloper/tiktok/Main2.java @@ -0,0 +1,27 @@ +package io.github.jwdeveloper.tiktok; + +import com.google.common.base.Charsets; +import com.google.common.collect.Maps; +import com.google.common.io.Resources; +import com.hubspot.jinjava.Jinjava; + +import java.io.IOException; +import java.util.HashMap; + + +public class Main2 { + public static void main(String[] args) throws IOException { + var version = System.getenv("VERSION"); + if (version == null || version.equals("")) { + version = "[Replace with current version]"; + } + + var template = Resources.toString(Resources.getResource("my-template.html"), Charsets.UTF_8); + + var jinjava = new Jinjava(); + var context = new HashMap(); + context.put("version", version); + + var renderedTemplate = jinjava.render(template, context); + } +} diff --git a/Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/ReadmeGenerator.java b/tools-readme/src/main/java/io/github/jwdeveloper/tiktok/ReadmeGenerator.java similarity index 100% rename from Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/ReadmeGenerator.java rename to tools-readme/src/main/java/io/github/jwdeveloper/tiktok/ReadmeGenerator.java diff --git a/Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/TemplateUtility.java b/tools-readme/src/main/java/io/github/jwdeveloper/tiktok/TemplateUtility.java similarity index 100% rename from Tools-ReadmeGenerator/src/main/java/io/github/jwdeveloper/tiktok/TemplateUtility.java rename to tools-readme/src/main/java/io/github/jwdeveloper/tiktok/TemplateUtility.java diff --git a/Tools-ReadmeGenerator/src/main/resources/logo.svg b/tools-readme/src/main/resources/logo.svg similarity index 100% rename from Tools-ReadmeGenerator/src/main/resources/logo.svg rename to tools-readme/src/main/resources/logo.svg diff --git a/Tools-ReadmeGenerator/src/main/resources/output.md b/tools-readme/src/main/resources/output.md similarity index 100% rename from Tools-ReadmeGenerator/src/main/resources/output.md rename to tools-readme/src/main/resources/output.md diff --git a/Tools-ReadmeGenerator/src/main/resources/readme-template.html b/tools-readme/src/main/resources/readme-template.html similarity index 72% rename from Tools-ReadmeGenerator/src/main/resources/readme-template.html rename to tools-readme/src/main/resources/readme-template.html index 09257ce..771e75d 100644 --- a/Tools-ReadmeGenerator/src/main/resources/readme-template.html +++ b/tools-readme/src/main/resources/readme-template.html @@ -4,7 +4,6 @@ - TikTok Live Java
@@ -19,6 +18,11 @@
+ + A Java library inspired by [TikTokLive](https://github.com/isaackogan/TikTokLive) and [TikTokLiveSharp](https://github.com/frankvHoof93/TikTokLiveSharp). Use it to receive live stream events such as comments and gifts in realtime from [TikTok LIVE](https://www.tiktok.com/live) by connecting to TikTok's internal WebCast push service. + The library includes a wrapper that connects to the WebCast service using just the username (`uniqueId`). This allows you to connect to your own live chat as well as the live chat of other streamers. + No credentials are required. Events such as [Members Joining](#member), [Gifts](#gift), [Subscriptions](#subscribe), [Viewers](#roomuser), [Follows](#social), [Shares](#social), [Questions](#questionnew), [Likes](#like) and [Battles](#linkmicbattle) can be tracked. +
diff --git a/Tools-ReadmeGenerator/src/main/resources/template.md b/tools-readme/src/main/resources/template.md similarity index 98% rename from Tools-ReadmeGenerator/src/main/resources/template.md rename to tools-readme/src/main/resources/template.md index 24dda0d..c496dad 100644 --- a/Tools-ReadmeGenerator/src/main/resources/template.md +++ b/tools-readme/src/main/resources/template.md @@ -81,9 +81,10 @@ Do you prefer other programming languages? ## Events -{{events-content}} -{{for item of data }} +@{events-content} + +{{for item of data}} {{if item is 2}} @@ -102,6 +103,5 @@ my name is {{item.name}} {{listener-content}} ``` - ## Contributing Your improvements are welcome! Feel free to open an issue or pull request. From 63672fe9eb2739e82af976e94f23f5c7aba0195f Mon Sep 17 00:00:00 2001 From: "jacek.wolniewicz" Date: Mon, 1 Jul 2024 23:32:33 +0200 Subject: [PATCH 09/13] - updating customizaton example --- .../io/github/jwdeveloper/tiktok/CusomizationExample.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Examples/src/main/java/io/github/jwdeveloper/tiktok/CusomizationExample.java b/Examples/src/main/java/io/github/jwdeveloper/tiktok/CusomizationExample.java index 371784d..b0c3827 100644 --- a/Examples/src/main/java/io/github/jwdeveloper/tiktok/CusomizationExample.java +++ b/Examples/src/main/java/io/github/jwdeveloper/tiktok/CusomizationExample.java @@ -8,6 +8,7 @@ import io.github.jwdeveloper.tiktok.http.HttpClientBuilder; import io.github.jwdeveloper.tiktok.http.HttpClientFactory; import io.github.jwdeveloper.tiktok.live.GiftsManager; import io.github.jwdeveloper.tiktok.live.LiveClient; +import io.github.jwdeveloper.tiktok.live.LiveEventsHandler; import java.util.List; import java.util.Map; @@ -33,8 +34,8 @@ public class CusomizationExample { }) .customize(container -> { - //overriding default implementation of GiftsManager, with own one - container.registerSingleton(TikTokLiveEventHandler.class, customEventHandler); + //overriding default implementation of LiveEventsHandler, with own one + container.registerSingleton(LiveEventsHandler.class, customEventHandler); }).build(); client.connect(); From 7005f58edde9dc1f8fd612385f444e38728fe8f0 Mon Sep 17 00:00:00 2001 From: kohlerpop1 Date: Mon, 1 Jul 2024 17:38:02 -0400 Subject: [PATCH 10/13] Fixed spelling mistake! --- ...ionExample.java => CustomizationExample.java} | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) rename Examples/src/main/java/io/github/jwdeveloper/tiktok/{CusomizationExample.java => CustomizationExample.java} (74%) diff --git a/Examples/src/main/java/io/github/jwdeveloper/tiktok/CusomizationExample.java b/Examples/src/main/java/io/github/jwdeveloper/tiktok/CustomizationExample.java similarity index 74% rename from Examples/src/main/java/io/github/jwdeveloper/tiktok/CusomizationExample.java rename to Examples/src/main/java/io/github/jwdeveloper/tiktok/CustomizationExample.java index b0c3827..eb1d1f9 100644 --- a/Examples/src/main/java/io/github/jwdeveloper/tiktok/CusomizationExample.java +++ b/Examples/src/main/java/io/github/jwdeveloper/tiktok/CustomizationExample.java @@ -2,23 +2,13 @@ package io.github.jwdeveloper.tiktok; import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent; import io.github.jwdeveloper.tiktok.data.events.gift.TikTokGiftEvent; -import io.github.jwdeveloper.tiktok.data.models.gifts.Gift; -import io.github.jwdeveloper.tiktok.data.settings.LiveClientSettings; -import io.github.jwdeveloper.tiktok.http.HttpClientBuilder; -import io.github.jwdeveloper.tiktok.http.HttpClientFactory; -import io.github.jwdeveloper.tiktok.live.GiftsManager; -import io.github.jwdeveloper.tiktok.live.LiveClient; -import io.github.jwdeveloper.tiktok.live.LiveEventsHandler; - -import java.util.List; -import java.util.Map; -import java.util.function.Predicate; +import io.github.jwdeveloper.tiktok.live.*; /** * When the default implementation does not meet your needs, * you can override it using `customize` method */ -public class CusomizationExample { +public class CustomizationExample { public static void main(String[] args) { var customEventHandler = new CustomEventsHandler(); @@ -51,4 +41,4 @@ public class CusomizationExample { System.out.println("Hello from custom events handler: " + tikTokEvent.getClass().getSimpleName()); } } -} +} \ No newline at end of file From 1054453451ba5348744eff29562da533940a3836 Mon Sep 17 00:00:00 2001 From: kohlerpop1 Date: Tue, 2 Jul 2024 17:50:37 -0400 Subject: [PATCH 11/13] Change parameter names for clarification! --- .../tiktok/data/models/users/User.java | 40 +++++++++---------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/users/User.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/users/User.java index 06fa68b..cfdd902 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/users/User.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/users/User.java @@ -22,16 +22,12 @@ */ package io.github.jwdeveloper.tiktok.data.models.users; -import io.github.jwdeveloper.tiktok.data.models.badges.Badge; import io.github.jwdeveloper.tiktok.data.models.Picture; +import io.github.jwdeveloper.tiktok.data.models.badges.Badge; import io.github.jwdeveloper.tiktok.messages.webcast.*; -import lombok.AccessLevel; -import lombok.Getter; +import lombok.*; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; @Getter public class User { @@ -49,12 +45,12 @@ public class User { return attributes.stream().toList(); } - public boolean hasAttribute(UserAttribute userFlag) { - return attributes.contains(userFlag); + public boolean hasAttribute(UserAttribute attribute) { + return attributes.contains(attribute); } - public void addAttribute(UserAttribute... flags) { - this.attributes.addAll(Arrays.stream(flags).toList()); + public void addAttribute(UserAttribute... attributes) { + this.attributes.addAll(List.of(attributes)); } public boolean isGiftGiver() { @@ -168,11 +164,11 @@ public class User { } public static User EMPTY = new User(0L, - "", - Picture.empty(), - 0, - 0, - List.of(Badge.empty())); + "", + Picture.empty(), + 0, + 0, + List.of(Badge.empty())); public static User map(io.github.jwdeveloper.tiktok.messages.data.User user) { return new User(user); @@ -209,12 +205,12 @@ public class User { public static User map(WebcastEnvelopeMessage.EnvelopeInfo envelopeInfo) { return new User(0L, - //envelopeInfo.getSendUserId(), - envelopeInfo.getSendUserName(), - Picture.map(envelopeInfo.getSendUserAvatar()), - 0, - 0, - List.of(Badge.empty())); + //envelopeInfo.getSendUserId(), + envelopeInfo.getSendUserName(), + Picture.map(envelopeInfo.getSendUserAvatar()), + 0, + 0, + List.of(Badge.empty())); } @Override From f986efd2d521267705bf095033a6f5044ebc8359 Mon Sep 17 00:00:00 2001 From: kohlerpop1 Date: Tue, 2 Jul 2024 22:08:02 -0400 Subject: [PATCH 12/13] Only fetch gifts if no exceptions are thrown to prevent spam to TikTok --- .../java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java index 1ce47d6..511fd89 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java @@ -131,9 +131,6 @@ public class TikTokLiveClient implements LiveClient roomInfo.setStartTime(userData.getStartTime()); roomInfo.setRoomId(userData.getRoomId()); - if (clientSettings.isFetchGifts()) - giftManager.attachGiftsList(httpClient.fetchRoomGiftsData(userData.getRoomId()).getGifts()); - if (userData.getUserStatus() == LiveUserData.UserStatus.Offline) throw new TikTokLiveOfflineHostException("User is offline: " + roomInfo.getHostName()); @@ -165,6 +162,9 @@ public class TikTokLiveClient implements LiveClient if (preconnectEvent.isCancelConnection()) throw new TikTokLiveException("TikTokPreConnectionEvent cancelled connection!"); + if (clientSettings.isFetchGifts()) + giftManager.attachGiftsList(httpClient.fetchRoomGiftsData(userData.getRoomId()).getGifts()); + var liveConnectionRequest = new LiveConnectionData.Request(userData.getRoomId()); var liveConnectionData = httpClient.fetchLiveConnectionData(liveConnectionRequest); webSocketClient.start(liveConnectionData, this); From f5de7720cdae420588251b35dad54cbb879c0816 Mon Sep 17 00:00:00 2001 From: kohlerpop1 Date: Wed, 3 Jul 2024 14:24:37 -0400 Subject: [PATCH 13/13] Created TikTokLiveUnknownHostException for use inside of TikTokLiveClient! --- .../TikTokLiveUnknownHostException.java | 30 +++++++++++++++++++ .../jwdeveloper/tiktok/TikTokLiveClient.java | 11 ++----- 2 files changed, 33 insertions(+), 8 deletions(-) create mode 100644 API/src/main/java/io/github/jwdeveloper/tiktok/exceptions/TikTokLiveUnknownHostException.java diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/exceptions/TikTokLiveUnknownHostException.java b/API/src/main/java/io/github/jwdeveloper/tiktok/exceptions/TikTokLiveUnknownHostException.java new file mode 100644 index 0000000..2f21399 --- /dev/null +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/exceptions/TikTokLiveUnknownHostException.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2023-2023 jwdeveloper jacekwoln@gmail.com + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package io.github.jwdeveloper.tiktok.exceptions; + +public class TikTokLiveUnknownHostException extends TikTokLiveException +{ + public TikTokLiveUnknownHostException(String message) { + super(message); + } +} \ No newline at end of file diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java index 511fd89..834e227 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java @@ -78,15 +78,10 @@ public class TikTokLiveClient implements LiveClient this.logger = logger; } - public void connectAsync(Consumer onConnection) { - CompletableFuture.runAsync(() -> { - connect(); - onConnection.accept(this); - }); + connectAsync().thenAccept(onConnection); } - public CompletableFuture connectAsync() { return CompletableFuture.supplyAsync(() -> { connect(); @@ -135,7 +130,7 @@ public class TikTokLiveClient implements LiveClient throw new TikTokLiveOfflineHostException("User is offline: " + roomInfo.getHostName()); if (userData.getUserStatus() == LiveUserData.UserStatus.NotFound) - throw new TikTokLiveOfflineHostException("User not found: " + roomInfo.getHostName()); + throw new TikTokLiveUnknownHostException("User not found: " + roomInfo.getHostName()); var liveDataRequest = new LiveData.Request(userData.getRoomId()); var liveData = httpClient.fetchLiveData(liveDataRequest); @@ -144,7 +139,7 @@ public class TikTokLiveClient implements LiveClient throw new TikTokLiveException("Livestream for " + roomInfo.getHostName() + " is 18+ or age restricted!"); if (liveData.getLiveStatus() == LiveData.LiveStatus.HostNotFound) - throw new TikTokLiveOfflineHostException("LiveStream for " + roomInfo.getHostName() + " could not be found."); + throw new TikTokLiveUnknownHostException("LiveStream for " + roomInfo.getHostName() + " could not be found."); if (liveData.getLiveStatus() == LiveData.LiveStatus.HostOffline) throw new TikTokLiveOfflineHostException("LiveStream for " + roomInfo.getHostName() + " not found, is the Host offline?");