LiveRoomInfo
    + new method getConnectionState() getting current state of connection
   + ListenersManager
     getBindingModels() renamed to getListeners()

  + Introducing documentation, each public interface got small documentation

  + New property in config .setSessionId()

  + New event: onReconnecting()

Bugs:
   CommentEvent was throwing mapping exception
This commit is contained in:
JW
2023-09-13 06:32:36 +02:00
parent bc045d49dc
commit 6e092dd362
27 changed files with 413 additions and 172 deletions

View File

@@ -72,13 +72,8 @@ jobs:
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
git add pom.xml
git add API/pom.xml
git add Client/pom.xml
git add TestApplication/pom.xml
git add Tools-EventsCollector/pom.xml
git add Tools-ReadmeGenerator/pom.xml
git add Tools/pom.xml
git add README.MD
git add pom.xml && git add '**/pom.xml'
git commit -m "Update version in pom.xml"
- name: Push changes
uses: ad-m/github-push-action@master

61
.gitignore vendored
View File

@@ -80,3 +80,64 @@ fabric.properties
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser
/.idea/.gitignore
/.idea/.name
/.idea/compiler.xml
/TestApplication/target/classes/io/github/jwdeveloper/tiktok/ConfigurationExample.class
/TestApplication/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
/TestApplication/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst
/Tools/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
/Tools/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst
/Tools-EventsCollector/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
/Tools-ReadmeGenerator/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
/Tools-ReadmeGenerator/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst
/.idea/encodings.xml
/Tools-ReadmeGenerator/target/classes/io/github/jwdeveloper/tiktok/EventsListGenerator$EventTypeComparator.class
/Tools-ReadmeGenerator/target/classes/io/github/jwdeveloper/tiktok/EventsListGenerator.class
/Tools-EventsCollector/target/classes/io/github/jwdeveloper/tiktok/tools/collector/tables/ExceptionInfoModel.class
/Tools/target/classes/io/github/jwdeveloper/tiktok/utils/FilesUtility.class
/TestApplication/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
/TestApplication/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
/Tools/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
/Tools/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
/Tools-EventsCollector/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
/Tools-ReadmeGenerator/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
/Tools-ReadmeGenerator/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
/.idea/jarRepositories.xml
/TestApplication/target/classes/io/github/jwdeveloper/tiktok/ListenerExample$CustomListener.class
/TestApplication/target/classes/io/github/jwdeveloper/tiktok/ListenerExample.class
/Tools-ReadmeGenerator/target/classes/io/github/jwdeveloper/tiktok/LiveClientMethodsGenerator.class
/TestApplication/target/classes/io/github/jwdeveloper/tiktok/Main.class
/Tools-EventsCollector/target/classes/io/github/jwdeveloper/tiktok/tools/collector/Main.class
/Tools-ReadmeGenerator/target/classes/io/github/jwdeveloper/tiktok/Main.class
/.idea/misc.xml
/Tools-ReadmeGenerator/src/main/resources/output.md
/Tools-ReadmeGenerator/target/classes/output.md
/TestApplication/target/maven-archiver/pom.properties
/Tools/target/maven-archiver/pom.properties
/Tools-EventsCollector/target/maven-archiver/pom.properties
/Tools-ReadmeGenerator/target/maven-archiver/pom.properties
/.idea/inspectionProfiles/Project_Default.xml
/Tools/target/classes/io/github/jwdeveloper/tiktok/protocol/ProtocolGenerator.class
/Tools-ReadmeGenerator/target/classes/io/github/jwdeveloper/tiktok/ReadmeGenerator.class
/TestApplication/target/classes/io/github/jwdeveloper/tiktok/SimpleExample.class
/Tools-EventsCollector/target/classes/io/github/jwdeveloper/tiktok/tools/collector/db/SqlConsts.class
/Tools-ReadmeGenerator/target/classes/template.md
/Tools/target/classes/io/github/jwdeveloper/tiktok/utils/TemplateUtility.class
/TestApplication/target/TestApplication-0.0.18-Release.jar
/TestApplication/target/TestApplication-0.0.18-Release-all.jar
/Tools-EventsCollector/target/classes/io/github/jwdeveloper/tiktok/tools/collector/db/TikTokDatabase.class
/Tools-EventsCollector/target/classes/io/github/jwdeveloper/tiktok/tools/collector/tables/TikTokErrorModel$TikTokErrorModelBuilder.class
/Tools-EventsCollector/target/classes/io/github/jwdeveloper/tiktok/tools/collector/tables/TikTokErrorModel.class
/Tools-EventsCollector/target/classes/io/github/jwdeveloper/tiktok/tools/collector/db/TikTokErrorModelDAO.class
/target/TikTokLiveJava-0.0.18-Release-all.pom
/Tools-EventsCollector/target/classes/io/github/jwdeveloper/tiktok/tools/collector/tables/TikTokMessageModel$TikTokMessageModelBuilder.class
/Tools-EventsCollector/target/classes/io/github/jwdeveloper/tiktok/tools/collector/tables/TikTokMessageModel.class
/Tools-EventsCollector/target/classes/io/github/jwdeveloper/tiktok/tools/collector/db/TikTokMessageModelDAO.class
/Tools/target/Tools-0.0.18-Release.jar
/Tools/target/Tools-0.0.18-Release-all.jar
/Tools-EventsCollector/target/Tools-EventsCollector-0.0.18-Release.jar
/Tools-EventsCollector/target/Tools-EventsCollector-0.0.18-Release-all.jar
/Tools-ReadmeGenerator/target/Tools-ReadmeGenerator-0.0.18-Release.jar
/Tools-ReadmeGenerator/target/Tools-ReadmeGenerator-0.0.18-Release-all.jar
/.idea/vcs.xml

View File

@@ -3,69 +3,75 @@ package io.github.jwdeveloper.tiktok;
import lombok.Data;
import java.time.Duration;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
@Data
public class ClientSettings {
/// <summary>
/// Timeout for Connections
/// </summary>
/**
* Timeout for Connections
*/
private Duration timeout;
// public RotatingProxy Proxy;
/// <summary>
/// ISO-Language for Client
/// </summary>
/**
* ISO-Language for Client
*/
private String clientLanguage;
/// <summary>
/// Whether to Retry if Connection Fails
/// </summary>
/**
* Whether to Retry if Connection Fails
*/
private boolean retryOnConnectionFailure;
/// <summary>
/// Wait to connect again for selected amount of time
/// </summary>
/**
* Wait to connect again for selected amount of time
*/
private Duration retryConnectionTimeout;
/// <summary>
/// Whether to handle Messages received from Room when Connecting
/// </summary>
/**
* Whether to handle Messages received from Room when Connecting
*/
private boolean handleExistingMessagesOnConnect;
/// <summary>
/// Whether to download List of Gifts for Room when Connecting
/// </summary>
/**
* Whether to download List of Gifts for Room when Connecting
*/
private boolean downloadGiftInfo;
/// <summary>
/// Whether to print Logs to Console
/// </summary>
/**
* Whether to print Logs to Console
*/
private boolean printToConsole;
/// <summary>
/// LoggingLevel for Logs
/// </summary>
/**
* LoggingLevel for Logs
*/
private Level logLevel;
/// <summary>
/// Whether to print Base64-Data for Messages to Console
/// </summary>
/**
* Whether to print Base64-Data for Messages to Console
*/
private boolean printMessageData;
/// <summary>
/// Tiktok user name
/// </summary>
/**
* Tiktok user name
*/
private String hostName;
/// <summary>
/// Parameters used in requests to tiktok api
/// </summary>
/**
* Parameters used in requests to Tiktok api
*/
private Map<String, Object> clientParameters;
/*
* Optional: Sometimes not every messages from chat are send to TikTokLiveJava to fix this issue you can set sessionId
* documentation how to obtain sessionId https://github.com/isaackogan/TikTok-Live-Connector#send-chat-messages
*/
private String sessionId;
}

View File

@@ -8,33 +8,32 @@ import java.util.logging.Level;
public class Constants {
/// <summary>
/// Web-URL for TikTok
/// </summary>
/**
* Web-URL for TikTok
*/
public static final String TIKTOK_URL_WEB = "https://www.tiktok.com/";
/// <summary>
/// WebCast-BaseURL for TikTok
/// </summary>
/**
* WebCast-BaseURL for TikTok
*/
public static final String TIKTOK_URL_WEBCAST = "https://webcast.tiktok.com/webcast/";
/// <summary>
/// Signing API by Isaac Kogan
/// https://github-wiki-see.page/m/isaackogan/TikTokLive/wiki/All-About-Signatures
/// </summary>
/**
* Signing API by Isaac Kogan
* https://github-wiki-see.page/m/isaackogan/TikTokLive/wiki/All-About-Signatures
*/
public static final String TIKTOK_SIGN_API = "https://tiktok.eulerstream.com/webcast/sign_url";
/// <summary>
/// Default TimeOut for Connections
/// </summary>
/**
* Default TimeOut for Connections
*/
public static final int DEFAULT_TIMEOUT = 20;
/// <summary>
/// Default Polling-Time for Socket-Connection
/// </summary>
/**
* Default Polling-Time for Socket-Connection
*/
public static final int DEFAULT_POLLTIME = 1;
/// <summary>
/// Default Settings for Client
/// </summary>
/**
* Default Settings for Client
*/
public static ClientSettings DefaultClientSettings() {
@@ -53,15 +52,13 @@ public class Constants {
}
/**
* Default Parameters for HTTP-Request
*/
/// <summary>
/// Default Parameters for HTTP-Request
/// </summary>
public static Map<String,Object> DefaultClientParams() {
var clientParams = new TreeMap<String,Object>();
public static Map<String, Object> DefaultClientParams() {
var clientParams = new TreeMap<String, Object>();
clientParams.put("aid", 1988);
clientParams.put("app_language", "en-US");
clientParams.put("app_name", "tiktok_web");
@@ -100,11 +97,11 @@ public class Constants {
}
/// <summary>
/// Default Headers for HTTP-Request
/// </summary>
public static Map<String,String> DefaultRequestHeaders() {
var headers = new HashMap<String,String>();
/**
* Default Headers for HTTP-Request
*/
public static Map<String, String> DefaultRequestHeaders() {
var headers = new HashMap<String, String>();
headers.put("Connection", "keep-alive");
headers.put("Cache-Control", "max-age=0");

View File

@@ -7,7 +7,6 @@ import io.github.jwdeveloper.tiktok.events.objects.Picture;
import io.github.jwdeveloper.tiktok.events.objects.User;
import io.github.jwdeveloper.tiktok.messages.WebcastChatMessage;
import io.github.jwdeveloper.tiktok.messages.WebcastRoomPinMessage;
import lombok.Getter;
import lombok.Value;
import java.util.ArrayList;
@@ -16,11 +15,11 @@ import java.util.List;
@Value
@EventMeta(eventType = EventType.Message)
public class TikTokCommentEvent extends TikTokHeaderEvent {
User user;
String text;
String language;
List<User> mentionedUsers;
List<Picture> pictures;
User user;
String text;
String language;
List<User> mentionedUsers;
List<Picture> pictures;
public TikTokCommentEvent(WebcastRoomPinMessage.RoomPinMessageData data) {
super(data.getDetails().getRoomId(), data.getDetails().getMessageId(), data.getDetails().getServerTime());
@@ -32,11 +31,11 @@ public class TikTokCommentEvent extends TikTokHeaderEvent {
}
public TikTokCommentEvent(WebcastChatMessage msg) {
super(msg.getHeader());
user = User.MapOrEmpty(msg.getSender());
text = msg.getComment();
language = msg.getLanguage();
mentionedUsers = msg.getMentionedUsersList().stream().map(User::new).toList();
pictures = msg.getImagesList().stream().map(e -> new Picture(e.getImage())).toList();
super(msg.getCommon());
user = User.MapOrEmpty(msg.getUser());
text = msg.getContent();
language = msg.getContentLanguage();
mentionedUsers = List.of(User.MapOrEmpty(msg.getAtUser()));
pictures = msg.getEmotesListList().stream().map(e -> new Picture(e.getEmote().getImage())).toList();
}
}

View File

@@ -12,7 +12,6 @@ import lombok.Getter;
@EventMeta(eventType = EventType.Custom)
public class TikTokJoinEvent extends TikTokHeaderEvent {
private User user;
private final Long totalViewers;
public TikTokJoinEvent(WebcastSocialMessage msg) {

View File

@@ -2,9 +2,15 @@ package io.github.jwdeveloper.tiktok.listener;
import java.util.List;
/**
* You can dynamically add or removing TikTokEventListener
*
* @see TikTokEventListener
*
*/
public interface ListenersManager
{
List<TikTokEventListener> getBindingModels();
List<TikTokEventListener> getListeners();
void addListener(TikTokEventListener listener);
void removeListener(TikTokEventListener listener);

View File

@@ -1,5 +1,51 @@
package io.github.jwdeveloper.tiktok.listener;
/**
*
* @see ListenersManager
*
* TikTokEventListener is an alternative way of handing TikTok events.
*
* TikTokLive.newClient("someuser").addListener(listener)
*
* After registertion all listeners are kept in Listener manager
* that could be obtained by client.getListenerManager();
*
* Method in TikTokEventListener should meet 4 requirements to be detected
* - must have @TikTokEventHandler annotation
* - must have 2 parameters
* - first parameter must be LiveClient
* - second must be class that extending TikTokEvent
*
* public static class CustomListener implements TikTokEventListener
* {
* @TikTokEventHandler
* public void onError(LiveClient liveClient, TikTokErrorEvent event)
* {
* System.out.println(event.getException().getMessage());
* }
*
* @TikTokEventHandler
* public void onCommentMessage(LiveClient liveClient, TikTokCommentEvent event)
* {
* System.out.println(event.getText());
* }
*
* @TikTokEventHandler
* public void onGiftMessage(LiveClient liveClient, TikTokGiftMessageEvent event)
* {
* System.out.println(event.getGift().getDescription());
* }
*
* @TikTokEventHandler
* public void onAnyEvent(LiveClient liveClient, TikTokEvent event)
* {
* System.out.println(event.getClass().getSimpleName());
* }
* }
*
*/
public interface TikTokEventListener
{

View File

@@ -6,9 +6,25 @@ import io.github.jwdeveloper.tiktok.models.gifts.TikTokGiftInfo;
import java.util.Map;
public interface GiftManager
{
Map<Integer, TikTokGiftInfo> getGiftsInfo();
public interface GiftManager {
Map<GiftId, TikTokGift> getActiveGifts();
/**
* Meta information about all TikTok available gifts such as, name, id, description, cost, etc
* TikTokGiftInfos are downloaded only if `clientSettings.setDownloadGiftInfo(true);`
*
* @return map of metainformations about gitfts where Integer is Gift Id and TikTokGiftInfo is gift data
* @see TikTokGiftInfo
*/
Map<Integer, TikTokGiftInfo> getGiftsInfo();
/**
* Active Gifts are updated after TikTokGiftMessageEvent. This map contains gifts that
* recently send to host and have active strike
*
* @return map of active gifts
* @see TikTokGift
* @see io.github.jwdeveloper.tiktok.events.messages.TikTokGiftMessageEvent
*/
Map<GiftId, TikTokGift> getActiveGifts();
}

View File

@@ -1,19 +1,34 @@
package io.github.jwdeveloper.tiktok.live;
import io.github.jwdeveloper.tiktok.listener.ListenersManager;
import io.github.jwdeveloper.tiktok.listener.TikTokEventListener;
public interface LiveClient {
// Connects to the live stream.
/**
* Connects to the live stream.
*/
void connect();
// Disconnects the connection.
/**
* Disconnects the connection.
*/
void disconnect();
// Gets the meta information about all gifts.
/**
* Get information about gifts
*/
GiftManager getGiftManager();
// Gets the current room info from TikTok API including streamer info, room status and statistics.
/**
* Gets the current room info from TikTok API including streamer info, room status and statistics.
*/
LiveRoomInfo getRoomInfo();
/**
* Manage TikTokEventListener
* @see TikTokEventListener
*/
ListenersManager getListenersManager();
}

View File

@@ -5,4 +5,5 @@ public interface LiveRoomInfo
int getViewersCount();
String getRoomId();
String getUserName();
ConnectionState getConnectionState();
}

View File

@@ -1348,19 +1348,57 @@ message ModerationData {
// Comment sent by User
message WebcastChatMessage {
MessageHeader header = 1;
User sender = 2; // User who sent message
string comment = 3; // Text for Chat-Message
uint64 data1 = 11;
repeated User mentionedUsers = 12; // Users mentioned in comment
repeated ChatImage images = 13;
string language = 14; // Language for sender
DataContainer chatData = 18;
repeated ModerationData moderationData = 19;
Common common = 1;
User user = 2;
string content = 3;
bool visibleToSender = 4;
Image backgroundImage = 5;
string fullScreenTextColor = 6;
Image backgroundImageV2 = 7;
Image giftImage = 10;
int32 inputType = 11;
User atUser = 12;
repeated EmoteWithIndex emotesList = 13;
string contentLanguage = 14;
int32 quickChatScene = 16;
int32 communityFlaggedStatus = 17;
message ChatImage {
uint64 data1 = 1;
Image Image = 2;
// @EmoteWithIndex
// proto.webcast.im.ChatMessage
// C:\Users\ja\RiderProjects\TikTokProBufferGenerator\Application\output\sources\test.js
message EmoteWithIndex {
int64 index = 1;
Emote emote = 2;
}
message Emote {
string emoteId = 1;
Image image = 2;
AuditStatus auditStatus = 3; // Enum
string uuid = 4;
EmoteType emoteType = 5; // Enum
ContentSource contentSource = 6; // Enum
EmotePrivateType emotePrivateType = 7; // Enum
}
enum AuditStatus {
AUDITSTATUSUNKNOWN = 0;
AUDITSTATUSPASS = 1;
AUDITSTATUSFAILED = 2;
AUDITSTATUSREVIEWING = 3;
AUDITSTATUSFORBIDDEN = 4;
}
enum EmoteType {
EMOTETYPENORMAL = 0;
EMOTETYPEWITHSTICKER = 1;
}
enum ContentSource {
CONTENTSOURCEUNKNOWN = 0;
CONTENTSOURCENORMAL = 1;
CONTENTSOURCECAMERA = 2;
}
enum EmotePrivateType {
EMOTE_PRIVATE_TYPE_NORMAL = 0;
EMOTE_PRIVATE_TYPE_SUB_WAVE = 1;
}
}

View File

@@ -14,6 +14,7 @@ public class TikTokGiftManager implements GiftManager {
@Getter
private final Map<Integer, TikTokGiftInfo> giftsInfo;
@Getter
private final Map<GiftId, TikTokGift> activeGifts;

View File

@@ -108,12 +108,11 @@ public class TikTokMessageHandlerRegistration extends TikTokMessageHandler {
if (matcher.find())
{
var value = matcher.group(0);
var value = matcher.group(1);
var number = Integer.parseInt(value);
return new TikTokShareEvent(message, number);
}
return switch (socialType) {
case SocialTypes.LikeType -> new TikTokLikeEvent(message);
case SocialTypes.FollowType -> new TikTokFollowEvent(message);

View File

@@ -24,7 +24,7 @@ public class TikTokListenersManager implements ListenersManager {
@Override
public List<TikTokEventListener> getBindingModels() {
public List<TikTokEventListener> getListeners() {
return bindingModels.stream().map(ListenerBindingModel::getListener).toList();
}

3
FUNDING.yml Normal file
View File

@@ -0,0 +1,3 @@
github: [jwdeveloper]
patreon: jwdeveloper
custom: ["https://www.buymeacoffee.com/jwdev"]

View File

@@ -5,6 +5,7 @@ import io.github.jwdeveloper.tiktok.events.TikTokEvent;
import io.github.jwdeveloper.tiktok.events.messages.TikTokCommentEvent;
import io.github.jwdeveloper.tiktok.events.messages.TikTokErrorEvent;
import io.github.jwdeveloper.tiktok.events.messages.TikTokGiftMessageEvent;
import io.github.jwdeveloper.tiktok.events.messages.TikTokLikeEvent;
import io.github.jwdeveloper.tiktok.listener.TikTokEventListener;
import io.github.jwdeveloper.tiktok.live.LiveClient;
@@ -34,6 +35,11 @@ public class ListenerExample
public static class CustomListener implements TikTokEventListener
{
@TikTokEventHandler
public void onLike(LiveClient liveClient, TikTokLikeEvent event)
{
System.out.println(event.toString());
}
@TikTokEventHandler
public void onError(LiveClient liveClient, TikTokErrorEvent event)

View File

@@ -17,6 +17,7 @@ public class Main {
{
clientSettings.setRetryConnectionTimeout(Duration.ofSeconds(5));
clientSettings.setRetryOnConnectionFailure(true);
clientSettings.setDownloadGiftInfo(true);
})
.onConnected(Main::onConnected)
.onDisconnected(Main::onDisconnected)
@@ -29,10 +30,6 @@ public class Main {
.onLike(Main::onLike)
.onGiftMessage(Main::onGiftMessage)
.onEmote(Main::onEmote)
.onEvent((liveClient, event) ->
{
})
.onError((_client, error) ->
{
error.getException().printStackTrace();

View File

@@ -1,7 +1,6 @@
package io.github.jwdeveloper.tiktok.tools.collector;
import io.github.jwdeveloper.tiktok.TikTokLive;
import io.github.jwdeveloper.tiktok.events.objects.Badge;
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;
@@ -13,9 +12,10 @@ import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
public class Main {
public class RunCollector {
//https://protobuf-decoder.netlify.app/
//https://streamdps.com/tiktok-widgets/gifts/
/*
mia_tattoo
moniczkka
@@ -25,8 +25,6 @@ public class Main {
public static List<String> ignoredEvents;
public static void main(String[] args) throws SQLException {
ignoredEvents = new ArrayList<>();
//ignoredEvents = List.of("TikTokJoinEvent","TikTokLikeEvent");
@@ -34,27 +32,26 @@ public class Main {
var db = new TikTokDatabase("test");
db.init();
var errors = db.selectErrors();
var users = new ArrayList<String>();
// users.add("mia_tattoo");
// users.add("moniczkka");
// users.add("besin1276");
users.add("jackwoln");
for(var user : users)
{
// users.add("mia_tattoo");
// users.add("moniczkka");
// users.add("besin1276");
users.add("evequinte96");
for (var user : users) {
runTikTokLiveInstance(user, db);
}
}
private static void runTikTokLiveInstance(String tiktokUser, TikTokDatabase tikTokDatabase)
{
private static void runTikTokLiveInstance(String tiktokUser, TikTokDatabase tikTokDatabase) {
TikTokLive.newClient(tiktokUser)
.onWebsocketMessage((liveClient, event) ->
{
var eventName = event.getEvent().getClass().getSimpleName();
if(ignoredEvents.contains(eventName))
{
if (ignoredEvents.contains(eventName)) {
return;
}
@@ -67,32 +64,32 @@ public class Main {
.build();
tikTokDatabase.insertMessage(model);
System.out.println("EVENT: ["+tiktokUser+"] " + eventName);
System.out.println("EVENT: [" + tiktokUser + "] " + eventName);
})
.onError((liveClient, event) ->
{
var exception = event.getException();
var exceptionContent = ExceptionInfoModel.getStackTraceAsString(exception);
var builder = TikTokErrorModel.builder();
var errorModel = new TikTokErrorModel();
if (exception instanceof TikTokLiveMessageException ex) {
builder.hostName(tiktokUser)
.errorName(ex.messageName())
.errorType("error-message")
.exceptionContent(exceptionContent)
.message(ex.messageToBase64())
.response(ex.webcastResponseToBase64());
errorModel.setHostName(tiktokUser);
errorModel.setErrorName(ex.messageName());
errorModel.setErrorType("error-message");
errorModel.setExceptionContent(exceptionContent);
errorModel.setMessage(ex.messageToBase64());
errorModel.setResponse(ex.webcastResponseToBase64());
} else {
builder.hostName(tiktokUser)
.errorName(exception.getClass().getSimpleName())
.errorType("error-system")
.exceptionContent(exceptionContent)
.message("")
.response("");
errorModel.setHostName(tiktokUser);
errorModel.setErrorName(exception.getClass().getSimpleName());
errorModel.setErrorType("error-system");
errorModel.setExceptionContent(exceptionContent);
errorModel.setMessage("");
errorModel.setResponse("");
}
var error = builder.build();
tikTokDatabase.insertError(error);
System.out.println("ERROR: "+error.getErrorName());
tikTokDatabase.insertError(errorModel);
System.out.println("ERROR: " + errorModel.getErrorName());
exception.printStackTrace();
})

View File

@@ -5,11 +5,11 @@ 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;
import java.util.List;
public class TikTokDatabase
{
@@ -24,12 +24,13 @@ public class TikTokDatabase
public void init() throws SQLException {
var jdbcUrl ="jdbc:sqlite:"+database+".db";
var connection = DriverManager.getConnection(jdbcUrl);
Jdbi jdbi = Jdbi.create(jdbcUrl)
var jdbi = Jdbi.create(jdbcUrl)
.installPlugin(new SqlObjectPlugin());
jdbi.useHandle(handle -> {
handle.execute(SqlConsts.CREATE_MESSAGES_TABLE);
handle.execute(SqlConsts.CREATE_ERROR_TABLE);
});
// jdbi.registerRowMapper(new TikTokErrorModelMapper());
messagesTable = jdbi.onDemand(TikTokMessageModelDAO.class);
errorTable = jdbi.onDemand(TikTokErrorModelDAO.class);
}
@@ -47,4 +48,9 @@ public class TikTokDatabase
message.setCreatedAt(dateFormat.format(new Date()));
errorTable.insertTikTokMessage(message);
}
public List<TikTokErrorModel> selectErrors()
{
return errorTable.selectErrors();
}
}

View File

@@ -2,12 +2,21 @@ package io.github.jwdeveloper.tiktok.tools.collector.db;
import io.github.jwdeveloper.tiktok.tools.collector.tables.TikTokErrorModel;
import org.jdbi.v3.sqlobject.config.RegisterBeanMapper;
import org.jdbi.v3.sqlobject.customizer.BindBean;
import org.jdbi.v3.sqlobject.statement.SqlQuery;
import org.jdbi.v3.sqlobject.statement.SqlUpdate;
import java.util.List;
@RegisterBeanMapper(TikTokErrorModel.class)
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);
@SqlQuery("SELECT * FROM TikTokErrorModel")
List<TikTokErrorModel> selectErrors();
}

View File

@@ -1,10 +1,8 @@
package io.github.jwdeveloper.tiktok.tools.collector.tables;
import lombok.Builder;
import lombok.Data;
@Data
@Builder
public class TikTokErrorModel
{
private Integer id;

View File

@@ -3,8 +3,6 @@ package io.github.jwdeveloper.tiktok.tools.collector.tables;
import lombok.Builder;
import lombok.Data;
import java.util.Date;
@Data
@Builder

View File

@@ -0,0 +1,51 @@
package io.github.jwdeveloper.tiktok.tools.tester;
import com.google.protobuf.InvalidProtocolBufferException;
import io.github.jwdeveloper.tiktok.ClientSettings;
import io.github.jwdeveloper.tiktok.TikTokGiftManager;
import io.github.jwdeveloper.tiktok.TikTokRoomInfo;
import io.github.jwdeveloper.tiktok.events.messages.TikTokErrorEvent;
import io.github.jwdeveloper.tiktok.handlers.TikTokEventObserver;
import io.github.jwdeveloper.tiktok.handlers.TikTokMessageHandlerRegistration;
import io.github.jwdeveloper.tiktok.messages.WebcastResponse;
import io.github.jwdeveloper.tiktok.tools.collector.db.TikTokDatabase;
import java.sql.SQLException;
import java.util.Base64;
import java.util.logging.Logger;
public class RunTester {
public static void main(String[] args) throws SQLException, InvalidProtocolBufferException {
var db = new TikTokDatabase("test");
db.init();
var errors = db.selectErrors();
var handler = getMessageHandler();
for (var error : errors) {
var bytes = Base64.getDecoder().decode(error.getResponse());
var response = WebcastResponse.parseFrom(bytes);
handler.handle(null,response);
}
}
public static TikTokMessageHandlerRegistration getMessageHandler()
{
var observer = new TikTokEventObserver();
observer.<TikTokErrorEvent>subscribe(TikTokErrorEvent.class,(liveClient, event) ->
{
event.getException().printStackTrace();
});
var settings = new ClientSettings();
//settings.setPrintMessageData(true);
var logger = Logger.getGlobal();
var roomInfo = new TikTokRoomInfo();
var manager = new TikTokGiftManager();
return new TikTokMessageHandlerRegistration(observer,settings,logger,manager,roomInfo);
}
}

View File

@@ -10,7 +10,12 @@
<modelVersion>4.0.0</modelVersion>
<artifactId>Tools-ReadmeGenerator</artifactId>
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<properties>
<maven.compiler.source>16</maven.compiler.source>
<maven.compiler.target>16</maven.compiler.target>
@@ -24,5 +29,11 @@
<version>${project.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.github.jwdeveloper.Descrabble</groupId>
<artifactId>Descrabble-Full</artifactId>
<version>0.0.7-Release</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>

View File

@@ -14,10 +14,7 @@ public class ReadmeGenerator
var template = FilesUtility.getFileFromResource(Main.class,"template.md");
var variables = new HashMap<String,Object>();
var pomPath = "C:\\Users\\ja\\IdeaProjects\\TikTokLiveJava\\Tools-ReadmeGenerator\\pom.xml";
variables.put("version", getCurrentVersion(pomPath));
variables.put("version", getCurrentVersion());
var exampleCodePath = "C:\\Users\\ja\\IdeaProjects\\TikTokLiveJava\\TestApplication\\src\\main\\java\\io\\github\\jwdeveloper\\tiktok\\SimpleExample.java";
variables.put("Code-Example", getCodeExample(exampleCodePath));
@@ -39,23 +36,11 @@ public class ReadmeGenerator
FilesUtility.saveFile(outputPath, template);
}
public String getCurrentVersion(String path)
public String getCurrentVersion()
{
var content = FilesUtility.loadFileContent(path);
var pattern = "<version>(.*?)<\\/version>";
var version = System.getenv("version");;
// Create a Pattern object
var regex = Pattern.compile(pattern);
// Create a Matcher object
var matcher = regex.matcher(content);
// Find the first match
if (matcher.find()) {
// Extract and print the version
return matcher.group(1);
}
return "VERSION NOT FOUND";
return version == null?"NOT_FOUND":version;
}
public String getCodeExample(String path)

View File

@@ -48,6 +48,7 @@
<artifactId>maven-shade-plugin</artifactId>
<version>3.5.0</version> <!-- Use the latest version -->
<executions>
<execution>
<phase>package</phase>
<goals>