mirror of
				https://forge.katzen.cafe/schrottkatze/nix-configs.git
				synced 2025-10-31 01:27:57 +01:00 
			
		
		
		
	continue working on traveldings (get live checkin thing working maybe??)
This commit is contained in:
		
					parent
					
						
							
								258d4639d7
							
						
					
				
			
			
				commit
				
					
						bd3674accf
					
				
			
		
					 5 changed files with 274 additions and 30 deletions
				
			
		|  | @ -1,9 +1,182 @@ | |||
| use crate::traewelling::TraewellingClient; | ||||
| use std::time::Duration; | ||||
| 
 | ||||
| use chrono::Local; | ||||
| use reqwest::StatusCode; | ||||
| use serde::Serialize; | ||||
| use tokio::time::sleep; | ||||
| 
 | ||||
| use crate::traewelling::{ | ||||
|     model::{JsonableData, Status, StopJourneyPart}, | ||||
|     RequestErr, TraewellingClient, | ||||
| }; | ||||
| 
 | ||||
| pub async fn get_current_journey() -> anyhow::Result<()> { | ||||
|     let client = TraewellingClient::new()?; | ||||
| 
 | ||||
|     println!("active: {:#?}", client.get_active_checkin().await?); | ||||
|     let mut state; | ||||
|     let mut cur_active_checkin = None; | ||||
| 
 | ||||
|     loop { | ||||
|         match client.get_active_checkin().await { | ||||
|             Ok(status) => { | ||||
|                 cur_active_checkin = Some(status); | ||||
|                 state = State::Live; | ||||
|             } | ||||
|             Err(err) => { | ||||
|                 if err == RequestErr::WithStatus(StatusCode::NOT_FOUND) { | ||||
|                     state = State::NoCheckin; | ||||
|                     cur_active_checkin = None; | ||||
|                 } else { | ||||
|                     state = State::NoConnectionOrSomethingElseDoesntWork; | ||||
|                 } | ||||
|             } | ||||
|         }; | ||||
| 
 | ||||
|         match (state, &cur_active_checkin) { | ||||
|             (State::Live | State::NoConnectionOrSomethingElseDoesntWork, Some(status)) => { | ||||
|                 let live = state == State::Live; | ||||
|                 let out = CurrentJourneyOutput::new(&status, live); | ||||
| 
 | ||||
|                 println!( | ||||
|                     "{}", | ||||
|                     serde_json::to_string(&out) | ||||
|                         .expect("serde should not make you sad but it does because it's serde") | ||||
|                 ); | ||||
|                 sleep(Duration::from_secs(20)).await; | ||||
|             } | ||||
|             (_, None) | (State::NoCheckin, Some(_)) => { | ||||
|                 println!("null"); | ||||
|                 sleep(Duration::from_secs(60)).await; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     Ok(()) | ||||
| } | ||||
| 
 | ||||
| #[derive(PartialEq, Eq, Clone, Copy, Debug)] | ||||
| enum State { | ||||
|     Live, | ||||
|     NoConnectionOrSomethingElseDoesntWork, | ||||
|     NoCheckin, | ||||
| } | ||||
| 
 | ||||
| #[derive(Serialize)] | ||||
| struct CurrentJourneyOutput { | ||||
|     live: bool, | ||||
|     // Journey progress, 0.0-1.0
 | ||||
|     progress: Option<f32>, | ||||
|     time_left: Option<i64>, | ||||
|     icon: String, | ||||
| 
 | ||||
|     // Invalid data received?
 | ||||
|     departure_err: bool, | ||||
|     departure_planned: Option<i64>, | ||||
|     departure_real: Option<i64>, | ||||
|     departure_station: String, | ||||
|     departure_ril100: Option<String>, | ||||
|     departure_platform_data_available: bool, | ||||
|     departure_platform_planned: Option<String>, | ||||
|     departure_platform_real: Option<String>, | ||||
| 
 | ||||
|     // Invalid data received?
 | ||||
|     arrival_err: bool, | ||||
|     arrival_planned: Option<i64>, | ||||
|     arrival_real: Option<i64>, | ||||
|     arrival_station: String, | ||||
|     arrival_ril100: Option<String>, | ||||
|     arrival_platform_data_available: bool, | ||||
|     arrival_platform_planned: Option<String>, | ||||
|     arrival_platform_real: Option<String>, | ||||
| } | ||||
| 
 | ||||
| impl CurrentJourneyOutput { | ||||
|     fn new(checkin: &Status, live: bool) -> Self { | ||||
|         let JsonableData { | ||||
|             time_err: departure_err, | ||||
|             time_planned: departure_planned, | ||||
|             time_real: departure_real, | ||||
|             station: departure_station, | ||||
|             ril100: departure_ril100, | ||||
|             platform_data_available: departure_platform_data_available, | ||||
|             platform_planned: departure_platform_planned, | ||||
|             platform_real: departure_platform_real, | ||||
|         } = checkin.train.origin.get_time_data(StopJourneyPart::Origin); | ||||
|         let JsonableData { | ||||
|             time_err: arrival_err, | ||||
|             time_planned: arrival_planned, | ||||
|             time_real: arrival_real, | ||||
|             station: arrival_station, | ||||
|             ril100: arrival_ril100, | ||||
|             platform_data_available: arrival_platform_data_available, | ||||
|             platform_planned: arrival_platform_planned, | ||||
|             platform_real: arrival_platform_real, | ||||
|         } = checkin | ||||
|             .train | ||||
|             .destination | ||||
|             .get_time_data(StopJourneyPart::Destination); | ||||
| 
 | ||||
|         let (progress, time_left) = if !departure_err && !arrival_err { | ||||
|             let departure = departure_real.unwrap_or(departure_planned.unwrap()); | ||||
|             let arrival = arrival_real.unwrap_or(arrival_planned.unwrap()); | ||||
|             let dur = arrival - departure; | ||||
| 
 | ||||
|             let now = Local::now().timestamp(); | ||||
| 
 | ||||
|             let progress = ((now - departure) as f32) / dur as f32; | ||||
|             let time_left = arrival - now; | ||||
| 
 | ||||
|             (Some(progress), Some(time_left)) | ||||
|         } else { | ||||
|             (None, None) | ||||
|         }; | ||||
| 
 | ||||
|         let icon = match checkin.train.category.as_str() { | ||||
|             "nationalExpress" | "national" => "longDistanceTrans", | ||||
|             "regionalExp" | "regional" => "regionalTrans", | ||||
|             "suburban" => "localTrans", | ||||
|             "subway" => "subTrans", | ||||
|             "bus" => "bus", | ||||
|             "tram" => "tram", | ||||
|             "ferry" => "ferry", | ||||
|             _ => "other", | ||||
|         } | ||||
|         .to_string(); | ||||
| 
 | ||||
|         CurrentJourneyOutput { | ||||
|             live, | ||||
|             progress, | ||||
|             time_left, | ||||
|             icon, | ||||
|             departure_err, | ||||
|             departure_planned, | ||||
|             departure_real, | ||||
|             departure_station, | ||||
|             departure_ril100, | ||||
|             departure_platform_data_available, | ||||
|             departure_platform_planned, | ||||
|             departure_platform_real, | ||||
|             arrival_err, | ||||
|             arrival_planned, | ||||
|             arrival_real, | ||||
|             arrival_station, | ||||
|             arrival_ril100, | ||||
|             arrival_platform_data_available, | ||||
|             arrival_platform_planned, | ||||
|             arrival_platform_real, | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| enum TransportType { | ||||
|     // FV, ob jetzt NJ, IC, ICE... egal
 | ||||
|     LongDistanceTrans, | ||||
|     RegionalTrans, | ||||
|     // S-bahn...
 | ||||
|     LocalTrans, | ||||
|     // U-bahn
 | ||||
|     SubTrans, | ||||
|     Bus, | ||||
|     Tram, | ||||
|     Ferry, | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Schrottkatze
				Schrottkatze