diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokLinkMicBattleEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokLinkMicBattleEvent.java index f11838b..1b55357 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokLinkMicBattleEvent.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokLinkMicBattleEvent.java @@ -27,7 +27,7 @@ import io.github.jwdeveloper.tiktok.data.events.common.TikTokHeaderEvent; import io.github.jwdeveloper.tiktok.data.models.battles.*; import io.github.jwdeveloper.tiktok.messages.enums.LinkMicBattleStatus; import io.github.jwdeveloper.tiktok.messages.webcast.WebcastLinkMicBattle; -import lombok.*; +import lombok.Getter; import java.util.*; @@ -43,8 +43,6 @@ public class TikTokLinkMicBattleEvent extends TikTokHeaderEvent true if battle is finished otherwise false */ private final boolean finished; - @Getter(AccessLevel.NONE) - private final boolean oneVsOne; private final List teams; public TikTokLinkMicBattleEvent(WebcastLinkMicBattle msg) { @@ -55,16 +53,14 @@ public class TikTokLinkMicBattleEvent extends TikTokHeaderEvent if (msg.getHostTeamCount() == 2) { // 1v1 battle teams.add(new Team1v1(msg.getHostTeam(0), msg)); teams.add(new Team1v1(msg.getHostTeam(1), msg)); - oneVsOne = true; } else { // 2v2 battle if (isFinished()) { - teams.add(new Team2v2(msg.getHostData2V2List().stream().filter(data -> data.getTeamNumber() == 1).findFirst().orElseThrow(), msg)); - teams.add(new Team2v2(msg.getHostData2V2List().stream().filter(data -> data.getTeamNumber() == 2).findFirst().orElseThrow(), msg)); + teams.add(new Team2v2(msg.getHostData2V2List().stream().filter(data -> data.getTeamNumber() == 1).findFirst().orElse(null), msg)); + teams.add(new Team2v2(msg.getHostData2V2List().stream().filter(data -> data.getTeamNumber() == 2).findFirst().orElse(null), msg)); } else { teams.add(new Team2v2(msg.getHostTeam(0), msg.getHostTeam(1), msg)); teams.add(new Team2v2(msg.getHostTeam(2), msg.getHostTeam(3), msg)); } - oneVsOne = false; } // Info: @@ -72,12 +68,4 @@ public class TikTokLinkMicBattleEvent extends TikTokHeaderEvent // - msg.getDetailsCount() & msg.getViewerTeamCount() always is 2 only when battle is finished // - msg.getHostTeamCount() always is 2 for 1v1 or 4 for 2v2 } - - public boolean is1v1() { - return oneVsOne; - } - - public boolean is2v2() { - return !oneVsOne; - } } \ No newline at end of file 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..6217fe9 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 @@ -2,7 +2,9 @@ package io.github.jwdeveloper.tiktok.data.models.gifts; import com.google.gson.JsonObject; import io.github.jwdeveloper.tiktok.data.models.Picture; -import lombok.Data; +import lombok.*; + +import java.util.*; @Data public class Gift { @@ -14,7 +16,7 @@ public class Gift { private final int diamondCost; - private Picture picture; + private final Picture picture; private final JsonObject properties; 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 02f81df..204e9cb 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLive.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLive.java @@ -91,6 +91,7 @@ public class TikTokLive { return new TikTokLiveHttpClient(); } + //I don't like it, but it is reasonable for now private static GiftsManager giftsManager; @@ -107,4 +108,6 @@ public class TikTokLive { } return giftsManager; } + + } \ No newline at end of file diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java index dc60991..d23aad5 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java @@ -207,15 +207,9 @@ public class TikTokLiveClientBuilder implements LiveClientBuilder { //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.webcastObjectToConstructor(WebcastLinkMicMethod.class, TikTokLinkMicMethodEvent.class); + // mapper.webcastObjectToConstructor(WebcastLinkMicBattle.class, TikTokLinkMicBattleEvent.class); + // mapper.webcastObjectToConstructor(WebcastLinkMicArmies.class, TikTokLinkMicArmiesEvent.class); + // mapper.webcastObjectToConstructor(WebcastLinkMicMethod.class, TikTokLinkMicMethodEvent.class); // mapper.webcastObjectToConstructor(WebcastLinkMicFanTicketMethod.class, TikTokLinkMicFanTicketEvent.class); //Rank events 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 60e3b76..763b710 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,9 +1,13 @@ package io.github.jwdeveloper.tiktok.gifts; import io.github.jwdeveloper.tiktok.data.models.gifts.Gift; +import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException; import io.github.jwdeveloper.tiktok.live.GiftsManager; -import java.util.*; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -28,7 +32,11 @@ public class TikTokGiftsManager implements GiftsManager { } public Gift getById(int giftId) { - return giftsByIdIndex.getOrDefault(giftId, Gift.UNDEFINED); + if (!giftsByIdIndex.containsKey(giftId)) { + return Gift.UNDEFINED; + } + + return giftsByIdIndex.get(giftId); } public Gift getByFilter(Predicate filter) { @@ -36,7 +44,7 @@ public class TikTokGiftsManager implements GiftsManager { .stream() .filter(filter) .findFirst() - .orElse(Gift.UNDEFINED); + .orElseGet(() -> Gift.UNDEFINED); } @Override @@ -54,4 +62,4 @@ public class TikTokGiftsManager implements GiftsManager { public Map toMap() { return Collections.unmodifiableMap(giftsByIdIndex); } -} \ No newline at end of file +} diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/handlers/TikTokGiftEventHandler.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/handlers/TikTokGiftEventHandler.java index 0cda6ab..0547994 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/handlers/TikTokGiftEventHandler.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/mappers/handlers/TikTokGiftEventHandler.java @@ -27,11 +27,13 @@ import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent; import io.github.jwdeveloper.tiktok.data.events.gift.*; import io.github.jwdeveloper.tiktok.data.models.Picture; import io.github.jwdeveloper.tiktok.data.models.gifts.*; +import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException; import io.github.jwdeveloper.tiktok.live.GiftsManager; import io.github.jwdeveloper.tiktok.mappers.TikTokMapperHelper; import io.github.jwdeveloper.tiktok.mappers.data.MappingResult; import io.github.jwdeveloper.tiktok.messages.webcast.WebcastGiftMessage; import lombok.SneakyThrows; +import sun.misc.Unsafe; import java.util.*; @@ -122,8 +124,36 @@ public class TikTokGiftEventHandler { } if (gift.getPicture().getLink().endsWith(".webp")) - gift.setPicture(Picture.map(giftMessage.getGift().getImage())); + { + updatePicture(gift, giftMessage); + } return gift; } + + // TODO-kohlerpop1: I do not think this method is needed for any reason? + // TODO response: + + /** + * Some generated gifts in JSON file contains .webp image format, + * that's bad since java by the defult is not supporing .webp and when URL is + * converted to Java.io.Image then image is null + * + * However, TikTok in GiftWebcast event always has image in .jpg format, + * so I take advantage of it and swap .webp url with .jpg url + * + */ + + private void updatePicture(Gift gift, WebcastGiftMessage webcastGiftMessage) { + try { + var picture = Picture.map(webcastGiftMessage.getGift().getImage()); + var constructor = Unsafe.class.getDeclaredConstructors()[0]; + constructor.setAccessible(true); + var field = Gift.class.getDeclaredField("picture"); + field.setAccessible(true); + field.set(gift, picture); + } catch (Exception e) { + throw new TikTokLiveException("Unable to update picture in gift: " + gift.toString()); + } + } } \ No newline at end of file