diff --git a/src/config.rs b/src/config.rs index 70386d9..00d7e7d 100644 --- a/src/config.rs +++ b/src/config.rs @@ -2,11 +2,11 @@ mod defaults; mod file_config; mod filters; -use clap::{arg, value_parser, ArgAction, Command}; -use file_config::FileConfig; -use std::{path::PathBuf, time::Duration}; - use self::filters::{Filter, Replacement}; +use clap::{arg, value_parser, Arg, ArgAction, Command}; +use file_config::FileConfig; +use log::LevelFilter; +use std::{path::PathBuf, time::Duration}; pub struct Config { pub port: u32, @@ -17,13 +17,14 @@ pub struct Config { pub idle_bucket_name: String, pub active_window_bucket_name: String, pub no_server: bool, + pub verbosity: LevelFilter, filters: Vec, } impl Config { pub fn from_cli() -> anyhow::Result { let matches = Command::new("Activity Watcher") - .version("0.1.0") + .version("0.0.1") .about("A set of ActivityWatch desktop watchers") .args([ arg!(-c --config "Custom config file").value_parser(value_parser!(PathBuf)), @@ -45,6 +46,10 @@ impl Config { arg!(--"no-server" "Don't communicate to the ActivityWatch server") .value_parser(value_parser!(bool)) .action(ArgAction::SetTrue), + Arg::new("verbosity") + .short('v') + .help("Verbosity level: -v for warnings, -vv for info, -vvv for debug, -vvvv for trace") + .action(ArgAction::Count), ]) .get_matches(); @@ -53,6 +58,13 @@ impl Config { let hostname = gethostname::gethostname().into_string().unwrap(); let idle_bucket_name = format!("aw-watcher-afk_{hostname}"); let active_window_bucket_name = format!("aw-watcher-window_{hostname}"); + let verbosity = match matches.get_count("verbosity") { + 0 => LevelFilter::Error, + 1 => LevelFilter::Warn, + 2 => LevelFilter::Info, + 3 => LevelFilter::Debug, + _ => LevelFilter::Trace, + }; Ok(Self { port: config.server.port, @@ -64,6 +76,7 @@ impl Config { active_window_bucket_name, filters: config.client.filters, no_server: *matches.get_one("no-server").unwrap(), + verbosity, }) } diff --git a/src/main.rs b/src/main.rs index f3ab9c4..404c788 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,15 +9,12 @@ mod watchers; use config::Config; use fern::colors::{Color, ColoredLevelConfig}; +use log::LevelFilter; use report_client::ReportClient; -use std::env; use std::{sync::Arc, thread}; +use watchers::ConstructorFilter; -use crate::watchers::ConstructorFilter; - -fn setup_logger() -> Result<(), fern::InitError> { - let log_setting = env::var("AWATCHER_LOG").unwrap_or("info".to_string()); - +fn setup_logger(verbosity: LevelFilter) -> Result<(), fern::InitError> { fern::Dispatch::new() .format(|out, message, record| { let colors = ColoredLevelConfig::new() @@ -32,20 +29,18 @@ fn setup_logger() -> Result<(), fern::InitError> { message )); }) - .level(log::LevelFilter::Warn) - .level_for( - "awatcher", - log_setting.parse().unwrap_or(log::LevelFilter::Info), - ) + .level(log::LevelFilter::Error) + .level_for("awatcher", verbosity) .chain(std::io::stdout()) .apply()?; Ok(()) } fn main() -> anyhow::Result<()> { - setup_logger()?; + let config = Config::from_cli()?; + setup_logger(config.verbosity)?; - let client = ReportClient::new(Config::from_cli()?)?; + let client = ReportClient::new(config)?; let client = Arc::new(client); if client.config.no_server { diff --git a/src/watchers.rs b/src/watchers.rs index 5f3c0f3..4a361ad 100644 --- a/src/watchers.rs +++ b/src/watchers.rs @@ -57,7 +57,8 @@ pub const IDLE: &WatcherConstructors = &[ pub const ACTIVE_WINDOW: &WatcherConstructors = &[ watcher!(wl_foreign_toplevel::WindowWatcher), - watcher!(x11_window::WindowWatcher), + // XWayland gives _NET_WM_NAME on some windows in KDE, but not on others watcher!(kwin_window::WindowWatcher), + watcher!(x11_window::WindowWatcher), watcher!(gnome_window::WindowWatcher), ];