Main bulk of program built

This commit is contained in:
djaidjai committed 2023-05-05 12:41:09 +02:00
commit f87356c859
9 files changed
+392

No files matched your search

+100
View File
@@ -0,0 +1,100 @@
use log::{debug, trace};
use mpris::{PlayerFinder, MetadataValue};
use crate::structs::{config::{Rating, Config}, data::Data};
fn update_prefix(cfg: &Config, data: &mut Data) {
if data.current_player.is_some() {
let c = cfg.player_prefixes.get(&data.current_player.as_ref().unwrap().to_ascii_lowercase());
if let Some(char) = c {
data.display_prefix = char.clone();
trace!("updated prefix to {}", data.display_prefix);
} else {
data.display_prefix = cfg.player_prefixes.get("default").unwrap().clone(); //todo: error handling
trace!("set prefix to default ({})", data.display_prefix);
}
}
}
fn value_to_string(v: &MetadataValue, sep: char) -> String {
match v {
MetadataValue::String(v) => v.to_string(),
MetadataValue::I16(v) => v.to_string(),
MetadataValue::I32(v) => v.to_string(),
MetadataValue::I64(v) => v.to_string(),
MetadataValue::U8(v) => v.to_string(),
MetadataValue::U16(v) => v.to_string(),
MetadataValue::U32(v) => v.to_string(),
MetadataValue::U64(v) => v.to_string(),
MetadataValue::F64(v) => v.to_string(),
MetadataValue::Bool(v) => v.to_string(),
MetadataValue::Array(v) => {
let mut out = v.iter().map( |val| {
let mut str = value_to_string(val, sep);
str.push(sep);
str
}).collect::<String>();
out.pop();
out
},
MetadataValue::Map(_v) => panic!("unimplemented! TBH i have no clue when a metadataValue would even return this?"),
MetadataValue::Unsupported => panic!("Unsupported Metadata type detected!"),
}
}
fn rating_to_string(r: Option<&MetadataValue>, map: &Rating) -> String {
match r {
Some(rating) => {
let f = (rating.as_f64().unwrap() * 10_f64).round() as i64;
match f { //todo: refactor
0 => Rating::repeat(map.nil, 5),
1 => format!("{}{}", Rating::repeat(map.half, 1), Rating::repeat(map.nil, 4)),
2 => format!("{}{}", Rating::repeat(map.full, 1), Rating::repeat(map.nil, 4)),
3 => format!("{}{}{}", Rating::repeat(map.full, 1), Rating::repeat(map.half, 1), Rating::repeat(map.nil, 3)),
4 => format!("{}{}", Rating::repeat(map.full, 2), Rating::repeat(map.nil, 3)),
5 => format!("{}{}{}", Rating::repeat(map.full, 2), Rating::repeat(map.half, 1), Rating::repeat(map.nil, 2)),
6 => format!("{}{}", Rating::repeat(map.full, 3), Rating::repeat(map.nil, 2)),
7 => format!("{}{}{}", Rating::repeat(map.full, 3), Rating::repeat(map.half, 1), Rating::repeat(map.nil, 1)),
8 => format!("{}{}", Rating::repeat(map.full, 4), Rating::repeat(map.nil, 1)),
9 => format!("{}{}", Rating::repeat(map.full, 4), Rating::repeat(map.half, 1)),
10.. => Rating::repeat(map.full, 5),
_ => format!("Invalid rating!")
}
},
None => {
Rating::repeat(map.nil, 5)
},
}
}
pub fn update_message(pf: &PlayerFinder, cfg: &Config, data: &mut Data) {
if data.current_player.is_some() {
update_prefix(cfg, data);
let name = &data.current_player.as_ref().unwrap();
if let Ok(player) = pf.find_by_name(name) {
debug!("found player!");
if let Ok(m) = player.get_metadata() {
debug!("got metadata!");
for field in &cfg.metadata_fields {
if field.field.eq("xesam:userRating") || field.field.eq("xesam:autoRating") {
let key = field.field.clone();
data.display_text.insert(field.field.clone(), rating_to_string(m.get(&key), &cfg.rating_icons));
} else {
let key = field.field.clone();
match m.get(&key) {
Some(value) => {
debug!("inserting {}: '{}'", key, value_to_string(value, cfg.array_separator));
data.display_text.insert(key, value_to_string(value, cfg.array_separator));
},
None => {
debug!("field {} is empty!", key);
data.display_text.insert(key, format!("No {}", field.field.clone().trim_start_matches("xesam:")));
},
}
}
}
}
}
}
}
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.