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

make the posts

Changed files
+51 -16
src
+51 -16
src/main.rs
··· 53 jetstream_cursor: Option<u64>, 54 } 55 56 - async fn post_link<C: HttpClient>(client: &AuthenticatedClient<C>, identifier: &AtIdentifier<'_>, pre_text: &str, link: Url) -> Result<()> { 57 - let link_text = link.to_string(); 58 - let text = format!("{pre_text} {link_text}"); 59 - let link_feature = serde_json::json!({ 60 "$type": "app.bsky.richtext.facet#link", 61 - "uri": link_text, 62 }); 63 - let link_facet = Facet { 64 - features: vec![Data::from_json(&link_feature)?], 65 index: ByteSlice { 66 - byte_start: (pre_text.len() + 1) as i64, 67 - byte_end: text.len() as i64, 68 extra_data: Default::default(), 69 }, 70 extra_data: Default::default(), ··· 74 let post = Post { 75 created_at: Datetime::now(), 76 langs: Some(vec![Language::new("en")?]), 77 - text: text.into(), 78 - facets: Some(vec![link_facet]), 79 embed: Default::default(), 80 entities: Default::default(), 81 labels: Default::default(), ··· 276 continue; 277 } 278 }; 279 - let Some(serde_json::Value::String(name)) = repo_record.get("name") else { 280 eprintln!("failed to get name for repo for {subject}"); 281 continue; 282 }; ··· 293 } 294 }; 295 296 - let issues_url = format!("https://tangled.org/{nice_tangled_repo_id}/{name}/issues"); 297 298 - println!("hi: {issues_url}"); 299 300 - // let message = format!(r#""#); 301 302 - eprintln!("got {subject} {title:?} for {name}"); 303 } 304 305 // let u2: Url = "https://bad-example.com".parse()?;
··· 53 jetstream_cursor: Option<u64>, 54 } 55 56 + async fn post<C: HttpClient>( 57 + client: &AuthenticatedClient<C>, 58 + identifier: &AtIdentifier<'_>, 59 + repo_name: &str, 60 + repo_url: &str, 61 + title: &str, 62 + repo_issues_url: &str, 63 + ) -> Result<()> { 64 + let message = format!(r#"good-first-issue tagged for {repo_name}: 65 + 66 + > {title}"#); 67 + 68 + let repo_feature = serde_json::json!({ 69 + "$type": "app.bsky.richtext.facet#link", 70 + "uri": repo_url, 71 + }); 72 + let repo_facet = Facet { 73 + features: vec![Data::from_json(&repo_feature)?], 74 + index: ByteSlice { 75 + byte_start: 28, 76 + byte_end: 29 + repo_name.len() as i64, 77 + extra_data: Default::default(), 78 + }, 79 + extra_data: Default::default(), 80 + }; 81 + 82 + let title_starts_at = (29 + repo_name.len() + 5) as i64; 83 + 84 + let repo_issues_feature = serde_json::json!({ 85 "$type": "app.bsky.richtext.facet#link", 86 + "uri": repo_issues_url, 87 }); 88 + let issues_facet = Facet { 89 + features: vec![Data::from_json(&repo_issues_feature)?], 90 index: ByteSlice { 91 + byte_start: title_starts_at, 92 + byte_end: title_starts_at + title.len() as i64, 93 extra_data: Default::default(), 94 }, 95 extra_data: Default::default(), ··· 99 let post = Post { 100 created_at: Datetime::now(), 101 langs: Some(vec![Language::new("en")?]), 102 + text: message.into(), 103 + facets: Some(vec![repo_facet, issues_facet]), 104 embed: Default::default(), 105 entities: Default::default(), 106 labels: Default::default(), ··· 301 continue; 302 } 303 }; 304 + let Some(serde_json::Value::String(repo_name)) = repo_record.get("name") else { 305 eprintln!("failed to get name for repo for {subject}"); 306 continue; 307 }; ··· 318 } 319 }; 320 321 + let repo_full_name = format!("{nice_tangled_repo_id}/{repo_name}"); 322 + let repo_url = format!("https://tangled.org/{nice_tangled_repo_id}/{repo_name}"); 323 324 + let issues_url = format!("https://tangled.org/{nice_tangled_repo_id}/{repo_name}/issues"); 325 326 + if let Err(e) = post( 327 + &client, 328 + &bot_id, 329 + &repo_full_name, 330 + &repo_url, 331 + title, 332 + &issues_url, 333 + ).await { 334 + eprintln!("failed to post for {subject}: {e}"); 335 + }; 336 337 + break; 338 } 339 340 // let u2: Url = "https://bad-example.com".parse()?;