diff --git a/.gitignore b/.gitignore index 3efc327..4d9f763 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,82 @@ # Project exclude paths /API/target/ -/Client/target/ \ No newline at end of file +/Client/target/ +*.db + +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser \ No newline at end of file diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/events/TikTokEventBuilder.java b/API/src/main/java/io/github/jwdeveloper/tiktok/events/TikTokEventBuilder.java index 11df854..3f3f31e 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/events/TikTokEventBuilder.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/events/TikTokEventBuilder.java @@ -1,8 +1,6 @@ package io.github.jwdeveloper.tiktok.events; import io.github.jwdeveloper.tiktok.events.messages.*; -import java.util.function.Consumer; - public interface TikTokEventBuilder { @@ -89,6 +87,9 @@ public interface TikTokEventBuilder { T onUnhandledControl(TikTokEventConsumer event); T onEvent(TikTokEventConsumer event); + + T onSuccessResponseMapping(TikTokEventConsumer event); + } diff --git a/API/src/main/java/io/github/jwdeveloper/tiktok/exceptions/TikTokLiveMessageException.java b/API/src/main/java/io/github/jwdeveloper/tiktok/exceptions/TikTokLiveMessageException.java index 18f5736..1402505 100644 --- a/API/src/main/java/io/github/jwdeveloper/tiktok/exceptions/TikTokLiveMessageException.java +++ b/API/src/main/java/io/github/jwdeveloper/tiktok/exceptions/TikTokLiveMessageException.java @@ -21,13 +21,18 @@ public class TikTokLiveMessageException extends TikTokLiveException { this.webcastResponse = webcastResponse; } - public void messageToBase64() + public String messageName() { - var decoded = Base64.getEncoder().encodeToString(webcastMessage.getBinary().toByteArray()); + return webcastMessage.getType(); } - public void webcastResponseToBase64() + public String messageToBase64() { - var decoded = Base64.getEncoder().encodeToString(webcastResponse.toByteArray()); + return Base64.getEncoder().encodeToString(webcastMessage.getBinary().toByteArray()); + } + + public String webcastResponseToBase64() + { + return Base64.getEncoder().encodeToString(webcastResponse.toByteArray()); } } diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java index a4bb012..ff62d51 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/TikTokLiveClientBuilder.java @@ -317,6 +317,12 @@ public class TikTokLiveClientBuilder implements TikTokEventBuilder event) { + tikTokEventHandler.subscribe(TikTokSuccessResponseMappingEvent.class, event); + return this; + } } diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/handlers/TikTokMessageHandler.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/handlers/TikTokMessageHandler.java index 75d932b..81fa4c9 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/handlers/TikTokMessageHandler.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/handlers/TikTokMessageHandler.java @@ -6,6 +6,7 @@ import io.github.jwdeveloper.tiktok.ClientSettings; import io.github.jwdeveloper.tiktok.TikTokLiveClient; import io.github.jwdeveloper.tiktok.events.TikTokEvent; import io.github.jwdeveloper.tiktok.events.messages.TikTokErrorEvent; +import io.github.jwdeveloper.tiktok.events.messages.TikTokSuccessResponseMappingEvent; import io.github.jwdeveloper.tiktok.events.messages.TikTokUnhandledEvent; import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveMessageException; import io.github.jwdeveloper.tiktok.exceptions.TikTokMessageMappingException; @@ -69,6 +70,7 @@ public abstract class TikTokMessageHandler { } var handler = handlers.get(message.getType()); var tiktokEvent = handler.handle(message); + tikTokEventHandler.publish(client, new TikTokSuccessResponseMappingEvent(tiktokEvent, message)); tikTokEventHandler.publish(client, tiktokEvent); } diff --git a/Client/src/main/java/io/github/jwdeveloper/tiktok/handlers/TikTokMessageHandlerRegistration.java b/Client/src/main/java/io/github/jwdeveloper/tiktok/handlers/TikTokMessageHandlerRegistration.java index 1dee12e..1cd7828 100644 --- a/Client/src/main/java/io/github/jwdeveloper/tiktok/handlers/TikTokMessageHandlerRegistration.java +++ b/Client/src/main/java/io/github/jwdeveloper/tiktok/handlers/TikTokMessageHandlerRegistration.java @@ -33,8 +33,8 @@ public class TikTokMessageHandlerRegistration extends TikTokMessageHandler { public void init() { //ConnectionEvents events - register(WebcastControlMessage.class, TikTokRoomMessageEvent.class); - register(SystemMessage.class, this::handleWebcastControlMessage); + register(WebcastControlMessage.class, this::handleWebcastControlMessage); + register(SystemMessage.class,TikTokRoomMessageEvent.class); //Room status events diff --git a/TestApplication/src/main/java/io/github/jwdeveloper/tiktok/Main.java b/TestApplication/src/main/java/io/github/jwdeveloper/tiktok/Main.java index cef0083..0e6adc0 100644 --- a/TestApplication/src/main/java/io/github/jwdeveloper/tiktok/Main.java +++ b/TestApplication/src/main/java/io/github/jwdeveloper/tiktok/Main.java @@ -7,7 +7,7 @@ import java.io.IOException; public class Main { - public static String TEST_TIKTOK_USER = "kitovskyyy"; + public static String TEST_TIKTOK_USER = "polonezgarage"; public static void main(String[] args) throws IOException { var client = TikTokLive.newClient(TEST_TIKTOK_USER) diff --git a/Tools-EventsCollector/pom.xml b/Tools-EventsCollector/pom.xml new file mode 100644 index 0000000..48bf579 --- /dev/null +++ b/Tools-EventsCollector/pom.xml @@ -0,0 +1,50 @@ + + + + TikTokLiveJava + io.github.jwdeveloper.tiktok + 0.0.14-Release + + 4.0.0 + + Tools-EventsCollector + + + 17 + 17 + + + + + + org.xerial + sqlite-jdbc + 3.34.0 + + + org.jdbi + jdbi3-core + 3.23.0 + + + org.jdbi + jdbi3-sqlobject + 3.23.0 + + + org.slf4j + slf4j-simple + 1.7.32 + + + io.github.jwdeveloper.tiktok + Client + ${project.version} + compile + + + + + \ No newline at end of file diff --git a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/Main.java b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/Main.java new file mode 100644 index 0000000..d437222 --- /dev/null +++ b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/Main.java @@ -0,0 +1,65 @@ +package io.github.jwdeveloper.tiktok.tools.collector; + +import io.github.jwdeveloper.tiktok.TikTokLive; +import io.github.jwdeveloper.tiktok.exceptions.TikTokLiveMessageException; +import io.github.jwdeveloper.tiktok.tools.collector.db.TikTokDatabase; +import io.github.jwdeveloper.tiktok.tools.collector.tables.ExceptionInfoModel; +import io.github.jwdeveloper.tiktok.tools.collector.tables.TikTokErrorModel; +import io.github.jwdeveloper.tiktok.tools.collector.tables.TikTokMessageModel; + +import java.sql.SQLException; +import java.util.Base64; + +public class Main { + + public static void main(String[] args) throws SQLException { + var tiktokUser = "mr_cios"; + var db = new TikTokDatabase("test"); + db.init(); + TikTokLive.newClient(tiktokUser) + .onWebcastResponseDebug((liveClient, event) -> + { + var eventName = event.getEvent().getClass().getSimpleName(); + var binary = Base64.getEncoder().encodeToString(event.getMessage().getBinary().toByteArray()); + var model = TikTokMessageModel.builder() + .type("message") + .hostName(tiktokUser) + .eventName(eventName) + .eventContent(binary) + .build(); + + db.insertMessage(model); + System.out.println("EVENT: " + eventName); + }) + .onError((liveClient, event) -> + { + var exception = event.getException(); + var exceptionContent = ExceptionInfoModel.getStackTraceAsString(exception); + var builder = TikTokErrorModel.builder(); + if (exception instanceof TikTokLiveMessageException ex) { + builder.hostName(tiktokUser) + .errorName(ex.messageName()) + .errorType("error-message") + .exceptionContent(exceptionContent) + .message(ex.messageToBase64()) + .response(ex.webcastResponseToBase64()); + } else { + builder.hostName(tiktokUser) + .errorName(exception.getClass().getSimpleName()) + .errorType("error-system") + .exceptionContent(exceptionContent) + .message("") + .response(""); + } + + var error = builder.build(); + db.insertError(error); + System.out.println("ERROR: "+error.getErrorName()); + exception.printStackTrace(); + + }) + .buildAndRun(); + } + + +} diff --git a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/db/SqlConsts.java b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/db/SqlConsts.java new file mode 100644 index 0000000..6bdbdd1 --- /dev/null +++ b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/db/SqlConsts.java @@ -0,0 +1,29 @@ +package io.github.jwdeveloper.tiktok.tools.collector.db; + +public class SqlConsts +{ + public static String CREATE_MESSAGES_TABLE = """ + CREATE TABLE IF NOT EXISTS TikTokMessageModel ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + hostName TEXT, + type TEXT, + eventName TEXT, + eventContent TEXT, + createdAt TEXT + ); + """; + + public static String CREATE_ERROR_TABLE = """ + CREATE TABLE IF NOT EXISTS TikTokErrorModel ( + id INT AUTO_INCREMENT PRIMARY KEY, + hostName VARCHAR(255), + errorName VARCHAR(255), + errorType VARCHAR(255), + exceptionContent TEXT, + message TEXT, + response TEXT, + createdAt DATETIME + ); + """; + +} diff --git a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/db/TikTokDatabase.java b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/db/TikTokDatabase.java new file mode 100644 index 0000000..f688d00 --- /dev/null +++ b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/db/TikTokDatabase.java @@ -0,0 +1,50 @@ +package io.github.jwdeveloper.tiktok.tools.collector.db; + +import io.github.jwdeveloper.tiktok.tools.collector.tables.TikTokErrorModel; +import io.github.jwdeveloper.tiktok.tools.collector.tables.TikTokMessageModel; +import org.jdbi.v3.core.Jdbi; +import org.jdbi.v3.sqlobject.SqlObjectPlugin; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class TikTokDatabase +{ + private final String database; + private TikTokMessageModelDAO messagesTable; + private TikTokErrorModelDAO errorTable; + + public TikTokDatabase(String database) { + this.database =database; + } + + public void init() throws SQLException { + var jdbcUrl ="jdbc:sqlite:"+database+".db"; + var connection = DriverManager.getConnection(jdbcUrl); + Jdbi jdbi = Jdbi.create(jdbcUrl) + .installPlugin(new SqlObjectPlugin()); + jdbi.useHandle(handle -> { + handle.execute(SqlConsts.CREATE_MESSAGES_TABLE); + handle.execute(SqlConsts.CREATE_ERROR_TABLE); + }); + messagesTable = jdbi.onDemand(TikTokMessageModelDAO.class); + errorTable = jdbi.onDemand(TikTokErrorModelDAO.class); + } + + public void insertMessage(TikTokMessageModel message) + { + var dateFormat = new SimpleDateFormat("dd:MM:yyyy HH:mm:ss.SSS"); + message.setCreatedAt(dateFormat.format(new Date())); + messagesTable.insertTikTokMessage(message); + } + + public void insertError(TikTokErrorModel message) + { + var dateFormat = new SimpleDateFormat("dd:MM:yyyy HH:mm:ss.SSS"); + message.setCreatedAt(dateFormat.format(new Date())); + errorTable.insertTikTokMessage(message); + } +} diff --git a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/db/TikTokErrorModelDAO.java b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/db/TikTokErrorModelDAO.java new file mode 100644 index 0000000..3bb206f --- /dev/null +++ b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/db/TikTokErrorModelDAO.java @@ -0,0 +1,13 @@ +package io.github.jwdeveloper.tiktok.tools.collector.db; + +import io.github.jwdeveloper.tiktok.tools.collector.tables.TikTokErrorModel; + +import org.jdbi.v3.sqlobject.customizer.BindBean; +import org.jdbi.v3.sqlobject.statement.SqlUpdate; + +public interface TikTokErrorModelDAO +{ + @SqlUpdate("INSERT INTO TikTokErrorModel (hostName, errorName, errorType, exceptionContent, message, response, createdAt) " + + "VALUES (:hostName, :errorName, :errorType, :exceptionContent, :message, :response, :createdAt)") + void insertTikTokMessage(@BindBean TikTokErrorModel message); +} diff --git a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/db/TikTokMessageModelDAO.java b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/db/TikTokMessageModelDAO.java new file mode 100644 index 0000000..52b130c --- /dev/null +++ b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/db/TikTokMessageModelDAO.java @@ -0,0 +1,12 @@ +package io.github.jwdeveloper.tiktok.tools.collector.db; + +import io.github.jwdeveloper.tiktok.tools.collector.tables.TikTokMessageModel; +import org.jdbi.v3.sqlobject.customizer.BindBean; +import org.jdbi.v3.sqlobject.statement.SqlUpdate; + +public interface TikTokMessageModelDAO +{ + @SqlUpdate("INSERT INTO TikTokMessageModel (hostName, eventName,type, eventContent, createdAt) " + + "VALUES (:hostName, :eventName, :type, :eventContent, :createdAt)") + void insertTikTokMessage(@BindBean TikTokMessageModel message); +} diff --git a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/tables/ExceptionInfoModel.java b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/tables/ExceptionInfoModel.java new file mode 100644 index 0000000..01a877a --- /dev/null +++ b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/tables/ExceptionInfoModel.java @@ -0,0 +1,31 @@ +package io.github.jwdeveloper.tiktok.tools.collector.tables; + +import java.io.PrintWriter; +import java.io.StringWriter; + +public class ExceptionInfoModel +{ + private String message; + private String stackTrace; + + public ExceptionInfoModel(Throwable throwable) { + this.message = throwable.getMessage(); + this.stackTrace = getStackTraceAsString(throwable); + } + + public static String getStackTraceAsString(Throwable throwable) { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + throwable.printStackTrace(pw); + return sw.toString(); + } + + // Getters for message and stackTrace + public String getMessage() { + return message; + } + + public String getStackTrace() { + return stackTrace; + } +} diff --git a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/tables/TikTokErrorModel.java b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/tables/TikTokErrorModel.java new file mode 100644 index 0000000..1c5a98f --- /dev/null +++ b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/tables/TikTokErrorModel.java @@ -0,0 +1,25 @@ +package io.github.jwdeveloper.tiktok.tools.collector.tables; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class TikTokErrorModel +{ + private Integer id; + + private String hostName; + + private String errorName; + + private String errorType; + + private String exceptionContent; + + private String message; + + private String response; + + private String createdAt; +} diff --git a/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/tables/TikTokMessageModel.java b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/tables/TikTokMessageModel.java new file mode 100644 index 0000000..f2bb335 --- /dev/null +++ b/Tools-EventsCollector/src/main/java/io/github/jwdeveloper/tiktok/tools/collector/tables/TikTokMessageModel.java @@ -0,0 +1,24 @@ +package io.github.jwdeveloper.tiktok.tools.collector.tables; + +import lombok.Builder; +import lombok.Data; + +import java.util.Date; + + +@Data +@Builder +public class TikTokMessageModel +{ + private Integer id; + + private String hostName; + + private String eventName; + + private String type; + + private String eventContent; + + private String createdAt; +} diff --git a/pom.xml b/pom.xml index a917ad6..2ddc8f2 100644 --- a/pom.xml +++ b/pom.xml @@ -13,6 +13,7 @@ Client Tools TestApplication + Tools-EventsCollector