This commit is contained in:
kieran 2024-12-26 15:10:21 +00:00
commit 715ac91099
No known key found for this signature in database
GPG Key ID: DE71CEB3925BE941
5 changed files with 2625 additions and 0 deletions

3
.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
target/
data/
.idea/

2504
Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

15
Cargo.toml Normal file
View File

@ -0,0 +1,15 @@
[package]
name = "dtan_relay"
version = "0.1.0"
edition = "2021"
[dependencies]
nostr-sdk = { git = "https://github.com/rust-nostr/nostr.git", rev = "7351b86c17cb06869a69cb49645d2e9809a9c1a9", package = "nostr-sdk", features = ["lmdb"] }
nostr-relay-builder = { git = "https://github.com/rust-nostr/nostr.git", rev = "7351b86c17cb06869a69cb49645d2e9809a9c1a9", package = "nostr-relay-builder" }
log = "0.4.22"
config = { version = "0.15.4", features = ["yaml"] }
pretty_env_logger = "0.5.0"
tokio = { version = "1.42.0", features = ["rt", "rt-multi-thread", "macros"] }
clap = { version = "4.5.23", features = ["derive"] }
anyhow = "1.0.95"
serde = { version = "1.0.216", features = ["derive"] }

11
config.yml Normal file
View File

@ -0,0 +1,11 @@
# Location where the relay will store its data
database_dir: "./data"
# Bootstrap relays to discover content
relays:
- "wss://relay.damus.io"
- "wss://nos.lol"
- "wss://relay.nostr.band"
# Listen address of dtan relay
relay_listen: "0.0.0.0:8000"

92
src/main.rs Normal file
View File

@ -0,0 +1,92 @@
use anyhow::Result;
use clap::Parser;
use config::Config;
use nostr_relay_builder::builder::{PolicyResult, WritePolicy};
use nostr_relay_builder::prelude::Event;
use nostr_relay_builder::{LocalRelay, RelayBuilder};
use nostr_sdk::prelude::async_trait;
use nostr_sdk::{Client, NostrLMDB};
use serde::Deserialize;
use std::collections::HashSet;
use std::net::SocketAddr;
use std::path::PathBuf;
use std::sync::Arc;
#[derive(Parser, Debug)]
#[command(about, version)]
struct Args {
#[arg(long)]
pub config: Option<PathBuf>,
}
#[derive(Deserialize)]
pub struct Settings {
/// Path to store events
pub database_dir: Option<PathBuf>,
/// List of relays to bootstrap from
pub relays: Vec<String>,
/// Listen addr for relay
pub relay_listen: Option<SocketAddr>,
}
#[derive(Debug)]
struct AcceptKinds(HashSet<u16>);
impl AcceptKinds {
pub fn from<I>(input: I) -> Self
where
I: Into<HashSet<u16>>,
{
Self(input.into())
}
}
#[async_trait]
impl WritePolicy for AcceptKinds {
async fn admit_event(&self, event: &Event, _addr: &SocketAddr) -> PolicyResult {
if !self.0.contains(&event.kind.as_u16()) {
PolicyResult::Reject("kind not accepted".to_string())
} else {
PolicyResult::Accept
}
}
}
#[tokio::main]
async fn main() -> Result<()> {
pretty_env_logger::init();
let args = Args::parse();
let config: Settings = Config::builder()
.add_source(config::File::from(
args.config.unwrap_or(PathBuf::from("./config.yml")),
))
.build()?
.try_deserialize()?;
let db = NostrLMDB::open(config.database_dir.unwrap_or(PathBuf::from("./data")))?;
let db = Arc::new(db);
let client = Client::builder().database(db.clone()).build();
for relay in &config.relays {
client.add_relay(relay).await?;
}
client.connect().await;
let addr = config
.relay_listen
.unwrap_or(SocketAddr::new([0, 0, 0, 0].into(), 8000));
let relay = RelayBuilder::default()
.database(db.clone())
.addr(addr.ip())
.port(addr.port())
.write_policy(AcceptKinds::from([0, 2003, 2004]));
LocalRelay::run(relay).await?;
// start scraper
Ok(())
}