diff --git a/src/main.rs b/src/main.rs index 61910f5..d3008e6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -23,6 +23,9 @@ use salvo::{conn::TcpListener, Listener}; mod api; mod superbot; +mod traits; + +pub(crate) use traits::PingList; #[derive(Default, Clone)] pub(crate) struct PingedBot { @@ -31,65 +34,6 @@ pub(crate) struct PingedBot { is_response: bool, } -pub(crate) trait PingList { - fn clear_outdead(&self); - fn add_new(&self, telegram_id: u64); - fn check(&self, telegram_id: u64) -> bool; - fn new_res(&self, telegram_id: u64); -} - -impl PingList for Mutex> { - fn clear_outdead(&self) { - log::info!("Clear the dead pings"); - let dead_time = chrono::Utc::now().timestamp() - 60; - let mut bots = self - .lock() - .expect("Another holder paniced while holding the lock"); - *bots = bots - .iter() - .filter(|b| b.ping_in > dead_time) - .cloned() - .collect(); - } - - fn add_new(&self, telegram_id: u64) { - log::debug!("Adding new bot to the list: {telegram_id}"); - self.lock() - .expect("Another holder paniced while holding the lock") - .push(PingedBot::new(telegram_id)); - } - - fn check(&self, telegram_id: u64) -> bool { - log::debug!("Checking the {telegram_id} if is response"); - self.clear_outdead(); - let result = self - .lock() - .expect("Another holder paniced while holding the lock") - .iter() - .any(|b| b.telegram_id == telegram_id && b.is_response); - log::debug!("Response status: {result}"); - result - } - - fn new_res(&self, telegram_id: u64) { - log::debug!("New res from: {telegram_id}"); - let mut bots = self - .lock() - .expect("Another holder paniced while holding the lock"); - *bots = bots - .iter() - .cloned() - .map(|b| { - if b.telegram_id == telegram_id { - log::info!("Found the sender in the list"); - b.new_res() - } else { - b - } - }) - .collect(); - } -} impl PingedBot { pub(crate) fn new(telegram_id: u64) -> Self { diff --git a/src/traits.rs b/src/traits.rs new file mode 100644 index 0000000..5bf3c0f --- /dev/null +++ b/src/traits.rs @@ -0,0 +1,79 @@ +// A simple API to ping telegram bots and returns if it's online or not. +// Copyright (C) 2023-2024 Awiteb +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +use std::sync::Mutex; + +use crate::PingedBot; + +pub(crate) trait PingList { + fn clear_outdead(&self); + fn add_new(&self, telegram_id: u64); + fn check(&self, telegram_id: u64) -> bool; + fn new_res(&self, telegram_id: u64); +} + +impl PingList for Mutex> { + fn clear_outdead(&self) { + log::info!("Clear the dead pings"); + let dead_time = chrono::Utc::now().timestamp() - 60; + let mut bots = self + .lock() + .expect("Another holder paniced while holding the lock"); + *bots = bots + .iter() + .filter(|b| b.ping_in > dead_time) + .cloned() + .collect(); + } + + fn add_new(&self, telegram_id: u64) { + log::debug!("Adding new bot to the list: {telegram_id}"); + self.lock() + .expect("Another holder paniced while holding the lock") + .push(PingedBot::new(telegram_id)); + } + + fn check(&self, telegram_id: u64) -> bool { + log::debug!("Checking the {telegram_id} if is response"); + self.clear_outdead(); + let result = self + .lock() + .expect("Another holder paniced while holding the lock") + .iter() + .any(|b| b.telegram_id == telegram_id && b.is_response); + log::debug!("Response status: {result}"); + result + } + + fn new_res(&self, telegram_id: u64) { + log::debug!("New res from: {telegram_id}"); + let mut bots = self + .lock() + .expect("Another holder paniced while holding the lock"); + *bots = bots + .iter() + .cloned() + .map(|b| { + if b.telegram_id == telegram_id { + log::info!("Found the sender in the list"); + b.new_res() + } else { + b + } + }) + .collect(); + } +}