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 "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://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}