don't store when a client did anything but disconnect
This commit is contained in:
parent
1ca44e300e
commit
eb5e5fd0fa
33
src/ports.rs
33
src/ports.rs
@ -112,17 +112,32 @@ impl<T: Display> Debug for DisplayAsDebug<T> {
|
||||
|
||||
#[derive(Default, Serialize, Deserialize)]
|
||||
pub struct PortState {
|
||||
#[serde(deserialize_with = "deserialize_last_change")]
|
||||
last_change: UnixTimestamp,
|
||||
#[serde(skip_deserializing)]
|
||||
status: PortStatus,
|
||||
}
|
||||
|
||||
fn deserialize_last_change<'de, D>(deserializer: D) -> Result<UnixTimestamp, D::Error>
|
||||
where
|
||||
D: serde::Deserializer<'de>,
|
||||
{
|
||||
Ok(match Option::<UnixTimestamp>::deserialize(deserializer)? {
|
||||
Some(timestamp) => timestamp,
|
||||
None => now(),
|
||||
})
|
||||
}
|
||||
|
||||
fn now() -> UnixTimestamp {
|
||||
SystemTime::now()
|
||||
.duration_since(UNIX_EPOCH)
|
||||
.expect("timestamp overflow")
|
||||
.as_secs()
|
||||
}
|
||||
|
||||
impl PortState {
|
||||
pub fn new_state(&mut self, status: PortStatus) {
|
||||
self.last_change = SystemTime::now()
|
||||
.duration_since(UNIX_EPOCH)
|
||||
.expect("timestamp overflow")
|
||||
.as_secs();
|
||||
self.last_change = now();
|
||||
|
||||
self.status = status;
|
||||
}
|
||||
@ -187,7 +202,15 @@ impl PortHandler {
|
||||
.unwrap()
|
||||
.values_mut()
|
||||
.for_each(|value| {
|
||||
value.as_object_mut().unwrap().remove("status").unwrap();
|
||||
let value_object = value.as_object_mut().unwrap();
|
||||
|
||||
// it does not make sense to store when the did anything else other than disconnect
|
||||
// because when we restart the server it will no longer be connected
|
||||
if value_object.get("status").unwrap().as_str().unwrap() != "disconnected" {
|
||||
*value_object.get_mut("last_change").unwrap() = serde_json::Value::Null;
|
||||
}
|
||||
|
||||
value_object.remove("status").unwrap();
|
||||
});
|
||||
|
||||
serde_json::to_writer(BufWriter::new(File::create(&temp_file)?), &value)?;
|
||||
|
Loading…
Reference in New Issue
Block a user