diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/dto/ProxyData.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/dto/ProxyData.java index e1a75ea..cca5afc 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/dto/ProxyData.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/dto/ProxyData.java @@ -50,16 +50,12 @@ public class ProxyData return new ProxyData(address, port); } catch (NumberFormatException e) { - throw new IllegalArgumentException("Port must be a valid integer!"); + throw new IllegalArgumentException("Port must be a valid integer!", e); } catch (UnknownHostException e) { - throw new IllegalArgumentException("Address must be valid IPv4, IPv6, or domain name!"); + throw new IllegalArgumentException("Address must be valid IPv4, IPv6, or domain name!", e); } } - public ProxyData clone() { - return new ProxyData(address, port); - } - public InetSocketAddress toSocketAddress() { return new InetSocketAddress(address, port); } diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/battles/Team.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/battles/Team.java index 5b4e773..dc8554f 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/battles/Team.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/battles/Team.java @@ -1,3 +1,25 @@ +/* + * 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.data.models.battles; public abstract class Team { diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/battles/Team1v1.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/battles/Team1v1.java index 647ab55..9462e67 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/battles/Team1v1.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/battles/Team1v1.java @@ -1,3 +1,25 @@ +/* + * 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.data.models.battles; import io.github.jwdeveloper.tiktok.data.models.users.User; diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/battles/Team2v2.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/battles/Team2v2.java index 374f579..b843f45 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/battles/Team2v2.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/battles/Team2v2.java @@ -1,3 +1,25 @@ +/* + * 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.data.models.battles; import io.github.jwdeveloper.tiktok.data.models.users.User; diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/battles/Viewer.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/battles/Viewer.java index bf4b385..814519f 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/battles/Viewer.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/battles/Viewer.java @@ -1,3 +1,25 @@ +/* + * 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.data.models.battles; import io.github.jwdeveloper.tiktok.data.models.Picture; diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/gifts/Gift.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/gifts/Gift.java index 95f8b91..c97ad72 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/gifts/Gift.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/gifts/Gift.java @@ -1,3 +1,25 @@ +/* + * 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.data.models.gifts; import com.google.gson.JsonObject; diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/users/ListUser.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/users/ListUser.java index 60ef712..2553076 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/users/ListUser.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/users/ListUser.java @@ -1,3 +1,25 @@ +/* + * 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.data.models.users; import lombok.Getter; diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/requests/LiveUserData.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/requests/LiveUserData.java index ce20ce8..44ad687 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/requests/LiveUserData.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/requests/LiveUserData.java @@ -27,18 +27,23 @@ import lombok.*; public class LiveUserData { @Getter - @AllArgsConstructor public static class Request { - private String userName; + private final String userName; + + public Request(String userName) { + if (userName == null || userName.isBlank()) + throw new IllegalArgumentException("Invalid empty username!"); + this.userName = userName; + } } @Getter @AllArgsConstructor public static class Response { - private String json; - private UserStatus userStatus; - private String roomId; - private long startedAtTimeStamp; + private final String json; + private final UserStatus userStatus; + private final String roomId; + private final long startTime; public boolean isLiveOnline() { return userStatus == LiveUserData.UserStatus.Live || userStatus == LiveUserData.UserStatus.LivePaused; diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/settings/HttpClientSettings.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/settings/HttpClientSettings.java index 7f724f4..33f3bbe 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/settings/HttpClientSettings.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/settings/HttpClientSettings.java @@ -97,7 +97,7 @@ public class HttpClientSettings { newSettings.getHeaders().putAll(new TreeMap<>(this.headers)); newSettings.getCookies().putAll(new TreeMap<>(this.cookies)); newSettings.getParams().putAll(new TreeMap<>(this.params)); - newSettings.proxyClientSettings = this.proxyClientSettings; + newSettings.setProxyClientSettings(this.proxyClientSettings); return newSettings; } diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/settings/ProxyClientSettings.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/settings/ProxyClientSettings.java index ab295e1..ad5ce17 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/settings/ProxyClientSettings.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/settings/ProxyClientSettings.java @@ -31,17 +31,17 @@ import java.util.function.Consumer; @Getter @Setter -public class ProxyClientSettings implements Iterator +public class ProxyClientSettings implements Iterator, Iterable { private boolean enabled, autoDiscard = true, fallback = true; private Rotation rotation = Rotation.CONSECUTIVE; private final List proxyList = new ArrayList<>(); - private int index = -1; + private int index; private Proxy.Type type = Proxy.Type.DIRECT; private Consumer onProxyUpdated = x -> {}; public boolean addProxy(String addressPort) { - return proxyList.add(ProxyData.map(addressPort)); + return addProxy(ProxyData.map(addressPort).toSocketAddress()); } public boolean addProxy(String address, int port) { @@ -57,33 +57,27 @@ public class ProxyClientSettings implements Iterator } @Override - public boolean hasNext() { + public synchronized boolean hasNext() { return !proxyList.isEmpty(); } @Override - public ProxyData next() { - var nextProxy = switch (rotation) - { - case CONSECUTIVE -> { - index = (index+1) % proxyList.size(); - yield proxyList.get(index).clone(); + public synchronized ProxyData next() { + try { + var nextProxy = proxyList.get(index); + onProxyUpdated.accept(nextProxy); + return nextProxy; + } finally { + switch (rotation) { + case CONSECUTIVE -> index = ++index % proxyList.size(); + case RANDOM -> index = (int) (Math.random() * proxyList.size()); + case NONE -> index = Math.max(index, 0); } - case RANDOM -> { - index = new Random().nextInt(proxyList.size()); - yield proxyList.get(index).clone(); - } - case NONE -> { - index = Math.max(index, 0); - yield proxyList.get(index).clone(); - } - }; - onProxyUpdated.accept(nextProxy); - return nextProxy; - } + } + } @Override - public void remove() { + public synchronized void remove() { proxyList.remove(index); } @@ -97,8 +91,8 @@ public class ProxyClientSettings implements Iterator } } - public ProxyClientSettings clone() - { + @Override + public ProxyClientSettings clone() { ProxyClientSettings settings = new ProxyClientSettings(); settings.setEnabled(enabled); settings.setRotation(rotation); @@ -109,6 +103,27 @@ public class ProxyClientSettings implements Iterator return settings; } + @Override + public String toString() { + return "ProxyClientSettings{" + + "enabled=" + enabled + + ", autoDiscard=" + autoDiscard + + ", fallback=" + fallback + + ", rotation=" + rotation + + ", proxyList=" + proxyList + + ", index=" + index + + ", type=" + type + + '}'; + } + + /** + * With {@code Iterable} interface, you can use this object inside for loop! + */ + @Override + public Iterator iterator() { + return this; + } + public enum Rotation { /** Rotate addresses consecutively, from proxy 0 -> 1 -> 2 -> ...etc. */ diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/handler/TikTokMessageHandler.java b/API/src/main/java/io/github/jwdeveloper/tiktok/handler/TikTokMessageHandler.java deleted file mode 100644 index a5f1cb2..0000000 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/handler/TikTokMessageHandler.java +++ /dev/null @@ -1,34 +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.handler; - - -import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent; - -import java.util.List; - - -public interface TikTokMessageHandler -{ - List handle(byte[] messagePayload) throws Exception; -} diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/listener/ListenersManager.java b/API/src/main/java/io/github/jwdeveloper/tiktok/listener/ListenersManager.java index e8a3097..09f430a 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/listener/ListenersManager.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/listener/ListenersManager.java @@ -33,6 +33,7 @@ import java.util.List; public interface ListenersManager { List getListeners(); + void addListener(TikTokEventListener listener); void removeListener(TikTokEventListener listener); diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/listener/TikTokEventListenerBase.java b/API/src/main/java/io/github/jwdeveloper/tiktok/listener/TikTokEventListenerBase.java index 17e1be0..d21c272 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/listener/TikTokEventListenerBase.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/listener/TikTokEventListenerBase.java @@ -1,3 +1,25 @@ +/* + * 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.listener; import io.github.jwdeveloper.tiktok.data.events.*; diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/EventConsumer.java b/API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/EventConsumer.java index f2039c1..9ba91ba 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/EventConsumer.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/EventConsumer.java @@ -25,7 +25,13 @@ package io.github.jwdeveloper.tiktok.live.builder; import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent; import io.github.jwdeveloper.tiktok.live.LiveClient; +@FunctionalInterface public interface EventConsumer { + /** + * + * @param liveClient TikTok live client + * @param event event data object + */ void onEvent(LiveClient liveClient, T event); } 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 5083c57..c5dfb7a 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 @@ -52,77 +52,70 @@ public interface EventsBuilder { /** * Invoked whenever any event is triggered * - * @param action - * @return + * @param action consumable action + * @return self instance */ T onEvent(EventConsumer action); /** * Invoked when information about room (live) got updated such as viewer count, etc.. * - * @param action - * @return + * @param action consumable action + * @return self instance */ T onRoomInfo(EventConsumer action); /** * Invoked when someone send message to chat - * - * @param action - * @return + * @param action consumable action + * @return self instance */ T onComment(EventConsumer action); - /** * Invoked when TikTokLiveJava makes http request and getting response - * - * @param action - * @return + * @param action consumable action + * @return self instance */ T onHttpResponse(EventConsumer action); /** * Invoked when TikTok protocolBuffer data "message" was successfully mapped to event * events contains protocol-buffer "Message" and TikTokLiveJava "Event" - * - * @param action - * @return + * @param action consumable action + * @return self instance */ T onWebsocketMessage(EventConsumer action); /** * Invoked when there was not found event mapper for TikTok protocolBuffer data "message" - * - * @param action - * @return + * @param action consumable action + * @return self instance */ T onWebsocketUnhandledMessage(EventConsumer action); /** * Invoked every time TikTok sends protocolBuffer data to websocket * Response contains list of messages that are later mapped to events - * @param action - * @return + * @param action consumable action + * @return self instance */ T onWebsocketResponse(EventConsumer action); - /** * Invoked for gifts that has no combo, or when combo finishes - * @param action - * @return + * @param action consumable action + * @return self instance */ T onGift(EventConsumer action); /** * Invoked for gifts that has combo options such as roses - * @param action - * @return + * @param action consumable action + * @return self instance */ T onGiftCombo(EventConsumer action); - T onQuestion(EventConsumer action); T onSubscribe(EventConsumer action); @@ -145,36 +138,36 @@ public interface EventsBuilder { /** * Invoked when client has been successfully connected to live - * @param action - * @return + * @param action consumable action + * @return self instance */ T onConnected(EventConsumer action); /** * Invoked before client has been successfully connected to live - * @param action - * @return + * @param action consumable action + * @return self instance */ T onPreConnection(EventConsumer action); /** * Invoked when client tries to reconnect - * @param action - * @return + * @param action consumable action + * @return self instance */ T onReconnecting(EventConsumer action); /** * Invoked when client disconnected - * @param action - * @return + * @param action consumable action + * @return self instance */ T onDisconnected(EventConsumer action); /** * Invoked when exception was throed inside client or event handler - * @param action - * @return + * @param action consumable action + * @return self instance */ T onError(EventConsumer action); diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokMapper.java b/API/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokMapper.java index d2597cb..479a386 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokMapper.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokMapper.java @@ -32,13 +32,18 @@ import java.util.function.Function; public interface TikTokMapper { /** - * * if mapper is not found for messageName, TikTokLiveException is thrown + * when mapper is not found for messageName, TikTokLiveException is thrown * * @param messageName * @return TikTokMapperModel */ TikTokMapperModel forMessage(String messageName); + /** + * + * @param mapperName protocol buffer class type + * @return + */ TikTokMapperModel forMessage(Class mapperName); TikTokMapperModel forMessage(String mapperName, MappingAction onMapping); diff --git a/Client/pom.xml b/Client/pom.xml index 2733f1a..f1b5592 100644 --- a/Client/pom.xml +++ b/Client/pom.xml @@ -11,6 +11,12 @@ Client + + + jitpack.io + https://jitpack.io + + @@ -24,7 +30,12 @@ ${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/TikTokLive.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLive.java index 4b4aa89..09a9b45 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLive.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLive.java @@ -23,19 +23,21 @@ package io.github.jwdeveloper.tiktok; +import io.github.jwdeveloper.tiktok.data.settings.LiveClientSettings; import io.github.jwdeveloper.tiktok.gifts.TikTokGiftsManager; import io.github.jwdeveloper.tiktok.http.LiveHttpClient; import io.github.jwdeveloper.tiktok.live.GiftsManager; import io.github.jwdeveloper.tiktok.live.builder.LiveClientBuilder; import java.util.concurrent.CompletableFuture; +import java.util.function.Consumer; public class TikTokLive { /** * Example: https://www.tiktok.com/@dostawcavideo - hostName would be 'dostawcavideo' * - * @param hostName profile name of Tiktok user could be found in profile link + * @param hostName profile name of TikTok user could be found in profile link * @return LiveClientBuilder */ public static LiveClientBuilder newClient(String hostName) { @@ -45,7 +47,7 @@ public class TikTokLive { /** * Example: https://www.tiktok.com/@dostawcavideo - hostName would be 'dostawcavideo' * - * @param hostName profile name of Tiktok user could be found in profile link + * @param hostName profile name of TikTok user could be found in profile link * @return true if live is Online, false if is offline */ public static boolean isLiveOnline(String hostName) { @@ -55,7 +57,7 @@ public class TikTokLive { /** * Example: https://www.tiktok.com/@dostawcavideo - hostName would be 'dostawcavideo' * - * @param hostName profile name of Tiktok user could be found in profile link + * @param hostName profile name of TikTok user could be found in profile link * @return true if live is Online, false if is offline */ public static CompletableFuture isLiveOnlineAsync(String hostName) { @@ -65,7 +67,7 @@ public class TikTokLive { /** * Example: https://www.tiktok.com/@dostawcavideo - hostName would be 'dostawcavideo' * - * @param hostName profile name of Tiktok user could be found in profile link + * @param hostName profile name of TikTok user could be found in profile link * @return true is hostName name is valid and exists, false if not */ public static boolean isHostNameValid(String hostName) { @@ -75,20 +77,29 @@ public class TikTokLive { /** * Example: https://www.tiktok.com/@dostawcavideo - hostName would be 'dostawcavideo' * - * @param hostName profile name of Tiktok user could be found in profile link + * @param hostName profile name of TikTok user could be found in profile link * @return true is hostName name is valid and exists, false if not */ public static CompletableFuture isHostNameValidAsync(String hostName) { return CompletableFuture.supplyAsync(() -> isHostNameValid(hostName)); } + /** + * Use to get some data from TikTok about users are lives + * + * @return LiveHttpClient + */ + public static LiveHttpClient requests(Consumer consumer) { + return new TikTokLiveHttpClient(consumer); + } + /** * Use to get some data from TikTok about users are lives * * @return LiveHttpClient */ public static LiveHttpClient requests() { - return new TikTokLiveHttpClient(); + return requests(liveClientSettings -> {}); } private static GiftsManager giftsManager; 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 15e98be..b2aac4e 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClient.java @@ -23,6 +23,7 @@ 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.*; @@ -43,13 +44,14 @@ import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; import java.util.logging.Logger; -public class TikTokLiveClient implements LiveClient { +public class TikTokLiveClient implements LiveClient +{ private final TikTokRoomInfo liveRoomInfo; private final LiveHttpClient httpClient; private final SocketClient webSocketClient; private final TikTokLiveEventHandler tikTokEventHandler; private final LiveClientSettings clientSettings; - private final TikTokListenersManager listenersManager; + private final ListenersManager listenersManager; private final Logger logger; private final GiftsManager giftsManager; private final TikTokLiveMessageHandler messageHandler; @@ -62,7 +64,7 @@ public class TikTokLiveClient implements LiveClient { SocketClient webSocketClient, TikTokLiveEventHandler tikTokEventHandler, LiveClientSettings clientSettings, - TikTokListenersManager listenersManager, + ListenersManager listenersManager, Logger logger) { this.messageHandler = messageHandler; this.giftsManager = giftsManager; @@ -125,7 +127,7 @@ public class TikTokLiveClient implements LiveClient { tikTokEventHandler.publish(this, new TikTokConnectingEvent()); var userDataRequest = new LiveUserData.Request(liveRoomInfo.getHostName()); var userData = httpClient.fetchLiveUserData(userDataRequest); - liveRoomInfo.setStartTime(userData.getStartedAtTimeStamp()); + liveRoomInfo.setStartTime(userData.getStartTime()); liveRoomInfo.setRoomId(userData.getRoomId()); if (clientSettings.isFetchGifts()) 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 80f1f97..1f2b7ce 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java @@ -22,6 +22,9 @@ */ package io.github.jwdeveloper.tiktok; +import io.github.jwdeveloper.dependance.Dependance; +import io.github.jwdeveloper.dependance.api.DependanceContainer; +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; @@ -38,13 +41,15 @@ import io.github.jwdeveloper.tiktok.data.settings.LiveClientSettings; import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException; import io.github.jwdeveloper.tiktok.gifts.TikTokGiftsManager; import io.github.jwdeveloper.tiktok.http.HttpClientFactory; +import io.github.jwdeveloper.tiktok.http.LiveHttpClient; import io.github.jwdeveloper.tiktok.listener.*; import io.github.jwdeveloper.tiktok.live.*; import io.github.jwdeveloper.tiktok.live.builder.*; import io.github.jwdeveloper.tiktok.mappers.*; -import io.github.jwdeveloper.tiktok.mappers.data.MappingResult; -import io.github.jwdeveloper.tiktok.mappers.handlers.*; -import io.github.jwdeveloper.tiktok.messages.webcast.*; +import io.github.jwdeveloper.tiktok.mappers.handlers.TikTokCommonEventHandler; +import io.github.jwdeveloper.tiktok.mappers.handlers.TikTokGiftEventHandler; +import io.github.jwdeveloper.tiktok.mappers.handlers.TikTokRoomInfoEventHandler; +import io.github.jwdeveloper.tiktok.mappers.handlers.TikTokSocialMediaEventHandler; import io.github.jwdeveloper.tiktok.websocket.*; import java.util.*; @@ -52,28 +57,23 @@ import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; import java.util.logging.Logger; -import static io.github.jwdeveloper.tiktok.messages.enums.LinkMessageType.*; - public class TikTokLiveClientBuilder implements LiveClientBuilder { protected final LiveClientSettings clientSettings; protected final TikTokLiveEventHandler eventHandler; protected final List listeners; - protected Consumer onCustomMappings; - protected Logger logger; - protected GiftsManager giftsManager; + protected final List> onCustomMappings; public TikTokLiveClientBuilder(String userName) { this.clientSettings = LiveClientSettings.createDefault(); this.clientSettings.setHostName(userName); this.eventHandler = new TikTokLiveEventHandler(); this.listeners = new ArrayList<>(); - this.onCustomMappings = (e) -> { - }; + this.onCustomMappings = new ArrayList<>(); } - public LiveClientBuilder onMapping(Consumer onCustomMappings) { - this.onCustomMappings = onCustomMappings; + public LiveClientBuilder onMapping(Consumer consumer) { + this.onCustomMappings.add(consumer); return this; } @@ -104,169 +104,81 @@ public class TikTokLiveClientBuilder implements LiveClientBuilder { var httpSettings = clientSettings.getHttpSettings(); httpSettings.getParams().put("app_language", clientSettings.getClientLanguage()); httpSettings.getParams().put("webcast_language", clientSettings.getClientLanguage()); - - this.logger = LoggerFactory.create(clientSettings.getHostName(), clientSettings); - this.giftsManager = clientSettings.isFetchGifts() ? TikTokLive.gifts() : new TikTokGiftsManager(List.of()); } + //TODO each class registered to container should implement own interface, public LiveClient build() { validate(); - var tiktokRoomInfo = new TikTokRoomInfo(); - tiktokRoomInfo.setHostName(clientSettings.getHostName()); + //Docs: https://github.com/jwdeveloper/DepenDance?tab=readme-ov-file#01-basic + var dependance = Dependance.newContainer(); - var listenerManager = new TikTokListenersManager(listeners, eventHandler); + //config + dependance.registerSingleton(LiveClientSettings.class, clientSettings); + dependance.registerSingleton(Logger.class, LoggerFactory.create(clientSettings.getHostName(), clientSettings)); + dependance.registerSingleton(TikTokRoomInfo.class, container -> + { + var roomInfo = new TikTokRoomInfo(); + roomInfo.setHostName(clientSettings.getHostName()); + return roomInfo; + }); - var httpClientFactory = new HttpClientFactory(clientSettings); + //messages + dependance.registerSingleton(TikTokLiveEventHandler.class, eventHandler); + dependance.registerSingleton(TikTokLiveMessageHandler.class); - var liveHttpClient = clientSettings.isOffline() ? - new TikTokLiveHttpOfflineClient() : - new TikTokLiveHttpClient(httpClientFactory, clientSettings); + //listeners + dependance.registerSingletonList(TikTokEventListener.class, (e) -> listeners); + dependance.registerSingleton(ListenersManager.class, TikTokListenersManager.class); - var eventsMapper = createMapper(giftsManager, tiktokRoomInfo); - var messageHandler = new TikTokLiveMessageHandler(eventHandler, eventsMapper); + //networking + dependance.registerSingleton(HttpClientFactory.class); + if (clientSettings.isOffline()) { + dependance.registerSingleton(SocketClient.class, TikTokWebSocketOfflineClient.class); + dependance.registerSingleton(LiveHttpClient.class, TikTokLiveHttpOfflineClient.class); + } else { + dependance.registerSingleton(SocketClient.class, TikTokWebSocketClient.class); + dependance.registerSingleton(LiveHttpClient.class, TikTokLiveHttpClient.class); + } - var webSocketClient = clientSettings.isOffline() ? - new TikTokWebSocketOfflineClient(eventHandler) : - new TikTokWebSocketClient( - clientSettings, - messageHandler, - eventHandler); + /* TODO in future, custom proxy implementation that can be provided via builder + * if(customProxy != null) + * dependance.registerSingleton(TikTokProxyProvider.class,customProxy); + * else + * dependance.registerSingleton(TikTokProxyProvider.class,DefaultProxyProvider.class); + */ - return new TikTokLiveClient( - messageHandler, - giftsManager, - tiktokRoomInfo, - liveHttpClient, - webSocketClient, - eventHandler, - clientSettings, - listenerManager, - logger); + //gifts + if (clientSettings.isFetchGifts()) { + dependance.registerSingleton(GiftsManager.class, TikTokLive.gifts()); + } else { + dependance.registerSingleton(GiftsManager.class, new TikTokGiftsManager(List.of())); + } + + //mapper + dependance.registerSingleton(TikTokGenericEventMapper.class); + dependance.registerSingleton(TikTokMapperHelper.class, TikTokLiveMapperHelper.class); + dependance.registerSingleton(TikTokMapper.class, (container) -> + { + var dependace = (DependanceContainer) container.find(DependanceContainer.class); + var mapper = MessagesMapperFactory.create(dependace); + onCustomMappings.forEach(action -> action.accept(mapper)); + return mapper; + }); + + //mapper handlers + dependance.registerSingleton(TikTokCommonEventHandler.class); + dependance.registerSingleton(TikTokGiftEventHandler.class); + dependance.registerSingleton(TikTokRoomInfoEventHandler.class); + dependance.registerSingleton(TikTokSocialMediaEventHandler.class); + + //client + dependance.registerSingleton(LiveClient.class, TikTokLiveClient.class); + + var container = dependance.build(); + return container.find(LiveClient.class); } - public TikTokLiveMapper createMapper(GiftsManager giftsManager, TikTokRoomInfo roomInfo) { - - - var eventMapper = new TikTokGenericEventMapper(); - var mapper = new TikTokLiveMapper(new TikTokLiveMapperHelper(eventMapper)); - - //ConnectionEvents events - var commonHandler = new TikTokCommonEventHandler(); - var giftHandler = new TikTokGiftEventHandler(giftsManager, roomInfo); - var roomInfoHandler = new TikTokRoomInfoEventHandler(roomInfo); - var socialHandler = new TikTokSocialMediaEventHandler(roomInfo); - - - mapper.forMessage(WebcastControlMessage.class, commonHandler::handleWebcastControlMessage); - - //Room status events - mapper.forMessage(WebcastLiveIntroMessage.class, roomInfoHandler::handleIntro); - mapper.forMessage(WebcastRoomUserSeqMessage.class, roomInfoHandler::handleUserRanking); - mapper.forMessage(WebcastCaptionMessage.class, (inputBytes, messageName, mapperHelper) -> - { - var messageObject = mapperHelper.bytesToWebcastObject(inputBytes, WebcastCaptionMessage.class); - return MappingResult.of(messageObject, new TikTokCaptionEvent(messageObject)); - }); - - - //User Interactions events - mapper.forMessage(WebcastChatMessage.class, (inputBytes, messageName, mapperHelper) -> - { - var messageObject = mapperHelper.bytesToWebcastObject(inputBytes, WebcastChatMessage.class); - return MappingResult.of(messageObject, new TikTokCommentEvent(messageObject)); - }); - mapper.forMessage(WebcastSubNotifyMessage.class, (inputBytes, messageName, mapperHelper) -> - { - var messageObject = mapperHelper.bytesToWebcastObject(inputBytes, WebcastSubNotifyMessage.class); - return MappingResult.of(messageObject, new TikTokSubscribeEvent(messageObject)); - }); - mapper.forMessage(WebcastEmoteChatMessage.class, (inputBytes, messageName, mapperHelper) -> - { - var messageObject = mapperHelper.bytesToWebcastObject(inputBytes, WebcastEmoteChatMessage.class); - return MappingResult.of(messageObject, new TikTokEmoteEvent(messageObject)); - }); - mapper.forMessage(WebcastQuestionNewMessage.class, (inputBytes, messageName, mapperHelper) -> - { - var messageObject = mapperHelper.bytesToWebcastObject(inputBytes, WebcastQuestionNewMessage.class); - return MappingResult.of(messageObject, new TikTokQuestionEvent(messageObject)); - }); - - mapper.forMessage(WebcastLikeMessage.class, roomInfoHandler::handleLike); - mapper.forMessage(WebcastGiftMessage.class, giftHandler::handleGifts); - mapper.forMessage(WebcastSocialMessage.class, socialHandler::handle); - mapper.forMessage(WebcastMemberMessage.class, roomInfoHandler::handleMemberMessage); - - - //Host Interaction events - mapper.forMessage(WebcastPollMessage.class, commonHandler::handlePollEvent); - mapper.forMessage(WebcastRoomPinMessage.class, commonHandler::handlePinMessage); - mapper.forMessage(WebcastChatMessage.class, (inputBytes, messageName, mapperHelper) -> - { - var messageObject = mapperHelper.bytesToWebcastObject(inputBytes, WebcastChatMessage.class); - return MappingResult.of(messageObject, new TikTokCommentEvent(messageObject)); - }); - - - //LinkMic events - mapper.forMessage(WebcastLinkMicBattle.class, (inputBytes, messageName, mapperHelper) -> { - var message = mapperHelper.bytesToWebcastObject(inputBytes, WebcastLinkMicBattle.class); - return MappingResult.of(message, new TikTokLinkMicBattleEvent(message)); - }); - mapper.forMessage(WebcastLinkMicArmies.class, (inputBytes, messageName, mapperHelper) -> { - var message = mapperHelper.bytesToWebcastObject(inputBytes, WebcastLinkMicArmies.class); - return MappingResult.of(message, new TikTokLinkMicArmiesEvent(message)); - }); - mapper.forMessage(WebcastLinkMessage.class, ((inputBytes, messageName, mapperHelper) -> { - var message = mapperHelper.bytesToWebcastObject(inputBytes, WebcastLinkMessage.class); - return MappingResult.of(message, switch (message.getMessageType()) { - case TYPE_LINKER_INVITE -> new TikTokLinkInviteEvent(message); - case TYPE_LINKER_REPLY -> new TikTokLinkReplyEvent(message); - case TYPE_LINKER_CREATE -> new TikTokLinkCreateEvent(message); - case TYPE_LINKER_CLOSE -> new TikTokLinkCloseEvent(message); - case TYPE_LINKER_ENTER -> new TikTokLinkEnterEvent(message); - case TYPE_LINKER_LEAVE -> new TikTokLinkLeaveEvent(message); - case TYPE_LINKER_CANCEL_INVITE, TYPE_LINKER_CANCEL_APPLY -> new TikTokLinkCancelEvent(message); - case TYPE_LINKER_KICK_OUT -> new TikTokLinkKickOutEvent(message); - case TYPE_LINKER_LINKED_LIST_CHANGE -> new TikTokLinkLinkedListChangeEvent(message); - case TYPE_LINKER_UPDATE_USER -> new TikTokLinkUpdateUserEvent(message); - case TYPE_LINKER_WAITING_LIST_CHANGE, TYPE_LINKER_WAITING_LIST_CHANGE_V2 -> new TikTokLinkWaitListChangeEvent(message); - case TYPE_LINKER_MUTE -> new TikTokLinkMuteEvent(message); - case TYPE_LINKER_MATCH -> new TikTokLinkRandomMatchEvent(message); - case TYPE_LINKER_UPDATE_USER_SETTING -> new TikTokLinkUpdateUserSettingEvent(message); - case TYPE_LINKER_MIC_IDX_UPDATE -> new TikTokLinkMicIdxUpdateEvent(message); - case TYPE_LINKER_LINKED_LIST_CHANGE_V2 -> new TikTokLinkListChangeEvent(message); - case TYPE_LINKER_COHOST_LIST_CHANGE -> new TikTokLinkCohostListChangeEvent(message); - case TYPE_LINKER_MEDIA_CHANGE -> new TikTokLinkMediaChangeEvent(message); - case TYPE_LINKER_ACCEPT_NOTICE -> new TikTokLinkAcceptNoticeEvent(message); - case TYPE_LINKER_SYS_KICK_OUT -> new TikTokLinkSysKickOutEvent(message); - case TYPE_LINKMIC_USER_TOAST -> new TikTokLinkUserToastEvent(message); - default -> new TikTokLinkEvent(message); - }); - })); - // mapper.webcastObjectToConstructor(WebcastLinkMicMethod.class, TikTokLinkMicMethodEvent.class); - // mapper.webcastObjectToConstructor(WebcastLinkMicFanTicketMethod.class, TikTokLinkMicFanTicketEvent.class); - - //Rank events - // mapper.webcastObjectToConstructor(WebcastRankTextMessage.class, TikTokRankTextEvent.class); - // mapper.webcastObjectToConstructor(WebcastRankUpdateMessage.class, TikTokRankUpdateEvent.class); - // mapper.webcastObjectToConstructor(WebcastHourlyRankMessage.class, TikTokRankUpdateEvent.class); - - //Others events - // mapper.webcastObjectToConstructor(WebcastInRoomBannerMessage.class, TikTokInRoomBannerEvent.class); - // mapper.webcastObjectToConstructor(WebcastMsgDetectMessage.class, TikTokDetectEvent.class); - // mapper.webcastObjectToConstructor(WebcastBarrageMessage.class, TikTokBarrageEvent.class); - // mapper.webcastObjectToConstructor(WebcastUnauthorizedMemberMessage.class, TikTokUnauthorizedMemberEvent.class); - // mapper.webcastObjectToConstructor(WebcastOecLiveShoppingMessage.class, TikTokShopEvent.class); - // mapper.webcastObjectToConstructor(WebcastImDeleteMessage.class, TikTokIMDeleteEvent.class); - // mapper.bytesToEvents(WebcastEnvelopeMessage.class, commonHandler::handleEnvelop); - - - onCustomMappings.accept(mapper); - return mapper; - } - - public LiveClient buildAndConnect() { var client = build(); client.connect(); @@ -277,6 +189,10 @@ 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; 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 d4be170..a53abbf 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveEventHandler.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveEventHandler.java @@ -26,10 +26,7 @@ import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent; import io.github.jwdeveloper.tiktok.live.builder.EventConsumer; import io.github.jwdeveloper.tiktok.live.LiveClient; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; +import java.util.*; public class TikTokLiveEventHandler { private final Map, Set> events; @@ -39,21 +36,8 @@ public class TikTokLiveEventHandler { } public void publish(LiveClient tikTokLiveClient, TikTokEvent tikTokEvent) { - if (events.containsKey(TikTokEvent.class)) { - var handlers = events.get(TikTokEvent.class); - for (var handle : handlers) { - handle.onEvent(tikTokLiveClient, tikTokEvent); - } - } - - - if (!events.containsKey(tikTokEvent.getClass())) { - return; - } - var handlers = events.get(tikTokEvent.getClass()); - for (var handler : handlers) { - handler.onEvent(tikTokLiveClient, tikTokEvent); - } + Optional.ofNullable(events.get(TikTokEvent.class)).ifPresent(handlers -> handlers.forEach(handler -> handler.onEvent(tikTokLiveClient, tikTokEvent))); + Optional.ofNullable(events.get(tikTokEvent.getClass())).ifPresent(handlers -> handlers.forEach(handler -> handler.onEvent(tikTokLiveClient, tikTokEvent))); } public void subscribe(Class clazz, EventConsumer event) { @@ -65,22 +49,10 @@ public class TikTokLiveEventHandler { } public void unsubscribe(EventConsumer consumer) { - for (var entry : events.entrySet()) { - entry.getValue().remove(consumer); - } + events.forEach((key, value) -> value.remove(consumer)); } public void unsubscribe(Class clazz, EventConsumer consumer) { - if (clazz == null) { - return; - } - - if (!events.containsKey(clazz)) { - return; - } - - var eventSet = events.get(clazz); - eventSet.remove(consumer); - - } -} + Optional.ofNullable(clazz).map(events::get).ifPresent(consumers -> consumers.remove(consumer)); + } +} \ No newline at end of file diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveHttpClient.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveHttpClient.java index 7387a13..2637e3f 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveHttpClient.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveHttpClient.java @@ -23,6 +23,7 @@ package io.github.jwdeveloper.tiktok; import com.google.protobuf.InvalidProtocolBufferException; +import io.github.jwdeveloper.dependance.injector.api.annotations.Inject; import io.github.jwdeveloper.tiktok.common.*; import io.github.jwdeveloper.tiktok.data.requests.*; import io.github.jwdeveloper.tiktok.data.settings.LiveClientSettings; @@ -32,6 +33,7 @@ import io.github.jwdeveloper.tiktok.http.mappers.*; import io.github.jwdeveloper.tiktok.messages.webcast.WebcastResponse; import java.net.http.HttpResponse; +import java.util.function.Consumer; import java.util.logging.Logger; public class TikTokLiveHttpClient implements LiveHttpClient @@ -53,17 +55,19 @@ public class TikTokLiveHttpClient implements LiveHttpClient private final GiftsDataMapper giftsDataMapper; private final Logger logger; - public TikTokLiveHttpClient(HttpClientFactory factory, LiveClientSettings settings) { + @Inject + public TikTokLiveHttpClient(HttpClientFactory factory) { this.httpFactory = factory; - this.clientSettings = settings; + this.clientSettings = factory.getLiveClientSettings(); this.logger = LoggerFactory.create("HttpClient-"+hashCode(), clientSettings); liveUserDataMapper = new LiveUserDataMapper(); liveDataMapper = new LiveDataMapper(); giftsDataMapper = new GiftsDataMapper(); } - public TikTokLiveHttpClient() { - this(new HttpClientFactory(LiveClientSettings.createDefault()), LiveClientSettings.createDefault()); + public TikTokLiveHttpClient(Consumer consumer) { + this(new HttpClientFactory(LiveClientSettings.createDefault())); + consumer.accept(clientSettings); } public GiftsData.Response fetchRoomGiftsData(String room_id) { @@ -191,7 +195,7 @@ public class TikTokLiveHttpClient implements LiveHttpClient .withParam("internal_ext", webcastResponse.getInternalExt()) .withParams(webcastResponse.getRouteParamsMapMap()) .build() - .toUrl(); + .toUri(); return new LiveConnectionData.Response(websocketCookie, webSocketUrl, webcastResponse); } catch (InvalidProtocolBufferException e) { diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveHttpOfflineClient.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveHttpOfflineClient.java index 76eaa94..0e64de2 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveHttpOfflineClient.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveHttpOfflineClient.java @@ -1,3 +1,25 @@ +/* + * 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; import io.github.jwdeveloper.tiktok.data.models.Picture; 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 893f3d8..8bd374f 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveMessageHandler.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveMessageHandler.java @@ -31,6 +31,7 @@ import io.github.jwdeveloper.tiktok.data.events.websocket.TikTokWebsocketUnhandl 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.messages.webcast.WebcastResponse; import io.github.jwdeveloper.tiktok.utils.Stopwatch; @@ -41,9 +42,9 @@ public class TikTokLiveMessageHandler { private final TikTokLiveEventHandler tikTokEventHandler; private final TikTokLiveMapper mapper; - public TikTokLiveMessageHandler(TikTokLiveEventHandler tikTokEventHandler, TikTokLiveMapper mapper) { + public TikTokLiveMessageHandler(TikTokLiveEventHandler tikTokEventHandler, TikTokMapper mapper) { this.tikTokEventHandler = tikTokEventHandler; - this.mapper = mapper; + this.mapper = (TikTokLiveMapper) mapper; } public void handle(LiveClient client, WebcastResponse webcastResponse) { @@ -61,10 +62,12 @@ public class TikTokLiveMessageHandler { 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; } + var stopwatch = new Stopwatch(); stopwatch.start(); var events = mapper.handleMapping(messageClassName, message.getPayload().toByteArray()); @@ -76,5 +79,4 @@ public class TikTokLiveMessageHandler { tikTokEventHandler.publish(client, event); } } - -} +} \ No newline at end of file diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/common/ActionResult.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/common/ActionResult.java index 25cb954..d2119fe 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/common/ActionResult.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/common/ActionResult.java @@ -1,3 +1,25 @@ +/* + * 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 com.google.gson.*; diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/common/ActionResultBuilder.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/common/ActionResultBuilder.java index f9383d9..c63f606 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/common/ActionResultBuilder.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/common/ActionResultBuilder.java @@ -1,3 +1,25 @@ +/* + * 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 lombok.Setter; diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/common/LoggerFactory.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/common/LoggerFactory.java index fcd2227..eb06253 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/common/LoggerFactory.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/common/LoggerFactory.java @@ -1,3 +1,25 @@ +/* + * 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 io.github.jwdeveloper.tiktok.data.settings.LiveClientSettings; diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/gifts/TikTokGiftsManager.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/gifts/TikTokGiftsManager.java index 622500a..6a875c7 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/gifts/TikTokGiftsManager.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/gifts/TikTokGiftsManager.java @@ -1,3 +1,25 @@ +/* + * 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 io.github.jwdeveloper.tiktok.data.models.gifts.Gift; @@ -7,6 +29,7 @@ import java.util.*; import java.util.function.*; import java.util.stream.Collectors; +//TODO I should've been called it TikTokGiftsRepository public class TikTokGiftsManager implements GiftsManager { private final Map giftsByIdIndex; diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/HttpClient.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/HttpClient.java index eb7a228..25575a3 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/HttpClient.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/HttpClient.java @@ -90,14 +90,14 @@ public class HttpClient { return toResponse().map(HttpResponse::body); } - public URI toUrl() { + public URI toUri() { var stringUrl = prepareUrlWithParameters(url, httpClientSettings.getParams()); return URI.create(stringUrl); } protected HttpRequest prepareGetRequest() { var requestBuilder = HttpRequest.newBuilder().GET(); - requestBuilder.uri(toUrl()); + requestBuilder.uri(toUri()); requestBuilder.timeout(httpClientSettings.getTimeout()); httpClientSettings.getHeaders().forEach(requestBuilder::setHeader); 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 c645560..30fa1f1 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 @@ -23,7 +23,9 @@ package io.github.jwdeveloper.tiktok.http; import io.github.jwdeveloper.tiktok.data.settings.*; +import lombok.Getter; +@Getter public class HttpClientFactory { private final LiveClientSettings liveClientSettings; @@ -35,7 +37,9 @@ public class HttpClientFactory { 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()); diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/HttpProxyClient.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/HttpProxyClient.java index 771234e..4907587 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/HttpProxyClient.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/HttpProxyClient.java @@ -95,7 +95,7 @@ public class HttpProxyClient extends HttpClient { public X509Certificate[] getAcceptedIssuers() { return null; } }}, null); - URL url = toUrl().toURL(); + URL url = toUri().toURL(); if (proxySettings.hasNext()) { try { @@ -117,7 +117,7 @@ public class HttpProxyClient extends HttpClient { var responseInfo = createResponseInfo(socksConnection.getResponseCode(), headers); - var response = createHttpResponse(body, toUrl(), responseInfo); + var response = createHttpResponse(body, toUri(), responseInfo); return ActionResult.success(response); } catch (IOException e) { diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/mappers/HttpRequestJsonMapper.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/mappers/HttpRequestJsonMapper.java index 51c1441..bda137c 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/mappers/HttpRequestJsonMapper.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/mappers/HttpRequestJsonMapper.java @@ -1,3 +1,25 @@ +/* + * 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.http.mappers; import com.google.gson.*; diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/mappers/HttpResponseJsonMapper.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/mappers/HttpResponseJsonMapper.java index 4c0a5ec..b8f2856 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/http/mappers/HttpResponseJsonMapper.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/http/mappers/HttpResponseJsonMapper.java @@ -1,3 +1,25 @@ +/* + * 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.http.mappers; import com.google.gson.*; 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 new file mode 100644 index 0000000..85c4ec3 --- /dev/null +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/MessagesMapperFactory.java @@ -0,0 +1,155 @@ +/* + * 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.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; +import io.github.jwdeveloper.tiktok.mappers.handlers.TikTokRoomInfoEventHandler; +import io.github.jwdeveloper.tiktok.mappers.handlers.TikTokSocialMediaEventHandler; +import io.github.jwdeveloper.tiktok.messages.webcast.*; + +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 mapper = new TikTokLiveMapper(helper); + + //ConnectionEvents events + var commonHandler = container.find(TikTokCommonEventHandler.class); + var giftHandler = container.find(TikTokGiftEventHandler.class); + var roomInfoHandler = container.find(TikTokRoomInfoEventHandler.class); + var socialHandler = container.find(TikTokSocialMediaEventHandler.class); + + + mapper.forMessage(WebcastControlMessage.class, commonHandler::handleWebcastControlMessage); + + //Room status events + mapper.forMessage(WebcastLiveIntroMessage.class, roomInfoHandler::handleIntro); + mapper.forMessage(WebcastRoomUserSeqMessage.class, roomInfoHandler::handleUserRanking); + mapper.forMessage(WebcastCaptionMessage.class, (inputBytes, messageName, mapperHelper) -> + { + var messageObject = mapperHelper.bytesToWebcastObject(inputBytes, WebcastCaptionMessage.class); + return MappingResult.of(messageObject, new TikTokCaptionEvent(messageObject)); + }); + + + //User Interactions events + mapper.forMessage(WebcastChatMessage.class, (inputBytes, messageName, mapperHelper) -> + { + var messageObject = mapperHelper.bytesToWebcastObject(inputBytes, WebcastChatMessage.class); + return MappingResult.of(messageObject, new TikTokCommentEvent(messageObject)); + }); + mapper.forMessage(WebcastSubNotifyMessage.class, (inputBytes, messageName, mapperHelper) -> + { + var messageObject = mapperHelper.bytesToWebcastObject(inputBytes, WebcastSubNotifyMessage.class); + return MappingResult.of(messageObject, new TikTokSubscribeEvent(messageObject)); + }); + mapper.forMessage(WebcastEmoteChatMessage.class, (inputBytes, messageName, mapperHelper) -> + { + var messageObject = mapperHelper.bytesToWebcastObject(inputBytes, WebcastEmoteChatMessage.class); + return MappingResult.of(messageObject, new TikTokEmoteEvent(messageObject)); + }); + mapper.forMessage(WebcastQuestionNewMessage.class, (inputBytes, messageName, mapperHelper) -> + { + var messageObject = mapperHelper.bytesToWebcastObject(inputBytes, WebcastQuestionNewMessage.class); + return MappingResult.of(messageObject, new TikTokQuestionEvent(messageObject)); + }); + + mapper.forMessage(WebcastLikeMessage.class, roomInfoHandler::handleLike); + mapper.forMessage(WebcastGiftMessage.class, giftHandler::handleGifts); + mapper.forMessage(WebcastSocialMessage.class, socialHandler::handle); + mapper.forMessage(WebcastMemberMessage.class, roomInfoHandler::handleMemberMessage); + + //Host Interaction events + mapper.forMessage(WebcastPollMessage.class, commonHandler::handlePollEvent); + mapper.forMessage(WebcastRoomPinMessage.class, commonHandler::handlePinMessage); + mapper.forMessage(WebcastChatMessage.class, (inputBytes, messageName, mapperHelper) -> + { + var messageObject = mapperHelper.bytesToWebcastObject(inputBytes, WebcastChatMessage.class); + return MappingResult.of(messageObject, new TikTokCommentEvent(messageObject)); + }); + + //LinkMic events + mapper.forMessage(WebcastLinkMicBattle.class, (inputBytes, messageName, mapperHelper) -> { + var message = mapperHelper.bytesToWebcastObject(inputBytes, WebcastLinkMicBattle.class); + return MappingResult.of(message, new TikTokLinkMicBattleEvent(message)); + }); + mapper.forMessage(WebcastLinkMicArmies.class, (inputBytes, messageName, mapperHelper) -> { + var message = mapperHelper.bytesToWebcastObject(inputBytes, WebcastLinkMicArmies.class); + return MappingResult.of(message, new TikTokLinkMicArmiesEvent(message)); + }); + mapper.forMessage(WebcastLinkMessage.class, ((inputBytes, messageName, mapperHelper) -> { + var message = mapperHelper.bytesToWebcastObject(inputBytes, WebcastLinkMessage.class); + return MappingResult.of(message, switch (message.getMessageType()) { + case TYPE_LINKER_INVITE -> new TikTokLinkInviteEvent(message); + case TYPE_LINKER_CREATE -> new TikTokLinkCreateEvent(message); + case TYPE_LINKER_CLOSE -> new TikTokLinkCloseEvent(message); + case TYPE_LINKER_ENTER -> new TikTokLinkEnterEvent(message); + case TYPE_LINKER_LEAVE -> new TikTokLinkLeaveEvent(message); + case TYPE_LINKER_CANCEL_INVITE, TYPE_LINKER_CANCEL_APPLY -> new TikTokLinkCancelEvent(message); + case TYPE_LINKER_KICK_OUT -> new TikTokLinkKickOutEvent(message); + case TYPE_LINKER_LINKED_LIST_CHANGE -> new TikTokLinkLinkedListChangeEvent(message); + case TYPE_LINKER_UPDATE_USER -> new TikTokLinkUpdateUserEvent(message); + case TYPE_LINKER_WAITING_LIST_CHANGE, TYPE_LINKER_WAITING_LIST_CHANGE_V2 -> + new TikTokLinkWaitListChangeEvent(message); + case TYPE_LINKER_MUTE -> new TikTokLinkMuteEvent(message); + case TYPE_LINKER_MATCH -> new TikTokLinkRandomMatchEvent(message); + case TYPE_LINKER_UPDATE_USER_SETTING -> new TikTokLinkUpdateUserSettingEvent(message); + case TYPE_LINKER_MIC_IDX_UPDATE -> new TikTokLinkMicIdxUpdateEvent(message); + case TYPE_LINKER_LINKED_LIST_CHANGE_V2 -> new TikTokLinkListChangeEvent(message); + case TYPE_LINKER_COHOST_LIST_CHANGE -> new TikTokLinkCohostListChangeEvent(message); + case TYPE_LINKER_MEDIA_CHANGE -> new TikTokLinkMediaChangeEvent(message); + case TYPE_LINKER_ACCEPT_NOTICE -> new TikTokLinkAcceptNoticeEvent(message); + case TYPE_LINKER_SYS_KICK_OUT -> new TikTokLinkSysKickOutEvent(message); + case TYPE_LINKMIC_USER_TOAST -> new TikTokLinkUserToastEvent(message); + default -> new TikTokLinkEvent(message); + }); + })); + // mapper.webcastObjectToConstructor(WebcastLinkMicMethod.class, TikTokLinkMicMethodEvent.class); + // mapper.webcastObjectToConstructor(WebcastLinkMicFanTicketMethod.class, TikTokLinkMicFanTicketEvent.class); + + //Rank events + // mapper.webcastObjectToConstructor(WebcastRankTextMessage.class, TikTokRankTextEvent.class); + // mapper.webcastObjectToConstructor(WebcastRankUpdateMessage.class, TikTokRankUpdateEvent.class); + // mapper.webcastObjectToConstructor(WebcastHourlyRankMessage.class, TikTokRankUpdateEvent.class); + + //Others events + // mapper.webcastObjectToConstructor(WebcastInRoomBannerMessage.class, TikTokInRoomBannerEvent.class); + // mapper.webcastObjectToConstructor(WebcastMsgDetectMessage.class, TikTokDetectEvent.class); + // mapper.webcastObjectToConstructor(WebcastBarrageMessage.class, TikTokBarrageEvent.class); + // mapper.webcastObjectToConstructor(WebcastUnauthorizedMemberMessage.class, TikTokUnauthorizedMemberEvent.class); + // mapper.webcastObjectToConstructor(WebcastOecLiveShoppingMessage.class, TikTokShopEvent.class); + // mapper.webcastObjectToConstructor(WebcastImDeleteMessage.class, TikTokIMDeleteEvent.class); + // mapper.bytesToEvents(WebcastEnvelopeMessage.class, commonHandler::handleEnvelop); + return mapper; + } +} 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 99e79f5..4fe6dd4 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 @@ -23,14 +23,10 @@ package io.github.jwdeveloper.tiktok.mappers; import com.google.protobuf.GeneratedMessageV3; -import io.github.jwdeveloper.tiktok.TikTokLive; 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 io.github.jwdeveloper.tiktok.mappers.data.*; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.function.Function; public class TikTokLiveMapper implements TikTokMapper { @@ -47,11 +43,7 @@ public class TikTokLiveMapper implements TikTokMapper { @Override public TikTokMapperModel forMessage(String messageName) { - if (!isRegistered(messageName)) { - var model = new TikTokLiveMapperModel(messageName); - mappers.put(messageName, model); - } - return mappers.get(messageName); + return mappers.computeIfAbsent(messageName, TikTokLiveMapperModel::new); } @Override @@ -66,7 +58,6 @@ public class TikTokLiveMapper implements TikTokMapper { return model; } - @Override public TikTokMapperModel forMessage(Class mapperName, MappingAction onMapping) { var model = forMessage(mapperName); @@ -84,7 +75,6 @@ public class TikTokLiveMapper implements TikTokMapper { return globalMapperModel; } - public boolean isRegistered(String mapperName) { return mappers.containsKey(mapperName); } @@ -94,23 +84,19 @@ public class TikTokLiveMapper implements TikTokMapper { } public List handleMapping(String messageName, byte[] bytes) { - if (!isRegistered(messageName)) { - return List.of(); - } var mapperModel = mappers.get(messageName); + if (mapperModel == null) + return List.of(); var inputBytes = mapperModel.getOnBeforeMapping().onMapping(bytes, messageName, mapperUtils); var globalInputBytes = globalMapperModel.getOnBeforeMapping().onMapping(inputBytes, messageName, mapperUtils); - var mappingResult = mapperModel.getOnMapping().onMapping(globalInputBytes, messageName, mapperUtils); - if (mappingResult == null) { - mappingResult = globalMapperModel.getOnMapping().onMapping(globalInputBytes, messageName, mapperUtils); - } + if (mappingResult == null) + mappingResult = globalMapperModel.getOnMapping().onMapping(globalInputBytes, messageName, mapperUtils); var afterMappingResult = mapperModel.getOnAfterMapping().apply(mappingResult); - var globalAfterMappingResult = globalMapperModel.getOnAfterMapping().apply(MappingResult.of(mappingResult.getSource(), afterMappingResult)); - return globalAfterMappingResult; + return globalMapperModel.getOnAfterMapping().apply(MappingResult.of(mappingResult.getSource(), afterMappingResult)); } -} +} \ No newline at end of file diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokLiveMapperModel.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokLiveMapperModel.java index 93f9f52..eb5a6fd 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokLiveMapperModel.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/TikTokLiveMapperModel.java @@ -75,5 +75,4 @@ public class TikTokLiveMapperModel implements TikTokMapperModel { return this; } - } diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/handlers/TikTokChestEventHandler.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/handlers/TikTokChestEventHandler.java deleted file mode 100644 index f6c5be3..0000000 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/handlers/TikTokChestEventHandler.java +++ /dev/null @@ -1,26 +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.mappers.handlers; - -public class TikTokChestEventHandler { -} 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 824c689..5d5ea37 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 @@ -22,6 +22,7 @@ */ package io.github.jwdeveloper.tiktok.websocket; +import io.github.jwdeveloper.dependance.injector.api.containers.Container; import io.github.jwdeveloper.tiktok.*; import io.github.jwdeveloper.tiktok.data.dto.ProxyData; import io.github.jwdeveloper.tiktok.data.requests.LiveConnectionData; 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 d30dddc..66d6ff5 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 @@ -1,3 +1,25 @@ +/* + * 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.websocket; import io.github.jwdeveloper.tiktok.TikTokLiveEventHandler; 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 e44987b..12e166e 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 @@ -1,9 +1,29 @@ +/* + * 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.websocket; import org.java_websocket.WebSocket; -import java.util.Random; - public class TikTokWebSocketPingingTask { private Thread thread; @@ -14,7 +34,7 @@ public class TikTokWebSocketPingingTask public void run(WebSocket webSocket, long pingTaskTime) { stop(); - thread = new Thread(() -> pingTask(webSocket, pingTaskTime)); + thread = new Thread(() -> pingTask(webSocket, pingTaskTime), "pinging-task"); isRunning = true; thread.start(); } @@ -28,18 +48,16 @@ public class TikTokWebSocketPingingTask private void pingTask(WebSocket webSocket, long pingTaskTime) { - var random = new Random(); while (isRunning) { try { - if (!webSocket.isOpen()) { + if (webSocket.isOpen()) { + webSocket.sendPing(); + Thread.sleep(pingTaskTime+(int)(Math.random() * MAX_TIMEOUT)); + } else Thread.sleep(SLEEP_TIME); - continue; - } - webSocket.sendPing(); - - Thread.sleep(pingTaskTime+random.nextInt(MAX_TIMEOUT)); } catch (Exception e) { + //TODO we should display some kind of error message isRunning = false; } } diff --git a/Examples/pom.xml b/Examples/pom.xml index 2682f29..47410c8 100644 --- a/Examples/pom.xml +++ b/Examples/pom.xml @@ -75,7 +75,7 @@ io.github.jwdeveloper.tiktok extension-collector - 1.7.2-Release + ${project.version} compile diff --git a/Examples/src/main/java/io/github/jwdeveloper/tiktok/ConnectionExample.java b/Examples/src/main/java/io/github/jwdeveloper/tiktok/ConnectionExample.java index 9e7ebe5..b9e70e5 100644 --- a/Examples/src/main/java/io/github/jwdeveloper/tiktok/ConnectionExample.java +++ b/Examples/src/main/java/io/github/jwdeveloper/tiktok/ConnectionExample.java @@ -32,7 +32,7 @@ import java.time.Duration; import java.util.logging.Level; public class ConnectionExample { - public static String TIKTOK_HOSTNAME = "kvadromama_marina1"; + public static String TIKTOK_HOSTNAME = "yttvandroid"; public static void main(String[] args) throws IOException { diff --git a/Examples/src/main/java/io/github/jwdeveloper/tiktok/Events_And_Gifts_Testing_Example.java b/Examples/src/main/java/io/github/jwdeveloper/tiktok/Events_And_Gifts_Testing_Example.java index 3d7068b..ecbcdcc 100644 --- a/Examples/src/main/java/io/github/jwdeveloper/tiktok/Events_And_Gifts_Testing_Example.java +++ b/Examples/src/main/java/io/github/jwdeveloper/tiktok/Events_And_Gifts_Testing_Example.java @@ -1,3 +1,25 @@ +/* + * 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; import io.github.jwdeveloper.tiktok.data.events.TikTokCommentEvent; @@ -47,9 +69,7 @@ public class Events_And_Gifts_Testing_Example var fakeGift = TikTokGiftEvent.of(roseGift); var fakeComboGift = TikTokGiftComboEvent.of(roseGift, 12, GiftComboStateType.Begin); - var fakeMessage = TikTokCommentEvent.of("Mark", "Hello world"); - var fakeSubscriber = TikTokSubscribeEvent.of("Mark"); var fakeFollow = TikTokFollowEvent.of("Mark"); var fakeLike = TikTokLikeEvent.of("Mark", 12); diff --git a/extension-collector/src/main/java/io/github/jwdeveloper/tiktok/extension/collector/api/CollectorEvent.java b/extension-collector/src/main/java/io/github/jwdeveloper/tiktok/extension/collector/api/CollectorEvent.java index 40165ea..8aef821 100644 --- a/extension-collector/src/main/java/io/github/jwdeveloper/tiktok/extension/collector/api/CollectorEvent.java +++ b/extension-collector/src/main/java/io/github/jwdeveloper/tiktok/extension/collector/api/CollectorEvent.java @@ -1,3 +1,25 @@ +/* + * 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.extension.collector.api; import io.github.jwdeveloper.tiktok.live.LiveClient; diff --git a/extension-collector/src/main/java/io/github/jwdeveloper/tiktok/extension/collector/api/Storage.java b/extension-collector/src/main/java/io/github/jwdeveloper/tiktok/extension/collector/api/Storage.java index dc7e1a0..dd065cf 100644 --- a/extension-collector/src/main/java/io/github/jwdeveloper/tiktok/extension/collector/api/Storage.java +++ b/extension-collector/src/main/java/io/github/jwdeveloper/tiktok/extension/collector/api/Storage.java @@ -1,3 +1,25 @@ +/* + * 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.extension.collector.api; import org.bson.Document; diff --git a/extension-collector/src/main/java/io/github/jwdeveloper/tiktok/extension/collector/api/settings/CollectorListenerSettings.java b/extension-collector/src/main/java/io/github/jwdeveloper/tiktok/extension/collector/api/settings/CollectorListenerSettings.java index c87a5d4..8430f92 100644 --- a/extension-collector/src/main/java/io/github/jwdeveloper/tiktok/extension/collector/api/settings/CollectorListenerSettings.java +++ b/extension-collector/src/main/java/io/github/jwdeveloper/tiktok/extension/collector/api/settings/CollectorListenerSettings.java @@ -1,3 +1,25 @@ +/* + * 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.extension.collector.api.settings; import io.github.jwdeveloper.tiktok.extension.collector.api.CollectorEvent; diff --git a/extension-collector/src/main/java/io/github/jwdeveloper/tiktok/extension/collector/impl/DataCollectorListener.java b/extension-collector/src/main/java/io/github/jwdeveloper/tiktok/extension/collector/impl/DataCollectorListener.java index 900edcf..12a798a 100644 --- a/extension-collector/src/main/java/io/github/jwdeveloper/tiktok/extension/collector/impl/DataCollectorListener.java +++ b/extension-collector/src/main/java/io/github/jwdeveloper/tiktok/extension/collector/impl/DataCollectorListener.java @@ -1,3 +1,25 @@ +/* + * 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.extension.collector.impl; import io.github.jwdeveloper.tiktok.annotations.TikTokEventObserver; diff --git a/extension-collector/src/main/java/io/github/jwdeveloper/tiktok/extension/collector/impl/storages/FileStorage.java b/extension-collector/src/main/java/io/github/jwdeveloper/tiktok/extension/collector/impl/storages/FileStorage.java index e7e2f8a..6d94824 100644 --- a/extension-collector/src/main/java/io/github/jwdeveloper/tiktok/extension/collector/impl/storages/FileStorage.java +++ b/extension-collector/src/main/java/io/github/jwdeveloper/tiktok/extension/collector/impl/storages/FileStorage.java @@ -1,3 +1,25 @@ +/* + * 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.extension.collector.impl.storages; import io.github.jwdeveloper.tiktok.extension.collector.api.Storage; diff --git a/extension-collector/src/main/java/io/github/jwdeveloper/tiktok/extension/collector/impl/storages/MongoStorage.java b/extension-collector/src/main/java/io/github/jwdeveloper/tiktok/extension/collector/impl/storages/MongoStorage.java index 5fef256..f40fa6b 100644 --- a/extension-collector/src/main/java/io/github/jwdeveloper/tiktok/extension/collector/impl/storages/MongoStorage.java +++ b/extension-collector/src/main/java/io/github/jwdeveloper/tiktok/extension/collector/impl/storages/MongoStorage.java @@ -1,3 +1,25 @@ +/* + * 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.extension.collector.impl.storages; import com.mongodb.ConnectionString;