format, use logging properly, restrict runtime.log to 5mb, bump versions, update framework

This commit is contained in:
Sticks 2025-04-11 22:41:09 -04:00
parent add21253c7
commit ba25e5d485
12 changed files with 3136 additions and 2011 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "fanslysync-desktop", "name": "fanslysync-desktop",
"version": "0.1.6", "version": "0.1.7",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "vite dev", "dev": "vite dev",
@ -17,7 +17,7 @@
"@sveltejs/adapter-static": "^3.0.5", "@sveltejs/adapter-static": "^3.0.5",
"@sveltejs/kit": "^2.6.1", "@sveltejs/kit": "^2.6.1",
"@sveltejs/vite-plugin-svelte": "^3.1.2", "@sveltejs/vite-plugin-svelte": "^3.1.2",
"@tauri-apps/cli": "^2.1.0", "@tauri-apps/cli": "^2.4.1",
"@types/eslint": "^9.6.1", "@types/eslint": "^9.6.1",
"autoprefixer": "^10.4.20", "autoprefixer": "^10.4.20",
"eslint": "^9.12.0", "eslint": "^9.12.0",

2383
src-tauri/Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -17,18 +17,19 @@ tauri-build = { version = "2.0.0", features = [] }
[dependencies] [dependencies]
serde_json = "1.0" serde_json = "1.0"
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
tauri = { version = "2.0.0-rc.2", features = [] } tauri = { version = "2.4.1", features = [] }
dirs = "5.0.1" dirs = "5.0.1"
reqwest = { version = "0.11.18", features = ["json"] } reqwest = { version = "0.11.18", features = ["json", "multipart"] }
lazy_static = "1.5.0" lazy_static = "1.5.0"
tokio = { version = "1.29.1", features = ["full"] } tokio = { version = "1.29.1", features = ["full"] }
tokio-macros = "2.3.0" tokio-macros = "2.3.0"
tauri-plugin-os = { version = "2.0.0" } tauri-plugin-os = { version = "2.2.1" }
tauri-plugin-dialog = { version = "2.0.0" } tauri-plugin-dialog = { version = "2.2.1" }
tauri-plugin-clipboard-manager = { version = "2.0.0" } tauri-plugin-clipboard-manager = { version = "2.2.1" }
tauri-plugin-notification = { version = "2.0.0" } tauri-plugin-notification = { version = "2.2.1" }
tauri-plugin-updater = { version = "2.0.0" } tauri-plugin-updater = { version = "2.2.1" }
tauri-plugin-log = { version = "2.0.0" } tauri-plugin-log = { version = "2.2.1" }
log = "0.4.27"
[features] [features]
# this feature is used for production builds or when `devPath` points to the filesystem and the built-in dev server is disabled. # this feature is used for production builds or when `devPath` points to the filesystem and the built-in dev server is disabled.
@ -37,4 +38,4 @@ tauri-plugin-log = { version = "2.0.0" }
custom-protocol = [ "tauri/custom-protocol" ] custom-protocol = [ "tauri/custom-protocol" ]
[target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies] [target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies]
tauri-plugin-autostart = "2.0.0" tauri-plugin-autostart = "2.3.0"

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -2,16 +2,16 @@ use crate::handlers::config::{get_config_path, Config};
#[tauri::command] #[tauri::command]
pub fn init_config() -> Result<(), String> { pub fn init_config() -> Result<(), String> {
println!("[commands::config::init_config] Initializing config..."); log::info!("[commands::config::init_config] Initializing config...");
let config_path = get_config_path().map_err(|e| e.to_string())?; let config_path = get_config_path().map_err(|e| e.to_string())?;
println!( log::info!(
"[commands::config::init_config] Config path: {}", "[commands::config::init_config] Config path: {}",
config_path.display() config_path.display()
); );
Config::load_or_create(&config_path).map_err(|e| e.to_string())?; Config::load_or_create(&config_path).map_err(|e| e.to_string())?;
println!("[commands::config::init_config] Config initialized successfully"); log::info!("[commands::config::init_config] Config initialized successfully");
Ok(()) Ok(())
} }
@ -20,7 +20,7 @@ pub fn get_config() -> Result<Config, String> {
let config_path = get_config_path().map_err(|e| e.to_string())?; let config_path = get_config_path().map_err(|e| e.to_string())?;
let config = Config::load_or_create(&config_path).map_err(|e| e.to_string())?; let config = Config::load_or_create(&config_path).map_err(|e| e.to_string())?;
println!( log::info!(
"[commands::config::get_config] Config loaded successfully: {:?} from path: {}", "[commands::config::get_config] Config loaded successfully: {:?} from path: {}",
config, config,
config_path.display() config_path.display()
@ -32,7 +32,7 @@ pub fn get_config() -> Result<Config, String> {
#[tauri::command] #[tauri::command]
pub fn save_config(config: Config) -> Result<(), String> { pub fn save_config(config: Config) -> Result<(), String> {
let config_path = get_config_path().map_err(|e| e.to_string())?; let config_path = get_config_path().map_err(|e| e.to_string())?;
println!( log::info!(
"[commands::config::save_config] Saving config: {:?} to path: {}", "[commands::config::save_config] Saving config: {:?} to path: {}",
config, config,
config_path.display() config_path.display()

View File

@ -55,15 +55,15 @@ impl Config {
let config_raw = std::fs::read_to_string(path)?; let config_raw = std::fs::read_to_string(path)?;
let config_json: serde_json::Value = serde_json::from_str(&config_raw)?; let config_json: serde_json::Value = serde_json::from_str(&config_raw)?;
println!("[config::migrate] Migrating config file to latest version..."); log::info!("[config::migrate] Migrating config file to latest version...");
println!( log::debug!(
"[config::migrate] [DEBUG] config is_object: {}", "[config::migrate] [DEBUG] config is_object: {}",
config_json.is_object() config_json.is_object()
); );
// Check if the JSON object is valid, if not, return an error // Check if the JSON object is valid, if not, return an error
if !config_json.is_object() { if !config_json.is_object() {
println!( log::error!(
"[config::migrate] [ERROR] Found invalid JSON object in config file" "[config::migrate] [ERROR] Found invalid JSON object in config file"
); );
return Err(io::Error::new( return Err(io::Error::new(
@ -77,7 +77,7 @@ impl Config {
// Check if the version field is a valid integer, if not, return an error // Check if the version field is a valid integer, if not, return an error
if version == 0 { if version == 0 {
println!( log::error!(
"[config::migrate] [ERROR] Found invalid version field in config JSON" "[config::migrate] [ERROR] Found invalid version field in config JSON"
); );
return Err(io::Error::new( return Err(io::Error::new(
@ -86,7 +86,7 @@ impl Config {
)); ));
} }
println!( log::info!(
"[config::migrate] Found version field in config JSON: {}", "[config::migrate] Found version field in config JSON: {}",
version version
); );
@ -110,7 +110,7 @@ impl Config {
config = config.migrate()?; config = config.migrate()?;
config.save(path)?; config.save(path)?;
println!( log::info!(
"[config::migrate] Successfully migrated config file to latest version" "[config::migrate] Successfully migrated config file to latest version"
); );
// Recursively call load_or_create to load the migrated config // Recursively call load_or_create to load the migrated config

View File

@ -154,15 +154,16 @@ impl Fansly {
let response = self.client.get(url).headers(headers).send().await?; let response = self.client.get(url).headers(headers).send().await?;
if !response.status().is_success() { if !response.status().is_success() {
eprintln!("[fanslySyncExt] No successful response from API. Setting error state."); log::error!("[sync::process::fetch_subscribers] No successful response from API. Setting error state.");
let error = response.error_for_status().unwrap_err(); let error = response.error_for_status().unwrap_err();
return Err(error); return Err(error);
} }
let subscriptions: FanslyBaseResponse<FanslySubscriptionsResponse> = let subscriptions: FanslyBaseResponse<FanslySubscriptionsResponse> =
response.json().await?; response.json().await?;
println!(
"[fanslySyncExt] Got {} subscriptions from API.", log::info!(
"[sync::process::fetch_subscribers] Got {} subscribers from API.",
subscriptions.response.subscriptions.len() subscriptions.response.subscriptions.len()
); );
@ -170,32 +171,37 @@ impl Fansly {
} }
async fn upload_sync_data(&self, data: SyncDataResponse) -> Result<String, reqwest::Error> { async fn upload_sync_data(&self, data: SyncDataResponse) -> Result<String, reqwest::Error> {
let url = "https://paste.hep.gg/documents"; let url = "https://paste.fanslycreatorbot.com";
// Set our content type to application/json // Convert passed data to bytes
let mut headers = reqwest::header::HeaderMap::new(); let json_string = serde_json::to_string(&data).unwrap();
headers.insert( let data_as_bytes = json_string.as_bytes();
reqwest::header::CONTENT_TYPE,
"application/json".parse().unwrap(), let form = reqwest::multipart::Form::new()
.part(
"file",
reqwest::multipart::Part::bytes(data_as_bytes.to_vec())
.file_name("sync_data.json")
.mime_str("application/json")?,
); );
// Create a new client and POST
let response = self let response = self
.client .client
.post(url) .post(url)
.headers(headers) .multipart(form)
.json(&data)
.send() .send()
.await?; .await?;
if !response.status().is_success() { if !response.status().is_success() {
eprintln!("[sync::process::upload_sync_data] Failed to upload sync data."); log::error!("Failed to upload sync data...");
log::info!("Response: {:?}", response);
return Err(response.error_for_status().unwrap_err()); return Err(response.error_for_status().unwrap_err());
} }
let json: serde_json::Value = response.json().await?; let reply = response.text().await?;
let key = json["key"].as_str().unwrap(); log::info!("Uploaded sync data successfully. Response: {}", reply);
Ok(reply)
Ok(format!("https://paste.hep.gg/{}", key))
} }
pub async fn upload_auto_sync_data( pub async fn upload_auto_sync_data(
@ -224,10 +230,12 @@ impl Fansly {
.await?; .await?;
if !response.status().is_success() { if !response.status().is_success() {
eprintln!("[sync::process::upload_auto_sync_data] Failed to upload sync data."); log::error!("Failed to upload sync data...");
log::info!("Response: {:?}", response);
return Err(response.error_for_status().unwrap_err()); return Err(response.error_for_status().unwrap_err());
} }
log::info!("Uploaded sync data successfully.");
Ok(()) Ok(())
} }
@ -253,7 +261,8 @@ impl Fansly {
match response { match response {
Ok(response) => { Ok(response) => {
if !response.status().is_success() { if !response.status().is_success() {
eprintln!("[sync::process::check_sync_token] Failed to check sync token."); log::error!("Failed to check sync token...");
log::info!("Response: {:?}", response);
return Err(response.error_for_status().unwrap_err()); return Err(response.error_for_status().unwrap_err());
} }
@ -266,34 +275,32 @@ impl Fansly {
pub async fn sync(&self, auto: bool) -> Result<SyncDataResponse, String> { pub async fn sync(&self, auto: bool) -> Result<SyncDataResponse, String> {
// Fetch profile // Fetch profile
println!("[sync::process] Fetching profile..."); log::info!("[sync::process] Fetching profile...");
let profile = self.get_profile().await.map_err(|e| e.to_string())?; let profile = self.get_profile().await.map_err(|e| e.to_string())?;
if !profile.success { if !profile.success {
return Err("Failed to fetch profile".to_string()); return Err("Failed to fetch profile".to_string());
} }
println!("[sync::process] Profile retrieved successfully."); log::info!("[sync::process] Syncing profile...");
let account = profile.response.account; let account = profile.response.account;
let total_followers = account.follow_count; let total_followers = account.follow_count;
let total_subscribers = account.subscriber_count; let total_subscribers = account.subscriber_count;
println!( log::info!("[sync::process] Account ID: {}, Followers: {}, Subscribers: {}",
"[sync::process] Account {} has {} followers and {} subscribers. Starting sync...", account.id, total_followers, total_subscribers);
account.id, total_followers, total_subscribers
);
let mut followers: Vec<FanslyFollowersResponse> = Vec::new(); let mut followers: Vec<FanslyFollowersResponse> = Vec::new();
let mut subscribers: Vec<Subscription> = Vec::new(); let mut subscribers: Vec<Subscription> = Vec::new();
println!("[sync::process] Fetching followers and subscribers..."); log::info!("[sync::process] Fetching followers...");
// Fetch followers until we have all of them // Fetch followers until we have all of them
let mut offset = 0; let mut offset = 0;
let mut total_requests = 0; let mut total_requests = 0;
while followers.len() < total_followers as usize { while followers.len() < total_followers as usize {
println!( log::info!(
"[sync::process] Fetching followers for account {} with offset {} (total: {})", "[sync::process] Fetching followers for account {} with offset {} (total: {})",
account.id, offset, total_followers account.id, offset, total_followers
); );
@ -302,7 +309,7 @@ impl Fansly {
.await .await
.map_err(|e| e.to_string())?; .map_err(|e| e.to_string())?;
println!( log::info!(
"[sync::process] Got {} followers from API.", "[sync::process] Got {} followers from API.",
response.response.len() response.response.len()
); );
@ -319,7 +326,7 @@ impl Fansly {
// Fetch subscribers until we have all of them // Fetch subscribers until we have all of them
offset = 0; offset = 0;
while subscribers.len() < total_subscribers as usize { while subscribers.len() < total_subscribers as usize {
println!( log::info!(
"[sync::process] Fetching subscribers with offset {} for account {} (total: {})", "[sync::process] Fetching subscribers with offset {} for account {} (total: {})",
offset, account.id, total_subscribers offset, account.id, total_subscribers
); );
@ -339,14 +346,14 @@ impl Fansly {
} }
} }
println!( log::info!(
"[sync::process] Got {} followers and {} subscribers from API.", "[sync::process] Got {} followers and {} subscribers from API.",
followers.len(), followers.len(),
subscribers.len() subscribers.len()
); );
println!("[sync::process] Sync complete."); log::info!("[sync::process] Sync complete.");
println!("[sync::process] Uploading sync data to paste.hep.gg for processing..."); log::info!("[sync::process] Uploading sync data to paste.hep.gg for processing...");
// Upload sync data to paste.hep.gg // Upload sync data to paste.hep.gg
if !auto { if !auto {

View File

@ -39,7 +39,6 @@ async fn main() {
MacosLauncher::LaunchAgent, MacosLauncher::LaunchAgent,
None, None,
)) ))
.plugin(tauri_plugin_log::Builder::new().build())
.plugin(tauri_plugin_notification::init()) .plugin(tauri_plugin_notification::init())
.plugin(tauri_plugin_clipboard_manager::init()) .plugin(tauri_plugin_clipboard_manager::init())
.plugin(tauri_plugin_dialog::init()) .plugin(tauri_plugin_dialog::init())
@ -54,6 +53,8 @@ async fn main() {
}), }),
Target::new(TargetKind::Webview), Target::new(TargetKind::Webview),
]) ])
.rotation_strategy(tauri_plugin_log::RotationStrategy::KeepOne)
.max_file_size(1024 * 1024 * 5)
.build(), .build(),
) )
.invoke_handler(tauri::generate_handler![ .invoke_handler(tauri::generate_handler![

View File

@ -107,7 +107,6 @@ pub struct Account {
pub post_likes: i64, pub post_likes: i64,
pub streaming: Streaming, pub streaming: Streaming,
pub account_media_likes: i64, pub account_media_likes: i64,
pub earnings_wallet: EarningsWallet,
pub subscription_tiers: Vec<SubscriptionTier>, pub subscription_tiers: Vec<SubscriptionTier>,
pub profile_access: bool, pub profile_access: bool,
} }
@ -156,18 +155,6 @@ pub struct Streaming {
pub enabled: bool, pub enabled: bool,
} }
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct EarningsWallet {
pub id: String,
pub account_id: String,
pub balance: i64,
#[serde(rename = "type")]
pub type_field: i64,
pub wallet_version: i64,
pub flags: i64,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub struct SubscriptionTier { pub struct SubscriptionTier {

View File

@ -42,7 +42,7 @@
"createUpdaterArtifacts": true "createUpdaterArtifacts": true
}, },
"productName": "FanslySync", "productName": "FanslySync",
"version": "0.1.6", "version": "0.1.7",
"identifier": "com.fanslycreatorbot.fanslysync", "identifier": "com.fanslycreatorbot.fanslysync",
"plugins": { "plugins": {
"updater": { "updater": {