chore: Move the PingList
trait to src/traits.rs
Signed-off-by: Awiteb <a@4rs.nl>
This commit is contained in:
parent
cffada6b3b
commit
53f58f25ee
2 changed files with 82 additions and 59 deletions
62
src/main.rs
62
src/main.rs
|
@ -23,6 +23,9 @@ use salvo::{conn::TcpListener, Listener};
|
||||||
|
|
||||||
mod api;
|
mod api;
|
||||||
mod superbot;
|
mod superbot;
|
||||||
|
mod traits;
|
||||||
|
|
||||||
|
pub(crate) use traits::PingList;
|
||||||
|
|
||||||
#[derive(Default, Clone)]
|
#[derive(Default, Clone)]
|
||||||
pub(crate) struct PingedBot {
|
pub(crate) struct PingedBot {
|
||||||
|
@ -31,65 +34,6 @@ pub(crate) struct PingedBot {
|
||||||
is_response: bool,
|
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<Vec<PingedBot>> {
|
|
||||||
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 {
|
impl PingedBot {
|
||||||
pub(crate) fn new(telegram_id: u64) -> Self {
|
pub(crate) fn new(telegram_id: u64) -> Self {
|
||||||
|
|
79
src/traits.rs
Normal file
79
src/traits.rs
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
// A simple API to ping telegram bots and returns if it's online or not.
|
||||||
|
// Copyright (C) 2023-2024 Awiteb <a@4rs.nl>
|
||||||
|
//
|
||||||
|
// 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 <https://www.gnu.org/licenses/agpl-3.0>.
|
||||||
|
|
||||||
|
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<Vec<PingedBot>> {
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue