From add69fecfa7db810eb01518f3abb9538d239f1d0 Mon Sep 17 00:00:00 2001 From: kieran Date: Fri, 16 Aug 2024 23:06:56 +0100 Subject: [PATCH] Config setup --- Cargo.lock | 323 +++++++++++++++++++++++++++++++++++------------- Cargo.toml | 7 +- config.toml | 7 ++ src/events.rs | 27 ++-- src/fetch.rs | 20 +-- src/main.rs | 20 ++- src/settings.rs | 8 ++ src/store.rs | 54 ++++---- 8 files changed, 326 insertions(+), 140 deletions(-) create mode 100644 config.toml create mode 100644 src/settings.rs diff --git a/Cargo.lock b/Cargo.lock index fe1f146..7908c03 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -118,31 +118,22 @@ dependencies = [ [[package]] name = "async-wsocket" -version = "0.5.2" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3445f8f330db8e5f3be7912f170f32e43fec90d995c71ced1ec3b8394b4a873c" +checksum = "5725a0615e4eb98e82e9cb963529398114e3fccfbf0e8b9111d605e2ac443e46" dependencies = [ "async-utility", + "futures", "futures-util", + "js-sys", "thiserror", "tokio", "tokio-rustls", "tokio-socks", "tokio-tungstenite", "url", - "wasm-ws", - "webpki-roots", -] - -[[package]] -name = "async_io_stream" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" -dependencies = [ - "futures", - "pharos", - "rustc_version", + "wasm-bindgen", + "web-sys", ] [[package]] @@ -283,6 +274,9 @@ name = "bitflags" version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +dependencies = [ + "serde", +] [[package]] name = "block-buffer" @@ -382,6 +376,55 @@ dependencies = [ "zeroize", ] +[[package]] +name = "config" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7328b20597b53c2454f0b1919720c25c7339051c02b72b7e05409e00b14132be" +dependencies = [ + "async-trait", + "convert_case", + "json5", + "lazy_static", + "nom", + "pathdiff", + "ron", + "rust-ini", + "serde", + "serde_json", + "toml", + "yaml-rust", +] + +[[package]] +name = "const-random" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +dependencies = [ + "const-random-macro", +] + +[[package]] +name = "const-random-macro" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom", + "once_cell", + "tiny-keccak", +] + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "cookie" version = "0.18.1" @@ -426,6 +469,12 @@ version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + [[package]] name = "crypto-common" version = "0.1.6" @@ -496,6 +545,15 @@ dependencies = [ "subtle", ] +[[package]] +name = "dlv-list" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "442039f5147480ba31067cb00ada1adae6892028e40e45fc5de7b7df6dcc1b5f" +dependencies = [ + "const-random", +] + [[package]] name = "either" version = "1.13.0" @@ -603,7 +661,6 @@ checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", - "futures-executor", "futures-io", "futures-sink", "futures-task", @@ -626,34 +683,12 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" -[[package]] -name = "futures-executor" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - [[package]] name = "futures-io" version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" -[[package]] -name = "futures-macro" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "futures-sink" version = "0.3.30" @@ -675,7 +710,6 @@ dependencies = [ "futures-channel", "futures-core", "futures-io", - "futures-macro", "futures-sink", "futures-task", "memchr", @@ -772,6 +806,12 @@ dependencies = [ "tracing", ] +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" + [[package]] name = "hashbrown" version = "0.14.5" @@ -981,7 +1021,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.14.5", "serde", ] @@ -1045,6 +1085,17 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "json5" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" +dependencies = [ + "pest", + "pest_derive", + "serde", +] + [[package]] name = "lazy_static" version = "1.5.0" @@ -1057,6 +1108,12 @@ version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + [[package]] name = "linux-raw-sys" version = "0.4.14" @@ -1112,7 +1169,7 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" dependencies = [ - "hashbrown", + "hashbrown 0.14.5", ] [[package]] @@ -1136,6 +1193,12 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.7.4" @@ -1182,10 +1245,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e664971378a3987224f7a0e10059782035e89899ae403718ee07de85bec42afe" [[package]] -name = "nostr" -version = "0.33.0" +name = "nom" +version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f08db214560a34bf7c4c1fea09a8461b9412bae58ba06e99ce3177d89fa1e0a6" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nostr" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5897e4142fcc33c4f1d58ad17f665e87dcba70de7e370c0bda1aa0fb73212c2a" dependencies = [ "aes", "base64 0.21.7", @@ -1213,9 +1286,9 @@ dependencies = [ [[package]] name = "nostr-database" -version = "0.33.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9f6c72d0d0842de637f7fba6e70764f719257d29dad8fc5f7352810b0f117ad" +checksum = "1926ef55392f3eea1bbe4a1358b64bbf12dd6eb554f40f483941a102c6263fc6" dependencies = [ "async-trait", "flatbuffers", @@ -1228,9 +1301,9 @@ dependencies = [ [[package]] name = "nostr-relay-pool" -version = "0.33.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afa5502a3df456790ca16d90cc688a677117d57ab56b079dcfa091390ac9f202" +checksum = "c6480cf60564957a2a64bd050d047ee0717e08dced7a389e22ef4e9fc104edd2" dependencies = [ "async-utility", "async-wsocket", @@ -1239,14 +1312,15 @@ dependencies = [ "nostr-database", "thiserror", "tokio", + "tokio-stream", "tracing", ] [[package]] name = "nostr-sdk" -version = "0.33.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b427dceefbbb49a9dd98abb8c4e40d25fdd467e99821aaad88615252bdb915bd" +checksum = "ca0c0c5f8ddbdfc064ea71883191ec53de6ed52b5dca10ab07f0810b99e91acc" dependencies = [ "async-utility", "atomic-destructor", @@ -1264,9 +1338,9 @@ dependencies = [ [[package]] name = "nostr-signer" -version = "0.33.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "665268b316f41cd8fa791be54b6c7935c5a239461708c380a699d6677be9af38" +checksum = "5c30294a7be7d9d5ac777954812f5c7b4ae2a1e583a62e33537f87d98ab23729" dependencies = [ "async-utility", "nostr", @@ -1278,9 +1352,9 @@ dependencies = [ [[package]] name = "nostr-zapper" -version = "0.33.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69922e74f8eab1f9d287008c0c06acdec87277a2d8f44bd9d38e003422aea0ab" +checksum = "dcf3ba30e807145e9cb924faf8fb0719e460f613088e99c753b67c2a9929c5b7" dependencies = [ "async-trait", "nostr", @@ -1292,6 +1366,7 @@ name = "nostr_services_rs" version = "0.1.0" dependencies = [ "anyhow", + "config", "log", "nostr", "nostr-database", @@ -1331,9 +1406,9 @@ dependencies = [ [[package]] name = "nwc" -version = "0.33.0" +version = "0.34.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2e04b3edb5e9572e95b62842430625f1718e8a4a3596a30aeb04e6734764ea" +checksum = "9a16ac06bc273fcd4ead47c0c5a58b6cc7db2247fc7a64dd9bc11cf18e3efeb4" dependencies = [ "async-utility", "nostr", @@ -1364,6 +1439,16 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" +[[package]] +name = "ordered-multimap" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ed8acf08e98e744e5384c8bc63ceb0364e68a6854187221c18df61c4797690e" +dependencies = [ + "dlv-list", + "hashbrown 0.13.2", +] + [[package]] name = "overload" version = "0.1.1" @@ -1429,6 +1514,12 @@ dependencies = [ "subtle", ] +[[package]] +name = "pathdiff" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" + [[package]] name = "pbkdf2" version = "0.12.2" @@ -1469,13 +1560,48 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] -name = "pharos" -version = "0.5.3" +name = "pest" +version = "2.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" +checksum = "cd53dff83f26735fdc1ca837098ccf133605d794cdae66acfc2bfac3ec809d95" dependencies = [ - "futures", - "rustc_version", + "memchr", + "thiserror", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a548d2beca6773b1c244554d36fcf8548a8a58e74156968211567250e48e49a" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c93a82e8d145725dcbaf44e5ea887c8a869efdcc28706df2d08c69e17077183" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pest_meta" +version = "2.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a941429fea7e08bedec25e4f6785b6ffaacc6b755da98df5ef3e7dcf4a124c4f" +dependencies = [ + "once_cell", + "pest", + "sha2", ] [[package]] @@ -1873,6 +1999,28 @@ dependencies = [ "uncased", ] +[[package]] +name = "ron" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" +dependencies = [ + "base64 0.21.7", + "bitflags 2.6.0", + "serde", + "serde_derive", +] + +[[package]] +name = "rust-ini" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e2a3bcec1f113553ef1c88aae6c020a369d03d55b58de9869a0908930385091" +dependencies = [ + "cfg-if", + "ordered-multimap", +] + [[package]] name = "rustc-demangle" version = "0.1.24" @@ -2020,12 +2168,6 @@ version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" -[[package]] -name = "send_wrapper" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" - [[package]] name = "serde" version = "1.0.204" @@ -2289,6 +2431,15 @@ dependencies = [ "time-core", ] +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + [[package]] name = "tinyvec" version = "1.8.0" @@ -2559,6 +2710,12 @@ dependencies = [ "serde", ] +[[package]] +name = "ucd-trie" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" + [[package]] name = "uncased" version = "0.9.10" @@ -2590,6 +2747,12 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-segmentation" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" + [[package]] name = "unicode-xid" version = "0.2.4" @@ -2723,23 +2886,6 @@ version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" -[[package]] -name = "wasm-ws" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "688c5806d1b06b4f3d90d015e23364dc5d3af412ee64abba6dde8fdc01637e33" -dependencies = [ - "async_io_stream", - "futures", - "js-sys", - "pharos", - "send_wrapper", - "thiserror", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - [[package]] name = "web-sys" version = "0.3.69" @@ -2957,6 +3103,15 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "yaml-rust" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +dependencies = [ + "linked-hash-map", +] + [[package]] name = "yansi" version = "1.0.1" diff --git a/Cargo.toml b/Cargo.toml index 9bf4295..4c674f1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,12 +5,13 @@ edition = "2021" [dependencies] tokio = { version = "1.38.1", features = ["rt", "rt-multi-thread", "macros"] } -nostr = "0.33.0" -nostr-sdk = { version = "0.33.0" } +nostr = { version = "0.34.0" } +nostr-sdk = { version = "0.34.0" } rocket = { version = "0.5.1", features = ["json"] } serde = { version = "1.0.204", features = ["derive"] } log = "0.4.22" pretty_env_logger = "0.5.0" anyhow = "1.0.86" -nostr-database = { version = "0.33.0", features = ["flatbuf"] } +nostr-database = { version = "0.34.0", features = ["flatbuf"] } sled = "0.34.7" +config = { version = "0.14.0", features = ["toml"] } diff --git a/config.toml b/config.toml new file mode 100644 index 0000000..b06fc34 --- /dev/null +++ b/config.toml @@ -0,0 +1,7 @@ + +# List of relays to connect to for fetching data +relays = [ + "wss://relay.snort.social", + "wss://relay.damus.io", + "wss://nos.lol" +] \ No newline at end of file diff --git a/src/events.rs b/src/events.rs index ff6f80a..62b4900 100644 --- a/src/events.rs +++ b/src/events.rs @@ -1,8 +1,8 @@ -use nostr::{Event, FromBech32, PublicKey}; use nostr::prelude::Nip19; -use rocket::{Route, State}; +use nostr::{Event, FromBech32, PublicKey}; use rocket::http::Status; use rocket::serde::json::Json; +use rocket::{Route, State}; use crate::fetch::FetchQueue; use crate::store::SledDatabase; @@ -12,17 +12,14 @@ pub fn routes() -> Vec { } #[rocket::post("/event", data = "")] -async fn import_event( - db: &State, - data: Json, -) -> Status { +async fn import_event(db: &State, data: Json) -> Status { if data.verify().is_err() { return Status::InternalServerError; } if let Ok(v) = db.save_event(&data).await { match v { true => Status::Ok, - false => Status::Conflict + false => Status::Conflict, } } else { Status::InternalServerError @@ -37,7 +34,7 @@ async fn get_event( ) -> Option> { let id = match Nip19::from_bech32(id) { Ok(i) => i, - _ => return None + _ => return None, }; match db.event_by_id(&id) { Ok(ev) => Some(Json::from(ev)), @@ -45,24 +42,20 @@ async fn get_event( let mut fetch = fetch.inner().clone(); match fetch.demand(&id).await.await { Ok(Some(ev)) => Some(Json::from(ev)), - _ => None + _ => None, } } } } #[rocket::get("/event//")] -fn get_event_by_kind( - db: &State, - kind: u32, - pubkey: &str, -) -> Option> { +fn get_event_by_kind(db: &State, kind: u32, pubkey: &str) -> Option> { let pk = match PublicKey::parse(pubkey) { Ok(i) => i, - _ => return None + _ => return None, }; match db.event_by_kind_pubkey(kind, &pk) { Ok(ev) => Some(Json::from(ev)), - _ => None + _ => None, } -} \ No newline at end of file +} diff --git a/src/fetch.rs b/src/fetch.rs index e78d8c8..bf0a27e 100644 --- a/src/fetch.rs +++ b/src/fetch.rs @@ -2,10 +2,10 @@ use std::collections::VecDeque; use std::sync::Arc; use std::time::Duration; -use nostr::{Event, Filter, Url}; use nostr::prelude::Nip19; +use nostr::{Event, Filter, Url}; use nostr_sdk::{FilterOptions, RelayOptions, RelayPool}; -use tokio::sync::{Mutex, oneshot}; +use tokio::sync::{oneshot, Mutex}; struct QueueItem { pub handler: oneshot::Sender>, @@ -28,7 +28,10 @@ impl FetchQueue { pub async fn add_relay(&mut self, relay: Url) -> Result { let pool_lock = self.pool.lock().await; - pool_lock.add_relay(relay.clone(), RelayOptions::default()).await.unwrap(); + pool_lock + .add_relay(relay.clone(), RelayOptions::default()) + .await + .unwrap(); if let Err(e) = pool_lock.connect_relay(relay, None).await { Err(anyhow::Error::new(e)) } else { @@ -53,7 +56,10 @@ impl FetchQueue { let pool_lock = self.pool.lock().await; let filters = vec![Self::nip19_to_filter(&q.request).unwrap()]; //info!("Sending filters: {:?}", filters); - if let Ok(evs) = pool_lock.get_events_of(filters, Duration::from_secs(5), FilterOptions::ExitOnEOSE).await { + if let Ok(evs) = pool_lock + .get_events_of(filters, Duration::from_secs(5), FilterOptions::ExitOnEOSE) + .await + { if let Some(e) = evs.first() { q.handler.send(Some(e.clone())).unwrap(); } else { @@ -68,11 +74,9 @@ impl FetchQueue { fn nip19_to_filter(filter: &Nip19) -> Option { match filter { Nip19::Coordinate(c) => Some(Filter::from(c)), - Nip19::Event(e) => Some(Filter::new() - .id(e.event_id) - ), + Nip19::Event(e) => Some(Filter::new().id(e.event_id)), Nip19::EventId(e) => Some(Filter::new().id(*e)), _ => None, } } -} \ No newline at end of file +} diff --git a/src/main.rs b/src/main.rs index 53684da..cab6d20 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,23 +4,37 @@ extern crate rocket; use std::time::Duration; use anyhow::Error; +use config::Config; use rocket::shield::Shield; use crate::fetch::FetchQueue; +use crate::settings::Settings; use crate::store::SledDatabase; mod events; -mod store; mod fetch; +mod store; +mod settings; #[rocket::main] async fn main() -> Result<(), Error> { pretty_env_logger::init(); + let builder = Config::builder() + .add_source(config::File::with_name("config.toml")) + .add_source(config::Environment::with_prefix("APP")) + .build()?; + + let settings: Settings = builder.try_deserialize()?; + let db = SledDatabase::new("nostr.db"); let mut fetch = FetchQueue::new(); - fetch.add_relay("wss://relay.snort.social".parse().unwrap()).await.unwrap(); + for x in settings.relays + { + fetch.add_relay(x).await.unwrap(); + } + let fetch2 = fetch.clone(); tokio::spawn(async move { @@ -44,4 +58,4 @@ async fn main() -> Result<(), Error> { } else { Ok(()) } -} \ No newline at end of file +} diff --git a/src/settings.rs b/src/settings.rs new file mode 100644 index 0000000..4abb15d --- /dev/null +++ b/src/settings.rs @@ -0,0 +1,8 @@ +use nostr_sdk::Url; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Settings { + /// List of relays to connect to for fetching data + pub relays: Vec +} \ No newline at end of file diff --git a/src/store.rs b/src/store.rs index 7f23feb..de312e2 100644 --- a/src/store.rs +++ b/src/store.rs @@ -1,9 +1,9 @@ use std::fmt::Debug; use std::sync::Arc; -use nostr::{Event, EventId, PublicKey}; use nostr::prelude::Nip19; use nostr::util::hex; +use nostr::{Event, EventId, PublicKey}; use nostr_database::{FlatBufferBuilder, FlatBufferDecode, FlatBufferEncode}; use sled::{Db, IVec}; use tokio::sync::Mutex; @@ -53,18 +53,20 @@ impl SledDatabase { } }) { Err(e) => Err(anyhow::Error::new(e)), - Ok(v) => { - match v { - Some(v) => { - info!("Wrote index {} = {}", hex::encode(rpk), hex::encode(v.as_ref())); - Ok(true) - } - None => { - info!("Duplicate or older index {}", hex::encode(rpk)); - Ok(false) - } + Ok(v) => match v { + Some(v) => { + info!( + "Wrote index {} = {}", + hex::encode(rpk), + hex::encode(v.as_ref()) + ); + Ok(true) } - } + None => { + info!("Duplicate or older index {}", hex::encode(rpk)); + Ok(false) + } + }, } } @@ -90,30 +92,32 @@ impl SledDatabase { let id_key = match event_id { Nip19::EventId(e) => e.as_bytes(), Nip19::Event(e) => e.event_id.as_bytes(), - _ => return Err(anyhow::Error::msg("Not supported ID format")) + _ => return Err(anyhow::Error::msg("Not supported ID format")), }; match self.db.get(id_key) { Ok(v) => match v { Some(v) => match Event::decode(&v) { Ok(v) => Ok(v), - Err(e) => Err(anyhow::Error::new(e)) + Err(e) => Err(anyhow::Error::new(e)), }, - None => Err(anyhow::Error::msg("Not Found")) - } - Err(e) => Err(anyhow::Error::new(e)) + None => Err(anyhow::Error::msg("Not Found")), + }, + Err(e) => Err(anyhow::Error::new(e)), } } - pub fn event_by_kind_pubkey(&self, kind: u32, pubkey: &PublicKey) -> Result { + pub fn event_by_kind_pubkey( + &self, + kind: u32, + pubkey: &PublicKey, + ) -> Result { let rpk = Self::replaceable_index_key(kind, pubkey); match self.db.get(rpk) { Ok(v) => match v { - Some(v) => { - self.event_by_id(&Nip19::EventId(EventId::from_slice(v[8..].as_ref())?)) - } - None => Err(anyhow::Error::msg("Not Found")) - } - Err(e) => Err(anyhow::Error::new(e)) + Some(v) => self.event_by_id(&Nip19::EventId(EventId::from_slice(v[8..].as_ref())?)), + None => Err(anyhow::Error::msg("Not Found")), + }, + Err(e) => Err(anyhow::Error::new(e)), } } -} \ No newline at end of file +}