diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokLinkMicArmiesEvent.java b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokLinkMicArmiesEvent.java index fdd19f1..0a68ec9 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokLinkMicArmiesEvent.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/events/TikTokLinkMicArmiesEvent.java @@ -27,6 +27,7 @@ import io.github.jwdeveloper.tiktok.annotations.EventType; import io.github.jwdeveloper.tiktok.data.events.common.TikTokHeaderEvent; import io.github.jwdeveloper.tiktok.data.models.LinkMicArmy; import io.github.jwdeveloper.tiktok.data.models.Picture; +import io.github.jwdeveloper.tiktok.messages.enums.LinkMicBattleStatus; import io.github.jwdeveloper.tiktok.messages.webcast.WebcastLinkMicArmies; import lombok.Getter; @@ -39,8 +40,10 @@ import java.util.List; @EventMeta(eventType = EventType.Message) public class TikTokLinkMicArmiesEvent extends TikTokHeaderEvent { private final Long battleId; - - private final Integer battleStatus; + /** + true if battle is finished otherwise false + */ + private final boolean finished; private final Picture picture; @@ -51,14 +54,6 @@ public class TikTokLinkMicArmiesEvent extends TikTokHeaderEvent { battleId = msg.getId(); armies = msg.getBattleItemsList().stream().map(LinkMicArmy::new).toList(); picture = Picture.map(msg.getImage()); - battleStatus = msg.getBattleStatus(); - } - - /** - battleStatus of 1 is Ongoing battle & 2 is Finished Battle - @return true if battle is finished otherwise false - */ - public boolean isFinished() { - return battleStatus == 2; + finished = msg.getBattleStatus() == LinkMicBattleStatus.ARMY_FINISHED; } } \ No newline at end of file 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 c8fdd2d..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 @@ -24,8 +24,8 @@ package io.github.jwdeveloper.tiktok.data.events; import io.github.jwdeveloper.tiktok.annotations.*; import io.github.jwdeveloper.tiktok.data.events.common.TikTokHeaderEvent; -import io.github.jwdeveloper.tiktok.data.models.Picture; -import io.github.jwdeveloper.tiktok.data.models.users.User; +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.Getter; @@ -36,15 +36,19 @@ import java.util.*; */ @Getter @EventMeta(eventType = EventType.Message) -public class TikTokLinkMicBattleEvent extends TikTokHeaderEvent { +public class TikTokLinkMicBattleEvent extends TikTokHeaderEvent +{ private final Long battleId; - private final Integer battleStatus; + /** + true if battle is finished otherwise false + */ + private final boolean finished; private final List teams; public TikTokLinkMicBattleEvent(WebcastLinkMicBattle msg) { super(msg.getCommon()); battleId = msg.getId(); - battleStatus = msg.getBattleStatus(); + finished = msg.getBattleStatus() == LinkMicBattleStatus.BATTLE_FINISHED; teams = new ArrayList<>(); if (msg.getHostTeamCount() == 2) { // 1v1 battle teams.add(new Team1v1(msg.getHostTeam(0), msg)); @@ -64,111 +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 } - - /** - battleStatus of 4 is Ongoing battle & 5 is Finished Battle - @return true if battle is finished otherwise false - */ - public boolean isFinished() { - return battleStatus == 5; - } - - public abstract static class Team { - /** - * Provides a check for verifying if this team represents a 1v1 Team. - * @return true if this team is of type {@link Team1v1}, false otherwise. - */ - public boolean is1v1Team() { - return this instanceof Team1v1; - } - - /** - * Provides a check for verifying if this team represents a 1v1 Team. - * @return true if this team is of type {@link Team1v1}, false otherwise. - */ - public boolean is2v2Team() { - return this instanceof Team2v2; - } - - /** - * Convenience method to get this team as a {@link Team1v1}. If this team is of some - * other type, an {@link IllegalStateException} will result. Hence it is best to use this method - * after ensuring that this element is of the desired type by calling {@link #is1v1Team()} first. - * - * @return this team as a {@link Team1v1}. - * @throws IllegalStateException if this team is of another type. - */ - public Team1v1 getAs1v1Team() { - if (is1v1Team()) - return (Team1v1) this; - throw new IllegalStateException("Not a 1v1Team: " + this); - } - - /** - * Convenience method to get this team as a {@link Team2v2}. If this team is of some - * other type, an {@link IllegalStateException} will result. Hence it is best to use this method - * after ensuring that this element is of the desired type by calling {@link #is2v2Team()} first. - * - * @return this team as a {@link Team2v2}. - * @throws IllegalStateException if this team is of another type. - */ - public Team2v2 getAs2v2Team() { - if (is2v2Team()) - return (Team2v2) this; - throw new IllegalStateException("Not a 2v2Team: " + this); - } - } - - @Getter - public static class Team1v1 extends Team { - /** Value >= 0 when finished otherwise -1 */ - private final int totalPoints; - private final int winStreak; - private final User host; - private final List viewers; - - public Team1v1(WebcastLinkMicBattle.LinkMicBattleHost hostTeam, WebcastLinkMicBattle msg) { - long hostId = hostTeam.getId(); - this.winStreak = msg.getTeamDataList().stream().filter(data -> data.getTeamId() == hostId).map(data -> data.getData().getWinStreak()).findFirst().orElse(-1); - this.totalPoints = msg.getDetailsList().stream().filter(dets -> dets.getId() == hostId).map(dets -> dets.getSummary().getPoints()).findFirst().orElse(-1); - this.host = new User(hostTeam.getHostGroup(0).getHost(0)); - this.viewers = msg.getViewerTeamList().stream().filter(team -> team.getId() == hostId).findFirst().map(topViewers -> - topViewers.getViewerGroup(0).getViewerList().stream().map(Viewer::new).toList()).orElseGet(ArrayList::new); - } - } - - @Getter - public static class Team2v2 extends Team { - /** Value >= 0 when finished otherwise -1 */ - private final int totalPoints; - - private final List hosts; - private final List viewers; - - public Team2v2(WebcastLinkMicBattle.LinkMicBattleHost hostTeam1, WebcastLinkMicBattle.LinkMicBattleHost hostTeam2, WebcastLinkMicBattle msg) { - this.totalPoints = -1; - this.hosts = List.of(new User(hostTeam1.getHostGroup(0).getHost(0)), new User(hostTeam2.getHostGroup(0).getHost(0))); - this.viewers = new ArrayList<>(); - } - - public Team2v2(WebcastLinkMicBattle.Host2v2Data hd, WebcastLinkMicBattle msg) { - this.totalPoints = hd.getTotalPoints(); - var host = new User(msg.getHostTeamList().stream().filter(data -> data.getId() == hd.getHostdata(0).getHostId()).findFirst().orElseThrow().getHostGroup(0).getHost(0)); - var cohost = new User(msg.getHostTeamList().stream().filter(data -> data.getId() == hd.getHostdata(1).getHostId()).findFirst().orElseThrow().getHostGroup(0).getHost(0)); - this.hosts = List.of(host, cohost); - this.viewers = msg.getViewerTeamList().stream().filter(team -> team.getId() == host.getId() || team.getId() == cohost.getId()).findFirst().map(topViewers -> - topViewers.getViewerGroup(0).getViewerList().stream().map(Viewer::new).toList()).orElseGet(ArrayList::new); - } - } - - @Getter - public static class Viewer { - private final User user; - private final int points; - - public Viewer(WebcastLinkMicBattle.LinkMicBattleTopViewers.TopViewerGroup.TopViewer topViewer) { - this.user = new User(topViewer.getId(), null, topViewer.getProfileId(), Picture.map(topViewer.getImages(0))); - this.points = topViewer.getPoints(); - } - } } \ No newline at end of file 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 new file mode 100644 index 0000000..5b4e773 --- /dev/null +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/battles/Team.java @@ -0,0 +1,47 @@ +package io.github.jwdeveloper.tiktok.data.models.battles; + +public abstract class Team { + /** + * Provides a check for verifying if this team represents a 1v1 Team. + * @return true if this team is of type {@link Team1v1}, false otherwise. + */ + public boolean is1v1Team() { + return this instanceof Team1v1; + } + + /** + * Provides a check for verifying if this team represents a 1v1 Team. + * @return true if this team is of type {@link Team1v1}, false otherwise. + */ + public boolean is2v2Team() { + return this instanceof Team2v2; + } + + /** + * Convenience method to get this team as a {@link Team1v1}. If this team is of some + * other type, an {@link IllegalStateException} will result. Hence it is best to use this method + * after ensuring that this element is of the desired type by calling {@link #is1v1Team()} first. + * + * @return this team as a {@link Team1v1}. + * @throws IllegalStateException if this team is of another type. + */ + public Team1v1 getAs1v1Team() { + if (is1v1Team()) + return (Team1v1) this; + throw new IllegalStateException("Not a 1v1Team: " + this); + } + + /** + * Convenience method to get this team as a {@link Team2v2}. If this team is of some + * other type, an {@link IllegalStateException} will result. Hence it is best to use this method + * after ensuring that this element is of the desired type by calling {@link #is2v2Team()} first. + * + * @return this team as a {@link Team2v2}. + * @throws IllegalStateException if this team is of another type. + */ + public Team2v2 getAs2v2Team() { + if (is2v2Team()) + return (Team2v2) this; + throw new IllegalStateException("Not a 2v2Team: " + this); + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..647ab55 --- /dev/null +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/battles/Team1v1.java @@ -0,0 +1,26 @@ +package io.github.jwdeveloper.tiktok.data.models.battles; + +import io.github.jwdeveloper.tiktok.data.models.users.User; +import io.github.jwdeveloper.tiktok.messages.webcast.WebcastLinkMicBattle; +import lombok.Getter; + +import java.util.*; + +@Getter +public class Team1v1 extends Team +{ + /** Value >= 0 when finished otherwise -1 */ + private final int totalPoints; + private final int winStreak; + private final User host; + private final List viewers; + + public Team1v1(WebcastLinkMicBattle.LinkMicBattleHost hostTeam, WebcastLinkMicBattle msg) { + long hostId = hostTeam.getId(); + this.winStreak = msg.getTeamDataList().stream().filter(data -> data.getTeamId() == hostId).map(data -> data.getData().getWinStreak()).findFirst().orElse(-1); + this.totalPoints = msg.getDetailsList().stream().filter(dets -> dets.getId() == hostId).map(dets -> dets.getSummary().getPoints()).findFirst().orElse(-1); + this.host = new User(hostTeam.getHostGroup(0).getHost(0)); + this.viewers = msg.getViewerTeamList().stream().filter(team -> team.getId() == hostId).findFirst().map(topViewers -> + topViewers.getViewerGroup(0).getViewerList().stream().map(Viewer::new).toList()).orElseGet(ArrayList::new); + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..374f579 --- /dev/null +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/battles/Team2v2.java @@ -0,0 +1,31 @@ +package io.github.jwdeveloper.tiktok.data.models.battles; + +import io.github.jwdeveloper.tiktok.data.models.users.User; +import io.github.jwdeveloper.tiktok.messages.webcast.WebcastLinkMicBattle; +import lombok.Getter; + +import java.util.*; + +@Getter +public class Team2v2 extends Team { + /** Value >= 0 when finished otherwise -1 */ + private final int totalPoints; + + private final List hosts; + private final List viewers; + + public Team2v2(WebcastLinkMicBattle.LinkMicBattleHost hostTeam1, WebcastLinkMicBattle.LinkMicBattleHost hostTeam2, WebcastLinkMicBattle msg) { + this.totalPoints = -1; + this.hosts = List.of(new User(hostTeam1.getHostGroup(0).getHost(0)), new User(hostTeam2.getHostGroup(0).getHost(0))); + this.viewers = new ArrayList<>(); + } + + public Team2v2(WebcastLinkMicBattle.Host2v2Data hd, WebcastLinkMicBattle msg) { + this.totalPoints = hd.getTotalPoints(); + var host = new User(msg.getHostTeamList().stream().filter(data -> data.getId() == hd.getHostdata(0).getHostId()).findFirst().orElseThrow().getHostGroup(0).getHost(0)); + var cohost = new User(msg.getHostTeamList().stream().filter(data -> data.getId() == hd.getHostdata(1).getHostId()).findFirst().orElseThrow().getHostGroup(0).getHost(0)); + this.hosts = List.of(host, cohost); + this.viewers = msg.getViewerTeamList().stream().filter(team -> team.getId() == host.getId() || team.getId() == cohost.getId()).findFirst().map(topViewers -> + topViewers.getViewerGroup(0).getViewerList().stream().map(Viewer::new).toList()).orElseGet(ArrayList::new); + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..bf4b385 --- /dev/null +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/data/models/battles/Viewer.java @@ -0,0 +1,17 @@ +package io.github.jwdeveloper.tiktok.data.models.battles; + +import io.github.jwdeveloper.tiktok.data.models.Picture; +import io.github.jwdeveloper.tiktok.data.models.users.User; +import io.github.jwdeveloper.tiktok.messages.webcast.WebcastLinkMicBattle; +import lombok.Getter; + +@Getter +public class Viewer { + private final User user; + private final int points; + + public Viewer(WebcastLinkMicBattle.LinkMicBattleTopViewers.TopViewerGroup.TopViewer topViewer) { + this.user = new User(topViewer.getId(), null, topViewer.getProfileId(), Picture.map(topViewer.getImages(0))); + this.points = topViewer.getPoints(); + } +} \ No newline at end of file diff --git a/API/src/main/proto/enums.proto b/API/src/main/proto/enums.proto index 8e132d0..4512837 100644 --- a/API/src/main/proto/enums.proto +++ b/API/src/main/proto/enums.proto @@ -35,6 +35,14 @@ enum LinkmicApplierSortSetting { LINKMIC_APPLIER_SORT_SETTING_BY_GIFT_SCORE = 1; } +enum LinkMicBattleStatus { + BATTLE_ARMY_UNKNOWN = 0; + ARMY_ONGOING = 1; + ARMY_FINISHED = 2; + BATTLE_ONGOING = 4; + BATTLE_FINISHED = 5; +} + enum HashtagNamespace { GLOBAL = 0; GAMING = 1; diff --git a/API/src/main/proto/webcast.proto b/API/src/main/proto/webcast.proto index 9b4ed79..4e97f26 100644 --- a/API/src/main/proto/webcast.proto +++ b/API/src/main/proto/webcast.proto @@ -521,7 +521,7 @@ message WebcastLinkMicArmies { uint64 id2 = 4; uint64 timeStamp1 = 5; uint64 timeStamp2 = 6; - int32 battleStatus = 7; // SHOULD BE AN ENUM + LinkMicBattleStatus battleStatus = 7; uint64 data1 = 8; uint64 data2 = 9; uint32 data3 = 10; @@ -574,7 +574,7 @@ message WebcastLinkMicBattle { Common common = 1; uint64 id = 2; LinkMicBattleConfig battleConfig = 3; - int32 battleStatus = 4; // SHOULD BE AN ENUM + LinkMicBattleStatus battleStatus = 4; repeated LinkMicBattleDetails details = 5; repeated LinkMicBattleTopViewers viewerTeam = 9; repeated LinkMicBattleHost hostTeam = 10;