this repo has no description
5
fork

Configure Feed

Select the types of activity you want to include in your feed.

Resolve the knot for a repo

+76
+68
src/knot.rs
··· 1 + use reqwest::blocking; 2 + 3 + pub fn find_knot(did: String, repo_name: String, pds: String) -> Result<String, ()> { 4 + // https://docs.bsky.app/docs/api/com-atproto-repo-list-records 5 + let mut cursor: Option<String> = None; 6 + 7 + loop { 8 + let url = format!( 9 + "{0}/xrpc/com.atproto.repo.listRecords?collection=sh.tangled.repo&repo={1}&cursor={2}", 10 + pds.clone(), 11 + did.clone(), 12 + cursor.clone().unwrap_or(String::new()) 13 + ); 14 + 15 + let res = match reqwest::blocking::get(url) { 16 + Ok(val) => val, 17 + Err(_) => { 18 + println!(" Failed to load repos."); 19 + return Err(()); 20 + } 21 + }; 22 + 23 + if !res.status().is_success() { 24 + println!(" Got non 2xx code when loading repos"); 25 + return Err(()); 26 + } 27 + 28 + let body = match res.text() { 29 + Ok(val) => match json::parse(&val) { 30 + Ok(val) => val, 31 + Err(_) => { 32 + println!(" Invalid or malformed response response"); 33 + return Err(()); 34 + } 35 + }, 36 + Err(_) => { 37 + println!(" Missing body from response"); 38 + return Err(()); 39 + } 40 + }; 41 + 42 + // must contain a records array 43 + if !body["records"].is_array() { 44 + println!(" Invalid or malformed response response"); 45 + return Err(()); 46 + } 47 + for record in body["records"].members() { 48 + if let Some(val) = record["value"]["name"].as_str() 49 + && val == repo_name 50 + { 51 + if let Some(knot) = record["value"]["knot"].as_str() { 52 + return Ok(String::from(knot)); 53 + } else { 54 + println!(" Repo didn't have a valid knot"); 55 + return Err(()); 56 + } 57 + } 58 + } 59 + 60 + if let Some(val) = body["cursor"].as_str() { 61 + cursor = Some(String::from(val)) 62 + } else { 63 + break; 64 + } 65 + } 66 + 67 + return Err(()); 68 + }
+8
src/main.rs
··· 1 1 mod args; 2 2 mod did; 3 + mod knot; 3 4 4 5 fn main() -> Result<(), ()> { 5 6 // load configuration ··· 16 17 }; 17 18 18 19 // resolve did+repoName to knotserver 20 + println!("Resolving @{0}/{1}", config.handle, config.repo_name); 21 + let knot_server = match knot::find_knot(did_doc.did, config.repo_name, did_doc.pds) { 22 + Ok(val) => val, 23 + Err(_) => return Err(()), 24 + }; 25 + 26 + println!("{}", knot_server); 19 27 20 28 // connect to /events on knotserver 21 29