- improve collector

This commit is contained in:
JW
2024-03-02 10:55:44 +01:00
parent e058290118
commit 92fde03f2b
4 changed files with 31 additions and 21 deletions

View File

@@ -0,0 +1,8 @@
package io.github.jwdeveloper.tiktok.extension.collector.api;
import io.github.jwdeveloper.tiktok.live.LiveClient;
import org.bson.Document;
public interface CollectorEvent {
boolean execute(LiveClient client, Document document);
}

View File

@@ -1,5 +1,6 @@
package io.github.jwdeveloper.tiktok.extension.collector.api.settings; package io.github.jwdeveloper.tiktok.extension.collector.api.settings;
import io.github.jwdeveloper.tiktok.extension.collector.api.CollectorEvent;
import lombok.Data; import lombok.Data;
import org.bson.Document; import org.bson.Document;
@@ -9,5 +10,5 @@ import java.util.function.Function;
@Data @Data
public class CollectorListenerSettings { public class CollectorListenerSettings {
private Map<String, Object> extraFields; private Map<String, Object> extraFields;
private Function<Document, Boolean> filter; private CollectorEvent filter;
} }

View File

@@ -22,6 +22,7 @@
*/ */
package io.github.jwdeveloper.tiktok.extension.collector.impl; package io.github.jwdeveloper.tiktok.extension.collector.impl;
import io.github.jwdeveloper.tiktok.extension.collector.api.CollectorEvent;
import io.github.jwdeveloper.tiktok.extension.collector.api.Storage; import io.github.jwdeveloper.tiktok.extension.collector.api.Storage;
import io.github.jwdeveloper.tiktok.extension.collector.api.settings.CollectorListenerSettings; import io.github.jwdeveloper.tiktok.extension.collector.api.settings.CollectorListenerSettings;
import org.bson.Document; import org.bson.Document;
@@ -40,6 +41,7 @@ public class DataCollector {
public void connect() { public void connect() {
storage.connect(); storage.connect();
} }
public void disconnect() { public void disconnect() {
storage.disconnect(); storage.disconnect();
} }
@@ -49,11 +51,11 @@ public class DataCollector {
} }
public DataCollectorListener newListener(Map<String, Object> additionalFields) { public DataCollectorListener newListener(Map<String, Object> additionalFields) {
return newListener(additionalFields, (e) -> true); return newListener(additionalFields, (live, document) -> true);
} }
public DataCollectorListener newListener(Map<String, Object> additionalFields, public DataCollectorListener newListener(Map<String, Object> additionalFields,
Function<Document, Boolean> filter) { CollectorEvent filter) {
var settings = new CollectorListenerSettings(); var settings = new CollectorListenerSettings();
settings.setExtraFields(additionalFields); settings.setExtraFields(additionalFields);
settings.setFilter(filter); settings.setFilter(filter);

View File

@@ -17,13 +17,13 @@ import org.bson.Document;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.io.StringWriter; import java.io.StringWriter;
import java.util.Base64; import java.util.Base64;
import java.util.UUID; import java.util.Date;
public class DataCollectorListener implements LiveDataCollector { public class DataCollectorListener implements LiveDataCollector {
private final Storage storage; private final Storage storage;
private final CollectorListenerSettings settings; private final CollectorListenerSettings settings;
private String sessionId; private String roomId;
private String userName; private String userName;
public DataCollectorListener(Storage collection, CollectorListenerSettings settings) { public DataCollectorListener(Storage collection, CollectorListenerSettings settings) {
@@ -41,44 +41,42 @@ public class DataCollectorListener implements LiveDataCollector {
@TikTokEventObserver @TikTokEventObserver
private void onEvent(LiveClient liveClient, TikTokEvent event) { private void onEvent(LiveClient liveClient, TikTokEvent event) {
if (event instanceof TikTokConnectingEvent) { if (event instanceof TikTokConnectingEvent) {
sessionId = UUID.randomUUID().toString();
userName = liveClient.getRoomInfo().getHostName(); userName = liveClient.getRoomInfo().getHostName();
roomId = liveClient.getRoomInfo().getRoomId();
} }
if (event instanceof TikTokErrorEvent) { if (event instanceof TikTokErrorEvent) {
return; return;
} }
includeEvent(event); includeEvent(liveClient, event);
} }
@TikTokEventObserver @TikTokEventObserver
private void onError(LiveClient liveClient, TikTokErrorEvent event) { private void onError(LiveClient liveClient, TikTokErrorEvent event) {
event.getException().printStackTrace(); event.getException().printStackTrace();
includeError(event); includeError(liveClient, event);
} }
private void includeResponse(LiveClient liveClient, WebcastResponse message) { private void includeResponse(LiveClient liveClient, WebcastResponse message) {
var messageContent = Base64.getEncoder().encodeToString(message.toByteArray()); var messageContent = Base64.getEncoder().encodeToString(message.toByteArray());
insertDocument(createDocument("response", "webcast", messageContent)); insertDocument(liveClient, createDocument("response", "webcast", messageContent));
} }
private void includeMessage(LiveClient liveClient, WebcastResponse.Message message) { private void includeMessage(LiveClient liveClient, WebcastResponse.Message message) {
var method = message.getMethod(); var method = message.getMethod();
var messageContent = Base64.getEncoder().encodeToString(message.getPayload().toByteArray()); var messageContent = Base64.getEncoder().encodeToString(message.getPayload().toByteArray());
insertDocument(liveClient, createDocument("message", method, messageContent));
insertDocument(createDocument("message", method, messageContent));
} }
private void includeEvent(TikTokEvent event) { private void includeEvent(LiveClient client, TikTokEvent event) {
var json = JsonUtil.toJson(event); var json = JsonUtil.toJson(event);
var content = Base64.getEncoder().encodeToString(json.getBytes()); var content = Base64.getEncoder().encodeToString(json.getBytes());
var name = event.getClass().getSimpleName(); var name = event.getClass().getSimpleName();
insertDocument(createDocument("event", name, content)); insertDocument(client, createDocument("event", name, content));
} }
private void includeError(TikTokErrorEvent event) { private void includeError(LiveClient client, TikTokErrorEvent event) {
var exception = event.getException(); var exception = event.getException();
var exceptionName = event.getException().getClass().getSimpleName(); var exceptionName = event.getException().getClass().getSimpleName();
@@ -86,18 +84,18 @@ public class DataCollectorListener implements LiveDataCollector {
var pw = new PrintWriter(sw); var pw = new PrintWriter(sw);
event.getException().printStackTrace(pw); event.getException().printStackTrace(pw);
var content = sw.toString(); var content = sw.toString();
var contentBase64 = Base64.getEncoder().encodeToString(content.getBytes());
var doc = createDocument("error", exceptionName, content); var doc = createDocument("error", exceptionName, contentBase64);
if (exception instanceof TikTokLiveMessageException ex) { if (exception instanceof TikTokLiveMessageException ex) {
doc.append("message", ex.messageToBase64()) doc.append("message", ex.messageToBase64())
.append("response", ex.webcastResponseToBase64()); .append("response", ex.webcastResponseToBase64());
} }
insertDocument(doc); insertDocument(client, doc);
} }
private void insertDocument(Document document) { private void insertDocument(LiveClient client, Document document) {
if (!settings.getFilter().apply(document)) { if (!settings.getFilter().execute(client, document)) {
return; return;
} }
storage.insert(document); storage.insert(document);
@@ -106,7 +104,7 @@ public class DataCollectorListener implements LiveDataCollector {
private Document createDocument(String dataType, String dataTypeName, String content) { private Document createDocument(String dataType, String dataTypeName, String content) {
var doc = new Document(); var doc = new Document();
doc.append("session", sessionId); doc.append("roomId", roomId);
for (var entry : settings.getExtraFields().entrySet()) { for (var entry : settings.getExtraFields().entrySet()) {
doc.append(entry.getKey(), entry.getValue()); doc.append(entry.getKey(), entry.getValue());
} }
@@ -114,6 +112,7 @@ public class DataCollectorListener implements LiveDataCollector {
doc.append("dataType", dataType); doc.append("dataType", dataType);
doc.append("dataTypeName", dataTypeName); doc.append("dataTypeName", dataTypeName);
doc.append("content", content); doc.append("content", content);
doc.append("createdAt", new Date());
return doc; return doc;
} }
} }