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 2 use url::Url; 3 3 use jetstream::{ 4 4 JetstreamCompression, JetstreamConfig, JetstreamConnector, 5 - events::{CommitOp, Cursor, EventKind}, 5 + events::{CommitOp, Cursor, EventKind, JetstreamEvent}, 6 6 exports::Nsid, 7 7 }; 8 8 use jacquard::{ ··· 128 128 Ok(()) 129 129 } 130 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 + 131 149 /// com.bad-example.identity.resolveMiniDoc bit we care about 132 150 #[derive(Deserialize)] 133 151 struct MiniDocResponse { ··· 222 240 println!("logged in as {} ({})", session.handle, session.did); 223 241 client.set_session(session).await?; 224 242 243 + let slingshot_client = reqwest::Client::builder() 244 + .user_agent("hacktober_bot") 245 + .timeout(Duration::from_secs(9)) 246 + .build()?; 247 + 225 248 let jetstream_config: JetstreamConfig = JetstreamConfig { 226 249 endpoint: args.jetstream_url.to_string(), 227 250 wanted_collections: vec![Nsid::new("sh.tangled.label.op".to_string())?], ··· 231 254 channel_size: 1024, // buffer up to ~1s of jetstream events 232 255 ..Default::default() 233 256 }; 234 - 235 257 let mut receiver = JetstreamConnector::new(jetstream_config)? 236 258 .connect_cursor(args.jetstream_cursor.map(Cursor::from_raw_u64)) 237 259 .await?; 238 - 239 - let req_client = reqwest::Client::builder() 240 - .user_agent("hacktober_bot") 241 - .timeout(Duration::from_secs(9)) 242 - .build()?; 243 260 244 261 println!("receiving jetstream messages..."); 245 262 loop { ··· 247 264 eprintln!("consumer: could not receive event, bailing"); 248 265 break; 249 266 }; 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"); 267 + 268 + let Ok((CreateLabelRecord { add, subject }, cursor)) = event_to_create_label(event) else { 255 269 continue; 256 270 }; 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 + 271 272 let mut added_good_first_issue = false; 272 273 for added in add { 273 274 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 + println!("found a good first issue label!! {:?}", cursor); 275 276 added_good_first_issue = true; 276 277 break; // inner 277 278 } ··· 281 282 continue; 282 283 } 283 284 284 - let IssueRecord { title, repo } = match get_record(&req_client, &subject).await { 285 + let IssueRecord { title, repo } = match get_record(&slingshot_client, &subject).await { 285 286 Ok(m) => m, 286 287 Err(e) => { 287 288 eprintln!("failed to get issue record: {e} for {subject}"); ··· 294 295 continue; 295 296 }; 296 297 297 - let RepoRecord { name: repo_name } = match get_record(&req_client, &repo).await { 298 + let RepoRecord { name: repo_name } = match get_record(&slingshot_client, &repo).await { 298 299 Ok(m) => m, 299 300 Err(e) => { 300 301 eprintln!("failed to get repo record: {e} for {subject}"); ··· 304 305 305 306 let nice_tangled_repo_id = match repo_uri.authority() { 306 307 AtIdentifier::Handle(h) => format!("@{h}"), 307 - AtIdentifier::Did(did) => match get_handle(&req_client, did.as_str()).await { 308 + AtIdentifier::Did(did) => match get_handle(&slingshot_client, did.as_str()).await { 308 309 Err(e) => { 309 310 eprintln!("failed to get mini doc from repo identifier: {e} for {subject}"); 310 311 continue;