stwp/
lib.rs

1use project::Project;
2use std::sync::Arc;
3use tokio::sync::RwLock;
4use tokio::time::Duration;
5
6pub mod archivist;
7pub mod background;
8pub mod item;
9pub mod project;
10pub mod task;
11
12const TRACKER_NODES: [&str; 7] = [
13    // "http://localhost:8080", // 测试环境
14    "https://0.tracker.saveweb.org",
15    "https://1.tracker.saveweb.org",
16    "https://ipv4.1.tracker.saveweb.org",
17    "https://ipv6.1.tracker.saveweb.org",
18    // "https://2.tracker.saveweb.org", // 这台宕了
19    "https://3.tracker.saveweb.org",
20    "https://ipv4.3.tracker.saveweb.org",
21    "https://ipv6.3.tracker.saveweb.org",
22];
23
24pub struct Tracker {
25    api_base: Arc<RwLock<&'static str>>,
26    api_version: &'static str,
27    project_id: String,
28    http_client: reqwest::Client,
29    client_version: String,
30    archivist: String,
31    project: Option<Project>,
32}
33
34impl Tracker {
35    pub fn new(
36        project_id: String,
37        client_version: String,
38        archivist: String,
39    ) -> Result<Self, Box<dyn std::error::Error>> {
40        let api_base = Arc::new(RwLock::new(TRACKER_NODES[1]));
41        Self::start_select_tracker_background(Arc::clone(&api_base));
42        Ok(Tracker {
43            api_base,
44            api_version: "v1",
45            project_id,
46            http_client: reqwest::Client::builder()
47                .timeout(Duration::from_secs(60))
48                .build()?,
49            client_version,
50            archivist,
51            project: None,
52        })
53    }
54}
55
56#[cfg(test)]
57mod tests {
58    use super::*;
59
60    #[tokio::test]
61    async fn test_get_tracker() {
62        let mut tracker = Tracker::new("test".into(), "1.1".into(), "neko".into()).unwrap();
63        let project = tracker.get_project().await;
64        println!("{:?}", project);
65        let task = tracker.claim_task(true).await.unwrap();
66
67        println!("{:?}", task);
68        let payload = r#"{"hhhh":123123, "f": 123.123}"#.to_string();
69
70        let resp = tracker
71            .insert_item(&task, String::from("DONE"), payload)
72            .await;
73        println!("{:?}", resp);
74    }
75}