Skip to content

Commit 3832db1

Browse files
committed
Changes:
onCustomEvent() <- registering custom events onMapping() <- custom mappings check out 'CustomMappingExample' more gifs has been added exceptions are more explicit
1 parent 46d5f15 commit 3832db1

File tree

28 files changed

+840
-411
lines changed

28 files changed

+840
-411
lines changed

API/src/main/java/io/github/jwdeveloper/tiktok/exceptions/TikTokMessageMappingException.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,20 @@
2626
/**
2727
* Happens when incoming data from TikTok can not be mapped to TikTokEvent's
2828
*/
29-
public class TikTokMessageMappingException extends TikTokLiveException
30-
{
31-
public TikTokMessageMappingException(Class<?> inputClazz, Class<?> outputClass, Throwable throwable)
32-
{
33-
super("Unable to handle mapping from class: " + inputClazz.getSimpleName() + " to class " + outputClass.getSimpleName(),throwable);
29+
public class TikTokMessageMappingException extends TikTokLiveException {
30+
public TikTokMessageMappingException(Class<?> inputClazz, Class<?> outputClass, Throwable throwable) {
31+
super("Unable to handle mapping from class: " + inputClazz.getSimpleName() + " to class " + outputClass.getSimpleName(), throwable);
3432
}
3533

36-
public TikTokMessageMappingException(Class<?> inputClazz, Class<?> outputClass, String message)
37-
{
38-
super("Unable to handle mapping from class: " + inputClazz.getSimpleName() + " to class " + outputClass.getSimpleName()+": "+message);
34+
public TikTokMessageMappingException(Class<?> inputClazz, Class<?> outputClass, String message) {
35+
super("Unable to handle mapping from class: " + inputClazz.getSimpleName() + " to class " + outputClass.getSimpleName() + ": " + message);
36+
}
37+
38+
public TikTokMessageMappingException(Class<?> inputClazz, String message, Throwable throwable) {
39+
super("Unable to handle mapping from class: " + inputClazz.getSimpleName() + ": " + message, throwable);
40+
}
41+
42+
public TikTokMessageMappingException(String message, Throwable throwable) {
43+
super( message, throwable);
3944
}
4045
}

API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/EventsBuilder.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,12 @@
3838

3939
public interface EventsBuilder<T> {
4040

41-
T onCustomEvent(EventConsumer<CustomEvent> event);
41+
/**
42+
* Method used to register own custom events
43+
* @param eventClazz event class
44+
* @param event action
45+
*/
46+
<E extends TikTokEvent> T onCustomEvent(Class<E> eventClazz, EventConsumer<E> event);
4247

4348
T onRoomInfo(EventConsumer<TikTokRoomInfoEvent> event);
4449

@@ -52,6 +57,7 @@ public interface EventsBuilder<T> {
5257

5358

5459
T onGiftCombo(EventConsumer<TikTokGiftComboEvent> event);
60+
5561
T onGift(EventConsumer<TikTokGiftEvent> event);
5662

5763
T onQuestion(EventConsumer<TikTokQuestionEvent> event);
@@ -68,7 +74,7 @@ public interface EventsBuilder<T> {
6874

6975
T onShare(EventConsumer<TikTokShareEvent> event);
7076

71-
// T onChest(EventConsumer<TikTokChestEvent> event);
77+
// T onChest(EventConsumer<TikTokChestEvent> event);
7278

7379
T onLivePaused(EventConsumer<TikTokLivePausedEvent> event);
7480

@@ -83,9 +89,8 @@ public interface EventsBuilder<T> {
8389
T onDisconnected(EventConsumer<TikTokDisconnectedEvent> event);
8490

8591
T onError(EventConsumer<TikTokErrorEvent> event);
86-
T onEvent(EventConsumer<TikTokEvent> event);
87-
8892

93+
T onEvent(EventConsumer<TikTokEvent> event);
8994

9095

9196
// TODO Figure out how those events works

API/src/main/java/io/github/jwdeveloper/tiktok/live/builder/LiveClientBuilder.java

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,60 @@
2323
package io.github.jwdeveloper.tiktok.live.builder;
2424

2525
import io.github.jwdeveloper.tiktok.ClientSettings;
26+
import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent;
2627
import io.github.jwdeveloper.tiktok.listener.TikTokEventListener;
2728
import io.github.jwdeveloper.tiktok.live.LiveClient;
29+
import io.github.jwdeveloper.tiktok.mappers.TikTokMapper;
2830

2931
import java.util.concurrent.CompletableFuture;
3032
import java.util.function.Consumer;
33+
import java.util.function.Function;
3134

3235
public interface LiveClientBuilder extends EventsBuilder<LiveClientBuilder> {
33-
LiveClientBuilder configure(Consumer<ClientSettings> consumer);
3436

37+
/**
38+
* This method is triggered after default mappings are registered
39+
* It could be used to OVERRIDE behaviour of mappings and implement custom behaviour
40+
*
41+
* Be aware if for example you override WebcastGiftEvent, onGiftEvent() will not be working
42+
*
43+
* @param onCustomMappings lambda method
44+
* @return
45+
*/
46+
LiveClientBuilder onMapping(Consumer<TikTokMapper> onCustomMappings);
47+
48+
49+
/**
50+
* Configuration of client settings
51+
* @see ClientSettings
52+
* @param onConfigure
53+
* @return
54+
*/
55+
LiveClientBuilder configure(Consumer<ClientSettings> onConfigure);
56+
57+
/**
58+
* @see TikTokEventListener
59+
* Adding events listener class, its fancy way to register events without using lamda method
60+
* but actual method in class that implements TikTokEventListener
61+
* @return
62+
*/
3563
LiveClientBuilder addListener(TikTokEventListener listener);
3664

65+
/**
66+
*
67+
* @return LiveClient object
68+
*/
3769
LiveClient build();
3870

71+
/**
72+
*
73+
* @return LiveClient object and connects to TikTok live
74+
*/
3975
LiveClient buildAndConnect();
4076

77+
/**
78+
*
79+
* @return LiveClient object and connects to TikTok live asynchronously
80+
*/
4181
CompletableFuture<LiveClient> buildAndConnectAsync();
4282
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package io.github.jwdeveloper.tiktok.mappers;
2+
3+
import com.google.protobuf.GeneratedMessageV3;
4+
import io.github.jwdeveloper.tiktok.data.events.common.TikTokEvent;
5+
6+
import java.util.List;
7+
import java.util.function.Function;
8+
9+
public interface TikTokMapper {
10+
11+
12+
/**
13+
* Triggered when `sourceClass` is mapped,
14+
* input is bytes that are coming from TikTok in `sourceClass` packet
15+
* output is TikTok event we want to create
16+
* <p>
17+
* bytesToEvent(WebcastGiftMessage.class, bytes ->
18+
* {
19+
* var giftMessage = WebcastGiftMessage.parseFrom(bytes);
20+
* var giftName = giftMessage.getGift().getName();
21+
* return new TikTokEvent(Gift.ROSE, giftMessage);
22+
* })
23+
*
24+
* @param sourceClass protocol buffer webcast class
25+
* @param onMapping lambda function that is triggered on mapping. takes as input ProtocolBuffer object and as output TikTokEvent
26+
*/
27+
void bytesToEvent(Class<? extends GeneratedMessageV3> sourceClass, Function<byte[], TikTokEvent> onMapping);
28+
29+
void bytesToEvents(Class<? extends GeneratedMessageV3> sourceClass, Function<byte[], List<TikTokEvent>> onMapping);
30+
31+
32+
/**
33+
* In case you found some TikTok message that has not Webcast class use this method
34+
*
35+
* @param messageName Name of TikTok data event
36+
* @param onMapping lambda function that is triggered on mapping. takes as input ProtocolBuffer object and as output TikTokEvent
37+
*/
38+
void bytesToEvent(String messageName, Function<byte[], TikTokEvent> onMapping);
39+
40+
void bytesToEvents(String messageName, Function<byte[], List<TikTokEvent>> onMapping);
41+
42+
43+
/**
44+
* This method can be used to override default mapping for
45+
* certain TikTok incoming data message. For this example
46+
* we are overriding WebcastGiftMessage and retuning CustomGiftEvent
47+
* instead of TikTokGiftEvent
48+
* <p>
49+
* webcastObjectToEvent(WebcastGiftMessage.class, webcastGiftMessage ->
50+
* {
51+
* var giftName = webcastGiftMessage.getGift().getName();
52+
* var user = webcastGiftMessage.getUser().getNickname();
53+
* return new CustomGiftEvent(giftName, user);
54+
* })
55+
*
56+
* @param sourceClass ProtocolBuffer class that represent incoming custom data, hint class should starts with Webcast prefix
57+
* @param onMapping lambda function that is triggered on mapping. takes as input ProtocolBuffer object and as output TikTokEvent
58+
*/
59+
<T extends GeneratedMessageV3> void webcastObjectToEvent(Class<T> sourceClass, Function<T, TikTokEvent> onMapping);
60+
61+
<T extends GeneratedMessageV3> void webcastObjectToEvents(Class<T> sourceClass, Function<T, List<TikTokEvent>> onMapping);
62+
63+
/**
64+
* Triggered when `sourceClass` is mapped,
65+
* looking for constructor in `outputClass` with one parameter that is of type `sourceClass`
66+
* and created instance of object from this constructor
67+
*
68+
* @param sourceClass protocol buffer webcast class
69+
* @param outputClass TikTok event class
70+
*/
71+
void webcastObjectToConstructor(Class<? extends GeneratedMessageV3> sourceClass, Class<? extends TikTokEvent> outputClass);
72+
73+
}

API/src/main/java/io/github/jwdeveloper/tiktok/utils/CancelationToken.java

Lines changed: 0 additions & 60 deletions
This file was deleted.
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package io.github.jwdeveloper.tiktok.utils;
2+
3+
import java.nio.file.Path;
4+
import java.util.Map;
5+
import java.util.TreeMap;
6+
7+
public class ProtoBufferFileGenerator {
8+
9+
10+
public static String generate(ProtoBufferObject protoBuffObj, String name) {
11+
12+
var sb = new StringBuilder();
13+
var offset = 2;
14+
sb.append("message ").append(name).append(" { \n");
15+
16+
var objects = new TreeMap<String, ProtoBufferObject>();
17+
var objectCounter = 0;
18+
for (var entry : protoBuffObj.getFields().entrySet()) {
19+
var index = entry.getKey();
20+
var field = entry.getValue();
21+
var fieldName = field.type.toLowerCase() + "Value";
22+
var value = field.value;
23+
if (field.value instanceof ProtoBufferObject object) {
24+
fieldName += objectCounter;
25+
value = "";
26+
objects.put(fieldName,object);
27+
objectCounter++;
28+
29+
}
30+
for (var i = 0; i < offset; i++) {
31+
sb.append(" ");
32+
}
33+
sb.append(field.type).append(" ").append(fieldName)
34+
.append(" ")
35+
.append("=")
36+
.append(" ")
37+
.append(index)
38+
.append(";")
39+
.append(" //")
40+
.append(value)
41+
.append("\n");
42+
}
43+
sb.append(" \n");
44+
for(var object : objects.entrySet())
45+
{
46+
var structure = generate(object.getValue(),object.getKey());
47+
sb.append(structure);
48+
}
49+
50+
51+
sb.append(" \n");
52+
sb.append("} \n");
53+
return sb.toString();
54+
}
55+
56+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package io.github.jwdeveloper.tiktok.utils;
2+
3+
import com.google.gson.GsonBuilder;
4+
import com.google.gson.JsonObject;
5+
6+
public class ProtoBufferJsonGenerator {
7+
public static JsonObject genratejson(ProtoBufferObject protoBuffObj) {
8+
9+
JsonObject jsonObject = new JsonObject();
10+
for (var entry : protoBuffObj.getFields().entrySet()) {
11+
var fieldName = entry.getKey() + "_" + entry.getValue().type;
12+
if (entry.getValue().value instanceof ProtoBufferObject protoObj)
13+
{
14+
JsonObject childJson = genratejson(protoObj);
15+
jsonObject.add(fieldName, childJson);
16+
continue;
17+
}
18+
19+
var value = entry.getValue().value.toString();
20+
jsonObject.addProperty(fieldName, value);
21+
}
22+
23+
return jsonObject;
24+
}
25+
26+
public static String generate(ProtoBufferObject protoBufferObject) {
27+
var json = genratejson(protoBufferObject);
28+
var gson = new GsonBuilder().setPrettyPrinting().create();
29+
return gson.toJson(json);
30+
}
31+
}

0 commit comments

Comments
 (0)