Compare commits
2 Commits
current
...
jude/custo
Author | SHA1 | Date | |
---|---|---|---|
4d14365f2b | |||
0f4df703eb |
2
Cargo.lock
generated
2
Cargo.lock
generated
@ -2614,7 +2614,7 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "reminder-rs"
|
name = "reminder-rs"
|
||||||
version = "1.7.38"
|
version = "1.7.39"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"base64 0.22.1",
|
"base64 0.22.1",
|
||||||
"chrono",
|
"chrono",
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "reminder-rs"
|
name = "reminder-rs"
|
||||||
version = "1.7.38"
|
version = "1.7.39"
|
||||||
authors = ["Jude Southworth <judesouthworth@pm.me>"]
|
authors = ["Jude Southworth <judesouthworth@pm.me>"]
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
license = "AGPL-3.0 only"
|
license = "AGPL-3.0 only"
|
||||||
|
@ -34,8 +34,10 @@ use crate::{
|
|||||||
lazy_static! {
|
lazy_static! {
|
||||||
pub static ref TIMEFROM_REGEX: Regex =
|
pub static ref TIMEFROM_REGEX: Regex =
|
||||||
Regex::new(r#"<<timefrom:(?P<time>\d+):(?P<format>.+)?>>"#).unwrap();
|
Regex::new(r#"<<timefrom:(?P<time>\d+):(?P<format>.+)?>>"#).unwrap();
|
||||||
pub static ref TIMENOW_REGEX: Regex =
|
pub static ref TIMENOW_REGEX: Regex = Regex::new(
|
||||||
Regex::new(r#"<<timenow:(?P<timezone>(?:\w|/|_)+):(?P<format>.+)?>>"#).unwrap();
|
r#"<<timenow(?:(?P<sign>[+-])(?P<offset>\d+))?:(?P<timezone>(?:\w|/|_)+?):(?P<format>.+?)?>>"#
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
pub static ref LOG_TO_DATABASE: bool = env::var("LOG_TO_DATABASE").map_or(true, |v| v == "1");
|
pub static ref LOG_TO_DATABASE: bool = env::var("LOG_TO_DATABASE").map_or(true, |v| v == "1");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -64,7 +66,7 @@ fn fmt_displacement(format: &str, seconds: u64) -> String {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn substitute(string: &str) -> String {
|
pub fn substitute(string: &str) -> String {
|
||||||
let new = TIMEFROM_REGEX.replace(string, |caps: &Captures| {
|
let new = TIMEFROM_REGEX.replace_all(string, |caps: &Captures| {
|
||||||
let final_time = caps.name("time").map(|m| m.as_str().parse::<i64>().ok()).flatten();
|
let final_time = caps.name("time").map(|m| m.as_str().parse::<i64>().ok()).flatten();
|
||||||
let format = caps.name("format").map(|m| m.as_str());
|
let format = caps.name("format").map(|m| m.as_str());
|
||||||
|
|
||||||
@ -92,12 +94,26 @@ pub fn substitute(string: &str) -> String {
|
|||||||
});
|
});
|
||||||
|
|
||||||
TIMENOW_REGEX
|
TIMENOW_REGEX
|
||||||
.replace(&new, |caps: &Captures| {
|
.replace_all(&new, |caps: &Captures| {
|
||||||
let timezone = caps.name("timezone").map(|m| m.as_str().parse::<Tz>().ok()).flatten();
|
let timezone = caps.name("timezone").map(|m| m.as_str().parse::<Tz>().ok()).flatten();
|
||||||
let format = caps.name("format").map(|m| m.as_str());
|
let format = caps.name("format").map(|m| m.as_str());
|
||||||
|
let sign = caps.name("sign").map(|m| m.as_str());
|
||||||
|
let offset = caps.name("offset").map(|m| m.as_str().parse::<i64>().ok()).flatten();
|
||||||
|
|
||||||
if let (Some(timezone), Some(format)) = (timezone, format) {
|
if let (Some(timezone), Some(format)) = (timezone, format) {
|
||||||
let now = Utc::now().with_timezone(&timezone);
|
let mut now = Utc::now().with_timezone(&timezone);
|
||||||
|
if let (Some(sign), Some(offset)) = (sign, offset) {
|
||||||
|
now = now
|
||||||
|
.checked_add_signed(TimeDelta::seconds(
|
||||||
|
offset * {
|
||||||
|
match sign {
|
||||||
|
"-" => -1,
|
||||||
|
_ => 1,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
))
|
||||||
|
.unwrap_or(now)
|
||||||
|
}
|
||||||
|
|
||||||
now.format(format).to_string()
|
now.format(format).to_string()
|
||||||
} else {
|
} else {
|
||||||
|
@ -37,4 +37,40 @@
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<section class="hero is-small">
|
||||||
|
<div class="hero-body">
|
||||||
|
<div class="container">
|
||||||
|
<p class="title">Custom formatting rules</p>
|
||||||
|
<p class="content">
|
||||||
|
Reminder content can be customized using formatting rules.
|
||||||
|
</p>
|
||||||
|
<p class="subtitle">timefrom</p>
|
||||||
|
<p class="content">
|
||||||
|
The <code>timefrom</code> formatting rule will display a formatted difference
|
||||||
|
between the time the reminder sends and a specified time.
|
||||||
|
<br>
|
||||||
|
For example, if the current time is 1755800000 (UNIX time), the format string
|
||||||
|
<code><<timefrom:1755803600>></code> would display "1 hour"
|
||||||
|
</p>
|
||||||
|
<p class="subtitle">timenow</p>
|
||||||
|
<p class="content">
|
||||||
|
The <code>timenow</code> formatting rule displays the current time or an offset
|
||||||
|
from the current time in a given timezone in a custom format.
|
||||||
|
<br>
|
||||||
|
For example, if the current time is 1755800000 (UNIX time), the format string
|
||||||
|
<code><<timenow:UTC:%H:%M:%S>></code> would display "18:13:20"
|
||||||
|
<br>
|
||||||
|
Optionally, an offset can be provided to display a time from your current time.
|
||||||
|
For example, if the current time is 1755800000 (UNIX time), the format string
|
||||||
|
<code><<timenow+120:UTC:%H:%M:%S>></code> would display "18:15:20",
|
||||||
|
or <code><<timenow-120:UTC:%H:%M:%S>></code> would display "18:11:20"
|
||||||
|
<br>
|
||||||
|
You can use this feature alongside Discord's timestamp formatting. The following
|
||||||
|
will show the text "in 2 minutes" for all users as a Discord timestamp:
|
||||||
|
<code><t:<<timenow+120:UTC:%s>>:R></code>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
Reference in New Issue
Block a user