From ece32cf9e2039ab1247d0bb4ed47aad85336a2d1 Mon Sep 17 00:00:00 2001 From: lifegpc Date: Sun, 5 Nov 2023 13:46:07 +0000 Subject: [PATCH] Update push Save all changed cookies file every 1 min --- src/cookies.rs | 39 ++++++++++++++++++++++ src/db/push_task.rs | 7 ++++ src/server/push/task/pixiv_follow.rs | 4 +++ src/server/push/task/pixiv_send_message.rs | 1 + src/server/timer.rs | 6 ++++ 5 files changed, 57 insertions(+) diff --git a/src/cookies.rs b/src/cookies.rs index a3edbe0..2f286c2 100644 --- a/src/cookies.rs +++ b/src/cookies.rs @@ -309,16 +309,27 @@ impl CookieJarLine { } } +fn cal_md5(cookies: &Vec) -> String { + let mut s = String::new(); + for c in cookies.iter() { + s += c.to_netscape_str().as_str(); + } + let re = md5::compute(s.as_bytes()); + format!("{:x}", re) +} + #[derive(Clone, Debug)] /// Cookies Jar pub struct CookieJar { cookies: Vec, + md5: String, } impl CookieJar { pub fn new() -> Self { Self { cookies: Vec::new(), + md5: String::from("d41d8cd98f00b204e9800998ecf8427e"), } } @@ -414,9 +425,14 @@ impl CookieJar { self.add(c); } self.check_expired(); + self.md5 = cal_md5(&self.cookies); true } + pub fn is_changed(&self) -> bool { + self.md5 != cal_md5(&self.cookies) + } + pub fn save + ?Sized>(&mut self, file_name: &P) -> bool { let p = file_name.as_ref(); self.check_expired(); @@ -440,6 +456,7 @@ impl CookieJar { return false; } } + self.md5 = cal_md5(&self.cookies); true } @@ -485,6 +502,24 @@ impl CookieJarManager { } } + pub fn save(&self) { + let jars = self.jars.get_ref(); + for (path, (jar, _)) in jars.iter() { + if jar.get_ref().is_changed() { + log::debug!("Cookies file changed: {}", path.display()); + if !jar.get_mut().save(path) { + log::warn!( + "{} {}", + gettext("Warning: Failed to save cookies file:"), + path.display() + ); + } else { + log::debug!("Cookies file saved: {}", path.display()); + } + } + } + } + pub fn get_cookie_jar + ?Sized>( &self, path: &P, @@ -535,6 +570,10 @@ lazy_static! { static ref MANAGER: CookieJarManager = CookieJarManager::new(); } +pub fn save_all_cookies() { + MANAGER.save(); +} + #[derive(Clone, Debug)] /// A cookie jar that make sure there are one cookie interface for a cookies file pub struct ManagedCookieJar { diff --git a/src/db/push_task.rs b/src/db/push_task.rs index 4370da4..2d6c7f2 100644 --- a/src/db/push_task.rs +++ b/src/db/push_task.rs @@ -54,6 +54,10 @@ pub enum PushTaskPixivAction { }, } +fn default_pixiv_max_len() -> usize { + 100 +} + #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct PushTaskPixivConfig { @@ -66,6 +70,9 @@ pub struct PushTaskPixivConfig { pub use_app_api: Option, /// Use data from webpage first. pub use_webpage: Option, + #[serde(default = "default_pixiv_max_len")] + /// Max length of cached pushed artworks list + pub max_len: usize, } #[derive(Debug, Serialize, Deserialize)] diff --git a/src/server/push/task/pixiv_follow.rs b/src/server/push/task/pixiv_follow.rs index e2db23a..613404c 100644 --- a/src/server/push/task/pixiv_follow.rs +++ b/src/server/push/task/pixiv_follow.rs @@ -102,6 +102,10 @@ impl<'a> RunContext<'a> { self.web_run().await?; } if self.send_mode.is_none() { + let len = self.pushed.get_ref().len(); + if len > self.config.max_len { + self.pushed.get_mut().drain(0..(len - self.config.max_len)); + } let data = serde_json::to_string(self.pushed.get_ref().as_slice())?; self.ctx.db.set_push_task_data(self.task.id, &data).await?; self.ctx diff --git a/src/server/push/task/pixiv_send_message.rs b/src/server/push/task/pixiv_send_message.rs index e42d305..77e94cc 100644 --- a/src/server/push/task/pixiv_send_message.rs +++ b/src/server/push/task/pixiv_send_message.rs @@ -548,6 +548,7 @@ impl<'a> RunContext<'a> { if cfg.add_link_to_image { text.push_str(&format!("]({})", url)); } + text.push_str(" \n"); } } if cfg.author_locations.contains(&AuthorLocation::Top) { diff --git a/src/server/timer.rs b/src/server/timer.rs index fafc3d4..9d1655a 100644 --- a/src/server/timer.rs +++ b/src/server/timer.rs @@ -12,6 +12,12 @@ pub async fn start_timer(ctx: Arc) { loop { interval.tick().await; tasks.add_task(revoke_expired_tokens(ctx.clone())).await; + tasks + .add_task(async { + crate::cookies::save_all_cookies(); + Ok(()) + }) + .await; tasks.join().await; for task in tasks.take_finished_tasks() { let re = task.await;