aob-lemmy-bot/src/tui/mod.rs

95 lines
3.9 KiB
Rust
Raw Normal View History

2023-12-17 20:16:40 +01:00
use std::ops::Deref;
use std::sync::{Arc};
use chrono::{Duration, Local};
2023-12-17 20:16:40 +01:00
use tokio::sync::{RwLock, RwLockReadGuard};
use tokio::time::sleep;
use crate::{SharedData};
2023-12-18 11:49:52 +01:00
use crate::post_history::{PostHistory, PostHistoryInner};
2023-12-17 20:16:40 +01:00
pub(crate) async fn run<'a>(shared_data: Arc<RwLock<SharedData>>) {
let mut min_len_series: u32 = 0;
let mut min_len_slug: u32 = 0;
println!("TUI restarted");
loop {
let snapshot_data = shared_data.read().await;
sleep(Duration::milliseconds(250).to_std().unwrap()).await;
print_info(snapshot_data, &mut min_len_series, &mut min_len_slug).await;
}
}
async fn print_info<'a>(data: RwLockReadGuard<'a, SharedData>, min_len_series: &mut u32, min_len_slug: &mut u32) {
let mut local_min_len_series = *min_len_series.deref() as usize;
let mut local_min_len_slug = *min_len_slug.deref() as usize;
let separator_width = local_min_len_slug + local_min_len_series + 44; // 44 should account for length of every other string
print!("\x1B[2J\x1B[1;1H");
println!(
"##[Ascendance of a Bookworm Bot]## | Time: {}",
Local::now().naive_local().format("%H:%M:%S")
2023-12-17 20:16:40 +01:00
);
println!("Instance: {}", data.config.instance);
2023-12-17 23:03:34 +01:00
println!(
2023-12-17 23:00:37 +01:00
"Ran Last: {} | Config Reload Interval: {}",
2023-12-17 20:16:40 +01:00
data
.start
.with_timezone(&Local)
2023-12-17 20:16:40 +01:00
.naive_local()
2023-12-17 23:00:37 +01:00
.format("%d/%m/%Y %H:%M:%S"),
data.config.config_reload_seconds
2023-12-17 20:16:40 +01:00
);
println!("{:#<1$}", "", separator_width);
2023-12-18 11:49:52 +01:00
let mut sorted_series: Vec<(&String, &PostHistory)> = data.post_history.series.iter().collect();
sorted_series.sort_by(|(a, _), (b, _)| a.cmp(b));
sorted_series.iter().for_each(|(series, post_history)| {
2023-12-17 20:16:40 +01:00
if series.len() > local_min_len_series {
local_min_len_series = series.len() + 1;
*min_len_series = local_min_len_series as u32;
}
let series_config = data.config.series
.iter()
2023-12-18 11:49:52 +01:00
.find(|ser| {&&ser.slug == series})
2023-12-17 20:16:40 +01:00
.expect("Config should not parse without this");
2023-12-18 11:49:52 +01:00
let mut sorted_parts: Vec<(&String, &PostHistoryInner)> = post_history.parts.iter().collect();
sorted_parts.sort_by(|(a, _), (b, _)| a.cmp(b));
sorted_parts.iter().for_each(|(part, part_history)| {
2023-12-17 20:16:40 +01:00
if part_history.volume.len() > local_min_len_slug {
local_min_len_slug = part_history.chapter.len() + 1;
*min_len_slug = local_min_len_slug as u32;
}
print!("{series}");
print!("{:<1$}| ", "", local_min_len_series - series.len());
print!("Part {part}");
print!("{:<1$}| Volume | ", "", 2-part.len());
print!("{}", part_history.volume);
print!("{:<1$}| ", "", local_min_len_slug - part_history.volume.len());
print!("{}", series_config.volume_community.name);
println!("{:<1$}|", "", 20 - series_config.volume_community.name.len());
if part_history.chapter.len() > local_min_len_slug {
local_min_len_slug = part_history.chapter.len() + 1;
*min_len_slug = local_min_len_slug as u32;
}
print!("{series}");
print!("{:<1$}| ", "", local_min_len_series - series.len());
print!("Part {part}");
print!("{:<1$}| Chapter | ", "", 2-part.len());
print!("{}", part_history.chapter);
print!("{:<1$}| ", "", local_min_len_slug - part_history.chapter.len());
print!("{}", series_config.prepub_community.name);
println!("{:<1$}|", "", 20 - series_config.prepub_community.name.len());
});
});
println!("{:#<1$}", "", separator_width);
for error in data.get_messages(true, true, false).iter() {
2023-12-17 22:29:18 +01:00
println!("{}", error.content());
2023-12-17 20:16:40 +01:00
}
println!("{:#<1$}", "", separator_width);
2023-12-17 23:00:37 +01:00
for message in data.get_messages(false, false, true).iter() {
2023-12-17 22:29:18 +01:00
println!("{}", message.content());
2023-12-17 20:16:40 +01:00
}
}