1#![warn(missing_docs)]
11
12use anyhow::{Context, Result};
13use chrono::{TimeZone, Utc};
14use serde::Deserialize;
15
16#[derive(Debug, Deserialize)]
17struct RepeaterStatus {
18 last_updated: String,
19}
20
21fn get_bm_repeater_last_update(repeater_id: u32) -> Result<String, anyhow::Error> {
22 let request_url = format!(
23 "http://api.brandmeister.network/v1.0/repeater/?action=get&q={}",
24 repeater_id
25 );
26 let status: RepeaterStatus = ureq::get(&request_url)
27 .call()?
28 .into_json()
29 .context("error parsing brandmeister API result, ensure repeater id is valid")?;
30 Ok(status.last_updated)
31}
32
33pub fn last_seen_seconds(repeater_id: u32) -> Result<i64> {
41 let last_update_str = get_bm_repeater_last_update(repeater_id)?;
42 let last_update = Utc.datetime_from_str(&last_update_str, "%Y-%m-%d %H:%M:%S")?;
43 Ok(Utc::now().signed_duration_since(last_update).num_seconds())
44}