don't store when a client did anything but disconnect

This commit is contained in:
soruh 2023-06-20 18:49:36 +02:00
parent 1ca44e300e
commit eb5e5fd0fa

View File

@ -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,
}
impl PortState {
pub fn new_state(&mut self, status: PortStatus) {
self.last_change = SystemTime::now()
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();
.as_secs()
}
impl PortState {
pub fn new_state(&mut self, status: PortStatus) {
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)?;