From 980579b50cfc2d0fed1d33d71a845684f6c465e3 Mon Sep 17 00:00:00 2001 From: dusk Date: Wed, 30 Oct 2024 16:33:08 +0300 Subject: [PATCH] feat: notes wip part tres --- bun.lockb | Bin 160240 -> 164480 bytes gazebot/.gitignore | 5 +- gazebot/Cargo.lock | 1082 ++++++++++++++++++++- gazebot/Cargo.toml | 4 +- gazebot/src/main.rs | 48 +- package.json | 1 + src/lib/index.ts | 8 + src/lib/notes.ts | 7 +- src/routes/{notes => log}/+page.server.ts | 0 src/routes/{notes => log}/+page.svelte | 4 +- src/routes/log/create/+server.ts | 31 + 11 files changed, 1157 insertions(+), 33 deletions(-) rename src/routes/{notes => log}/+page.server.ts (100%) rename src/routes/{notes => log}/+page.svelte (70%) create mode 100644 src/routes/log/create/+server.ts diff --git a/bun.lockb b/bun.lockb index 03c710e12b0fd0e9f570e10dab5f443a9fd24b40..68c26f5256dfc5823658253517aa7a4b1569106d 100755 GIT binary patch delta 30968 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 delta 28504 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 diff --git a/gazebot/.gitignore b/gazebot/.gitignore index 796603f..ebaf859 100644 --- a/gazebot/.gitignore +++ b/gazebot/.gitignore @@ -1,2 +1,5 @@ target -.env \ No newline at end of file +.env +Secrets.toml/target +.shuttle* +Secrets*.toml diff --git a/gazebot/Cargo.lock b/gazebot/Cargo.lock index 35ea16c..22fdcd6 100644 --- a/gazebot/Cargo.lock +++ b/gazebot/Cargo.lock @@ -17,6 +17,36 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8" + [[package]] name = "arrayvec" version = "0.7.6" @@ -26,6 +56,28 @@ dependencies = [ "serde", ] +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + [[package]] name = "async-trait" version = "0.1.83" @@ -34,7 +86,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.85", ] [[package]] @@ -43,6 +95,51 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +[[package]] +name = "axum" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" +dependencies = [ + "async-trait", + "axum-core", + "bitflags 1.3.2", + "bytes", + "futures-util", + "http 0.2.12", + "http-body", + "hyper", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http 0.2.12", + "http-body", + "mime", + "rustversion", + "tower-layer", + "tower-service", +] + [[package]] name = "backtrace" version = "0.3.74" @@ -124,6 +221,33 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chrono" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-targets 0.52.6", +] + +[[package]] +name = "comfy-table" +version = "6.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e959d788268e3bf9d35ace83e81b124190378e4c91c9067524675e33394b8ba" +dependencies = [ + "crossterm 0.26.1", + "strum 0.24.1", + "strum_macros 0.24.3", + "unicode-width", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -158,6 +282,62 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-channel" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "crossterm" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a84cda67535339806297f1b331d6dd6320470d2a0fe65381e79ee9e156dd3d13" +dependencies = [ + "bitflags 1.3.2", + "crossterm_winapi", + "libc", + "mio 0.8.11", + "parking_lot", + "signal-hook", + "signal-hook-mio", + "winapi", +] + +[[package]] +name = "crossterm" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df" +dependencies = [ + "bitflags 2.6.0", + "crossterm_winapi", + "libc", + "mio 0.8.11", + "parking_lot", + "signal-hook", + "signal-hook-mio", + "winapi", +] + +[[package]] +name = "crossterm_winapi" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" +dependencies = [ + "winapi", +] + [[package]] name = "crypto-common" version = "0.1.6" @@ -200,6 +380,12 @@ version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + [[package]] name = "encoding_rs" version = "0.8.35" @@ -270,6 +456,17 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + [[package]] name = "futures-io" version = "0.3.31" @@ -284,7 +481,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.85", ] [[package]] @@ -323,6 +520,8 @@ version = "0.1.0" dependencies = [ "dotenvy", "serenity", + "shuttle-runtime", + "shuttle-serenity", "tokio", "tracing", "tracing-subscriber", @@ -355,6 +554,12 @@ version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + [[package]] name = "h2" version = "0.3.26" @@ -367,19 +572,61 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap", + "indexmap 2.6.0", "slab", "tokio", "tokio-util", "tracing", ] +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + [[package]] name = "hashbrown" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +[[package]] +name = "headers" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06683b93020a07e3dbcf5f8c0f6d40080d725bea7936fc01ad345c01b97dc270" +dependencies = [ + "base64 0.21.7", + "bytes", + "headers-core", + "http 0.2.12", + "httpdate", + "mime", + "sha1", +] + +[[package]] +name = "headers-core" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" +dependencies = [ + "http 0.2.12", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.3.9" @@ -469,6 +716,41 @@ dependencies = [ "tokio-rustls 0.24.1", ] +[[package]] +name = "hyper-timeout" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" +dependencies = [ + "hyper", + "pin-project-lite", + "tokio", + "tokio-io-timeout", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "idna" version = "0.5.0" @@ -479,6 +761,16 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + [[package]] name = "indexmap" version = "2.6.0" @@ -486,7 +778,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.15.0", ] [[package]] @@ -495,6 +787,15 @@ version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.11" @@ -522,12 +823,37 @@ version = "0.2.161" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + [[package]] name = "log" version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + [[package]] name = "memchr" version = "2.7.4" @@ -559,6 +885,18 @@ dependencies = [ "adler2", ] +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys 0.48.0", +] + [[package]] name = "mio" version = "1.0.2" @@ -587,6 +925,15 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + [[package]] name = "object" version = "0.36.5" @@ -602,18 +949,124 @@ version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +[[package]] +name = "opentelemetry" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e32339a5dc40459130b3bd269e9892439f55b33e772d2a9d402a789baaf4e8a" +dependencies = [ + "futures-core", + "futures-sink", + "indexmap 2.6.0", + "js-sys", + "once_cell", + "pin-project-lite", + "thiserror", + "urlencoding", +] + +[[package]] +name = "opentelemetry-http" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f51189ce8be654f9b5f7e70e49967ed894e84a06fc35c6c042e64ac1fc5399e" +dependencies = [ + "async-trait", + "bytes", + "http 0.2.12", + "opentelemetry", +] + +[[package]] +name = "opentelemetry_sdk" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f16aec8a98a457a52664d69e0091bac3a0abd18ead9b641cb00202ba4e0efe4" +dependencies = [ + "async-trait", + "crossbeam-channel", + "futures-channel", + "futures-executor", + "futures-util", + "glob", + "once_cell", + "opentelemetry", + "ordered-float", + "percent-encoding", + "rand", + "thiserror", +] + +[[package]] +name = "ordered-float" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83e7ccb95e240b7c9506a3d544f10d935e142cc90b0a1d56954fb44d89ad6b97" +dependencies = [ + "num-traits", +] + [[package]] name = "overload" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + [[package]] name = "percent-encoding" version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "pin-project" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.85", +] + [[package]] name = "pin-project-lite" version = "0.2.15" @@ -641,6 +1094,30 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + [[package]] name = "proc-macro2" version = "1.0.89" @@ -650,6 +1127,38 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "prost" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-derive" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "prost-types" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" +dependencies = [ + "prost", +] + [[package]] name = "quote" version = "1.0.37" @@ -689,6 +1198,59 @@ dependencies = [ "getrandom", ] +[[package]] +name = "redox_syscall" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.8", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + [[package]] name = "reqwest" version = "0.11.27" @@ -733,6 +1295,21 @@ dependencies = [ "winreg", ] +[[package]] +name = "reqwest-middleware" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a735987236a8e238bf0296c7e351b999c188ccc11477f311b82b55c93984216" +dependencies = [ + "anyhow", + "async-trait", + "http 0.2.12", + "reqwest", + "serde", + "task-local-extensions", + "thiserror", +] + [[package]] name = "ring" version = "0.17.8" @@ -748,6 +1325,28 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rmp" +version = "0.8.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" +dependencies = [ + "byteorder", + "num-traits", + "paste", +] + +[[package]] +name = "rmp-serde" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" +dependencies = [ + "byteorder", + "rmp", + "serde", +] + [[package]] name = "rustc-demangle" version = "0.1.24" @@ -816,12 +1415,24 @@ dependencies = [ "untrusted", ] +[[package]] +name = "rustversion" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" + [[package]] name = "ryu" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + [[package]] name = "sct" version = "0.7.1" @@ -842,6 +1453,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +dependencies = [ + "serde", +] + [[package]] name = "serde" version = "1.0.214" @@ -868,7 +1488,7 @@ checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.85", ] [[package]] @@ -917,7 +1537,7 @@ dependencies = [ "serde_json", "time", "tokio", - "tokio-tungstenite", + "tokio-tungstenite 0.21.0", "tracing", "typemap_rev", "url", @@ -949,6 +1569,164 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "shuttle-api-client" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "166fbe3022a11ff3f9f771b673f9e39578dec9274a406ff278ed9ee620272e0a" +dependencies = [ + "anyhow", + "async-trait", + "headers", + "http 0.2.12", + "percent-encoding", + "reqwest", + "reqwest-middleware", + "rmp-serde", + "serde", + "serde_json", + "shuttle-common", + "tokio", + "tokio-tungstenite 0.20.1", + "url", + "uuid", +] + +[[package]] +name = "shuttle-codegen" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e60a2db8b8548a2a725316ae5d7a04b4dad680a4746372d1b7172f2065f9c345" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.85", +] + +[[package]] +name = "shuttle-common" +version = "0.48.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8013d94cab8d047369ee2eca93f4baa2034e3ea09ca553df3384de1f56bbffb3" +dependencies = [ + "anyhow", + "async-trait", + "chrono", + "comfy-table", + "crossterm 0.27.0", + "http 0.2.12", + "opentelemetry", + "opentelemetry-http", + "pin-project", + "reqwest", + "semver", + "serde", + "serde_json", + "strum 0.26.3", + "thiserror", + "tower", + "tracing", + "tracing-opentelemetry", + "tracing-subscriber", + "typeshare", + "url", + "uuid", + "zeroize", +] + +[[package]] +name = "shuttle-proto" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d322a55314553aad71cd506451b817bec1d2ef5459d939f5642b472870c1e9" +dependencies = [ + "futures-core", + "prost", + "prost-types", + "shuttle-common", + "tonic", +] + +[[package]] +name = "shuttle-runtime" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20628ddf00446da52c448ef39b987321227195f6393dc6a5066a12fc22491bd3" +dependencies = [ + "anyhow", + "async-trait", + "hyper", + "serde", + "serde_json", + "shuttle-api-client", + "shuttle-codegen", + "shuttle-common", + "shuttle-proto", + "shuttle-service", + "strfmt", + "tokio", + "tokio-stream", + "tokio-util", + "tonic", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "shuttle-serenity" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f899a80629f3c3d007f0bb8df4ec064b7c9e5758e04e7fe9114929f9c7ef5909" +dependencies = [ + "serenity", + "shuttle-runtime", +] + +[[package]] +name = "shuttle-service" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57770033649fa028aa9cc76702c66eb6c93b47a103f5ad15e2739c6404689bba" +dependencies = [ + "anyhow", + "async-trait", + "serde", + "shuttle-common", + "strfmt", + "thiserror", +] + +[[package]] +name = "signal-hook" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-mio" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" +dependencies = [ + "libc", + "mio 0.8.11", + "signal-hook", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + [[package]] name = "slab" version = "0.4.9" @@ -980,12 +1758,70 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +[[package]] +name = "strfmt" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a8348af2d9fc3258c8733b8d9d8db2e56f54b2363a4b5b81585c7875ed65e65" + +[[package]] +name = "strum" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" + +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros 0.26.4", +] + +[[package]] +name = "strum_macros" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "rustversion", + "syn 1.0.109", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.85", +] + [[package]] name = "subtle" version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "syn" version = "2.0.85" @@ -1024,6 +1860,15 @@ dependencies = [ "libc", ] +[[package]] +name = "task-local-extensions" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba323866e5d033818e3240feeb9f7db2c4296674e4d9e16b97b7bf8f490434e8" +dependencies = [ + "pin-utils", +] + [[package]] name = "thiserror" version = "1.0.65" @@ -1041,7 +1886,7 @@ checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.85", ] [[package]] @@ -1109,13 +1954,25 @@ dependencies = [ "backtrace", "bytes", "libc", - "mio", + "mio 1.0.2", + "parking_lot", "pin-project-lite", + "signal-hook-registry", "socket2", "tokio-macros", "windows-sys 0.52.0", ] +[[package]] +name = "tokio-io-timeout" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" +dependencies = [ + "pin-project-lite", + "tokio", +] + [[package]] name = "tokio-macros" version = "2.4.0" @@ -1124,7 +1981,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.85", ] [[package]] @@ -1148,6 +2005,32 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-stream" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" +dependencies = [ + "futures-util", + "log", + "rustls 0.21.12", + "tokio", + "tokio-rustls 0.24.1", + "tungstenite 0.20.1", + "webpki-roots 0.25.4", +] + [[package]] name = "tokio-tungstenite" version = "0.21.0" @@ -1160,7 +2043,7 @@ dependencies = [ "rustls-pki-types", "tokio", "tokio-rustls 0.25.0", - "tungstenite", + "tungstenite 0.21.0", "webpki-roots 0.26.6", ] @@ -1177,6 +2060,59 @@ dependencies = [ "tokio", ] +[[package]] +name = "tonic" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d560933a0de61cf715926b9cac824d4c883c2c43142f787595e48280c40a1d0e" +dependencies = [ + "async-stream", + "async-trait", + "axum", + "base64 0.21.7", + "bytes", + "h2", + "http 0.2.12", + "http-body", + "hyper", + "hyper-timeout", + "percent-encoding", + "pin-project", + "prost", + "tokio", + "tokio-stream", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "indexmap 1.9.3", + "pin-project", + "pin-project-lite", + "rand", + "slab", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + [[package]] name = "tower-service" version = "0.3.3" @@ -1203,7 +2139,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.85", ] [[package]] @@ -1227,18 +2163,53 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "tracing-opentelemetry" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c67ac25c5407e7b961fafc6f7e9aa5958fd297aada2d20fa2ae1737357e55596" +dependencies = [ + "js-sys", + "once_cell", + "opentelemetry", + "opentelemetry_sdk", + "smallvec", + "tracing", + "tracing-core", + "tracing-log", + "tracing-subscriber", + "web-time", +] + +[[package]] +name = "tracing-serde" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" +dependencies = [ + "serde", + "tracing-core", +] + [[package]] name = "tracing-subscriber" version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ + "matchers", "nu-ansi-term", + "once_cell", + "regex", + "serde", + "serde_json", "sharded-slab", "smallvec", "thread_local", + "tracing", "tracing-core", "tracing-log", + "tracing-serde", ] [[package]] @@ -1247,6 +2218,26 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http 0.2.12", + "httparse", + "log", + "rand", + "rustls 0.21.12", + "sha1", + "thiserror", + "url", + "utf-8", +] + [[package]] name = "tungstenite" version = "0.21.0" @@ -1280,6 +2271,28 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "typeshare" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19be0f411120091e76e13e5a0186d8e2bcc3e7e244afdb70152197f1a8486ceb" +dependencies = [ + "chrono", + "serde", + "serde_json", + "typeshare-annotation", +] + +[[package]] +name = "typeshare-annotation" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a615d6c2764852a2e88a4f16e9ce1ea49bb776b5872956309e170d63a042a34f" +dependencies = [ + "quote", + "syn 2.0.85", +] + [[package]] name = "unicase" version = "2.8.0" @@ -1307,6 +2320,12 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + [[package]] name = "untrusted" version = "0.9.0" @@ -1325,12 +2344,28 @@ dependencies = [ "serde", ] +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + [[package]] name = "utf-8" version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "uuid" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" +dependencies = [ + "getrandom", + "serde", +] + [[package]] name = "valuable" version = "0.1.0" @@ -1380,7 +2415,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn", + "syn 2.0.85", "wasm-bindgen-shared", ] @@ -1414,7 +2449,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.85", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1448,6 +2483,16 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web-time" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa30049b1c872b72c89866d458eae9f20380ab280ffd1b1e18df2d3e2d98cfe0" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "webpki-roots" version = "0.25.4" @@ -1485,6 +2530,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -1652,7 +2706,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.85", ] [[package]] diff --git a/gazebot/Cargo.toml b/gazebot/Cargo.toml index 1db5878..aabb630 100644 --- a/gazebot/Cargo.toml +++ b/gazebot/Cargo.toml @@ -8,4 +8,6 @@ tracing = "0.1" tracing-subscriber = "0.3" dotenvy = "0.15.7" serenity = { version = "0.12", default-features = false, features = ["client", "gateway", "rustls_backend", "model"] } -tokio = { version = "1", features = ["macros", "rt-multi-thread"] } \ No newline at end of file +tokio = { version = "1", features = ["macros", "rt-multi-thread"] } +shuttle-serenity = "0.48.0" +shuttle-runtime = "0.48.0" diff --git a/gazebot/src/main.rs b/gazebot/src/main.rs index d424ac7..01caf86 100644 --- a/gazebot/src/main.rs +++ b/gazebot/src/main.rs @@ -1,9 +1,11 @@ use std::env; +use serenity::all::ActivityData; use serenity::async_trait; use serenity::model::channel::Message; use serenity::model::prelude::*; use serenity::prelude::*; +use shuttle_runtime::SecretStore; struct Handler; @@ -17,26 +19,44 @@ impl EventHandler for Handler { } } - async fn ready(&self, _: Context, ready: Ready) { + async fn ready(&self, ctx: Context, ready: Ready) { println!("{} is connected!", ready.user.name); + + ctx.set_presence(Some(ActivityData::listening("messages to log")), OnlineStatus::Online); } } -#[tokio::main] -async fn main() { - let _ = dotenvy::dotenv(); +// #[tokio::main] +// async fn main() { +// let _ = dotenvy::dotenv(); - tracing_subscriber::fmt::init(); +// tracing_subscriber::fmt::init(); - let token = env::var("DISCORD_TOKEN").expect("Expected a token in the environment"); - let intents = GatewayIntents::GUILD_MESSAGES - | GatewayIntents::DIRECT_MESSAGES - | GatewayIntents::MESSAGE_CONTENT; +// let token = env::var("DISCORD_TOKEN").expect("Expected a token in the environment"); +// let intents = GatewayIntents::DIRECT_MESSAGES | GatewayIntents::MESSAGE_CONTENT; - let mut client = - Client::builder(&token, intents).event_handler(Handler).await.expect("Err creating client"); +// let mut client = +// Client::builder(&token, intents).event_handler(Handler).await.expect("Err creating client"); - if let Err(why) = client.start().await { - println!("Client error: {why:?}"); - } +// if let Err(why) = client.start().await { +// println!("Client error: {why:?}"); +// } +// } + +#[shuttle_runtime::main] +async fn serenity( + #[shuttle_runtime::Secrets] secrets: SecretStore, +) -> shuttle_serenity::ShuttleSerenity { + // Get the discord token set in `Secrets.toml` + let token = secrets.get("DISCORD_TOKEN").unwrap(); + + // Set gateway intents, which decides what events the bot will be notified about + let intents = GatewayIntents::DIRECT_MESSAGES | GatewayIntents::MESSAGE_CONTENT; + + let client = Client::builder(&token, intents) + .event_handler(Handler) + .await + .expect("Err creating client"); + + Ok(client.into()) } \ No newline at end of file diff --git a/package.json b/package.json index dd6e1fc..b189b73 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ }, "type": "module", "dependencies": { + "@atproto/api": "^0.13.12", "@std/toml": "npm:@jsr/std__toml", "base64url": "^3.0.1", "nanoid": "^5.0.8", diff --git a/src/lib/index.ts b/src/lib/index.ts index 85b0821..b67102e 100644 --- a/src/lib/index.ts +++ b/src/lib/index.ts @@ -2,6 +2,7 @@ import type { Cookies } from '@sveltejs/kit' import { env } from '$env/dynamic/private' import { writable } from 'svelte/store' import { existsSync, readFileSync } from 'fs' +import { Agent, CredentialSession } from '@atproto/api' export const scopeCookies = (cookies: Cookies, path: string) => { return { @@ -19,3 +20,10 @@ export const scopeCookies = (cookies: Cookies, path: string) => { export const visitCountFile = `${env.WEBSITE_DATA_DIR}/visitcount` export const visitCount = writable(parseInt(existsSync(visitCountFile) ? readFileSync(visitCountFile).toString() : '0')); + +const loginToBsky = () => { + const creds = new CredentialSession(new URL("https://bsky.social")) + creds.login({identifier: 'gaze.systems', password: env.BSKY_PASSWORD ?? "" }) + return new Agent(creds) +} +export const bskyClient = loginToBsky() \ No newline at end of file diff --git a/src/lib/notes.ts b/src/lib/notes.ts index cb0121b..766549a 100644 --- a/src/lib/notes.ts +++ b/src/lib/notes.ts @@ -29,9 +29,14 @@ export const writeNote = (id: NoteId, note: Note) => { // only append to note list if its not in it yet let noteList = readNotesList() if (noteList.indexOf(id) === -1) { - writeNotesList(noteList.concat([id])) + writeNotesList([id].concat(noteList)) } } +export const createNote = (note: Note) => { + const id = genNoteId() + writeNote(id, note) + return id +} export const readNotesList = (): NoteId[] => { return JSON.parse(readFileSync(notesListFile).toString()) diff --git a/src/routes/notes/+page.server.ts b/src/routes/log/+page.server.ts similarity index 100% rename from src/routes/notes/+page.server.ts rename to src/routes/log/+page.server.ts diff --git a/src/routes/notes/+page.svelte b/src/routes/log/+page.svelte similarity index 70% rename from src/routes/notes/+page.svelte rename to src/routes/log/+page.svelte index a6bf94f..8210fa8 100644 --- a/src/routes/notes/+page.svelte +++ b/src/routes/log/+page.svelte @@ -25,9 +25,9 @@ " >


-gazesystems   note.nu
+gazesystems   log.nu
 
-gazesystems notes file $file.name +gazesystems log file $file.name

{#each data.notes as { noteId, note }, index} diff --git a/src/routes/log/create/+server.ts b/src/routes/log/create/+server.ts new file mode 100644 index 0000000..43182c2 --- /dev/null +++ b/src/routes/log/create/+server.ts @@ -0,0 +1,31 @@ +import { env } from '$env/dynamic/private'; +import { PUBLIC_BASE_URL } from '$env/static/public'; +import { bskyClient } from '$lib'; +import { createNote } from '$lib/notes.js'; + + +export const POST = async ({ request }) => { + const token = request.headers.get('authorization') + if (token !== env.GAZEBOT_TOKEN) { + return new Response("rizz failed", { status: 403 }) + } + // get note data + const noteData = await request.json() + if (noteData.content ?? null === null) { + return new Response("no rizz :(", { status: 400 }) + } + // create note + const published = Date.now() + const noteId = createNote({ content: noteData.content, published }) + // bridge to bsky if want to bridge + if (noteData.bskyPosse ?? null !== null) { + await bskyClient.post({text: `${noteData.content} (${PUBLIC_BASE_URL}/log?id=${noteId})`}) + } + // send back created note id + return new Response(JSON.stringify({ noteId }), { + headers: { + 'content-type': 'application/json', + 'cache-control': 'no-store', + } + }) +}; \ No newline at end of file