123
This commit is contained in:
9
.vscode/tasks.json
vendored
9
.vscode/tasks.json
vendored
@@ -45,6 +45,15 @@
|
||||
"$maven"
|
||||
],
|
||||
"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.nio.file.Files;
|
||||
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 static void main(String[] args) {
|
||||
@@ -61,7 +65,101 @@ public class Main {
|
||||
System.out.println("WebSocket server running on port " + port);
|
||||
|
||||
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) {
|
||||
System.err.println("Failed to load config or start server: " + e.getMessage());
|
||||
@@ -88,92 +186,107 @@ public class Main {
|
||||
}
|
||||
|
||||
// Write full config.yml with all event settings (valid YAML)
|
||||
String config = "# tiktok username to follow\n" +
|
||||
"TIKTOK_USERNAME: '" + username + "'\n" +
|
||||
"\n" +
|
||||
"websocket_port: " + port + " # Requires program restart to take effect\n" +
|
||||
"\n" +
|
||||
"events:\n" +
|
||||
" follow: true\n" +
|
||||
" likes: true\n" +
|
||||
" shares: true\n" +
|
||||
" gifts: true\n" +
|
||||
" chat: true\n" +
|
||||
" follow_settings:\n" +
|
||||
" ws_enable:\n" +
|
||||
" profile_img: true\n" +
|
||||
" userinfo: true\n" +
|
||||
" user_style: username\n" +
|
||||
" file_enable:\n" +
|
||||
" profile_img: true\n" +
|
||||
" userinfo: true\n" +
|
||||
" user_style: username\n" +
|
||||
" output_path: 'C:/Users/Tiktok/Follows'\n" +
|
||||
" cli_enable:\n" +
|
||||
" userinfo: true\n" +
|
||||
" user_style: username\n" +
|
||||
" likes_settings:\n" +
|
||||
" ws_enable:\n" +
|
||||
" profile_img: true\n" +
|
||||
" userinfo: true\n" +
|
||||
" user_style: username\n" +
|
||||
" amount: true\n" +
|
||||
" file_enable:\n" +
|
||||
" profile_img: true\n" +
|
||||
" userinfo: true\n" +
|
||||
" user_style: username\n" +
|
||||
" amount: true\n" +
|
||||
" output_path: 'C:/Users/Tiktok/Likes'\n" +
|
||||
" cli_enable:\n" +
|
||||
" userinfo: true\n" +
|
||||
" user_style: username\n" +
|
||||
" amount: true\n" +
|
||||
" shares_settings:\n" +
|
||||
" ws_enable:\n" +
|
||||
" profile_img: true\n" +
|
||||
" userinfo: true\n" +
|
||||
" user_style: username\n" +
|
||||
" file_enable:\n" +
|
||||
" profile_img: true\n" +
|
||||
" userinfo: true\n" +
|
||||
" user_style: username\n" +
|
||||
" output_path: 'C:/Users/Tiktok/Shares'\n" +
|
||||
" cli_enable:\n" +
|
||||
" userinfo: true\n" +
|
||||
" user_style: username\n" +
|
||||
" follower_only_share: true\n" +
|
||||
" gifts_settings:\n" +
|
||||
" ws_enable:\n" +
|
||||
" profile_img: true\n" +
|
||||
" userinfo: true\n" +
|
||||
" user_style: username\n" +
|
||||
" gift_name: true\n" +
|
||||
" amount: true\n" +
|
||||
" file_enable:\n" +
|
||||
" profile_img: true\n" +
|
||||
" userinfo: true\n" +
|
||||
" user_style: username\n" +
|
||||
" gift_name: true\n" +
|
||||
" amount: true\n" +
|
||||
" output_path: 'C:/Users/Tiktok/Gifts'\n" +
|
||||
" cli_enable:\n" +
|
||||
" userinfo: true\n" +
|
||||
" user_style: username\n" +
|
||||
" gift_name: true\n" +
|
||||
" amount: true\n" +
|
||||
" chat_settings:\n" +
|
||||
" ws_enable:\n" +
|
||||
" profile_img: true\n" +
|
||||
" userinfo: true\n" +
|
||||
" user_style: username\n" +
|
||||
" file_enable:\n" +
|
||||
" profile_img: false\n" +
|
||||
" userinfo: false\n" +
|
||||
" user_style: username\n" +
|
||||
" output_path: 'C:/Users/Tiktok/Chat'\n" +
|
||||
" cli_enable:\n" +
|
||||
" userinfo: true\n" +
|
||||
" user_style: username\n";
|
||||
String config = "# tiktok username to follow\n" +
|
||||
"TIKTOK_USERNAME: '" + username + "'\n" +
|
||||
"\n" +
|
||||
"websocket_port: " + port + " # Requires program restart to take effect\n" +
|
||||
"\n" +
|
||||
"events:\n" +
|
||||
" follow:\n" +
|
||||
" enabled: true\n" +
|
||||
" ws_enable:\n" +
|
||||
" enabled: true\n" +
|
||||
" profile_img: true\n" +
|
||||
" userinfo: true\n" +
|
||||
" user_style: username\n" +
|
||||
" file_enable:\n" +
|
||||
" enabled: true\n" +
|
||||
" profile_img: true\n" +
|
||||
" userinfo: true\n" +
|
||||
" user_style: username\n" +
|
||||
" output_path: 'C:/Users/Tiktok/Follows'\n" +
|
||||
" cli_enable:\n" +
|
||||
" enabled: true\n" +
|
||||
" userinfo: true\n" +
|
||||
" user_style: username\n" +
|
||||
" likes:\n" +
|
||||
" enabled: true\n" +
|
||||
" ws_enable:\n" +
|
||||
" enabled: true\n" +
|
||||
" profile_img: true\n" +
|
||||
" userinfo: true\n" +
|
||||
" user_style: username\n" +
|
||||
" amount: true\n" +
|
||||
" file_enable:\n" +
|
||||
" enabled: true\n" +
|
||||
" profile_img: true\n" +
|
||||
" userinfo: true\n" +
|
||||
" user_style: username\n" +
|
||||
" amount: true\n" +
|
||||
" output_path: 'C:/Users/Tiktok/Likes'\n" +
|
||||
" cli_enable:\n" +
|
||||
" enabled: true\n" +
|
||||
" userinfo: true\n" +
|
||||
" user_style: username\n" +
|
||||
" amount: true\n" +
|
||||
" shares:\n" +
|
||||
" enabled: true\n" +
|
||||
" ws_enable:\n" +
|
||||
" enabled: true\n" +
|
||||
" profile_img: true\n" +
|
||||
" userinfo: true\n" +
|
||||
" user_style: username\n" +
|
||||
" file_enable:\n" +
|
||||
" enabled: true\n" +
|
||||
" profile_img: true\n" +
|
||||
" userinfo: true\n" +
|
||||
" user_style: username\n" +
|
||||
" output_path: 'C:/Users/Tiktok/Shares'\n" +
|
||||
" cli_enable:\n" +
|
||||
" enabled: true\n" +
|
||||
" userinfo: true\n" +
|
||||
" user_style: username\n" +
|
||||
" follower_only_share: true\n" +
|
||||
" gifts:\n" +
|
||||
" enabled: true\n" +
|
||||
" ws_enable:\n" +
|
||||
" enabled: true\n" +
|
||||
" profile_img: true\n" +
|
||||
" userinfo: true\n" +
|
||||
" user_style: username\n" +
|
||||
" gift_name: true\n" +
|
||||
" amount: true\n" +
|
||||
" file_enable:\n" +
|
||||
" enabled: true\n" +
|
||||
" profile_img: true\n" +
|
||||
" userinfo: true\n" +
|
||||
" user_style: username\n" +
|
||||
" gift_name: true\n" +
|
||||
" amount: true\n" +
|
||||
" output_path: 'C:/Users/Tiktok/Gifts'\n" +
|
||||
" cli_enable:\n" +
|
||||
" enabled: true\n" +
|
||||
" userinfo: true\n" +
|
||||
" user_style: username\n" +
|
||||
" gift_name: true\n" +
|
||||
" amount: true\n" +
|
||||
" chat:\n" +
|
||||
" enabled: true\n" +
|
||||
" ws_enable:\n" +
|
||||
" enabled: true\n" +
|
||||
" profile_img: true\n" +
|
||||
" userinfo: true\n" +
|
||||
" user_style: username\n" +
|
||||
" file_enable:\n" +
|
||||
" enabled: false\n" +
|
||||
" profile_img: false\n" +
|
||||
" userinfo: false\n" +
|
||||
" user_style: username\n" +
|
||||
" output_path: 'C:/Users/Tiktok/Chat'\n" +
|
||||
" cli_enable:\n" +
|
||||
" enabled: true\n" +
|
||||
" userinfo: true\n" +
|
||||
" user_style: username\n";
|
||||
try {
|
||||
Files.writeString(Paths.get("config.yml"), config);
|
||||
System.out.println("config.yml created with all event settings. Please edit it for more options as needed.");
|
||||
|
||||
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
|
||||
WebSocketServerApp.class
|
||||
ConfigLoader.class
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user