From afb2fbe4ff252c02f1674914b773919bebcac22e Mon Sep 17 00:00:00 2001 From: jude Date: Tue, 22 Mar 2022 22:21:47 +0000 Subject: [PATCH] patch reminders --- web/src/lib.rs | 7 +- web/src/macros.rs | 38 +++++ web/src/routes/dashboard/guild.rs | 157 +++++++++++++----- web/src/routes/dashboard/mod.rs | 7 + web/static/img/logo_flat.webp | Bin 0 -> 62292 bytes web/static/js/main.js | 148 +++++++++++------ web/templates/base.html.tera | 2 +- web/templates/dashboard.html.tera | 8 +- .../guild_reminder.html.tera | 4 +- 9 files changed, 274 insertions(+), 97 deletions(-) create mode 100644 web/static/img/logo_flat.webp diff --git a/web/src/lib.rs b/web/src/lib.rs index ff93af0..274a796 100644 --- a/web/src/lib.rs +++ b/web/src/lib.rs @@ -122,7 +122,12 @@ pub async fn initialize( warn!("Exiting rocket runtime"); // distribute kill signal - kill_channel.send(()); + match kill_channel.send(()) { + Ok(_) => {} + Err(e) => { + error!("Failed to issue kill signal: {:?}", e); + } + } Ok(()) } diff --git a/web/src/macros.rs b/web/src/macros.rs index e14d3a4..8b33616 100644 --- a/web/src/macros.rs +++ b/web/src/macros.rs @@ -79,3 +79,41 @@ macro_rules! check_authorization { } } } + +macro_rules! update_field { + ($pool:expr, $error:ident, $reminder:ident.[$field:ident]) => { + if let Some(value) = &$reminder.$field { + match sqlx::query(concat!( + "UPDATE reminders SET `", + stringify!($field), + "` = ? WHERE uid = ?" + )) + .bind(value) + .bind(&$reminder.uid) + .execute($pool) + .await + { + Ok(_) => {} + Err(e) => { + warn!( + concat!( + "Error in `update_field!(", + stringify!($pool), + stringify!($reminder), + stringify!($field), + ")': {:?}" + ), + e + ); + + $error.push(format!("Error setting field {}", stringify!($field))); + } + } + } + }; + + ($pool:expr, $error:ident, $reminder:ident.[$field:ident, $($fields:ident),+]) => { + update_field!($pool, $error, $reminder.[$field]); + update_field!($pool, $error, $reminder.[$($fields),+]); + }; +} diff --git a/web/src/routes/dashboard/guild.rs b/web/src/routes/dashboard/guild.rs index b2c5243..a610172 100644 --- a/web/src/routes/dashboard/guild.rs +++ b/web/src/routes/dashboard/guild.rs @@ -294,42 +294,35 @@ pub async fn get_reminders(id: u64, ctx: &State, pool: &State, pool: &State>, ) -> JsonValue { - if let Some(enabled) = reminder.enabled { - sqlx::query!("UPDATE reminders SET enabled = ? WHERE uid = ?", enabled, reminder.uid) - .execute(pool.inner()) - .await; + let mut error = vec![]; + + update_field!(pool.inner(), error, reminder.[ + attachment, + attachment_name, + avatar, + content, + embed_author, + embed_author_url, + embed_color, + embed_description, + embed_footer, + embed_footer_url, + embed_image_url, + embed_thumbnail_url, + embed_title, + enabled, + expires, + interval_seconds, + interval_months, + name, + pin, + restartable, + tts, + username, + utc_time + ]); + + if reminder.channel > 0 { + let channel = ChannelId(reminder.channel).to_channel_cached(&serenity_context.inner()); + match channel { + Some(channel) => { + let channel_matches_guild = channel.guild().map_or(false, |c| c.guild_id.0 == id); + + if !channel_matches_guild { + warn!( + "Error in `edit_reminder`: channel {:?} not found for guild {}", + reminder.channel, id + ); + + return json!({"error": "Channel not found"}); + } + + let channel = create_database_channel( + serenity_context.inner(), + ChannelId(reminder.channel), + pool.inner(), + ) + .await; + + if let Err(e) = channel { + warn!("`create_database_channel` returned an error code: {:?}", e); + + return json!({"error": "Failed to configure channel for reminders. Please check the bot permissions"}); + } + + let channel = channel.unwrap(); + + match sqlx::query!( + "UPDATE reminders SET channel_id = ? WHERE uid = ?", + channel, + reminder.uid + ) + .execute(pool.inner()) + .await + { + Ok(_) => {} + Err(e) => { + warn!("Error setting channel: {:?}", e); + + error.push("Couldn't set channel".to_string()) + } + } + } + + None => { + warn!( + "Error in `edit_reminder`: channel {:?} not found for guild {}", + reminder.channel, id + ); + + return json!({"error": "Channel not found"}); + } + } } match sqlx::query_as_unchecked!( @@ -397,12 +470,12 @@ pub async fn edit_reminder( .fetch_one(pool.inner()) .await { - Ok(reminder) => json!(reminder), + Ok(reminder) => json!({"reminder": reminder, "errors": error}), Err(e) => { warn!("Error exiting `edit_reminder': {:?}", e); - json!({"error": "Unknown error"}) + json!({"reminder": Option::::None, "errors": vec!["Unknown error"]}) } } } diff --git a/web/src/routes/dashboard/mod.rs b/web/src/routes/dashboard/mod.rs index 2e130a5..5577102 100644 --- a/web/src/routes/dashboard/mod.rs +++ b/web/src/routes/dashboard/mod.rs @@ -22,6 +22,10 @@ fn name_default() -> String { "Reminder".to_string() } +fn channel_default() -> u64 { + 0 +} + #[derive(Serialize, Deserialize)] pub struct Reminder { attachment: Option>, @@ -63,6 +67,9 @@ pub struct PatchReminder { attachment_name: Unset>, #[serde(default)] avatar: Unset>, + #[serde(default = "channel_default")] + #[serde(with = "string")] + channel: u64, #[serde(default)] content: Unset, #[serde(default)] diff --git a/web/static/img/logo_flat.webp b/web/static/img/logo_flat.webp new file mode 100644 index 0000000000000000000000000000000000000000..35f4a2649d693421f076ae46f14e5876612143a9 GIT binary patch literal 62292 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

q$DkS>*4J$P6R7Q?iBmb{3i<0 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 n5jqp3eTv6*Ek+acf6(J!e+m2xkH5PU literal 0 HcmV?d00001 diff --git a/web/static/js/main.js b/web/static/js/main.js index 80e31f7..2bb5778 100644 --- a/web/static/js/main.js +++ b/web/static/js/main.js @@ -12,6 +12,10 @@ function colorToInt(r, g, b) { return (r << 16) + (g << 8) + b; } +function intToColor(i) { + return `#${i.toString(16)}`; +} + function resize_textareas() { document.querySelectorAll("textarea.autoresize").forEach((element) => { element.style.height = ""; @@ -134,19 +138,23 @@ async function fetch_reminders(guild_id) { document.dispatchEvent(remindersLoadedEvent); } }); - - register_interval_hide(); } document.addEventListener("remindersLoaded", (event) => { const guild = document.querySelector(".guildList a.is-active").dataset["guild"]; for (let reminder of event.detail) { - reminder.node.querySelector("button.hide-box").addEventListener("click", () => { - reminder.node.closest(".reminderContent").classList.toggle("is-collapsed"); + let node = reminder.node; + + node.querySelector("button.hide-box").addEventListener("click", () => { + node.closest(".reminderContent").classList.toggle("is-collapsed"); }); - const enableBtn = reminder.node.querySelector(".disable-enable"); + node.querySelector("div.discord-embed").style.borderLeftColor = intToColor( + reminder.embed_color + ); + + const enableBtn = node.querySelector(".disable-enable"); enableBtn.addEventListener("click", () => { let enable = enableBtn.dataset.action === "enable"; @@ -167,14 +175,68 @@ document.addEventListener("remindersLoaded", (event) => { }); }); - reminder.node - .querySelector("button.delete-reminder") - .addEventListener("click", () => { - let uid = reminder.node.closest(".reminderContent").dataset.uid; + node.querySelector("button.delete-reminder").addEventListener("click", () => { + $deleteReminderBtn.dataset["uid"] = reminder["uid"]; + $deleteReminderBtn.closest(".modal").classList.toggle("is-active"); + }); - $deleteReminderBtn.dataset["uid"] = uid; - $deleteReminderBtn.closest(".modal").classList.toggle("is-active"); - }); + node.querySelector("button.save-btn").addEventListener("click", (event) => { + let seconds = + parseInt(node.querySelector('input[name="interval_seconds"]').value) || + null; + let months = + parseInt(node.querySelector('input[name="interval_months"]').value) || + null; + + let rgb_color = window.getComputedStyle( + node.querySelector("div.discord-embed") + ).borderLeftColor; + let rgb = rgb_color.match(/\d+/g); + let color = colorToInt(parseInt(rgb[0]), parseInt(rgb[1]), parseInt(rgb[2])); + + let utc_time = luxon.DateTime.fromISO( + node.querySelector('input[name="time"]').value + ).setZone("UTC"); + + let reminder = { + uid: node.closest(".reminderContent").dataset["uid"], + avatar: node.querySelector("img.discord-avatar").src, + channel: node.querySelector("select.channel-selector").value, + content: node.querySelector('textarea[name="content"]').value, + embed_author_url: node.querySelector("img.embed_author_url").src, + embed_author: node.querySelector('textarea[name="embed_author"]').value, + embed_color: color, + embed_description: node.querySelector( + 'textarea[name="embed_description"]' + ).value, + embed_footer: node.querySelector('textarea[name="embed_footer"]').value, + embed_footer_url: node.querySelector("img.embed_footer_url").src, + embed_image_url: node.querySelector("img.embed_image_url").src, + embed_thumbnail_url: node.querySelector("img.embed_thumbnail_url").src, + embed_title: node.querySelector('textarea[name="embed_title"]').value, + expires: null, + interval_seconds: seconds, + interval_months: months, + name: node.querySelector('input[name="name"]').value, + pin: node.querySelector('input[name="pin"]').checked, + tts: node.querySelector('input[name="tts"]').checked, + username: node.querySelector('input[name="username"]').value, + utc_time: utc_time.toFormat("yyyy-LL-dd'T'HH:mm:ss"), + }; + + // send to server + let guild = document.querySelector(".guildList a.is-active").dataset["guild"]; + + fetch(`/dashboard/api/guild/${guild}/reminders`, { + method: "PATCH", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(reminder), + }) + .then((response) => response.json()) + .then((data) => console.log(data)); + }); } }); @@ -214,19 +276,6 @@ colorPicker.on("color:change", function (color) { $colorPickerInput.value = color.hexString; }); -document.querySelectorAll(".change-color").forEach((element) => { - element.addEventListener("click", (e) => { - e.preventDefault(); - - $discordFrame = element - .closest("div.reminderContent") - .querySelector("div.discord-embed"); - $colorPickerModal.classList.toggle("is-active"); - colorPicker.color.rgbString = - window.getComputedStyle($discordFrame).borderLeftColor; - }); -}); - $colorPickerModal.querySelector("button.is-success").addEventListener("click", () => { $discordFrame.style.borderLeftColor = colorPicker.color.rgbString; @@ -464,7 +513,7 @@ let $img; const $urlModal = document.querySelector("div#addImageModal"); const $urlInput = $urlModal.querySelector("input"); -$urlModal.querySelector("button.is-success").addEventListener("click", () => { +$urlModal.querySelector("button#setImgUrl").addEventListener("click", () => { $img.src = $urlInput.value; $urlInput.value = ""; @@ -481,26 +530,29 @@ document.querySelectorAll("button.close-modal").forEach((element) => { }); }); -document.querySelectorAll(".customizable").forEach((element) => { - element.querySelector("a").addEventListener("click", (e) => { - e.preventDefault(); +document.addEventListener("remindersLoaded", () => { + document.querySelectorAll(".customizable").forEach((element) => { + element.querySelector("a").addEventListener("click", (e) => { + e.preventDefault(); - $img = element.querySelector("img"); + $img = element.querySelector("img"); - $urlModal.classList.toggle("is-active"); + $urlModal.classList.toggle("is-active"); + }); }); -}); -document.querySelectorAll("a.icon-toggle").forEach((element) => { - element.addEventListener("click", (e) => { - e.preventDefault(); + const fileInput = document.querySelectorAll("input[type=file]"); - element.classList.toggle("is-active"); + fileInput.forEach((element) => { + element.addEventListener("change", () => { + if (element.files.length > 0) { + const fileName = element.parentElement.querySelector(".file-label"); + fileName.textContent = element.files[0].name; + } + }); }); -}); -function register_interval_hide() { - let $showInterval = document.querySelectorAll("a.intervalLabel"); + const $showInterval = document.querySelectorAll("a.intervalLabel"); $showInterval.forEach((element) => { element.addEventListener("click", () => { @@ -509,16 +561,18 @@ function register_interval_hide() { element.nextElementSibling.classList.toggle("is-hidden"); }); }); -} -const fileInput = document.querySelectorAll("input[type=file]"); + document.querySelectorAll(".change-color").forEach((element) => { + element.addEventListener("click", (e) => { + e.preventDefault(); -fileInput.forEach((element) => { - element.addEventListener("change", () => { - if (element.files.length > 0) { - const fileName = element.parentElement.querySelector(".file-label"); - fileName.textContent = element.files[0].name; - } + $discordFrame = element + .closest("div.reminderContent") + .querySelector("div.discord-embed"); + $colorPickerModal.classList.toggle("is-active"); + colorPicker.color.rgbString = + window.getComputedStyle($discordFrame).borderLeftColor; + }); }); }); diff --git a/web/templates/base.html.tera b/web/templates/base.html.tera index 788ad7f..ecad959 100644 --- a/web/templates/base.html.tera +++ b/web/templates/base.html.tera @@ -36,7 +36,7 @@