Update web for daily intervals
This commit is contained in:
		
							
								
								
									
										8
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										8
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							@@ -685,7 +685,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "atty",
 | 
			
		||||
 "humantime 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "humantime",
 | 
			
		||||
 "log",
 | 
			
		||||
 "regex",
 | 
			
		||||
 "termcolor",
 | 
			
		||||
@@ -1069,11 +1069,6 @@ version = "2.1.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "humantime"
 | 
			
		||||
version = "2.1.0"
 | 
			
		||||
source = "git+https://github.com/reminder-bot/humantime#12ce6f50894a56a410b390e5608ac9db8afe2407"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "hyper"
 | 
			
		||||
version = "0.14.23"
 | 
			
		||||
@@ -2145,7 +2140,6 @@ dependencies = [
 | 
			
		||||
 "chrono-tz 0.8.1",
 | 
			
		||||
 "dotenv",
 | 
			
		||||
 "env_logger",
 | 
			
		||||
 "humantime 2.1.0 (git+https://github.com/reminder-bot/humantime)",
 | 
			
		||||
 "lazy-regex",
 | 
			
		||||
 "lazy_static",
 | 
			
		||||
 "levenshtein",
 | 
			
		||||
 
 | 
			
		||||
@@ -75,7 +75,7 @@ impl Display for Ended {
 | 
			
		||||
 | 
			
		||||
impl StdError for Ended {}
 | 
			
		||||
 | 
			
		||||
#[tokio::main]
 | 
			
		||||
#[tokio::main(flavor = "multi_thread")]
 | 
			
		||||
async fn main() -> Result<(), Box<dyn StdError + Send + Sync>> {
 | 
			
		||||
    let (tx, mut rx) = broadcast::channel(16);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -58,6 +58,7 @@ pub async fn export_reminders(
 | 
			
		||||
                 reminders.enabled,
 | 
			
		||||
                 reminders.expires,
 | 
			
		||||
                 reminders.interval_seconds,
 | 
			
		||||
                 reminders.interval_days,
 | 
			
		||||
                 reminders.interval_months,
 | 
			
		||||
                 reminders.name,
 | 
			
		||||
                 reminders.restartable,
 | 
			
		||||
@@ -159,6 +160,7 @@ pub async fn import_reminders(
 | 
			
		||||
                                    enabled: record.enabled,
 | 
			
		||||
                                    expires: record.expires,
 | 
			
		||||
                                    interval_seconds: record.interval_seconds,
 | 
			
		||||
                                    interval_days: record.interval_days,
 | 
			
		||||
                                    interval_months: record.interval_months,
 | 
			
		||||
                                    name: record.name,
 | 
			
		||||
                                    restartable: record.restartable,
 | 
			
		||||
 
 | 
			
		||||
@@ -339,6 +339,7 @@ pub async fn get_reminders(id: u64, ctx: &State<Context>, pool: &State<Pool<MySq
 | 
			
		||||
                 reminders.enabled,
 | 
			
		||||
                 reminders.expires,
 | 
			
		||||
                 reminders.interval_seconds,
 | 
			
		||||
                 reminders.interval_days,
 | 
			
		||||
                 reminders.interval_months,
 | 
			
		||||
                 reminders.name,
 | 
			
		||||
                 reminders.restartable,
 | 
			
		||||
@@ -395,6 +396,7 @@ pub async fn edit_reminder(
 | 
			
		||||
        enabled,
 | 
			
		||||
        expires,
 | 
			
		||||
        interval_seconds,
 | 
			
		||||
        interval_days,
 | 
			
		||||
        interval_months,
 | 
			
		||||
        name,
 | 
			
		||||
        restartable,
 | 
			
		||||
@@ -483,6 +485,7 @@ pub async fn edit_reminder(
 | 
			
		||||
         reminders.enabled,
 | 
			
		||||
         reminders.expires,
 | 
			
		||||
         reminders.interval_seconds,
 | 
			
		||||
         reminders.interval_days,
 | 
			
		||||
         reminders.interval_months,
 | 
			
		||||
         reminders.name,
 | 
			
		||||
         reminders.restartable,
 | 
			
		||||
 
 | 
			
		||||
@@ -132,6 +132,7 @@ pub struct Reminder {
 | 
			
		||||
    enabled: bool,
 | 
			
		||||
    expires: Option<NaiveDateTime>,
 | 
			
		||||
    interval_seconds: Option<u32>,
 | 
			
		||||
    interval_days: Option<u32>,
 | 
			
		||||
    interval_months: Option<u32>,
 | 
			
		||||
    #[serde(default = "name_default")]
 | 
			
		||||
    name: String,
 | 
			
		||||
@@ -164,6 +165,7 @@ pub struct ReminderCsv {
 | 
			
		||||
    enabled: bool,
 | 
			
		||||
    expires: Option<NaiveDateTime>,
 | 
			
		||||
    interval_seconds: Option<u32>,
 | 
			
		||||
    interval_days: Option<u32>,
 | 
			
		||||
    interval_months: Option<u32>,
 | 
			
		||||
    #[serde(default = "name_default")]
 | 
			
		||||
    name: String,
 | 
			
		||||
@@ -214,6 +216,8 @@ pub struct PatchReminder {
 | 
			
		||||
    #[serde(default)]
 | 
			
		||||
    interval_seconds: Unset<Option<u32>>,
 | 
			
		||||
    #[serde(default)]
 | 
			
		||||
    interval_days: Unset<Option<u32>>,
 | 
			
		||||
    #[serde(default)]
 | 
			
		||||
    interval_months: Unset<Option<u32>>,
 | 
			
		||||
    #[serde(default)]
 | 
			
		||||
    name: Unset<String>,
 | 
			
		||||
@@ -370,8 +374,12 @@ pub async fn create_reminder(
 | 
			
		||||
    if reminder.utc_time < Utc::now().naive_utc() {
 | 
			
		||||
        return Err(json!({"error": "Time must be in the future"}));
 | 
			
		||||
    }
 | 
			
		||||
    if reminder.interval_seconds.is_some() || reminder.interval_months.is_some() {
 | 
			
		||||
    if reminder.interval_seconds.is_some()
 | 
			
		||||
        || reminder.interval_days.is_some()
 | 
			
		||||
        || reminder.interval_months.is_some()
 | 
			
		||||
    {
 | 
			
		||||
        if reminder.interval_months.unwrap_or(0) * 30 * DAY as u32
 | 
			
		||||
            + reminder.interval_days.unwrap_or(0) * DAY as u32
 | 
			
		||||
            + reminder.interval_seconds.unwrap_or(0)
 | 
			
		||||
            < *MIN_INTERVAL
 | 
			
		||||
        {
 | 
			
		||||
@@ -380,7 +388,10 @@ pub async fn create_reminder(
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // check patreon if necessary
 | 
			
		||||
    if reminder.interval_seconds.is_some() || reminder.interval_months.is_some() {
 | 
			
		||||
    if reminder.interval_seconds.is_some()
 | 
			
		||||
        || reminder.interval_days.is_some()
 | 
			
		||||
        || reminder.interval_months.is_some()
 | 
			
		||||
    {
 | 
			
		||||
        if !check_guild_subscription(&ctx, guild_id).await
 | 
			
		||||
            && !check_subscription(&ctx, user_id).await
 | 
			
		||||
        {
 | 
			
		||||
@@ -416,13 +427,14 @@ pub async fn create_reminder(
 | 
			
		||||
         enabled,
 | 
			
		||||
         expires,
 | 
			
		||||
         interval_seconds,
 | 
			
		||||
         interval_days,
 | 
			
		||||
         interval_months,
 | 
			
		||||
         name,
 | 
			
		||||
         restartable,
 | 
			
		||||
         tts,
 | 
			
		||||
         username,
 | 
			
		||||
         `utc_time`
 | 
			
		||||
        ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
 | 
			
		||||
        ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
 | 
			
		||||
        new_uid,
 | 
			
		||||
        attachment_data,
 | 
			
		||||
        reminder.attachment_name,
 | 
			
		||||
@@ -442,6 +454,7 @@ pub async fn create_reminder(
 | 
			
		||||
        reminder.enabled,
 | 
			
		||||
        reminder.expires,
 | 
			
		||||
        reminder.interval_seconds,
 | 
			
		||||
        reminder.interval_days,
 | 
			
		||||
        reminder.interval_months,
 | 
			
		||||
        name,
 | 
			
		||||
        reminder.restartable,
 | 
			
		||||
@@ -473,6 +486,7 @@ pub async fn create_reminder(
 | 
			
		||||
             reminders.enabled,
 | 
			
		||||
             reminders.expires,
 | 
			
		||||
             reminders.interval_seconds,
 | 
			
		||||
             reminders.interval_days,
 | 
			
		||||
             reminders.interval_months,
 | 
			
		||||
             reminders.name,
 | 
			
		||||
             reminders.restartable,
 | 
			
		||||
 
 | 
			
		||||
@@ -135,14 +135,14 @@ pub async fn discord_callback(
 | 
			
		||||
                    Err(Flash::new(
 | 
			
		||||
                        Redirect::to(uri!(super::return_to_same_site(""))),
 | 
			
		||||
                        "warning",
 | 
			
		||||
                        "Your login request was rejected",
 | 
			
		||||
                        "Your login request was rejected. The server may be misconfigured. Please retry or alert us in Discord.",
 | 
			
		||||
                    ))
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            Err(Flash::new(Redirect::to(uri!(super::return_to_same_site(""))), "danger", "Your request failed to validate, and so has been rejected (error: CSRF Validation Failure)"))
 | 
			
		||||
            Err(Flash::new(Redirect::to(uri!(super::return_to_same_site(""))), "danger", "Your request failed to validate, and so has been rejected (CSRF Validation Failure)"))
 | 
			
		||||
        }
 | 
			
		||||
    } else {
 | 
			
		||||
        Err(Flash::new(Redirect::to(uri!(super::return_to_same_site(""))), "warning", "Your request was missing information, and so has been rejected (error: CSRF Validation Tokens Missing)"))
 | 
			
		||||
        Err(Flash::new(Redirect::to(uri!(super::return_to_same_site(""))), "warning", "Your request was missing information, and so has been rejected (CSRF Validation Tokens Missing)"))
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -7,9 +7,9 @@ function get_interval(element) {
 | 
			
		||||
 | 
			
		||||
    return {
 | 
			
		||||
        months: parseInt(months) || null,
 | 
			
		||||
        days: parseInt(days) || null,
 | 
			
		||||
        seconds:
 | 
			
		||||
            (parseInt(days) || 0) * 86400 +
 | 
			
		||||
                (parseInt(hours) || 0) * 3600 +
 | 
			
		||||
            (parseInt(hours) || 0) * 3600 +
 | 
			
		||||
                (parseInt(minutes) || 0) * 60 +
 | 
			
		||||
                (parseInt(seconds) || 0) || null,
 | 
			
		||||
    };
 | 
			
		||||
@@ -42,13 +42,6 @@ function update_interval(element) {
 | 
			
		||||
        minutes.value = String(remainder).padStart(2, "0");
 | 
			
		||||
        hours.value = String(Number(hours.value) + Number(quotient)).padStart(2, "0");
 | 
			
		||||
    }
 | 
			
		||||
    if (hours.value >= 24) {
 | 
			
		||||
        let quotient = Math.floor(hours.value / 24);
 | 
			
		||||
        let remainder = hours.value % 24;
 | 
			
		||||
 | 
			
		||||
        hours.value = String(remainder).padStart(2, "0");
 | 
			
		||||
        days.value = Number(days.value) + Number(quotient);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const $intervalGroup = document.querySelector(".interval-group");
 | 
			
		||||
 
 | 
			
		||||
@@ -319,6 +319,7 @@ async function serialize_reminder(node, mode) {
 | 
			
		||||
        embed_fields: fields,
 | 
			
		||||
        expires: expiration_time,
 | 
			
		||||
        interval_seconds: mode !== "template" ? interval.seconds : null,
 | 
			
		||||
        interval_days: mode !== "template" ? interval.days : null,
 | 
			
		||||
        interval_months: mode !== "template" ? interval.months : null,
 | 
			
		||||
        name: node.querySelector('input[name="name"]').value,
 | 
			
		||||
        tts: node.querySelector('input[name="tts"]').checked,
 | 
			
		||||
 
 | 
			
		||||
@@ -49,7 +49,7 @@
 | 
			
		||||
                <p class="content">
 | 
			
		||||
                    Monthly or yearly intervals are configured the same as fixed intervals. Instead of a fixed time
 | 
			
		||||
                    interval, these reminders repeat on a certain day each month or each year. This makes them ideal
 | 
			
		||||
                    for marking certain dates.
 | 
			
		||||
                    for marking calendar events.
 | 
			
		||||
                </p>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
@@ -61,7 +61,8 @@
 | 
			
		||||
                <p class="title">Interval expiration</p>
 | 
			
		||||
                <p class="content">
 | 
			
		||||
                    An expiration time can also be specified, both via commands and dashboard, for repeating reminders.
 | 
			
		||||
                    This is optional, and if omitted, the reminder will repeat indefinitely.
 | 
			
		||||
                    This is optional, and if omitted, the reminder will repeat indefinitely. Otherwise, the reminder
 | 
			
		||||
                    will be deleted once the expiration date is reached.
 | 
			
		||||
                </p>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user