Fix character counting on /look. Initial support for jumping over DST boundaries

This commit is contained in:
jude 2022-11-20 12:20:10 +00:00
parent e9792e6322
commit 6e087bd2dd
6 changed files with 571 additions and 495 deletions

1031
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -14,7 +14,7 @@ regex = "1.6"
log = "0.4" log = "0.4"
env_logger = "0.9" env_logger = "0.9"
chrono = "0.4" chrono = "0.4"
chrono-tz = { version = "0.6", features = ["serde"] } chrono-tz = { version = "0.8", features = ["serde"] }
lazy_static = "1.4" lazy_static = "1.4"
num-integer = "0.1" num-integer = "0.1"
serde = "1.0" serde = "1.0"

View File

@ -1,4 +1,4 @@
use chrono::Duration; use chrono::{DateTime, Days, Duration};
use chrono_tz::Tz; use chrono_tz::Tz;
use lazy_static::lazy_static; use lazy_static::lazy_static;
use log::{error, info, warn}; use log::{error, info, warn};
@ -374,7 +374,30 @@ UPDATE channels SET webhook_id = NULL, webhook_token = NULL WHERE channel = ?
} }
} }
fn increment_days(
now: NaiveDateTime,
mut new_time: NaiveDateTime,
interval: u32,
) -> Option<NaiveDateTime> {
while new_time < now {
new_time = new_time.checked_add_days(Days::new((interval / 86400).into()))?;
}
Some(new_time)
}
if let Some(interval) = self.interval_seconds { if let Some(interval) = self.interval_seconds {
if interval.div_rem(&86400).1 == 0 {
updated_reminder_time =
match increment_days(now, updated_reminder_time, interval) {
Some(d) => d,
None => {
warn!("Failed to update days on a reminder.");
updated_reminder_time
}
}
}
while updated_reminder_time < now { while updated_reminder_time < now {
updated_reminder_time += Duration::seconds(interval as i64); updated_reminder_time += Duration::seconds(interval as i64);
} }

View File

@ -245,7 +245,7 @@ pub async fn look(
char_count < EMBED_DESCRIPTION_MAX_LENGTH char_count < EMBED_DESCRIPTION_MAX_LENGTH
}) })
.collect::<Vec<String>>() .collect::<Vec<String>>()
.join("\n"); .join("");
let pages = reminders let pages = reminders
.iter() .iter()

View File

@ -113,7 +113,7 @@ impl ComponentDataModel {
char_count < EMBED_DESCRIPTION_MAX_LENGTH char_count < EMBED_DESCRIPTION_MAX_LENGTH
}) })
.collect::<Vec<String>>() .collect::<Vec<String>>()
.join("\n"); .join("");
let mut embed = CreateEmbed::default(); let mut embed = CreateEmbed::default();
embed embed

View File

@ -326,14 +326,14 @@ WHERE
if self.interval_seconds.is_some() || self.interval_months.is_some() { if self.interval_seconds.is_some() || self.interval_months.is_some() {
format!( format!(
"'{}' *occurs next at* **{}**, repeating (set by {})", "'{}' *occurs next at* **{}**, repeating (set by {})\n",
self.display_content(), self.display_content(),
time_display, time_display,
self.set_by.map(|i| format!("<@{}>", i)).unwrap_or_else(|| "unknown".to_string()) self.set_by.map(|i| format!("<@{}>", i)).unwrap_or_else(|| "unknown".to_string())
) )
} else { } else {
format!( format!(
"'{}' *occurs next at* **{}** (set by {})", "'{}' *occurs next at* **{}** (set by {})\n",
self.display_content(), self.display_content(),
time_display, time_display,
self.set_by.map(|i| format!("<@{}>", i)).unwrap_or_else(|| "unknown".to_string()) self.set_by.map(|i| format!("<@{}>", i)).unwrap_or_else(|| "unknown".to_string())