POC in Rust save again only on change db and dont delete racers after leave

This commit is contained in:
Martin Quarda 2025-05-13 15:56:12 +02:00
parent 6aeb5e1c2a
commit bf531b477f

View File

@ -37,7 +37,7 @@ struct State{
impl Default for State { impl Default for State {
fn default() -> Self { fn default() -> Self {
Self { Self {
racers: vec![RacerTime{time: Instant::now(), racer: Racer{starting_number:11, card_id: 0}}], racers: vec![],
db: Default::default(), db: Default::default(),
time: Instant::now(), time: Instant::now(),
} }
@ -57,6 +57,26 @@ struct RegisterRacer{
station_id: usize, station_id: usize,
} }
#[derive(Serialize, Deserialize, Clone, Eq, PartialEq)]
struct Racer{
starting_number: usize,
card_id: usize,
}
enum Message{
CardReader(card_reader::Event),
RacerRecieved(db_update::Event),
Tick(Instant),
Nothing,
}
impl std::fmt::Debug for Message {
// Required method
fn fmt(&self, _f: &mut Formatter<'_>) -> Result<(), fmtError>{
todo!()
}
}
async fn station_register(card_id: usize, time: DateTime::<Local>) -> Result<(), reqwest::Error>{ async fn station_register(card_id: usize, time: DateTime::<Local>) -> Result<(), reqwest::Error>{
let register_racer = RegisterRacer{ let register_racer = RegisterRacer{
card_id: card_id, card_id: card_id,
@ -83,18 +103,17 @@ impl State{
match event { match event {
db_update::Event::MessageReceived(s) => { db_update::Event::MessageReceived(s) => {
let racer: Racer = serde_json::from_str(s.as_str()).unwrap(); let racer: Racer = serde_json::from_str(s.as_str()).unwrap();
self.db.insert(racer.card_id, racer); let old_racer = self.db.insert(racer.card_id, racer.clone());
if old_racer != Some(racer){
let json = serde_json::to_string(self).unwrap();
Task::perform(dump_state(json), |_| Message::Nothing)
}else{
Task::none()
}
}, },
}; }
let json = serde_json::to_string(self).unwrap();
Task::perform(dump_state(json), |_| Message::Nothing)
} }
Message::Tick(time) => { Message::Tick(time) => {
if let Some(racer_time) = self.racers.iter().next() {
if time - racer_time.time > Duration::new(CONFIG.DURATION + 10, 0){
self.racers.remove(0);
}
}
self.time = time; self.time = time;
Task::none() Task::none()
}, },
@ -103,7 +122,7 @@ impl State{
let time = Instant::now(); let time = Instant::now();
let datetime = Local::now(); let datetime = Local::now();
if let Some(racer) = self.db.get(&card_id){ if let Some(racer) = self.db.get(&card_id){
if !self.racers.iter().any(|rt| rt.racer.card_id == card_id){ if !self.racers.iter().any(|rt| rt.racer.starting_number == racer.starting_number){
let racer_time = RacerTime{time, racer: racer.clone()}; let racer_time = RacerTime{time, racer: racer.clone()};
self.racers.push(racer_time); self.racers.push(racer_time);
} }
@ -140,10 +159,12 @@ impl State{
} else { } else {
(duration - time, false) (duration - time, false)
}; };
let seconds = duration.as_secs(); let seconds = duration.as_secs();
if negative && seconds >= 10 {
continue
}
let duration = text!( let duration = text!(
"{}{:0>2}:{:0>2}.{:0>2}", "{}{:0>2}:{:0>2}.{:0>2}",
if negative {"-"} else {""}, if negative {"-"} else {""},
@ -171,27 +192,6 @@ impl State{
} }
} }
#[derive(Serialize, Deserialize, Clone)]
struct Racer{
starting_number: usize,
card_id: usize,
}
enum Message{
CardReader(card_reader::Event),
RacerRecieved(db_update::Event),
Tick(Instant),
Nothing,
}
impl std::fmt::Debug for Message {
// Required method
fn fmt(&self, _f: &mut Formatter<'_>) -> Result<(), fmtError>{
todo!()
}
}
pub fn main() -> iced::Result { pub fn main() -> iced::Result {
let init_state = || -> State {read_to_string("state.json").ok().map(|s| serde_json::from_str(&s).ok()).flatten().unwrap_or_else(||Default::default())} ; let init_state = || -> State {read_to_string("state.json").ok().map(|s| serde_json::from_str(&s).ok()).flatten().unwrap_or_else(||Default::default())} ;
env_logger::init(); env_logger::init();