Basic notification behaviour

This commit is contained in:
Nox Sluijtman 2025-06-18 09:30:08 +02:00
parent 5b434e3621
commit 69028816e8
Signed by: Egg
SSH key fingerprint: SHA256:2sG9X3C7Xvq2svGumz1/k7cm8l4G9+qAtAeugqB4J9M
2 changed files with 74 additions and 85 deletions

View file

@ -19,7 +19,7 @@
naersk-lib = pkgs.callPackage naersk { };
in
{
defaultPackage = naersk-lib.buildPackage rec {
packages.default = naersk-lib.buildPackage rec {
src = ./.;
nativeBuildInputs = with pkgs; [
libnotify

View file

@ -1,12 +1,10 @@
extern crate libnotify;
extern crate mpd;
use std::time::Duration;
use std::{io, usize};
use mpd::{Client, Query, Song, Term};
use clap::{Parser, Subcommand};
use libnotify::Notification;
use mpd::{Client, Query, Song, Term};
use std::time::Duration;
#[derive(Parser)]
#[command(author, version, about, long_about = "Banaan")]
@ -49,10 +47,10 @@ enum Commands {
///Only return the first n results
#[arg(short, long)]
max: Option<u32>,
#[arg(short, long)]
append: bool,
#[arg(short, long)]
insert: Option<u32>,
// #[arg(short, long)]
// append: bool,
// #[arg(short, long)]
// insert: Option<u32>,
},
/// Query database differently
Find {
@ -62,16 +60,21 @@ enum Commands {
///Only return the first n results
#[arg(short, long)]
max: Option<u32>,
#[arg(short, long)]
append: bool,
},
/// List items in the current queueueu
List {},
Add {
#[arg(short, long)]
position: Option<u32>,
},
// Add {
// #[arg(short, long)]
// position: Option<u32>,
// },
}
fn main() {
libnotify::init("noise").unwrap();
let n = libnotify::Notification::new("Noise", None, None);
let cli = Cli::parse();
let host = match cli.host {
@ -101,45 +104,41 @@ fn main() {
Commands::Stop {} => conn.stop().unwrap(),
Commands::Toggle {} => {
println!(
"{}",
match conn.status().unwrap().state {
mpd::State::Pause => "Resuming track...",
mpd::State::Play => "Pausing track...",
mpd::State::Stop => "Track stopped",
}
);
conn.toggle_pause().unwrap();
let status = get_status(conn, cli.verbose);
let status = get_status(conn, cli.verbose, n);
println!("{status}");
}
Commands::Next {} => conn.next().unwrap(),
Commands::Next {} => {
conn.next().unwrap();
let status = get_status(conn, cli.verbose, n);
println!("{status}");
}
Commands::Prev {} => conn.prev().unwrap(),
Commands::Prev {} => {
conn.prev().unwrap();
let status = get_status(conn, cli.verbose, n);
println!("{status}");
}
Commands::List {} => print_songs(conn.queue().unwrap()),
// Commands::List {} => {
// conn.insert(first_song, usize::try_from(1).unwrap());
// println!("{:?}", conn.queue().unwrap().first());
// }
Commands::Update {} => {
let thing = conn.update().unwrap();
println!("{thing}")
}
Commands::Current {} => {
let status = get_status(conn, cli.verbose);
let status = get_status(conn, cli.verbose, n);
println!("{status}");
}
Commands::Search {
query,
max,
append,
insert,
// append,
// insert,
} => {
let mut result: Vec<String> = vec![];
let mut songs: Vec<Song> = vec![];
let query = query.join(" ");
// I want to return all results by default
@ -151,29 +150,26 @@ fn main() {
conn.stats().unwrap().songs
},
);
if *append {
let queue_length = conn.status().unwrap().queue_len;
let _song = conn
.search(&Query::new().and(Term::Any, query), window)
.unwrap()
.iter()
.map(|x| songs.push(x.clone()));
conn.insert(
songs.first().unwrap(),
usize::try_from(queue_length).unwrap(),
)
.unwrap();
} else {
conn.search(&Query::new().and(Term::Any, query), window)
.unwrap()
.iter()
.for_each(|x| result.push(x.file.clone()));
result.iter().for_each(|x| println!("{x}"))
}
// let queue_length = conn.status().unwrap().queue_len;
// conn.search(&Query::new().and(Term::Any, query), window)
// .unwrap()
// .iter()
// .for_each(|x| songs.push(x.clone()));
// songs.iter().rev().for_each(|x| {
// conn.insert(x, usize::try_from(queue_length).unwrap())
// .unwrap();
// });
//conn.insert(, usize::try_from(queue_length).unwrap())
conn.search(&Query::new().and(Term::Any, query), window)
.unwrap()
.iter()
.for_each(|x| songs.push(x.clone()));
songs.iter().for_each(|x| println!("{}", x.file))
}
Commands::Find { query, max } => {
let mut result: Vec<String> = vec![];
Commands::Find { query, max, append } => {
let mut songs: Vec<Song> = vec![];
let query = query.join(" ");
let window = (
0,
@ -183,11 +179,15 @@ fn main() {
conn.stats().unwrap().songs
},
);
conn.find(&Query::new().and(Term::Any, query), window)
.unwrap()
.iter()
.for_each(|x| result.push(x.file.clone()));
result.iter().for_each(|x| println!("{x}"))
if *append {
conn.findadd(&Query::new().and(Term::Any, query)).unwrap();
} else {
conn.find(&Query::new().and(Term::Any, query), window)
.unwrap()
.iter()
.for_each(|x| songs.push(x.clone()));
songs.iter().for_each(|x| println!("{}", x.file))
}
}
Commands::Crossfade { seconds } => {
@ -200,37 +200,18 @@ fn main() {
println!("Crossfade disabled")
}
}
}
Commands::Add { position } => {
// insert_or_append(conn, *position);
println!("{:?}", position);
}
} // Commands::Add { position } => {
// // insert_or_append(conn, *position);
// println!("{:?}", position);
// }
}
} else {
let status = get_status(conn, cli.verbose);
println!("{}", status);
// println!("{:?}", conn.status().unwrap());
libnotify::init("noise").unwrap();
let n = libnotify::Notification::new("Noise", None, None);
n.show().unwrap();
let status = get_status(conn, cli.verbose, n);
println!("{}", &status);
libnotify::uninit();
}
}
fn stdin_reader() -> String {
"fiets".to_string()
}
// fn insert_or_append(mut client: Client, position: Option<u32>) {
// if let Some(pos) = position {
// client.insert(usize::try_from(1).unwrap(), usize::try_from(pos).unwrap());
// // let position = usize::try_from(position.unwrap()).unwrap();
// }
// }
fn print_songs(songs: Vec<Song>) -> () {
songs
.iter()
@ -246,7 +227,7 @@ fn bts(b: bool) -> &'static str {
b.then(|| "on").unwrap_or("off")
}
fn get_status(mut client: Client, verbose: bool) -> String {
fn get_status(mut client: Client, verbose: bool, notify: Notification) -> String {
let status = client.status().unwrap();
let repeat = bts(status.repeat);
@ -269,6 +250,8 @@ fn get_status(mut client: Client, verbose: bool) -> String {
output.push("No song playing".to_string())
}
send_notification(output.first().unwrap().clone(), notify);
if verbose {
output.push(format!(
"volume: {vol:<6} repeat: {repeat:<6} random: {rnd:<6} single: {single:<6} consume: {consume:<6}",
@ -294,6 +277,12 @@ fn get_status(mut client: Client, verbose: bool) -> String {
output.join("\n")
}
fn send_notification(body: String, notify: Notification) -> String {
let _ = notify.update("Noise", body.as_str(), None);
notify.show().unwrap();
body
}
fn to_mins_string(dur: Duration) -> String {
let seconds = dur.as_secs();