Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
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.messages.webcast.WebcastLinkMicBattleItemCard;
import lombok.Getter;

@Getter
@EventMeta(eventType = EventType.Message)
public class TikTokLinkMicBattleItemCard extends TikTokHeaderEvent {

public TikTokLinkMicBattleItemCard(WebcastLinkMicBattleItemCard msg) {
super(msg.getCommon());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
package io.github.jwdeveloper.tiktok.data.models.battles;

import io.github.jwdeveloper.tiktok.data.models.users.User;
import io.github.jwdeveloper.tiktok.messages.data.BattleUserInfo;
import io.github.jwdeveloper.tiktok.messages.enums.BattleType;
import io.github.jwdeveloper.tiktok.messages.webcast.WebcastLinkMicBattle;
import lombok.Data;
Expand Down Expand Up @@ -72,12 +73,12 @@ public Team(long teamId, List<User> hosts) {
this.hosts = List.copyOf(hosts);
}

public Team(WebcastLinkMicBattle.BattleUserInfo anchorInfo) {
public Team(BattleUserInfo anchorInfo) {
this.hosts = List.of(new User(anchorInfo.getUser()));
this.teamId = hosts.get(0).getId();
}

public Team(WebcastLinkMicBattle.BattleUserInfo anchorInfo, WebcastLinkMicBattle.BattleComboInfo battleCombo) {
public Team(BattleUserInfo anchorInfo, WebcastLinkMicBattle.BattleComboInfo battleCombo) {
this(anchorInfo);
this.winStreak = (int) battleCombo.getComboCount();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

import io.github.jwdeveloper.tiktok.data.models.Picture;
import io.github.jwdeveloper.tiktok.data.models.badges.Badge;
import io.github.jwdeveloper.tiktok.messages.data.BattleUserArmy;
import io.github.jwdeveloper.tiktok.messages.data.*;
import io.github.jwdeveloper.tiktok.messages.webcast.*;
import lombok.*;

Expand Down Expand Up @@ -140,7 +140,7 @@ public User(long id, String name, String profileId, Picture picture) {
this(id, name, profileId, null, picture, 0, 0, List.of(Badge.empty()));
}

public User(WebcastLinkMicBattle.BattleUserInfo.BattleBaseUserInfo host) {
public User(BattleUserInfo.BattleBaseUserInfo host) {
this(host.getUserId(), host.getDisplayId(), host.getNickName(), Picture.map(host.getAvatarThumb()));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import io.github.jwdeveloper.tiktok.data.requests.LiveConnectionData;
import io.github.jwdeveloper.tiktok.data.requests.LiveData;
import io.github.jwdeveloper.tiktok.data.requests.LiveUserData;
import io.github.jwdeveloper.tiktok.live.LiveRoomInfo;

public interface LiveHttpClient
{
Expand Down Expand Up @@ -64,4 +65,6 @@ default LiveConnectionData.Response fetchLiveConnectionData(String roomId) {
}

LiveConnectionData.Response fetchLiveConnectionData(LiveConnectionData.Request request);

boolean sendChat(LiveRoomInfo roomInfo, String content);
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ public interface LiveClient {
*/
void connect();


/**
* Connects in asynchronous way
* When connected Consumer returns instance of LiveClient
Expand All @@ -48,7 +47,6 @@ public interface LiveClient {
*/
CompletableFuture<LiveClient> connectAsync();


/**
* Disconnects the connection.
* @param type
Expand All @@ -68,7 +66,6 @@ default void disconnect() {
*/
void publishEvent(TikTokEvent event);


/**
* @param webcastMessageName name of TikTok protocol-buffer message
* @param payloadBase64 protocol-buffer message bytes payload
Expand Down Expand Up @@ -96,4 +93,12 @@ default void disconnect() {
* Logger
*/
Logger getLogger();

/**
* Send a chat message to the connected room
* @return true if successful, otherwise false
* @apiNote This is known to return true on some sessionIds despite failing!
* <p>We cannot fix this as it is a TikTok issue, not a library issue.
*/
boolean sendChat(String content);
}
18 changes: 18 additions & 0 deletions API/src/main/proto/data.proto
Original file line number Diff line number Diff line change
Expand Up @@ -2121,6 +2121,24 @@ message PublicAreaMessageCommon {
}
}

message BattleUserInfo {
BattleBaseUserInfo user = 1;
repeated BattleRivalTag tags = 2;

message BattleBaseUserInfo {
int64 user_id = 1;
string nick_name = 2;
Image avatar_thumb = 3;
string display_id = 4;
}

message BattleRivalTag {
Image bg_image = 1;
Image icon_image = 2;
string content = 3;
}
}

message GiftModeMeta {
int64 gift_id = 1;
string gift_name_key = 2;
Expand Down
15 changes: 15 additions & 0 deletions API/src/main/proto/enums.proto
Original file line number Diff line number Diff line change
Expand Up @@ -820,4 +820,19 @@ enum BattleType {
enum BattleInviteType {
BATTLE_INVITE_TYPE_NORMAL = 0;
BATTLE_INVITE_TYPE_AGAIN = 1;
}

enum BattleCardMsgType {
BATTLE_CARD_MSG_TYPE_UNKNOWN_CARD_ACTION = 0;
BATTLE_CARD_MSG_TYPE_CARD_OBTAIN_GUIDE = 1;
BATTLE_CARD_MSG_TYPE_USE_CRITICAL_STRIKE_CARD = 2;
BATTLE_CARD_MSG_TYPE_USE_SMOKE_CARD = 3;
BATTLE_CARD_MSG_TYPE_AWARD_CARD_NOTICE = 4;
BATTLE_CARD_MSG_TYPE_USE_EXTRA_TIME_CARD = 5;
BATTLE_CARD_MSG_TYPE_USE_SPECIAL_EFFECT_CARD = 6;
BATTLE_CARD_MSG_TYPE_USE_POTION_CARD = 7;
BATTLE_CARD_MSG_TYPE_USE_WAVE_CARD = 8;
BATTLE_CARD_MSG_TYPE_SPECIAL_EFFECT_NOTICE = 9;
BATTLE_CARD_MSG_TYPE_USE_TOP_2_CARD = 10;
BATTLE_CARD_MSG_TYPE_USE_TOP_3_CARD = 11;
}
153 changes: 135 additions & 18 deletions API/src/main/proto/webcast.proto
Original file line number Diff line number Diff line change
Expand Up @@ -1219,24 +1219,6 @@ message WebcastLinkMicBattle {
// BattleUserInfo user_info = 2;
// }

message BattleUserInfo {
BattleBaseUserInfo user = 1;
repeated BattleRivalTag tags = 2;

message BattleBaseUserInfo {
int64 user_id = 1;
string nick_name = 2;
Image avatar_thumb = 3;
string display_id = 4;
}

message BattleRivalTag {
Image bg_image = 1;
Image icon_image = 2;
string content = 3;
}
}

message BattleABTestSetting {
int64 uid = 1;
BattleABTestList ab_test_list = 2;
Expand Down Expand Up @@ -1471,4 +1453,139 @@ message RoomVerifyMessage {
string content = 3;
int64 noticeType = 4;
bool closeRoom = 5;
}
message WebcastLinkMicBattleItemCard {
CommonMessageData common = 1;
int64 battle_id = 2;
BattleCardMsgType msg_type = 3;
CardObtainGuide card_obtain_guide = 4;
UseCriticalStrikeCard use_critical_strike_card = 5;
UseSmokeCard use_smoke_card = 6;
AwardCardNotice award_card_notice = 7;
UseExtraTimeCard use_extra_time_card = 8;
UseSpecialEffectCard use_special_effect_card = 9;
UsePotionCard use_potion_card = 10;
UseWaveCard use_wave_card = 11;
SpecialEffectNotice special_effect_notice = 12;
UseTop2Card use_top2_card = 13;
UseTop3Card use_top3_card = 14;

message CardObtainGuide {
int32 not_in_use = 1;
}

message UseCriticalStrikeCard {
CriticalStrikeCardInfo card_info = 1;
int64 anchor_id = 2;
Text display_content = 3;

message CriticalStrikeCardInfo {
string card_name_key = 1;
Image card_image = 2;
int64 send_time_sec = 3;
BattleUserInfo send_user = 4;
int64 effect_last_duration = 5;
int64 critical_strike_rate_low = 6;
int64 critical_strike_rate_high = 7;
int64 multiple = 8;
string gift_name_key = 9;
string rule_url = 10;
int64 effect_time_sec = 11;
int64 to_anchor_id = 12;
string to_anchor_id_str = 13;
}
}

message UseSmokeCard {
CommonCardInfo card_info = 1;
int64 anchor_id = 2;
Text display_content = 3;
}

message AwardCardNotice {
Text display_content = 1;
repeated BattleUserInfo awarded_users = 2;
}

message UseExtraTimeCard {
ExtraTimeCardInfo card_info = 1;
int64 anchor_id = 2;
Text display_content = 3;

message ExtraTimeCardInfo {
string card_name_key = 1;
Image card_image = 2;
int64 send_time_sec = 3;
BattleUserInfo send_user = 4;
int64 effect_last_duration = 5;
string rule_url = 6;
int64 effect_time_sec = 7;
int64 to_anchor_id = 8;
int64 extra_duration_sec = 9;
string to_anchor_id_str = 10;
}
}

message UseSpecialEffectCard {
CommonCardInfo card_info = 1;
int64 anchor_id = 2;
Text display_content = 3;
repeated AnchorPair affected_anchor_pairs = 4;
}

message AnchorPair {
int64 source_anchor_id = 1;
int64 target_anchor_id = 2;
}

message UsePotionCard {
CommonCardInfo card_info = 1;
int64 anchor_id = 2;
Text display_content = 3;
}

message UseWaveCard {
CommonCardInfo card_info = 1;
int64 anchor_id = 2;
Text display_content = 3;
}

message CommonCardInfo {
string card_name_key = 1;
Image card_image = 2;
int64 send_time_sec = 3;
BattleUserInfo send_user = 4;
int64 effect_last_duration = 5;
string rule_url = 6;
int64 effect_time_sec = 7;
int64 to_anchor_id = 8;
string to_anchor_id_str = 9;
}

message SpecialEffectNotice {
int64 score = 1;
int64 from_user_id = 2;
int64 to_anchor_id = 3;
repeated AnchorPair affected_anchor_pairs = 4;
}

message UseTop2Card {
Top2CardInfo card_info = 1;
int64 anchor_id = 2;
Text display_content = 3;

message Top2CardInfo {
CommonCardInfo common = 1;
}
}

message UseTop3Card {
Top3CardInfo card_info = 1;
int64 anchor_id = 2;
Text display_content = 3;

message Top3CardInfo {
CommonCardInfo common = 1;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,11 @@ public void publishMessage(String webcastMessageName, byte[] payload) {
messageHandler.handleSingleMessage(this, message);
}

@Override
public boolean sendChat(String content) {
return httpClient.sendChat(roomInfo, content);
}

public void connectAsync(Consumer<LiveClient> onConnection) {
connectAsync().thenAccept(onConnection);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ public LiveClient build() {

//networking
dependance.registerSingleton(HttpClientFactory.class);
dependance.registerSingleton(WebSocketHeartbeatTask.class);
dependance.registerSingleton(WebSocketHeartbeatTask.class); // True global singleton - Static objects are located to serve as global
if (clientSettings.isOffline()) {
dependance.registerSingleton(LiveSocketClient.class, TikTokWebSocketOfflineClient.class);
dependance.registerSingleton(LiveHttpClient.class, TikTokLiveHttpOfflineClient.class);
Expand Down
Loading