Browse Source

Get ack tracking working with new ww-rs version, warn on pending

- whatsappweb-eta has now been hacked up to support PendingSend and
  Sent ack types, making our ack tracking actually worthwhile!
- We now additionally warn if a message has been in the PendingSend
  state for too long, indicating the phone might be disconnected.
master
eta 4 years ago
parent
commit
29028af3db
  1. 8
      Cargo.lock
  2. 2
      src/config.rs
  3. 28
      src/whatsapp.rs

8
Cargo.lock generated

@ -2057,7 +2057,7 @@ dependencies = [ @@ -2057,7 +2057,7 @@ dependencies = [
"tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
"toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
"uuid 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)",
"whatsappweb-eta 0.3.2 (git+https://git.theta.eu.org/whatsappweb-rs.git/)",
"whatsappweb-eta 0.4.0 (git+https://git.theta.eu.org/whatsappweb-rs.git/)",
]
[[package]]
@ -2592,8 +2592,8 @@ dependencies = [ @@ -2592,8 +2592,8 @@ dependencies = [
[[package]]
name = "whatsappweb-eta"
version = "0.3.2"
source = "git+https://git.theta.eu.org/whatsappweb-rs.git/#b05b1624b198cd0c4a5ad40e91dd31d78d23506b"
version = "0.4.0"
source = "git+https://git.theta.eu.org/whatsappweb-rs.git/#2c82b02f509a761cbc12b75f209d8ff400d68918"
dependencies = [
"base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
"bincode 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
@ -2958,7 +2958,7 @@ dependencies = [ @@ -2958,7 +2958,7 @@ dependencies = [
"checksum vcpkg 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "33dd455d0f96e90a75803cfeb7f948768c08d70a6de9a8d2362461935698bf95"
"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd"
"checksum want 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b6395efa4784b027708f7451087e647ec73cc74f5d9bc2e418404248d679a230"
"checksum whatsappweb-eta 0.3.2 (git+https://git.theta.eu.org/whatsappweb-rs.git/)" = "<none>"
"checksum whatsappweb-eta 0.4.0 (git+https://git.theta.eu.org/whatsappweb-rs.git/)" = "<none>"
"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
"checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770"
"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"

2
src/config.rs

@ -46,6 +46,8 @@ pub struct WhatsappConfig { @@ -46,6 +46,8 @@ pub struct WhatsappConfig {
#[serde(default)]
pub ack_warn_ms: Option<u64>,
#[serde(default)]
pub ack_warn_pending_ms: Option<u64>,
#[serde(default)]
pub ack_expiry_ms: Option<u64>,
#[serde(default)]
pub ack_resend_ms: Option<u64>,

28
src/whatsapp.rs

@ -59,7 +59,8 @@ struct MessageSendStatus { @@ -59,7 +59,8 @@ struct MessageSendStatus {
sent_ts: DateTime<Utc>,
content: ChatMessageContent,
destination: Jid,
alerted: bool
alerted: bool,
alerted_pending: bool,
}
pub struct WhatsappManager {
conn: Option<WhatsappWebConnection<WhatsappHandler>>,
@ -72,6 +73,7 @@ pub struct WhatsappManager { @@ -72,6 +73,7 @@ pub struct WhatsappManager {
outgoing_messages: HashMap<String, MessageSendStatus>,
state: WaState,
ack_warn: u64,
ack_warn_pending: u64,
ack_expiry: u64,
ack_resend: Option<u64>,
backlog_start: Option<chrono::NaiveDateTime>,
@ -108,6 +110,7 @@ impl WhatsappManager { @@ -108,6 +110,7 @@ impl WhatsappManager {
let autocreate = p.cfg.whatsapp.autocreate_prefix.clone();
let ack_ivl = p.cfg.whatsapp.ack_check_interval.unwrap_or(10);
let ack_warn_ms = p.cfg.whatsapp.ack_warn_ms.unwrap_or(5000);
let ack_warn_pending_ms = p.cfg.whatsapp.ack_warn_pending_ms.unwrap_or(ack_warn_ms * 2);
let ack_expiry_ms = p.cfg.whatsapp.ack_expiry_ms.unwrap_or(60000);
let ack_resend_ms = p.cfg.whatsapp.ack_resend_ms.clone();
let backlog_start = p.cfg.whatsapp.backlog_start.clone();
@ -133,6 +136,7 @@ impl WhatsappManager { @@ -133,6 +136,7 @@ impl WhatsappManager {
connected: false,
our_jid: None,
ack_warn: ack_warn_ms,
ack_warn_pending: ack_warn_pending_ms,
ack_expiry: ack_expiry_ms,
ack_resend: ack_resend_ms,
wa_tx, backlog_start,
@ -193,8 +197,6 @@ impl WhatsappManager { @@ -193,8 +197,6 @@ impl WhatsappManager {
fn check_acks(&mut self) -> Result<()> {
trace!("Checking acks");
let now = Utc::now();
/*
FIXME: this doesn't actually work, because we don't get "Send" acks yet!
let mut to_resend = vec![];
for (mid, mss) in self.outgoing_messages.iter_mut() {
let delta = now - mss.sent_ts;
@ -202,7 +204,7 @@ impl WhatsappManager { @@ -202,7 +204,7 @@ impl WhatsappManager {
if mss.ack_level.is_none() {
if delta_ms >= self.ack_warn && !mss.alerted {
warn!("Message {} has been un-acked for {} seconds!", mid, delta.num_seconds());
self.cb_tx.unbounded_send(ControlBotCommand::ReportFailure(format!("Warning: Message ID {} apparently hasn't been sent yet!", mid)))
self.cb_tx.unbounded_send(ControlBotCommand::ReportFailure(format!("Warning: Sending message ID {} seems to have failed!", mid)))
.unwrap();
mss.alerted = true;
}
@ -212,6 +214,16 @@ impl WhatsappManager { @@ -212,6 +214,16 @@ impl WhatsappManager {
}
}
}
if let Some(MessageAckLevel::PendingSend) = mss.ack_level {
if delta_ms >= self.ack_warn_pending && !mss.alerted_pending {
warn!("Message {} has been pending for {} seconds!", mid, delta.num_seconds());
self.cb_tx.unbounded_send(ControlBotCommand::ReportFailure(format!("Warning: Sending message ID {} is still pending. Is WhatsApp running and connected?", mid)))
.unwrap();
self.cb_tx.unbounded_send(ControlBotCommand::CommandResponse("For more information on pending outgoing messages, try the \x02WHATSAPP RECEIPTS\x02 command.".into()))
.unwrap();
mss.alerted_pending = true;
}
}
}
for mid in to_resend {
let mss = self.outgoing_messages.remove(&mid).unwrap();
@ -220,9 +232,12 @@ impl WhatsappManager { @@ -220,9 +232,12 @@ impl WhatsappManager {
.unwrap();
self.send_message(mss.content, mss.destination)?;
}
*/
let ack_expiry = self.ack_expiry;
self.outgoing_messages.retain(|_, m| {
if let Some(MessageAckLevel::PendingSend) | None = m.ack_level {
// Always retain the failures, so the user knows what happened with them (!)
return true;
}
let diff_ms = (now - m.sent_ts).num_milliseconds() as u64;
diff_ms < ack_expiry
});
@ -300,7 +315,8 @@ impl WhatsappManager { @@ -300,7 +315,8 @@ impl WhatsappManager {
sent_ts: Utc::now(),
content,
destination: jid,
alerted: false
alerted: false,
alerted_pending: false
};
let mid = self.conn.as_mut().unwrap()
.send_message(c, j);

Loading…
Cancel
Save