diff --git a/src-tauri/src/analytics.rs b/src-tauri/src/analytics.rs index 788b8845..da6576ce 100644 --- a/src-tauri/src/analytics.rs +++ b/src-tauri/src/analytics.rs @@ -1,4 +1,5 @@ use sqlx::types::JsonValue; +use tauri::{async_runtime, AppHandle, Manager}; use crate::is_dev; @@ -44,32 +45,74 @@ fn action_name(action: AnalyticsAction) -> &'static str { } } -pub async fn track_event( +pub fn track_event( + app_handle: &AppHandle, resource: AnalyticsResource, action: AnalyticsAction, attributes: Option, ) { - let event = format!("{}.{}", resource_name(resource), action_name(action)); - let attributes_json = attributes.unwrap_or("{}".to_string().into()).to_string(); - let params = vec![ - ("e", event.clone()), - ("a", attributes_json.clone()), - ("id", "site_zOK0d7jeBy2TLxFCnZ".to_string()), - ]; - let url = format!("https://t.yaak.app/t/e"); - let req = reqwest::Client::builder() - .build() - .unwrap() - .get(&url) - .query(¶ms); + async_runtime::block_on(async move { + let event = format!("{}.{}", resource_name(resource), action_name(action)); + let attributes_json = attributes.unwrap_or("{}".to_string().into()).to_string(); + let info = app_handle.package_info(); + let params = vec![ + ("e", event.clone()), + ("a", attributes_json.clone()), + ("id", "site_zOK0d7jeBy2TLxFCnZ".to_string()), + ("v", info.version.clone().to_string()), + ("os", get_os().to_string()), + ("xy", get_window_size(app_handle)), + ]; + let url = format!("https://t.yaak.app/t/e"); + let req = reqwest::Client::builder() + .build() + .unwrap() + .get(&url) + .query(¶ms); - if is_dev() { - println!("Ignore dev analytics event: {}", event); - } else { - if let Err(e) = req.send().await { - println!("Error sending analytics event: {}", e); + if is_dev() { + println!("Ignore dev analytics event: {} {:?}", event, params); } else { - println!("Sent analytics event: {}", event); + if let Err(e) = req.send().await { + println!("Error sending analytics event: {}", e); + } else { + println!("Sent analytics event: {}", event); + } } + }); +} + +fn get_os() -> &'static str { + if cfg!(target_os = "windows") { + "windows" + } else if cfg!(target_os = "macos") { + "macos" + } else if cfg!(target_os = "linux") { + "linux" + } else { + "unknown" } } + +fn get_window_size(app_handle: &AppHandle) -> String { + let window = match app_handle.windows().into_values().next() { + Some(w) => w, + None => return "unknown".to_string(), + }; + + let current_monitor = match window.current_monitor() { + Ok(Some(m)) => m, + _ => return "unknown".to_string(), + }; + + let scale_factor = current_monitor.scale_factor(); + let size = current_monitor.size(); + let width: f64 = size.width as f64 / scale_factor; + let height: f64 = size.height as f64 / scale_factor; + + format!( + "{}x{}", + (width / 100.0).round() * 100.0, + (height / 100.0).round() * 100.0 + ) +} diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index c42f11ba..4183a2cb 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -32,7 +32,7 @@ use tokio::sync::Mutex; use window_ext::TrafficLightWindowExt; -use crate::analytics::{AnalyticsAction, AnalyticsResource}; +use crate::analytics::{track_event, AnalyticsAction, AnalyticsResource}; mod analytics; mod models; @@ -817,10 +817,12 @@ fn main() { w.restore_state(StateFlags::all()) .expect("Failed to restore window state"); - tauri::async_runtime::block_on(async move { - analytics::track_event(AnalyticsResource::App, AnalyticsAction::Launch, None) - .await; - }) + track_event( + app_handle, + AnalyticsResource::App, + AnalyticsAction::Launch, + None, + ); } // ExitRequested { api, .. } => {