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)]
|
#[derive(Default, Serialize, Deserialize)]
|
||||||
pub struct PortState {
|
pub struct PortState {
|
||||||
|
#[serde(deserialize_with = "deserialize_last_change")]
|
||||||
last_change: UnixTimestamp,
|
last_change: UnixTimestamp,
|
||||||
#[serde(skip_deserializing)]
|
#[serde(skip_deserializing)]
|
||||||
status: PortStatus,
|
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 {
|
impl PortState {
|
||||||
pub fn new_state(&mut self, status: PortStatus) {
|
pub fn new_state(&mut self, status: PortStatus) {
|
||||||
self.last_change = SystemTime::now()
|
self.last_change = now();
|
||||||
.duration_since(UNIX_EPOCH)
|
|
||||||
.expect("timestamp overflow")
|
|
||||||
.as_secs();
|
|
||||||
|
|
||||||
self.status = status;
|
self.status = status;
|
||||||
}
|
}
|
||||||
@ -187,7 +202,15 @@ impl PortHandler {
|
|||||||
.unwrap()
|
.unwrap()
|
||||||
.values_mut()
|
.values_mut()
|
||||||
.for_each(|value| {
|
.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)?;
|
serde_json::to_writer(BufWriter::new(File::create(&temp_file)?), &value)?;
|
||||||
|
Loading…
Reference in New Issue
Block a user