Breaking changes:

'Gift': changed from class to enum, so now you can handle
incoming gifts in switch

`Events`
- new:
     onGiftComboFinished
- Removed:
      onGiftBrodcast
- Rename:
     onGiftMessage -> onGift
     onRoomPinMessage -> onRoomPin
     onRoomMessage -> onRoom
     onLinkMessage -> onLink
     onBarrageMessage -> onBarrage
     onPollMessage -> onPoll
     onShopMessage -> onShop
     onDetectMessage -> onDetect

`GiftManager`
   added:
      registerGift
      findById
      findByName
      getGifts
   removed:
      getActiveGifts
This commit is contained in:
JW
2023-10-05 16:52:05 +02:00
parent f0d7cb0cbc
commit 9f4c1c8c92
26 changed files with 200 additions and 89 deletions

View File

@@ -25,6 +25,8 @@ package io.github.jwdeveloper.tiktok.events;
import io.github.jwdeveloper.tiktok.events.messages.*;
import io.github.jwdeveloper.tiktok.events.messages.gift.TikTokGiftComboFinishedEvent;
import io.github.jwdeveloper.tiktok.events.messages.gift.TikTokGiftEvent;
import io.github.jwdeveloper.tiktok.events.messages.room.TikTokRoomEvent;
import io.github.jwdeveloper.tiktok.events.messages.room.TikTokRoomUserInfoEvent;
import io.github.jwdeveloper.tiktok.events.messages.social.TikTokFollowEvent;
import io.github.jwdeveloper.tiktok.events.messages.social.TikTokJoinEvent;
import io.github.jwdeveloper.tiktok.events.messages.social.TikTokLikeEvent;
@@ -54,6 +56,7 @@ public interface TikTokEventBuilder<T> {
T onGift(TikTokEventConsumer<TikTokGiftEvent> event);
T onQuestion(TikTokEventConsumer<TikTokQuestionEvent> event);
T onSubscribe(TikTokEventConsumer<TikTokSubscribeEvent> event);
@@ -80,7 +83,6 @@ public interface TikTokEventBuilder<T> {
T onDisconnected(TikTokEventConsumer<TikTokDisconnectedEvent> event);
T onError(TikTokEventConsumer<TikTokErrorEvent> event);
T onEvent(TikTokEventConsumer<TikTokEvent> event);
@@ -99,7 +101,7 @@ public interface TikTokEventBuilder<T> {
//T onCaption(TikTokEventConsumer<TikTokCaptionEvent> event);
//T onQuestion(TikTokEventConsumer<TikTokQuestionEvent> event);
//T onRoomPin(TikTokEventConsumer<TikTokRoomPinEvent> event);

View File

@@ -41,6 +41,7 @@ public class TikTokBarrageEvent extends TikTokHeaderEvent {
private final Picture rightIcon;
private final String eventName;
private final int duration;
private BarrageParam barrageParam;
public TikTokBarrageEvent(WebcastBarrageMessage msg) {
@@ -50,15 +51,7 @@ public class TikTokBarrageEvent extends TikTokHeaderEvent {
backGround = Picture.map(msg.getBackground());
rightIcon = Picture.map(msg.getRightIcon());
duration = msg.getDuration();
switch (msg.getMsgType()) {
case GRADEUSERENTRANCENOTIFICATION:
barrageParam = new UserGradeParam(msg.getUserGradeParam());
case FANSLEVELUPGRADE:
barrageParam = new FansLevelParam(msg.getFansLevelParam());
case SUBSCRIBEGIFT:
barrageParam = new SubscribeGiftParam(msg.getSubscribeGiftParam());
default:
barrageParam = new BarrageParam();
}
barrageParam = BarrageParam.map(msg);
}
}

View File

@@ -28,11 +28,15 @@ import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.messages.webcast.WebcastImDeleteMessage;
import lombok.Getter;
import java.util.List;
@Getter
@EventMeta(eventType = EventType.Message)
public class TikTokIMDeleteEvent extends TikTokHeaderEvent {
List<Long> userIds;
public TikTokIMDeleteEvent(WebcastImDeleteMessage msg) {
super(msg.getHeader());
super(msg.getCommon());
this.userIds = msg.getDeleteUserIdsListList();
}
}

View File

@@ -32,7 +32,6 @@ import lombok.Getter;
@EventMeta(eventType = EventType.Message)
public class TikTokLinkMicFanTicketEvent extends TikTokHeaderEvent {
public TikTokLinkMicFanTicketEvent(WebcastLinkMicFanTicketMethod msg) {
super(msg.getCommon());
}

View File

@@ -36,22 +36,15 @@ Triggered every time someone asks a new question via the question feature.
@EventMeta(eventType = EventType.Message)
public class TikTokQuestionEvent extends TikTokHeaderEvent {
private final Long questionId;
private final String text;
private final Long time;
private User user;
private final User user;
public TikTokQuestionEvent(WebcastQuestionNewMessage msg) {
super(msg.getCommon());
var data = msg.getDetails();
questionId = data.getId();
text = data.getText();
time = data.getTimeStamp();
if (data.hasUser()) {
user = new User(data.getUser());
}
user = User.map(data.getUser());
}
}

View File

@@ -42,6 +42,7 @@ public class TikTokShopEvent extends TikTokHeaderEvent {
private final String shopName;
//Not working
public TikTokShopEvent(WebcastOecLiveShoppingMessage msg) {
super(msg.getCommon());
var data = msg.getShopData();

View File

@@ -40,8 +40,6 @@ import lombok.Getter;
public class TikTokGiftEvent extends TikTokHeaderEvent {
private final Gift gift;
private final User user;
private final String purchaseId;
private final String receipt;
private final int combo;
private final boolean comboFinished;
private final int comboIndex;
@@ -49,9 +47,7 @@ public class TikTokGiftEvent extends TikTokHeaderEvent {
public TikTokGiftEvent(Gift gift, WebcastGiftMessage msg) {
super(msg.getCommon());
this.gift = gift;
user = User.map(msg.getUser());
purchaseId = msg.getOrderId();
receipt = msg.getMonitorExtra();
user = User.map(msg.getUser(),msg.getUserIdentity());
combo = msg.getComboCount();
comboFinished = msg.getRepeatEnd() > 0;
comboIndex = msg.getRepeatCount();

View File

@@ -20,7 +20,7 @@
* 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.events.messages;
package io.github.jwdeveloper.tiktok.events.messages.room;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;

View File

@@ -20,11 +20,12 @@
* 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.events.messages;
package io.github.jwdeveloper.tiktok.events.messages.room;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;
import io.github.jwdeveloper.tiktok.events.base.TikTokHeaderEvent;
import io.github.jwdeveloper.tiktok.events.messages.TikTokCommentEvent;
import io.github.jwdeveloper.tiktok.messages.webcast.WebcastRoomPinMessage;
import lombok.Getter;

View File

@@ -20,7 +20,7 @@
* 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.events.messages;
package io.github.jwdeveloper.tiktok.events.messages.room;
import io.github.jwdeveloper.tiktok.annotations.EventMeta;
import io.github.jwdeveloper.tiktok.annotations.EventType;

View File

@@ -30,10 +30,9 @@ import java.util.UUID;
public class Emote {
String emoteId;
Picture picture;
UUID uuid;
public static Emote map(io.github.jwdeveloper.tiktok.messages.data.Emote input) {
return new Emote(input.getEmoteId(), Picture.map(input.getImage()), UUID.fromString(input.getUuid()));
return new Emote(input.getEmoteId(), Picture.map(input.getImage()));
}
}

View File

@@ -25,7 +25,9 @@ package io.github.jwdeveloper.tiktok.events.objects;
import io.github.jwdeveloper.tiktok.events.objects.users.User;
import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.Value;
import java.util.List;
@@ -47,16 +49,14 @@ public class Text {
}
public static TextPiece mapTextPiece(io.github.jwdeveloper.tiktok.messages.data.Text.TextPiece input)
{
return switch (input.getType())
{
public static TextPiece mapTextPiece(io.github.jwdeveloper.tiktok.messages.data.Text.TextPiece input) {
return switch (input.getType()) {
case 11 -> {
var user = User.map(input.getUserValue().getUser());
yield new UserTextPiece(user);
}
//case 12 -> new GiftTextPiece(input.getStringValue());
default -> throw new TikTokLiveException("Unknown text piece");
default -> new StringTextPiece(input.getStringValue());
};
}
@@ -66,8 +66,18 @@ public class Text {
}
@Value
public static class StringTextPiece extends TextPiece {
String text;
public StringTextPiece(String text) {
this.text = text;
}
}
public static class UserTextPiece extends TextPiece {
User user;
public UserTextPiece(User user) {
this.user = user;
}

View File

@@ -22,7 +22,17 @@
*/
package io.github.jwdeveloper.tiktok.events.objects.barrage;
public class BarrageParam
{
import io.github.jwdeveloper.tiktok.messages.webcast.WebcastBarrageMessage;
public class BarrageParam {
//Figure out barrage type:11
public static BarrageParam map(WebcastBarrageMessage msg) {
return switch (msg.getMsgType()) {
case GRADEUSERENTRANCENOTIFICATION -> new UserGradeParam(msg.getUserGradeParam());
case FANSLEVELUPGRADE -> new FansLevelParam(msg.getFansLevelParam());
case SUBSCRIBEGIFT -> new SubscribeGiftParam(msg.getSubscribeGiftParam());
default -> new BarrageParam();
};
}
}

View File

@@ -29,5 +29,5 @@ import io.github.jwdeveloper.tiktok.messages.webcast.WebcastResponse;
public interface TikTokMessageHandler
{
TikTokEvent handle(WebcastResponse.Message message) throws Exception;
TikTokEvent handle(byte[] messagePayload) throws Exception;
}

View File

@@ -244,7 +244,6 @@ message WebcastEnvelopeMessage {
// @EnvelopeInfo
// proto.webcast.im.EnvelopeMessage
// C:\Users\ja\RiderProjects\TikTokProBufferGenerator\Application\output\sources\test.js
message EnvelopeInfo {
string envelopeId = 1;
int64 businessType = 2; // @warning Enum not found, should be BusinessType
@@ -283,8 +282,9 @@ message WebcastGoalUpdateMessage {
// Message related to Chat-moderation?
//@WebcastImDeleteMessage
message WebcastImDeleteMessage {
Common header = 1;
bytes data = 3;
Common common = 1;
repeated int64 deleteMsgIdsList = 2;
repeated int64 deleteUserIdsList = 3;
}
//@WebcastInRoomBannerMessage
@@ -708,4 +708,12 @@ message WebcastLinkLayerMessage {
}
message RoomVerifyMessage {
Common common = 1;
int32 action = 2;
string content = 3;
int64 noticeType = 4;
bool closeRoom = 5;
}

View File

@@ -30,6 +30,9 @@ import io.github.jwdeveloper.tiktok.events.messages.TikTokConnectedEvent;
import io.github.jwdeveloper.tiktok.events.messages.TikTokDisconnectedEvent;
import io.github.jwdeveloper.tiktok.events.messages.gift.TikTokGiftComboFinishedEvent;
import io.github.jwdeveloper.tiktok.events.messages.gift.TikTokGiftEvent;
import io.github.jwdeveloper.tiktok.events.messages.room.TikTokRoomEvent;
import io.github.jwdeveloper.tiktok.events.messages.room.TikTokRoomPinEvent;
import io.github.jwdeveloper.tiktok.events.messages.room.TikTokRoomUserInfoEvent;
import io.github.jwdeveloper.tiktok.events.messages.social.TikTokFollowEvent;
import io.github.jwdeveloper.tiktok.events.messages.social.TikTokJoinEvent;
import io.github.jwdeveloper.tiktok.events.messages.social.TikTokLikeEvent;

View File

@@ -53,7 +53,7 @@ public abstract class TikTokMessageHandler {
public abstract void init();
public void registerMapping(Class<?> clazz, Function<WebcastResponse.Message, TikTokEvent> func) {
public void registerMapping(Class<?> clazz, Function<byte[], TikTokEvent> func) {
handlers.put(clazz.getSimpleName(), func::apply);
}
@@ -72,6 +72,17 @@ public abstract class TikTokMessageHandler {
}
}
}
public void handleSingleMessage(LiveClient client, String type, byte[] bytes) throws Exception {
if (!handlers.containsKey(type)) {
tikTokEventHandler.publish(client, new TikTokWebsocketUnhandledMessageEvent(WebcastResponse.Message.newBuilder().setMethod(type).build()));
return;
}
var handler = handlers.get(type);
var tiktokEvent = handler.handle(bytes);
tikTokEventHandler.publish(client, new TikTokWebsocketMessageEvent(tiktokEvent, WebcastResponse.Message.newBuilder().build()));
tikTokEventHandler.publish(client, tiktokEvent);
}
public void handleSingleMessage(LiveClient client, WebcastResponse.Message message) throws Exception {
@@ -85,15 +96,15 @@ public abstract class TikTokMessageHandler {
return;
}
var handler = handlers.get(methodName);
var tiktokEvent = handler.handle(message);
var tiktokEvent = handler.handle(message.getPayload().toByteArray());
tikTokEventHandler.publish(client, new TikTokWebsocketMessageEvent(tiktokEvent, message));
tikTokEventHandler.publish(client, tiktokEvent);
}
protected TikTokEvent mapMessageToEvent(Class<?> inputClazz, Class<?> outputClass, WebcastResponse.Message message) {
protected TikTokEvent mapMessageToEvent(Class<?> inputClazz, Class<?> outputClass, byte[] payload) {
try {
var parseMethod = inputClazz.getDeclaredMethod("parseFrom", ByteString.class);
var deserialized = parseMethod.invoke(null, message.getPayload());
var parseMethod = inputClazz.getDeclaredMethod("parseFrom", byte[].class);
var deserialized = parseMethod.invoke(null,payload);
var constructors = Arrays.stream(outputClass.getConstructors())
.filter(ea -> Arrays.stream(ea.getParameterTypes())
.toList()

View File

@@ -32,6 +32,9 @@ import io.github.jwdeveloper.tiktok.events.messages.poll.TikTokPollEndEvent;
import io.github.jwdeveloper.tiktok.events.messages.poll.TikTokPollEvent;
import io.github.jwdeveloper.tiktok.events.messages.poll.TikTokPollStartEvent;
import io.github.jwdeveloper.tiktok.events.messages.poll.TikTokPollUpdateEvent;
import io.github.jwdeveloper.tiktok.events.messages.room.TikTokRoomEvent;
import io.github.jwdeveloper.tiktok.events.messages.room.TikTokRoomPinEvent;
import io.github.jwdeveloper.tiktok.events.messages.room.TikTokRoomUserInfoEvent;
import io.github.jwdeveloper.tiktok.events.messages.social.TikTokFollowEvent;
import io.github.jwdeveloper.tiktok.events.messages.social.TikTokJoinEvent;
import io.github.jwdeveloper.tiktok.events.messages.social.TikTokLikeEvent;
@@ -111,8 +114,8 @@ public class TikTokMessageHandlerRegistration extends TikTokMessageHandler {
@SneakyThrows
private TikTokEvent handleWebcastControlMessage(WebcastResponse.Message msg) {
var message = WebcastControlMessage.parseFrom(msg.getPayload());
private TikTokEvent handleWebcastControlMessage(byte[] msg) {
var message = WebcastControlMessage.parseFrom(msg);
return switch (message.getAction()) {
case STREAM_PAUSED -> new TikTokLivePausedEvent();
case STREAM_ENDED -> new TikTokLiveEndedEvent();
@@ -121,8 +124,8 @@ public class TikTokMessageHandlerRegistration extends TikTokMessageHandler {
}
@SneakyThrows
private TikTokEvent handleGift(WebcastResponse.Message msg) {
var giftMessage = WebcastGiftMessage.parseFrom(msg.getPayload());
private TikTokEvent handleGift(byte[] msg) {
var giftMessage = WebcastGiftMessage.parseFrom(msg);
var gift = giftManager.findById((int) giftMessage.getGiftId());
@@ -145,8 +148,8 @@ public class TikTokMessageHandlerRegistration extends TikTokMessageHandler {
}
@SneakyThrows
private TikTokEvent handleSocialMedia(WebcastResponse.Message msg) {
var message = WebcastSocialMessage.parseFrom(msg.getPayload());
private TikTokEvent handleSocialMedia(byte[] msg) {
var message = WebcastSocialMessage.parseFrom(msg);
var socialType = Text.map(message.getCommon().getDisplayText()).getKey();
var matcher = socialMediaPattern.matcher(socialType);
@@ -167,8 +170,8 @@ public class TikTokMessageHandlerRegistration extends TikTokMessageHandler {
}
@SneakyThrows
private TikTokEvent handleMemberMessage(WebcastResponse.Message msg) {
var message = WebcastMemberMessage.parseFrom(msg.getPayload());
private TikTokEvent handleMemberMessage(byte[] msg) {
var message = WebcastMemberMessage.parseFrom(msg);
return switch (message.getAction()) {
case JOINED -> new TikTokJoinEvent(message);
case SUBSCRIBED -> new TikTokSubscribeEvent(message);
@@ -176,21 +179,21 @@ public class TikTokMessageHandlerRegistration extends TikTokMessageHandler {
};
}
private TikTokEvent handleRoomUserSeqMessage(WebcastResponse.Message msg) {
private TikTokEvent handleRoomUserSeqMessage(byte[] msg) {
var event = (TikTokRoomUserInfoEvent) mapMessageToEvent(WebcastRoomUserSeqMessage.class, TikTokRoomUserInfoEvent.class, msg);
roomInfo.setViewersCount(event.getTotalUsers());
return event;
}
private TikTokEvent handleLike(WebcastResponse.Message msg) {
private TikTokEvent handleLike(byte[] msg) {
var event = (TikTokLikeEvent) mapMessageToEvent(WebcastLikeMessage.class, TikTokLikeEvent.class, msg);
roomInfo.setLikesCount(event.getTotalLikes());
return event;
}
@SneakyThrows
private TikTokEvent handlePinMessage(WebcastResponse.Message msg) {
var pinMessage = WebcastRoomPinMessage.parseFrom(msg.getPayload());
private TikTokEvent handlePinMessage(byte[] msg) {
var pinMessage = WebcastRoomPinMessage.parseFrom(msg);
var chatMessage = WebcastChatMessage.parseFrom(pinMessage.getPinnedMessage());
var chatEvent = new TikTokCommentEvent(chatMessage);
return new TikTokRoomPinEvent(pinMessage, chatEvent);
@@ -198,8 +201,8 @@ public class TikTokMessageHandlerRegistration extends TikTokMessageHandler {
//TODO check
@SneakyThrows
private TikTokEvent handlePollEvent(WebcastResponse.Message msg) {
var poolMessage = WebcastPollMessage.parseFrom(msg.getPayload());
private TikTokEvent handlePollEvent(byte[] msg) {
var poolMessage = WebcastPollMessage.parseFrom(msg);
return switch (poolMessage.getMessageType()) {
case 0 -> new TikTokPollStartEvent(poolMessage);
case 1 -> new TikTokPollEndEvent(poolMessage);

View File

@@ -88,11 +88,16 @@ public class TikTokWebSocketListener extends WebSocketClient {
@Override
public void onClose(int i, String s, boolean b) {
System.out.println("CLOSE "+i+" "+s+" "+b);
tikTokEventHandler.publish(tikTokLiveClient,new TikTokDisconnectedEvent());
}
@Override
public void onError(Exception error) {
public void onError(Exception error)
{
System.out.println("ERROR");
error.printStackTrace();
tikTokEventHandler.publish(tikTokLiveClient,new TikTokErrorEvent(error));
if(isNotClosing())
{
@@ -106,6 +111,7 @@ public class TikTokWebSocketListener extends WebSocketClient {
return;
}
var websocketMessage = websocketMessageOptional.get();
System.out.println("ACK ID "+websocketMessage.getLogId()+" ID "+websocketMessage.getSeqId());
sendAckId(websocketMessage.getLogId());
var webResponse = getWebResponseMessage(websocketMessage.getPayload());
@@ -147,7 +153,8 @@ public class TikTokWebSocketListener extends WebSocketClient {
.build();
if(isNotClosing())
{
send(serverInfo.toByteString().toByteArray());
System.out.println("SEND ICK ID "+id);
send(serverInfo.toByteArray());
}
}

View File

@@ -36,6 +36,7 @@ public class TikTokWebSocketPingingTask
public void run(WebSocket webSocket)
{
stop();
var thread = new Thread(() ->
{
pingTask(webSocket);
@@ -66,7 +67,9 @@ public class TikTokWebSocketPingingTask
Thread.sleep(100);
continue;
}
System.out.println("PING!");
webSocket.sendPing();
var timeout = random.nextInt(MAX_TIMEOUT)+MIN_TIMEOUT;
Thread.sleep(timeout);
}

View File

@@ -26,6 +26,7 @@ import io.github.jwdeveloper.tiktok.events.messages.*;
import io.github.jwdeveloper.tiktok.events.messages.TikTokConnectedEvent;
import io.github.jwdeveloper.tiktok.events.messages.TikTokDisconnectedEvent;
import io.github.jwdeveloper.tiktok.events.messages.gift.TikTokGiftEvent;
import io.github.jwdeveloper.tiktok.events.messages.room.TikTokRoomUserInfoEvent;
import io.github.jwdeveloper.tiktok.events.messages.social.TikTokFollowEvent;
import io.github.jwdeveloper.tiktok.events.messages.social.TikTokJoinEvent;
import io.github.jwdeveloper.tiktok.events.messages.social.TikTokLikeEvent;
@@ -38,7 +39,7 @@ import java.time.Duration;
public class Main {
public static String TEST_TIKTOK_USER = "szwagierkaqueen";
public static String TEST_TIKTOK_USER = "ano_liwia";
public static void main(String[] args) throws IOException
{
@@ -57,7 +58,7 @@ public class Main {
})
.onConnected(Main::onConnected)
.onDisconnected(Main::onDisconnected)
.onRoomUserInfo(Main::onViewerData)
.onRoomUserInfo(Main::onRoomUserInfo)
.onJoin(Main::onJoin)
.onComment(Main::onComment)
.onFollow(Main::onFollow)
@@ -81,7 +82,7 @@ public class Main {
private static void onGift(LiveClient tikTokLive, TikTokGiftEvent e)
{
switch (e.getGift()) {
case ROSE -> print( "\uD83D\uDC95",ConsoleColors.YELLOW,"x", e.getCombo(), " roses!", "\uD83D\uDC95");
case ROSE -> print( ConsoleColors.YELLOW,"x", e.getCombo(), " roses!", "\uD83D\uDC95");
default -> print(ConsoleColors.YELLOW,"Thanks for gift: ", e.getGift().getName(),"X",e.getCombo());
}
if(e.getGift().hasDiamondCostRange(1000,10000))
@@ -93,7 +94,7 @@ public class Main {
private static void onDisconnected(LiveClient tikTokLive, TikTokDisconnectedEvent e) {
print(ConsoleColors.GREEN, "[Disconnected]");
}
private static void onViewerData(LiveClient tikTokLive, TikTokRoomUserInfoEvent e) {
private static void onRoomUserInfo(LiveClient tikTokLive, TikTokRoomUserInfoEvent e) {
print("Viewer count is:", e.getTotalUsers());
}

View File

@@ -63,7 +63,7 @@ public class RunCollector {
// users.add("mia_tattoo");
// users.add("mr_wavecheck");
users.add("bangbetmenygy");
users.add("szwagierkaqueen");
// users.add("szwagierkaqueen");
for (var user : users) {
try {
runTikTokLiveInstance(user, db);

View File

@@ -22,16 +22,61 @@
*/
package io.github.jwdeveloper.tiktok.tools.tester;
import com.google.gson.JsonParser;
import com.google.protobuf.InvalidProtocolBufferException;
import io.github.jwdeveloper.tiktok.messages.webcast.WebcastLinkMicFanTicketMethod;
import io.github.jwdeveloper.tiktok.mockClient.TikTokClientMock;
public class RunLogTester
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.*;
public class RunLogTester {
public static void main(String[] args) throws IOException {
var input ="CjwKHVdlYmNhc3RMaW5rTWljRmFuVGlja2V0TWV0aG9kEIWWp7ig2O6OZRiGlviyrNjpjmUgza2G4a8xMAESZwoNCIWIouKYhLqBYhCbARCbASpTaHR0cHM6Ly9wMTYtd2ViY2FzdC50aWt0b2tjZG4uY29tL2ltZy93ZWJjYXN0LXNnL3Rpa3Rva19saW5rbWljX2NvaW5AM3gucG5nfjB4MC5wbmc=";
var bytes = Base64.getDecoder().decode(input);
var a= WebcastLinkMicFanTicketMethod.parseFrom(bytes);
var messages = getMessages();
var client = TikTokClientMock.create().build();
for(var msg : messages.entrySet())
{
public static void main(String[] args)
for(var content : msg.getValue())
{
var mockClient = TikTokClientMock.create("123").buildAndRun();
client.publishMessage(msg.getKey(),content);
}
}
client.connect();
}
private static Map<String, List<String>> getMessages() throws IOException {
var path = "C:\\Users\\ja\\IdeaProjects\\TikTokLiveJava\\Tools-EventsCollector\\src\\main\\resources\\log.json";
var jsonElement = JsonParser.parseReader(new FileReader(path, Charset.defaultCharset()));
var res = new HashMap<String, List<String>>();
if (jsonElement.isJsonObject()) {
var jsonObject = jsonElement.getAsJsonObject();
var keys = jsonObject.keySet();
for (String key : keys) {
var messages = jsonObject.get(key).getAsJsonArray();
for (var msg : messages) {
var data = msg.getAsJsonObject().get("eventData").getAsString();
// System.out.println("KEY: " + key + " DATA: " + data);
res.computeIfAbsent(key, s -> new ArrayList<>()).add(data);
}
}
}
return res;
}
}

View File

@@ -56,6 +56,13 @@ public class LiveClientMock extends TikTokLiveClient {
this.websocketClientMock = webSocketClient;
}
public void publishMessage(String type, String base64) {
websocketClientMock.addMessage(type, base64);
}
public void publishMessage(Class<?> clazz, String base64) {
websocketClientMock.addMessage(clazz.getSimpleName(), base64);
}
public void publishResponse(String value) {
websocketClientMock.addResponse(value);

View File

@@ -22,12 +22,13 @@
*/
package io.github.jwdeveloper.tiktok.mockClient.mocks;
import io.github.jwdeveloper.tiktok.TikTokLiveClientBuilder;
import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveException;
import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveMessageException;
import io.github.jwdeveloper.tiktok.handlers.TikTokMessageHandler;
import io.github.jwdeveloper.tiktok.live.LiveClient;
import io.github.jwdeveloper.tiktok.messages.webcast.WebcastResponse;
import io.github.jwdeveloper.tiktok.websocket.SocketClient;
import lombok.Value;
import java.util.Base64;
import java.util.Stack;
@@ -37,16 +38,30 @@ import java.util.logging.Logger;
public class WebsocketClientMock implements SocketClient {
Logger logger;
Stack<WebcastResponse> responses;
Stack<MsgStruct> messages;
TikTokMessageHandler messageHandler;
private boolean isRunning;
@Value
public static class MsgStruct {
String messageType;
byte[] messageValue;
}
public WebsocketClientMock(Logger logger, Stack<WebcastResponse> responses, TikTokMessageHandler messageHandler) {
this.logger = logger;
this.responses = responses;
this.messageHandler = messageHandler;
messages = new Stack<>();
}
public WebsocketClientMock addMessage(String type, String value) {
var bytes = Base64.getDecoder().decode(value);
messages.push(new MsgStruct(type, bytes));
return this;
}
public WebsocketClientMock addResponse(String value) {
var bytes = Base64.getDecoder().decode(value);
@@ -72,12 +87,8 @@ public class WebsocketClientMock implements SocketClient {
public void start(WebcastResponse webcastResponse, LiveClient tikTokLiveClient) {
logger.info("Running message: " + responses.size());
isRunning = true;
while (isRunning) {
do {
if(responses.isEmpty())
{
break;
}
while (!responses.isEmpty() || !messages.isEmpty()) {
if (!responses.isEmpty()) {
var response = responses.pop();
for (var message : response.getMessagesList()) {
try {
@@ -88,11 +99,15 @@ public class WebsocketClientMock implements SocketClient {
}
}
}
while (!responses.isEmpty());
if (!messages.isEmpty()) {
var messageStr = messages.pop();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
throw new RuntimeException(e);
System.out.println("TYPE: " + messageStr.getMessageType());
messageHandler.handleSingleMessage(tikTokLiveClient, messageStr.getMessageType(), messageStr.getMessageValue());
} catch (Exception e) {
logger.info("Unable to parse message for response " + messageStr.getMessageType());
throw new TikTokLiveException(e);
}
}
}