diff --git a/Cargo.lock b/Cargo.lock index ab7f6f6..cbbd6bc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -49,7 +49,7 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" dependencies = [ - "getrandom 0.2.4", + "getrandom 0.2.5", "once_cell", "version_check", ] @@ -74,9 +74,9 @@ dependencies = [ [[package]] name = "async-stream" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "171374e7e3b2504e0e5236e3b59260560f9fe94bfe9ac39ba5e4e929c5590625" +checksum = "dad5c83079eae9969be7fadefe640a1c566901f05ff91ab221de4b6f68d9507e" dependencies = [ "async-stream-impl", "futures-core", @@ -84,9 +84,9 @@ dependencies = [ [[package]] name = "async-stream-impl" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "648ed8c8d2ce5409ccd57453d9d1b214b342a0d69376a6feda1fd6cae3299308" +checksum = "10f203db73a71dfa2fb6dd22763990fa26f3d2625a6da2da900d23b87d26be27" dependencies = [ "proc-macro2", "quote", @@ -387,9 +387,9 @@ checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" [[package]] name = "cpufeatures" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469" +checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" dependencies = [ "libc", ] @@ -420,9 +420,9 @@ dependencies = [ [[package]] name = "crossbeam-queue" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dd435b205a4842da59efd07628f921c096bc1cc0a156835b4fa0bcb9a19bcce" +checksum = "1f25d8400f4a7a5778f0e4e52384a48cbd9b5c495d110786187fc750075277a2" dependencies = [ "cfg-if 1.0.0", "crossbeam-utils", @@ -430,9 +430,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.7" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e5bed1f1c269533fa816a0a5492b3545209a205ca1a54842be180eb63a16a6" +checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38" dependencies = [ "cfg-if 1.0.0", "lazy_static", @@ -505,12 +505,13 @@ dependencies = [ [[package]] name = "dashmap" -version = "4.0.2" +version = "5.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e77a43b28d0668df09411cb0bc9a8c2adc40f9a048afe863e05fd43251e8e39c" +checksum = "4c8858831f7781322e539ea39e72449c46b059638250c14344fec8d0aa6e539c" dependencies = [ "cfg-if 1.0.0", "num_cpus", + "parking_lot 0.12.0", "serde", ] @@ -866,9 +867,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418d37c8b1d42553c93648be529cb70f920d3baf8ef469b74b9638df426e0b4c" +checksum = "d39cd93900197114fa1fcb7ae84ca742095eed9442088988ae74fa744e930e77" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -919,9 +920,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.11" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9f1f717ddc7b2ba36df7e871fd88db79326551d3d6f1fc406fbfd28b582ff8e" +checksum = "62eeb471aa3e3c9197aa4bfeabfe02982f6dc96f750486c0bb0009ac58b26d2b" dependencies = [ "bytes", "fnv", @@ -1184,9 +1185,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.3.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f2d64f2edebec4ce84ad108148e67e1064789bee435edc5b60ad398714a3a9" +checksum = "35e70ee094dc02fd9c13fdad4940090f22dbd6ac7c9e7094a46cf0232a50bc7c" [[package]] name = "itertools" @@ -1245,9 +1246,9 @@ checksum = "db13adb97ab515a3691f56e4dbab09283d0b86cb45abd991d8634a9d6f501760" [[package]] name = "libc" -version = "0.2.118" +version = "0.2.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06e509672465a0504304aa87f9f176f2b2b716ed8fb105ebe5c02dc6dce96a94" +checksum = "efaa7b300f3b5fe8eb6bf21ce3895e1751d9665086af2d64b42f19701015ff4f" [[package]] name = "libm" @@ -1368,14 +1369,15 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba272f85fa0b41fc91872be579b3bbe0f56b792aa361a380eb669469f68dafb2" +checksum = "52da4364ffb0e4fe33a9841a98a3f3014fb964045ce4f7a45a398243c8d6b0c9" dependencies = [ "libc", "log", "miow 0.3.7", "ntapi", + "wasi 0.11.0+wasi-snapshot-preview1", "winapi 0.3.9", ] @@ -1463,13 +1465,12 @@ dependencies = [ [[package]] name = "nom" -version = "7.1.0" +version = "7.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d11e1ef389c76fe5b81bcaf2ea32cf88b62bc494e19f493d0b30e7a930109" +checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" dependencies = [ "memchr", "minimal-lexical", - "version_check", ] [[package]] @@ -1580,9 +1581,9 @@ dependencies = [ [[package]] name = "num_threads" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97ba99ba6393e2c3734791401b66902d981cb03bf190af674ca69949b6d5fb15" +checksum = "aba1801fb138d8e85e11d0fc70baf4fe1cdfffda7c6cd34a854905df588e5ed0" dependencies = [ "libc", ] @@ -1595,7 +1596,7 @@ checksum = "80e47cfc4c0a1a519d9a025ebfbac3a2439d1b5cdf397d72dcb79b11d9920dab" dependencies = [ "base64", "chrono", - "getrandom 0.2.4", + "getrandom 0.2.5", "http", "rand 0.8.5", "reqwest", @@ -1609,9 +1610,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da32515d9f6e6e489d7bc9d84c71b060db7247dc035bbe44eac88cf87486d8d5" +checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" [[package]] name = "opaque-debug" @@ -1658,6 +1659,15 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "ordered-float" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7940cf2ca942593318d07fcf2596cdca60a85c9e7fab408a5e21a4f9dcd40d87" +dependencies = [ + "num-traits", +] + [[package]] name = "parking_lot" version = "0.11.2" @@ -1886,10 +1896,12 @@ checksum = "58893f751c9b0412871a09abd62ecd2a00298c6c83befa223ef98c52aef40cbe" [[package]] name = "poise" version = "0.1.0" +source = "git+https://github.com/kangalioo/poise?branch=master#0fc5d548e32fc7e3c8ea490afe95db00ec17ec24" dependencies = [ "async-trait", "futures-core", "futures-util", + "log", "once_cell", "poise_macros", "regex", @@ -1900,6 +1912,7 @@ dependencies = [ [[package]] name = "poise_macros" version = "0.1.0" +source = "git+https://github.com/kangalioo/poise?branch=master#0fc5d548e32fc7e3c8ea490afe95db00ec17ec24" dependencies = [ "darling", "proc-macro2", @@ -1965,9 +1978,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.15" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "864d3e96a899863136fc6e99f3d7cae289dafe43bf2c5ac19b70df7210c0a145" +checksum = "b4af2ec4714533fcdf07e886f17025ace8b997b9ce51204ee69b6da831c3da57" dependencies = [ "proc-macro2", ] @@ -2031,7 +2044,7 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" dependencies = [ - "getrandom 0.2.4", + "getrandom 0.2.5", ] [[package]] @@ -2045,9 +2058,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" +checksum = "8380fe0152551244f0747b1bf41737e0f8a74f97a14ccefd1148187271634f3c" dependencies = [ "bitflags", ] @@ -2074,9 +2087,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.5.4" +version = "1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" +checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" dependencies = [ "aho-corasick", "memchr", @@ -2134,6 +2147,7 @@ dependencies = [ "lazy_static", "log", "oauth2", + "rand 0.7.3", "reqwest", "rocket", "rocket_dyn_templates", @@ -2153,9 +2167,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.9" +version = "0.11.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f242f1488a539a79bac6dbe7c8609ae43b7914b7736210f239a37cccb32525" +checksum = "46a1f7aa4f35e5e8b4160449f51afc758f0ce6454315a9fa7d0d113e958c41eb" dependencies = [ "base64", "bytes", @@ -2233,7 +2247,7 @@ dependencies = [ [[package]] name = "rocket" version = "0.5.0-rc.1" -source = "git+https://github.com/SergioBenitez/Rocket?branch=master#66d18bf66517e2765494d082629e9b9748ff8ad6" +source = "git+https://github.com/SergioBenitez/Rocket?branch=master#ae0ccf43f11be5c00bb9cd49996c8bb06a7e1651" dependencies = [ "async-stream", "async-trait", @@ -2271,7 +2285,7 @@ dependencies = [ [[package]] name = "rocket_codegen" version = "0.5.0-rc.1" -source = "git+https://github.com/SergioBenitez/Rocket?branch=master#66d18bf66517e2765494d082629e9b9748ff8ad6" +source = "git+https://github.com/SergioBenitez/Rocket?branch=master#ae0ccf43f11be5c00bb9cd49996c8bb06a7e1651" dependencies = [ "devise", "glob", @@ -2286,7 +2300,7 @@ dependencies = [ [[package]] name = "rocket_dyn_templates" version = "0.1.0-rc.1" -source = "git+https://github.com/SergioBenitez/Rocket?branch=master#66d18bf66517e2765494d082629e9b9748ff8ad6" +source = "git+https://github.com/SergioBenitez/Rocket?branch=master#ae0ccf43f11be5c00bb9cd49996c8bb06a7e1651" dependencies = [ "glob", "normpath", @@ -2298,7 +2312,7 @@ dependencies = [ [[package]] name = "rocket_http" version = "0.5.0-rc.1" -source = "git+https://github.com/SergioBenitez/Rocket?branch=master#66d18bf66517e2765494d082629e9b9748ff8ad6" +source = "git+https://github.com/SergioBenitez/Rocket?branch=master#ae0ccf43f11be5c00bb9cd49996c8bb06a7e1651" dependencies = [ "cookie", "either", @@ -2311,14 +2325,15 @@ dependencies = [ "percent-encoding", "pin-project-lite", "ref-cast", - "rustls 0.19.1", + "rustls 0.20.4", + "rustls-pemfile", "serde", "smallvec", "stable-pattern", "state", "time 0.3.7", "tokio", - "tokio-rustls 0.22.0", + "tokio-rustls 0.23.2", "uncased", ] @@ -2369,9 +2384,9 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "0.2.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eebeaeb360c87bfb72e84abdb3447159c0eaececf1bef2aecd65a8be949d1c9" +checksum = "1ee86d63972a7c661d1536fefe8c3c8407321c3df668891286de28abcd087360" dependencies = [ "base64", ] @@ -2471,6 +2486,16 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-value" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" +dependencies = [ + "ordered-float", + "serde", +] + [[package]] name = "serde_derive" version = "1.0.136" @@ -2528,7 +2553,7 @@ dependencies = [ [[package]] name = "serenity" version = "0.10.10" -source = "git+https://github.com/serenity-rs/serenity?branch=next#85b3d8c665d9c15f47aeb7afeb738c58a32a5e64" +source = "git+https://github.com/serenity-rs/serenity?branch=next#56c40fc53cab1ebda43d1efc0fcd4ab37a73a3d2" dependencies = [ "async-trait", "async-tungstenite", @@ -2545,6 +2570,7 @@ dependencies = [ "percent-encoding", "reqwest", "serde", + "serde-value", "serde_json", "tokio", "tracing", @@ -2621,9 +2647,9 @@ dependencies = [ [[package]] name = "siphasher" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a86232ab60fa71287d7f2ddae4a7073f6b7aac33631c3015abb556f08c6d0a3e" +checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" [[package]] name = "slab" @@ -2819,9 +2845,9 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" -version = "1.0.86" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a65b3f4ffa0092e9887669db0eae07941f023991ab58ea44da8fe8e2d511c6b" +checksum = "ea297be220d52398dcc07ce15a209fce436d361735ac1db700cab3b6cdfb9f54" dependencies = [ "proc-macro2", "quote", @@ -2878,9 +2904,9 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" +checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" dependencies = [ "winapi-util", ] @@ -2966,7 +2992,7 @@ dependencies = [ "bytes", "libc", "memchr", - "mio 0.8.0", + "mio 0.8.2", "num_cpus", "once_cell", "parking_lot 0.12.0", @@ -3076,9 +3102,9 @@ checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" [[package]] name = "tracing" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6c650a8ef0cd2dd93736f033d21cbd1224c5a967aa0c258d00fcf7dafef9b9f" +checksum = "4a1bdf54a7c28a2bbf701e1d2233f6c77f473486b94bee4f9678da5a148dca7f" dependencies = [ "cfg-if 1.0.0", "log", @@ -3089,9 +3115,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8276d9a4a3a558d7b7ad5303ad50b53d58264641b82914b7ada36bd762e7a716" +checksum = "2e65ce065b4b5c53e73bb28912318cb8c9e9ad3921f1d669eb0e68b4c8143a2b" dependencies = [ "proc-macro2", "quote", @@ -3100,9 +3126,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03cfcb51380632a72d3111cb8d3447a8d908e577d31beeac006f836383d29a23" +checksum = "aa31669fa42c09c34d94d8165dd2012e8ff3c66aca50f3bb226b68f216f2706c" dependencies = [ "lazy_static", "valuable", @@ -3379,6 +3405,12 @@ version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + [[package]] name = "wasm-bindgen" version = "0.2.79" @@ -3581,9 +3613,9 @@ checksum = "504a2476202769977a040c6364301a3f65d0cc9e3fb08600b2bda150a0488316" [[package]] name = "winreg" -version = "0.7.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" dependencies = [ "winapi 0.3.9", ] diff --git a/Cargo.toml b/Cargo.toml index 0104bb2..15969dc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,8 +5,7 @@ authors = ["jellywx "] edition = "2018" [dependencies] -#poise = { git = "https://github.com/kangalioo/poise", branch = "master" } -poise = { path = "/home/jude/poise" } +poise = { git = "https://github.com/kangalioo/poise", branch = "master" } dotenv = "0.15" tokio = { version = "1", features = ["process", "full"] } reqwest = "0.11" diff --git a/src/component_models/mod.rs b/src/component_models/mod.rs index a84cab8..51d240b 100644 --- a/src/component_models/mod.rs +++ b/src/component_models/mod.rs @@ -122,7 +122,7 @@ impl ComponentDataModel { .create_interaction_response(&ctx, |r| { r.kind(InteractionResponseType::UpdateMessage).interaction_response_data( |response| { - response.embeds(vec![embed]).components(|comp| { + response.set_embeds(vec![embed]).components(|comp| { pager.create_button_row(pages, comp); comp diff --git a/src/utils.rs b/src/utils.rs index ca2c11f..ecdef54 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -88,7 +88,7 @@ pub fn send_as_initial_response( if let Some(content) = content { f.content(content); } - f.embeds(embeds); + f.set_embeds(embeds); if let Some(allowed_mentions) = allowed_mentions { f.allowed_mentions(|f| { *f = allowed_mentions.clone(); diff --git a/web/Cargo.toml b/web/Cargo.toml index 16bcb28..1c34311 100644 --- a/web/Cargo.toml +++ b/web/Cargo.toml @@ -16,3 +16,4 @@ sqlx = { version = "0.5", features = ["runtime-tokio-rustls", "macros", "mysql", chrono = "0.4" chrono-tz = "0.5" lazy_static = "1.4.0" +rand = "0.7" diff --git a/web/src/consts.rs b/web/src/consts.rs index 1e18130..a94e8e7 100644 --- a/web/src/consts.rs +++ b/web/src/consts.rs @@ -18,6 +18,8 @@ pub const MINUTE: usize = 60; pub const HOUR: usize = 60 * MINUTE; pub const DAY: usize = 24 * HOUR; +pub const CHARACTERS: &str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_"; + use std::{collections::HashSet, env, iter::FromIterator}; use lazy_static::lazy_static; diff --git a/web/src/macros.rs b/web/src/macros.rs index f5cd0ae..8da595a 100644 --- a/web/src/macros.rs +++ b/web/src/macros.rs @@ -24,7 +24,7 @@ macro_rules! check_length_opt { macro_rules! check_url { ($field:expr) => { - if $field.starts_with("http://") || $field.starts_with("https://") { + if !($field.starts_with("http://") || $field.starts_with("https://")) { return json!({ "error": "URL invalid" }); } }; diff --git a/web/src/routes/dashboard/guild.rs b/web/src/routes/dashboard/guild.rs index c29e4e6..50214d5 100644 --- a/web/src/routes/dashboard/guild.rs +++ b/web/src/routes/dashboard/guild.rs @@ -18,7 +18,9 @@ use crate::{ MAX_EMBED_DESCRIPTION_LENGTH, MAX_EMBED_FOOTER_LENGTH, MAX_EMBED_TITLE_LENGTH, MAX_URL_LENGTH, MAX_USERNAME_LENGTH, MIN_INTERVAL, }, - routes::dashboard::{create_database_channel, DeleteReminder, Reminder}, + routes::dashboard::{ + create_database_channel, generate_uid, name_default, DeleteReminder, Reminder, + }, }; #[derive(Serialize)] @@ -193,11 +195,13 @@ pub async fn create_reminder( if reminder.utc_time < Utc::now().naive_utc() { return json!({"error": "Time must be in the future"}); } - if reminder.interval_months.unwrap_or(0) * 30 * DAY as u32 - + reminder.interval_seconds.unwrap_or(0) - < *MIN_INTERVAL - { - return json!({"error": "Interval too short"}); + if reminder.interval_seconds.is_some() || reminder.interval_months.is_some() { + if reminder.interval_months.unwrap_or(0) * 30 * DAY as u32 + + reminder.interval_seconds.unwrap_or(0) + < *MIN_INTERVAL + { + return json!({"error": "Interval too short"}); + } } // check patreon if necessary @@ -209,9 +213,12 @@ pub async fn create_reminder( } } + let name = if reminder.name.is_empty() { name_default() } else { reminder.name.clone() }; + // write to db match sqlx::query!( "INSERT INTO reminders ( + uid, channel_id, avatar, content, @@ -234,30 +241,8 @@ pub async fn create_reminder( tts, username, `utc_time` - ) VALUES ( - channel_id = ?, - 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` = ? - )", + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + generate_uid(), channel, reminder.avatar, reminder.content, @@ -274,7 +259,7 @@ pub async fn create_reminder( reminder.expires, reminder.interval_seconds, reminder.interval_months, - reminder.name, + name, reminder.pin, reminder.restartable, reminder.tts, diff --git a/web/src/routes/dashboard/mod.rs b/web/src/routes/dashboard/mod.rs index df80d75..d8e1403 100644 --- a/web/src/routes/dashboard/mod.rs +++ b/web/src/routes/dashboard/mod.rs @@ -1,17 +1,17 @@ use std::collections::HashMap; use chrono::naive::NaiveDateTime; +use rand::{rngs::OsRng, seq::IteratorRandom}; use rocket::{http::CookieJar, response::Redirect}; use rocket_dyn_templates::Template; use serde::{Deserialize, Serialize}; -use serenity::{ - client::Context, - http::{CacheHttp, Http}, - model::id::ChannelId, -}; -use sqlx::{Executor, Pool}; +use serenity::{http::Http, model::id::ChannelId}; +use sqlx::Executor; -use crate::{consts::DEFAULT_AVATAR, Database, Error}; +use crate::{ + consts::{CHARACTERS, DEFAULT_AVATAR}, + Database, Error, +}; pub mod guild; pub mod user; @@ -37,21 +37,30 @@ pub struct Reminder { embed_image_url: Option, embed_thumbnail_url: Option, embed_title: String, - enabled: i8, + enabled: bool, expires: Option, interval_seconds: Option, interval_months: Option, #[serde(default = "name_default")] name: String, - pin: i8, - restartable: i8, - tts: i8, + pin: bool, + restartable: bool, + tts: bool, #[serde(default)] uid: String, username: Option, utc_time: NaiveDateTime, } +pub fn generate_uid() -> String { + let mut generator: OsRng = Default::default(); + + (0..64) + .map(|_| CHARACTERS.chars().choose(&mut generator).unwrap().to_owned().to_string()) + .collect::>() + .join("") +} + // https://github.com/serde-rs/json/issues/329#issuecomment-305608405 mod string { use std::{fmt::Display, str::FromStr}; diff --git a/web/src/routes/dashboard/user.rs b/web/src/routes/dashboard/user.rs index 1d64efc..72817af 100644 --- a/web/src/routes/dashboard/user.rs +++ b/web/src/routes/dashboard/user.rs @@ -282,7 +282,7 @@ pub async fn get_reminders( if let Some(channel_id) = dm_channel { let reminders = sqlx::query_as!( Reminder, - "SELECT + r#"SELECT reminders.attachment, reminders.attachment_name, reminders.avatar, @@ -297,18 +297,18 @@ pub async fn get_reminders( reminders.embed_image_url, reminders.embed_thumbnail_url, reminders.embed_title, - reminders.enabled, + reminders.enabled as "enabled:_", reminders.expires, reminders.interval_seconds, reminders.interval_months, reminders.name, - reminders.pin, - reminders.restartable, - reminders.tts, + reminders.pin as "pin:_", + reminders.restartable as "restartable:_", + reminders.tts as "tts:_", reminders.uid, reminders.username, reminders.utc_time - FROM reminders INNER JOIN channels ON channels.id = reminders.channel_id WHERE channels.channel = ?", + FROM reminders INNER JOIN channels ON channels.id = reminders.channel_id WHERE channels.channel = ?"#, channel_id ) .fetch_all(pool.inner()) diff --git a/web/templates/dashboard.html.tera b/web/templates/dashboard.html.tera index 481037a..51fda97 100644 --- a/web/templates/dashboard.html.tera +++ b/web/templates/dashboard.html.tera @@ -114,7 +114,7 @@
Your browser timezone is: %browsertimezone% (HH:mm)
- Your bot timezone is: %bottimezone (HH:mm) + Your bot timezone is: %bottimezone% (HH:mm)


@@ -414,6 +414,7 @@ // populate channels newFrame.querySelector('select.channel-selector'); + // populate majority of items for (let prop in reminder) { if (reminder.hasOwnProperty(prop) && reminder[prop] !== null) { let $input = newFrame.querySelector(`*[name="${prop}"]`); @@ -427,6 +428,10 @@ } } + let timeInput = newFrame.querySelector('input[name="time"]'); + let localTime = luxon.DateTime.fromISO(reminder["utc_time"]).setZone(timezone); + timeInput.value = localTime.toFormat("yyyy-LL-dd'T'HH:mm:ss"); + $reminderBox.appendChild(newFrame); } } @@ -668,6 +673,62 @@ }); }); + let $createReminder = document.querySelector('#reminderCreator'); + + $createReminder.querySelector('button#createReminder').addEventListener('click', () => { + // create reminder object + let seconds = parseInt($createReminder.querySelector('input[name="interval_seconds"]').value) || null; + let months = parseInt($createReminder.querySelector('input[name="interval_months"]').value) || null; + + let rgb_color = window.getComputedStyle($createReminder.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($createReminder.querySelector('input[name="time"]').value).setZone('UTC'); + + let reminder = { + avatar: $createReminder.querySelector('img.discord-avatar').src, + channel: $createReminder.querySelector('select.channel-selector').value, + content: $createReminder.querySelector('textarea#messageContent').value, + embed_author_url: $createReminder.querySelector('img.embed_author_url').src, + embed_author: $createReminder.querySelector('textarea#embedAuthor').value, + embed_color: color, + embed_description: $createReminder.querySelector('textarea#embedDescription').value, + embed_footer: $createReminder.querySelector('textarea#embedFooter').value, + embed_footer_url: $createReminder.querySelector('img.embed_footer_url').src, + embed_image_url: $createReminder.querySelector('img.embed_image_url').src, + embed_thumbnail_url: $createReminder.querySelector('img.embed_thumbnail_url').src, + embed_title: $createReminder.querySelector('textarea#embedTitle').value, + enabled: true, + expires: null, + interval_seconds: seconds, + interval_months: months, + name: $createReminder.querySelector('input[name="name"]').value, + pin: $createReminder.querySelector('input[name="pin"]').checked, + restartable: false, + tts: $createReminder.querySelector('input[name="tts"]').checked, + username: $createReminder.querySelector('input#reminderUsername').value, + utc_time: utc_time.toFormat("yyyy-LL-dd'T'HH:mm:ss") + } + + console.log(reminder); + + // send to server + let guild = document.querySelector('.guildList a.is-active').dataset['guild']; + + fetch(`/dashboard/api/guild/${guild}/reminders`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(reminder) + }).then(response => response.json()).then(data => console.log(data)) + + // process response + + // reset inputs + }); + document.querySelectorAll('textarea.autoresize').forEach((element) => { element.addEventListener('input', () => { element.style.height = ""; @@ -696,6 +757,10 @@ }); }); + function colorToInt(r, g, b) { + return (r << 16) + (g << 8) + (b); + } + document.querySelectorAll('.customizable').forEach((element) => { element.querySelector('a').addEventListener('click', (e) => { e.preventDefault(); diff --git a/web/templates/reminder_dashboard/guild_reminder.html.tera b/web/templates/reminder_dashboard/guild_reminder.html.tera index 70c7c00..cb47d95 100644 --- a/web/templates/reminder_dashboard/guild_reminder.html.tera +++ b/web/templates/reminder_dashboard/guild_reminder.html.tera @@ -28,7 +28,7 @@ @@ -77,7 +77,7 @@ @@ -85,21 +85,21 @@

- Large embedded image + Large embedded image

@@ -128,7 +128,7 @@
- +
@@ -140,13 +140,13 @@
- +
- +
- +
diff --git a/web/templates/reminder_dashboard/reminder_dashboard.html.tera b/web/templates/reminder_dashboard/reminder_dashboard.html.tera index 8fe976e..3e3736b 100644 --- a/web/templates/reminder_dashboard/reminder_dashboard.html.tera +++ b/web/templates/reminder_dashboard/reminder_dashboard.html.tera @@ -6,6 +6,7 @@
{% set creating = true %} {% include "reminder_dashboard/guild_reminder" %} + {% set creating = false %}
diff --git a/web/templates/terms.html.tera b/web/templates/terms.html.tera index e34f2d4..9847d8f 100644 --- a/web/templates/terms.html.tera +++ b/web/templates/terms.html.tera @@ -45,10 +45,20 @@

JellyWX's Home

  • Do not discuss politics, harass other users, or use language intended to upset other users
  • -
  • Do not send malicious links
  • +
  • Do not share personal information about yourself or any other user. This includes but is not + limited to real names1, addresses, phone numbers, country of origin2, religion, email address, + IP address.
  • +
  • Do not send malicious links or attachments
  • Do not advertise
  • Do not send unwarranted direct messages
+

+ 1 Some users may use their real name on their account. In this case, do not assert that + this is a user's real name, or use it to try and identify a user. +
+ 2 Country of current residence may be discussed, as this is relevant to timezone and + DST selection. +