announcing good-first-issue tags added on @tangled.sh (not affiliated with tangled!)

extract some event handling

Changed files
+31 -30
src
+31 -30
src/main.rs
··· 2 use url::Url; 3 use jetstream::{ 4 JetstreamCompression, JetstreamConfig, JetstreamConnector, 5 - events::{CommitOp, Cursor, EventKind}, 6 exports::Nsid, 7 }; 8 use jacquard::{ ··· 128 Ok(()) 129 } 130 131 /// com.bad-example.identity.resolveMiniDoc bit we care about 132 #[derive(Deserialize)] 133 struct MiniDocResponse { ··· 222 println!("logged in as {} ({})", session.handle, session.did); 223 client.set_session(session).await?; 224 225 let jetstream_config: JetstreamConfig = JetstreamConfig { 226 endpoint: args.jetstream_url.to_string(), 227 wanted_collections: vec![Nsid::new("sh.tangled.label.op".to_string())?], ··· 231 channel_size: 1024, // buffer up to ~1s of jetstream events 232 ..Default::default() 233 }; 234 - 235 let mut receiver = JetstreamConnector::new(jetstream_config)? 236 .connect_cursor(args.jetstream_cursor.map(Cursor::from_raw_u64)) 237 .await?; 238 - 239 - let req_client = reqwest::Client::builder() 240 - .user_agent("hacktober_bot") 241 - .timeout(Duration::from_secs(9)) 242 - .build()?; 243 244 println!("receiving jetstream messages..."); 245 loop { ··· 247 eprintln!("consumer: could not receive event, bailing"); 248 break; 249 }; 250 - if event.kind != EventKind::Commit { 251 - continue; 252 - } 253 - let Some(ref commit) = event.commit else { 254 - eprintln!("consumer: commit event missing commit data, ignoring"); 255 continue; 256 }; 257 - if commit.operation != CommitOp::Create { 258 - continue; 259 - } 260 - let Some(ref record) = commit.record else { 261 - eprintln!("consumer: commit update/delete missing record, ignoring"); 262 - continue; 263 - }; 264 - let CreateLabelRecord { add, subject } = match serde_json::from_str(record.get()) { 265 - Ok(v) => v, 266 - Err(e) => { 267 - eprintln!("consumer: record failed to parse, ignoring: {e}"); 268 - continue; 269 - } 270 - }; 271 let mut added_good_first_issue = false; 272 for added in add { 273 if added.key == "at://did:plc:wshs7t2adsemcrrd4snkeqli/sh.tangled.label.definition/good-first-issue" { 274 - println!("found a good first issue label!! {:?}", event.cursor); 275 added_good_first_issue = true; 276 break; // inner 277 } ··· 281 continue; 282 } 283 284 - let IssueRecord { title, repo } = match get_record(&req_client, &subject).await { 285 Ok(m) => m, 286 Err(e) => { 287 eprintln!("failed to get issue record: {e} for {subject}"); ··· 294 continue; 295 }; 296 297 - let RepoRecord { name: repo_name } = match get_record(&req_client, &repo).await { 298 Ok(m) => m, 299 Err(e) => { 300 eprintln!("failed to get repo record: {e} for {subject}"); ··· 304 305 let nice_tangled_repo_id = match repo_uri.authority() { 306 AtIdentifier::Handle(h) => format!("@{h}"), 307 - AtIdentifier::Did(did) => match get_handle(&req_client, did.as_str()).await { 308 Err(e) => { 309 eprintln!("failed to get mini doc from repo identifier: {e} for {subject}"); 310 continue;
··· 2 use url::Url; 3 use jetstream::{ 4 JetstreamCompression, JetstreamConfig, JetstreamConnector, 5 + events::{CommitOp, Cursor, EventKind, JetstreamEvent}, 6 exports::Nsid, 7 }; 8 use jacquard::{ ··· 128 Ok(()) 129 } 130 131 + fn event_to_create_label<T: for <'a> Deserialize<'a>>(event: JetstreamEvent) -> Result<(T, Cursor)> { 132 + if event.kind != EventKind::Commit { 133 + return Err("not a commit".into()); 134 + } 135 + let commit = event.commit.ok_or("commit event missing commit data")?; 136 + if commit.operation != CommitOp::Create { 137 + return Err("not a create event".into()); 138 + } 139 + 140 + let raw = commit.record.ok_or("commit missing record")?; 141 + 142 + // todo: delete post if label is removed 143 + // delete sample: at://did:plc:hdhoaan3xa3jiuq4fg4mefid/sh.tangled.label.op/3m2jvx4c6wf22 144 + // tldr: has a "delete" array just like "add" on the same op collection 145 + let t = serde_json::from_str(raw.get())?; 146 + Ok((t, event.cursor)) 147 + } 148 + 149 /// com.bad-example.identity.resolveMiniDoc bit we care about 150 #[derive(Deserialize)] 151 struct MiniDocResponse { ··· 240 println!("logged in as {} ({})", session.handle, session.did); 241 client.set_session(session).await?; 242 243 + let slingshot_client = reqwest::Client::builder() 244 + .user_agent("hacktober_bot") 245 + .timeout(Duration::from_secs(9)) 246 + .build()?; 247 + 248 let jetstream_config: JetstreamConfig = JetstreamConfig { 249 endpoint: args.jetstream_url.to_string(), 250 wanted_collections: vec![Nsid::new("sh.tangled.label.op".to_string())?], ··· 254 channel_size: 1024, // buffer up to ~1s of jetstream events 255 ..Default::default() 256 }; 257 let mut receiver = JetstreamConnector::new(jetstream_config)? 258 .connect_cursor(args.jetstream_cursor.map(Cursor::from_raw_u64)) 259 .await?; 260 261 println!("receiving jetstream messages..."); 262 loop { ··· 264 eprintln!("consumer: could not receive event, bailing"); 265 break; 266 }; 267 + 268 + let Ok((CreateLabelRecord { add, subject }, cursor)) = event_to_create_label(event) else { 269 continue; 270 }; 271 + 272 let mut added_good_first_issue = false; 273 for added in add { 274 if added.key == "at://did:plc:wshs7t2adsemcrrd4snkeqli/sh.tangled.label.definition/good-first-issue" { 275 + println!("found a good first issue label!! {:?}", cursor); 276 added_good_first_issue = true; 277 break; // inner 278 } ··· 282 continue; 283 } 284 285 + let IssueRecord { title, repo } = match get_record(&slingshot_client, &subject).await { 286 Ok(m) => m, 287 Err(e) => { 288 eprintln!("failed to get issue record: {e} for {subject}"); ··· 295 continue; 296 }; 297 298 + let RepoRecord { name: repo_name } = match get_record(&slingshot_client, &repo).await { 299 Ok(m) => m, 300 Err(e) => { 301 eprintln!("failed to get repo record: {e} for {subject}"); ··· 305 306 let nice_tangled_repo_id = match repo_uri.authority() { 307 AtIdentifier::Handle(h) => format!("@{h}"), 308 + AtIdentifier::Did(did) => match get_handle(&slingshot_client, did.as_str()).await { 309 Err(e) => { 310 eprintln!("failed to get mini doc from repo identifier: {e} for {subject}"); 311 continue;