diff options
-rw-r--r-- | README.md | 6 | ||||
-rw-r--r-- | ezau-sample.toml | 6 | ||||
-rw-r--r-- | src/config.rs | 3 | ||||
-rw-r--r-- | src/main.rs | 21 |
4 files changed, 35 insertions, 1 deletions
@@ -50,6 +50,12 @@ upload = false # (optional) upload_unknown = false +# How often uploading a log should be retried when it failed. +# Note that this does not include the first try, so a value of 0 means "try it +# once". +# (optional) +retries = 0 + # Discord messaging section. # If this section is missing, ezau will not do Discord notifications for log uploads. # Mandatory keys in this section are only mandatory if the section is present, as the whole Discord functionality is optional. diff --git a/ezau-sample.toml b/ezau-sample.toml index a18d6ad..77d96a8 100644 --- a/ezau-sample.toml +++ b/ezau-sample.toml @@ -8,6 +8,12 @@ upload = false # (optional) upload_unknown = false +# How often uploading a log should be retried when it failed. +# Note that this does not include the first try, so a value of 0 means "try it +# once". +# (optional) +retries = 0 + # Discord messaging section. # If this section is missing, ezau will not do Discord notifications for log uploads. # Mandatory keys in this section are only mandatory if the section is present, as the whole Discord functionality is optional. diff --git a/src/config.rs b/src/config.rs index e4203de..6b9a89d 100644 --- a/src/config.rs +++ b/src/config.rs @@ -11,6 +11,9 @@ pub struct Config { /// Flag indicating whether logs with an unknown boss should be uploaded. #[serde(default)] pub upload_unknown: bool, + /// How often the upload to dps.report should be retried. + #[serde(default)] + pub retries: u32, /// Option Discord information for bot postings. pub discord: Option<Discord>, } diff --git a/src/main.rs b/src/main.rs index f2fa2ec..ddf54d8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,6 +3,7 @@ use std::{ io::{BufReader, BufWriter, Read, Write}, path::{Path, PathBuf}, sync::mpsc::channel, + thread, time::Duration, }; @@ -23,6 +24,7 @@ mod discord; const DPS_REPORT_API: &str = "https://dps.report/uploadContent"; const WATCH_DELAY_SECONDS: u64 = 2; +const RETRY_DELAY: Duration = Duration::from_secs(5); #[derive(Clap, Debug, Clone, PartialEq, Eq, Hash)] #[clap(version = "0.1")] @@ -161,7 +163,24 @@ fn handle_file(config: &Config, filename: &Path) -> Result<()> { return Ok(()); } - let permalink = upload_log(filename)?; + let mut try_counter = 0; + let permalink = loop { + let result = upload_log(filename); + if let Ok(link) = result { + break link; + } + warn!( + "Upload try {} failed, retrying {} more times. Reason: {}", + try_counter + 1, + config.retries - try_counter, + result.as_ref().unwrap_err(), + ); + if try_counter == config.retries { + return Err(result.unwrap_err()); + } + try_counter += 1; + thread::sleep(RETRY_DELAY); + }; info!("Uploaded log, available at {}", permalink); if let Some(d) = &config.discord { |