This commit is contained in:
minster586
2026-01-14 04:41:23 -05:00
parent 40534e4e04
commit 902dc4f51f
7 changed files with 2602 additions and 92 deletions

9
.vscode/tasks.json vendored
View File

@@ -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"
} }
] ]
} }

2392
class.txt Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -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());
@@ -88,92 +186,107 @@ public class Main {
} }
// Write full config.yml with all event settings (valid YAML) // Write full config.yml with all event settings (valid YAML)
String config = "# tiktok username to follow\n" + String config = "# tiktok username to follow\n" +
"TIKTOK_USERNAME: '" + username + "'\n" + "TIKTOK_USERNAME: '" + username + "'\n" +
"\n" + "\n" +
"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" + " ws_enable:\n" +
" gifts: true\n" + " enabled: true\n" +
" chat: true\n" + " profile_img: true\n" +
" follow_settings:\n" + " userinfo: true\n" +
" ws_enable:\n" + " user_style: username\n" +
" profile_img: true\n" + " file_enable:\n" +
" userinfo: true\n" + " enabled: true\n" +
" user_style: username\n" + " profile_img: true\n" +
" file_enable:\n" + " userinfo: true\n" +
" profile_img: true\n" + " user_style: username\n" +
" userinfo: true\n" + " output_path: 'C:/Users/Tiktok/Follows'\n" +
" user_style: username\n" + " cli_enable:\n" +
" output_path: 'C:/Users/Tiktok/Follows'\n" + " enabled: true\n" +
" cli_enable:\n" + " userinfo: true\n" +
" userinfo: true\n" + " user_style: username\n" +
" user_style: username\n" + " likes:\n" +
" likes_settings:\n" + " enabled: true\n" +
" ws_enable:\n" + " ws_enable:\n" +
" profile_img: true\n" + " enabled: true\n" +
" userinfo: true\n" + " profile_img: true\n" +
" user_style: username\n" + " userinfo: true\n" +
" amount: true\n" + " user_style: username\n" +
" file_enable:\n" + " amount: true\n" +
" profile_img: true\n" + " file_enable:\n" +
" userinfo: true\n" + " enabled: true\n" +
" user_style: username\n" + " profile_img: true\n" +
" amount: true\n" + " userinfo: true\n" +
" output_path: 'C:/Users/Tiktok/Likes'\n" + " user_style: username\n" +
" cli_enable:\n" + " amount: true\n" +
" userinfo: true\n" + " output_path: 'C:/Users/Tiktok/Likes'\n" +
" user_style: username\n" + " cli_enable:\n" +
" amount: true\n" + " enabled: true\n" +
" shares_settings:\n" + " userinfo: true\n" +
" ws_enable:\n" + " user_style: username\n" +
" profile_img: true\n" + " amount: true\n" +
" userinfo: true\n" + " shares:\n" +
" user_style: username\n" + " enabled: true\n" +
" file_enable:\n" + " ws_enable:\n" +
" profile_img: true\n" + " enabled: true\n" +
" userinfo: true\n" + " profile_img: true\n" +
" user_style: username\n" + " userinfo: true\n" +
" output_path: 'C:/Users/Tiktok/Shares'\n" + " user_style: username\n" +
" cli_enable:\n" + " file_enable:\n" +
" userinfo: true\n" + " enabled: true\n" +
" user_style: username\n" + " profile_img: true\n" +
" follower_only_share: true\n" + " userinfo: true\n" +
" gifts_settings:\n" + " user_style: username\n" +
" ws_enable:\n" + " output_path: 'C:/Users/Tiktok/Shares'\n" +
" profile_img: true\n" + " cli_enable:\n" +
" userinfo: true\n" + " enabled: true\n" +
" user_style: username\n" + " userinfo: true\n" +
" gift_name: true\n" + " user_style: username\n" +
" amount: true\n" + " follower_only_share: true\n" +
" file_enable:\n" + " gifts:\n" +
" profile_img: true\n" + " enabled: true\n" +
" userinfo: true\n" + " ws_enable:\n" +
" user_style: username\n" + " enabled: true\n" +
" gift_name: true\n" + " profile_img: true\n" +
" amount: true\n" + " userinfo: true\n" +
" output_path: 'C:/Users/Tiktok/Gifts'\n" + " user_style: username\n" +
" cli_enable:\n" + " gift_name: true\n" +
" userinfo: true\n" + " amount: true\n" +
" user_style: username\n" + " file_enable:\n" +
" gift_name: true\n" + " enabled: true\n" +
" amount: true\n" + " profile_img: true\n" +
" chat_settings:\n" + " userinfo: true\n" +
" ws_enable:\n" + " user_style: username\n" +
" profile_img: true\n" + " gift_name: true\n" +
" userinfo: true\n" + " amount: true\n" +
" user_style: username\n" + " output_path: 'C:/Users/Tiktok/Gifts'\n" +
" file_enable:\n" + " cli_enable:\n" +
" profile_img: false\n" + " enabled: true\n" +
" userinfo: false\n" + " userinfo: true\n" +
" user_style: username\n" + " user_style: username\n" +
" output_path: 'C:/Users/Tiktok/Chat'\n" + " gift_name: true\n" +
" cli_enable:\n" + " amount: true\n" +
" userinfo: true\n" + " chat:\n" +
" user_style: username\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 { try {
Files.writeString(Paths.get("config.yml"), config); 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."); System.out.println("config.yml created with all event settings. Please edit it for more options as needed.");

Binary file not shown.

View File

@@ -1,3 +0,0 @@
artifactId=tiktok-live-event-stream-data
groupId=com.smartcraftmedia
version=1.0-SNAPSHOT

View File

@@ -1,4 +1,3 @@
Main.class
TikTokEventListener.class TikTokEventListener.class
WebSocketServerApp.class WebSocketServerApp.class
ConfigLoader.class ConfigLoader.class