123
This commit is contained in:
9
.vscode/tasks.json
vendored
9
.vscode/tasks.json
vendored
@@ -45,6 +45,15 @@
|
|||||||
"$maven"
|
"$maven"
|
||||||
],
|
],
|
||||||
"group": "build"
|
"group": "build"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Maven: clean package (with TikTokLiveJava integration)",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "mvn clean package",
|
||||||
|
"problemMatcher": [
|
||||||
|
"$maven"
|
||||||
|
],
|
||||||
|
"group": "build"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -2,7 +2,11 @@ import java.io.File;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.util.Scanner;
|
|
||||||
|
import io.github.jwdeveloper.tiktok.TikTokLiveClient;
|
||||||
|
import io.github.jwdeveloper.tiktok.TikTokLiveClientBuilder;
|
||||||
|
import io.github.jwdeveloper.tiktok.TikTokLiveEventHandler;
|
||||||
|
import io.github.jwdeveloper.tiktok.models.ConnectionState;
|
||||||
|
|
||||||
public class Main {
|
public class Main {
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
@@ -61,7 +65,101 @@ public class Main {
|
|||||||
System.out.println("WebSocket server running on port " + port);
|
System.out.println("WebSocket server running on port " + port);
|
||||||
|
|
||||||
TikTokEventListener tiktokListener = new TikTokEventListener(config, format, wsServer);
|
TikTokEventListener tiktokListener = new TikTokEventListener(config, format, wsServer);
|
||||||
// TODO: Connect TikTokLiveJava and wire up event callbacks to tiktokListener
|
|
||||||
|
|
||||||
|
// --- TikTokLiveJava Integration ---
|
||||||
|
String username = (String) config.getOrDefault("TIKTOK_USERNAME", "");
|
||||||
|
if (username.startsWith("@")) {
|
||||||
|
username = username.substring(1);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
TikTokLiveClient client = new TikTokLiveClientBuilder()
|
||||||
|
.setUniqueId(username)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
|
||||||
|
// Helper to extract user info based on config user_style
|
||||||
|
java.util.function.Function<Object, String> getUserInfo = (event) -> {
|
||||||
|
try {
|
||||||
|
Object user = event.getClass().getMethod("getUser").invoke(event);
|
||||||
|
String userStyle = "username";
|
||||||
|
try {
|
||||||
|
Object eventsCfg = config.get("events");
|
||||||
|
if (eventsCfg instanceof java.util.Map) {
|
||||||
|
java.util.Map<?,?> eventsMap = (java.util.Map<?,?>) eventsCfg;
|
||||||
|
Object followCfg = eventsMap.get("follow");
|
||||||
|
if (followCfg instanceof java.util.Map) {
|
||||||
|
Object style = ((java.util.Map<?,?>) followCfg).get("ws_enable");
|
||||||
|
if (style instanceof java.util.Map) {
|
||||||
|
Object us = ((java.util.Map<?,?>) style).get("user_style");
|
||||||
|
if (us instanceof String) userStyle = (String) us;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception ignore) {}
|
||||||
|
if (userStyle.equalsIgnoreCase("display_name")) {
|
||||||
|
return (String) user.getClass().getMethod("getDisplayName").invoke(user);
|
||||||
|
} else {
|
||||||
|
return (String) user.getClass().getMethod("getUsername").invoke(user);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
return "[unknown user]";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
client.addEventHandler(new TikTokLiveEventHandler() {
|
||||||
|
@Override
|
||||||
|
public void onFollow(Object event) {
|
||||||
|
tiktokListener.onFollow(getUserInfo.apply(event));
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void onLike(Object event) {
|
||||||
|
try {
|
||||||
|
int count = (int) event.getClass().getMethod("getLikeCount").invoke(event);
|
||||||
|
tiktokListener.onLike(getUserInfo.apply(event), count);
|
||||||
|
} catch (Exception e) {
|
||||||
|
tiktokListener.onLike(getUserInfo.apply(event), 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void onShare(Object event) {
|
||||||
|
tiktokListener.onShare(getUserInfo.apply(event));
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void onGift(Object event) {
|
||||||
|
try {
|
||||||
|
Object user = event.getClass().getMethod("getUser").invoke(event);
|
||||||
|
Object gift = event.getClass().getMethod("getGift").invoke(event);
|
||||||
|
String userInfo = getUserInfo.apply(event);
|
||||||
|
String giftName = (String) gift.getClass().getMethod("getName").invoke(gift);
|
||||||
|
int amount = (int) event.getClass().getMethod("getGiftCount").invoke(event);
|
||||||
|
tiktokListener.onGift(userInfo, giftName, amount);
|
||||||
|
} catch (Exception e) {
|
||||||
|
tiktokListener.onGift(getUserInfo.apply(event), "Gift", 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void onComment(Object event) {
|
||||||
|
try {
|
||||||
|
String msg = (String) event.getClass().getMethod("getComment").invoke(event);
|
||||||
|
tiktokListener.onChat(getUserInfo.apply(event), msg);
|
||||||
|
} catch (Exception e) {
|
||||||
|
tiktokListener.onChat(getUserInfo.apply(event), "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
client.connect();
|
||||||
|
|
||||||
|
// Optionally, wait for connection state
|
||||||
|
while (client.getConnectionState() != ConnectionState.CONNECTED) {
|
||||||
|
Thread.sleep(500);
|
||||||
|
}
|
||||||
|
System.out.println("Connected to TikTok live for user: @" + username);
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.err.println("Failed to connect to TikTok Live: " + e.getMessage());
|
||||||
|
}
|
||||||
|
// --- End TikTokLiveJava Integration ---
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
System.err.println("Failed to load config or start server: " + e.getMessage());
|
System.err.println("Failed to load config or start server: " + e.getMessage());
|
||||||
@@ -94,62 +192,72 @@ public class Main {
|
|||||||
"websocket_port: " + port + " # Requires program restart to take effect\n" +
|
"websocket_port: " + port + " # Requires program restart to take effect\n" +
|
||||||
"\n" +
|
"\n" +
|
||||||
"events:\n" +
|
"events:\n" +
|
||||||
" follow: true\n" +
|
" follow:\n" +
|
||||||
" likes: true\n" +
|
" enabled: true\n" +
|
||||||
" shares: true\n" +
|
|
||||||
" gifts: true\n" +
|
|
||||||
" chat: true\n" +
|
|
||||||
" follow_settings:\n" +
|
|
||||||
" ws_enable:\n" +
|
" ws_enable:\n" +
|
||||||
|
" enabled: true\n" +
|
||||||
" profile_img: true\n" +
|
" profile_img: true\n" +
|
||||||
" userinfo: true\n" +
|
" userinfo: true\n" +
|
||||||
" user_style: username\n" +
|
" user_style: username\n" +
|
||||||
" file_enable:\n" +
|
" file_enable:\n" +
|
||||||
|
" enabled: true\n" +
|
||||||
" profile_img: true\n" +
|
" profile_img: true\n" +
|
||||||
" userinfo: true\n" +
|
" userinfo: true\n" +
|
||||||
" user_style: username\n" +
|
" user_style: username\n" +
|
||||||
" output_path: 'C:/Users/Tiktok/Follows'\n" +
|
" output_path: 'C:/Users/Tiktok/Follows'\n" +
|
||||||
" cli_enable:\n" +
|
" cli_enable:\n" +
|
||||||
|
" enabled: true\n" +
|
||||||
" userinfo: true\n" +
|
" userinfo: true\n" +
|
||||||
" user_style: username\n" +
|
" user_style: username\n" +
|
||||||
" likes_settings:\n" +
|
" likes:\n" +
|
||||||
|
" enabled: true\n" +
|
||||||
" ws_enable:\n" +
|
" ws_enable:\n" +
|
||||||
|
" enabled: true\n" +
|
||||||
" profile_img: true\n" +
|
" profile_img: true\n" +
|
||||||
" userinfo: true\n" +
|
" userinfo: true\n" +
|
||||||
" user_style: username\n" +
|
" user_style: username\n" +
|
||||||
" amount: true\n" +
|
" amount: true\n" +
|
||||||
" file_enable:\n" +
|
" file_enable:\n" +
|
||||||
|
" enabled: true\n" +
|
||||||
" profile_img: true\n" +
|
" profile_img: true\n" +
|
||||||
" userinfo: true\n" +
|
" userinfo: true\n" +
|
||||||
" user_style: username\n" +
|
" user_style: username\n" +
|
||||||
" amount: true\n" +
|
" amount: true\n" +
|
||||||
" output_path: 'C:/Users/Tiktok/Likes'\n" +
|
" output_path: 'C:/Users/Tiktok/Likes'\n" +
|
||||||
" cli_enable:\n" +
|
" cli_enable:\n" +
|
||||||
|
" enabled: true\n" +
|
||||||
" userinfo: true\n" +
|
" userinfo: true\n" +
|
||||||
" user_style: username\n" +
|
" user_style: username\n" +
|
||||||
" amount: true\n" +
|
" amount: true\n" +
|
||||||
" shares_settings:\n" +
|
" shares:\n" +
|
||||||
|
" enabled: true\n" +
|
||||||
" ws_enable:\n" +
|
" ws_enable:\n" +
|
||||||
|
" enabled: true\n" +
|
||||||
" profile_img: true\n" +
|
" profile_img: true\n" +
|
||||||
" userinfo: true\n" +
|
" userinfo: true\n" +
|
||||||
" user_style: username\n" +
|
" user_style: username\n" +
|
||||||
" file_enable:\n" +
|
" file_enable:\n" +
|
||||||
|
" enabled: true\n" +
|
||||||
" profile_img: true\n" +
|
" profile_img: true\n" +
|
||||||
" userinfo: true\n" +
|
" userinfo: true\n" +
|
||||||
" user_style: username\n" +
|
" user_style: username\n" +
|
||||||
" output_path: 'C:/Users/Tiktok/Shares'\n" +
|
" output_path: 'C:/Users/Tiktok/Shares'\n" +
|
||||||
" cli_enable:\n" +
|
" cli_enable:\n" +
|
||||||
|
" enabled: true\n" +
|
||||||
" userinfo: true\n" +
|
" userinfo: true\n" +
|
||||||
" user_style: username\n" +
|
" user_style: username\n" +
|
||||||
" follower_only_share: true\n" +
|
" follower_only_share: true\n" +
|
||||||
" gifts_settings:\n" +
|
" gifts:\n" +
|
||||||
|
" enabled: true\n" +
|
||||||
" ws_enable:\n" +
|
" ws_enable:\n" +
|
||||||
|
" enabled: true\n" +
|
||||||
" profile_img: true\n" +
|
" profile_img: true\n" +
|
||||||
" userinfo: true\n" +
|
" userinfo: true\n" +
|
||||||
" user_style: username\n" +
|
" user_style: username\n" +
|
||||||
" gift_name: true\n" +
|
" gift_name: true\n" +
|
||||||
" amount: true\n" +
|
" amount: true\n" +
|
||||||
" file_enable:\n" +
|
" file_enable:\n" +
|
||||||
|
" enabled: true\n" +
|
||||||
" profile_img: true\n" +
|
" profile_img: true\n" +
|
||||||
" userinfo: true\n" +
|
" userinfo: true\n" +
|
||||||
" user_style: username\n" +
|
" user_style: username\n" +
|
||||||
@@ -157,21 +265,26 @@ public class Main {
|
|||||||
" amount: true\n" +
|
" amount: true\n" +
|
||||||
" output_path: 'C:/Users/Tiktok/Gifts'\n" +
|
" output_path: 'C:/Users/Tiktok/Gifts'\n" +
|
||||||
" cli_enable:\n" +
|
" cli_enable:\n" +
|
||||||
|
" enabled: true\n" +
|
||||||
" userinfo: true\n" +
|
" userinfo: true\n" +
|
||||||
" user_style: username\n" +
|
" user_style: username\n" +
|
||||||
" gift_name: true\n" +
|
" gift_name: true\n" +
|
||||||
" amount: true\n" +
|
" amount: true\n" +
|
||||||
" chat_settings:\n" +
|
" chat:\n" +
|
||||||
|
" enabled: true\n" +
|
||||||
" ws_enable:\n" +
|
" ws_enable:\n" +
|
||||||
|
" enabled: true\n" +
|
||||||
" profile_img: true\n" +
|
" profile_img: true\n" +
|
||||||
" userinfo: true\n" +
|
" userinfo: true\n" +
|
||||||
" user_style: username\n" +
|
" user_style: username\n" +
|
||||||
" file_enable:\n" +
|
" file_enable:\n" +
|
||||||
|
" enabled: false\n" +
|
||||||
" profile_img: false\n" +
|
" profile_img: false\n" +
|
||||||
" userinfo: false\n" +
|
" userinfo: false\n" +
|
||||||
" user_style: username\n" +
|
" user_style: username\n" +
|
||||||
" output_path: 'C:/Users/Tiktok/Chat'\n" +
|
" output_path: 'C:/Users/Tiktok/Chat'\n" +
|
||||||
" cli_enable:\n" +
|
" cli_enable:\n" +
|
||||||
|
" enabled: true\n" +
|
||||||
" userinfo: true\n" +
|
" userinfo: true\n" +
|
||||||
" user_style: username\n";
|
" user_style: username\n";
|
||||||
try {
|
try {
|
||||||
|
|||||||
Binary file not shown.
@@ -1,3 +0,0 @@
|
|||||||
artifactId=tiktok-live-event-stream-data
|
|
||||||
groupId=com.smartcraftmedia
|
|
||||||
version=1.0-SNAPSHOT
|
|
||||||
@@ -1,4 +1,3 @@
|
|||||||
Main.class
|
|
||||||
TikTokEventListener.class
|
TikTokEventListener.class
|
||||||
WebSocketServerApp.class
|
WebSocketServerApp.class
|
||||||
ConfigLoader.class
|
ConfigLoader.class
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user