Added status publish on arena scheduled

master
noah metz 2024-01-21 23:30:57 -07:00
parent 5a4e7b0a24
commit d1dd10e090
1 changed files with 28 additions and 12 deletions

@ -525,9 +525,7 @@ impl TMClient {
// it only processes a single requests/response at a time. This is fine since there's // it only processes a single requests/response at a time. This is fine since there's
// only a single callback thread though. // only a single callback thread though.
for request in self.requests.try_iter() { for request in self.requests.try_iter() {
let time = SystemTime::now(); let packet = BackendPacket::new(TM_HEADER, get_float_time(), 2, self.last_seq_num + 1, request.as_bytes());
let millis = time.duration_since(UNIX_EPOCH).unwrap();
let packet = BackendPacket::new(TM_HEADER, (millis.as_millis() as f64)/1000.0, 2, self.last_seq_num + 1, request.as_bytes());
match self.stream.write(&packet.as_bytes()) { match self.stream.write(&packet.as_bytes()) {
Ok(_) => { Ok(_) => {
log::debug!("Sent: {:?}", packet); log::debug!("Sent: {:?}", packet);
@ -845,33 +843,51 @@ fn on_match_list_update(_notice: tm::Notice, event: &mut Event, connection: &mut
return messages; return messages;
} }
fn get_float_time() -> f64 {
let time = SystemTime::now();
let millis = time.duration_since(UNIX_EPOCH).unwrap();
return (millis.as_millis() as f64)/1000.0;
}
fn on_field_assigned(notice: tm::Notice, event: &mut Event, connection: &mut TMConnection) -> Vec<MQTTMessage> { fn on_field_assigned(notice: tm::Notice, event: &mut Event, connection: &mut TMConnection) -> Vec<MQTTMessage> {
let Some(field_info) = &notice.field else { return Vec::new() }; let Some(field_info) = &notice.field else { return Vec::new() };
let Some(tuple) = get_affected_match(&notice) else { return Vec::new() }; let Some(tuple) = get_affected_match(&notice) else { return Vec::new() };
let Some(field_set) = &mut event.field_sets.get_mut(&field_info.field_set_id()) else { return Vec::new() }; let Some(field_set) = &mut event.field_sets.get_mut(&field_info.field_set_id()) else { return Vec::new() };
let Some(field) = &mut field_set.fields.get_mut(&field_info.id()) else { return Vec::new() }; let Some(field) = &mut field_set.fields.get_mut(&field_info.id()) else { return Vec::new() };
let Some(division) = &event.divisions.get(&tuple.division) else { return Vec::new() }; let Some(division) = &mut event.divisions.get_mut(&tuple.division) else { return Vec::new() };
let Some(m) = &division.matches.iter().find(|a| a.tuple == tuple) else { return Vec::new() }; let Some(m) = &mut division.matches.iter_mut().find(|a| a.tuple == tuple) else { return Vec::new() };
m.state = Some(MatchState{
state: GameState::Scheduled,
start: get_float_time(),
});
field.last_known_match = Some(tuple); field.last_known_match = Some(tuple);
let mut messages = Vec::new(); let mut messages = Vec::new();
if let Some(score) = &m.score {
let serialized = serde_json::to_string_pretty(&score).unwrap(); if let Some(state) = &m.state {
let topic = format!("field/{}/{}/score", &field_info.field_set_id(), &field_info.id()); let serialized = serde_json::to_string_pretty(&state).unwrap();
let field_topic = format!("field/{}/{}/state", &field_info.field_set_id(), &field_info.id());
let match_topic = format!("division/{}/{:?}/{}/state", &m.tuple.division, &m.tuple.round, &m.tuple.match_num);
messages.push(MQTTMessage{ messages.push(MQTTMessage{
topic, topic: field_topic,
payload: serialized.clone(),
});
messages.push(MQTTMessage{
topic: match_topic,
payload: serialized, payload: serialized,
}); });
} }
if let Some(state) = &m.state { if let Some(score) = &m.score {
let serialized = serde_json::to_string_pretty(&state).unwrap(); let serialized = serde_json::to_string_pretty(&score).unwrap();
let topic = format!("field/{}/{}/state", &field_info.field_set_id(), &field_info.id()); let topic = format!("field/{}/{}/score", &field_info.field_set_id(), &field_info.id());
messages.push(MQTTMessage{ messages.push(MQTTMessage{
topic, topic,
payload: serialized, payload: serialized,
}); });
} }
return messages; return messages;
} }