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

Configure Feed

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

make the posts

phil 766ba4cd 9edda741

+51 -16
+51 -16
src/main.rs
··· 53 53 jetstream_cursor: Option<u64>, 54 54 } 55 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!({ 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!({ 60 85 "$type": "app.bsky.richtext.facet#link", 61 - "uri": link_text, 86 + "uri": repo_issues_url, 62 87 }); 63 - let link_facet = Facet { 64 - features: vec![Data::from_json(&link_feature)?], 88 + let issues_facet = Facet { 89 + features: vec![Data::from_json(&repo_issues_feature)?], 65 90 index: ByteSlice { 66 - byte_start: (pre_text.len() + 1) as i64, 67 - byte_end: text.len() as i64, 91 + byte_start: title_starts_at, 92 + byte_end: title_starts_at + title.len() as i64, 68 93 extra_data: Default::default(), 69 94 }, 70 95 extra_data: Default::default(), ··· 74 99 let post = Post { 75 100 created_at: Datetime::now(), 76 101 langs: Some(vec![Language::new("en")?]), 77 - text: text.into(), 78 - facets: Some(vec![link_facet]), 102 + text: message.into(), 103 + facets: Some(vec![repo_facet, issues_facet]), 79 104 embed: Default::default(), 80 105 entities: Default::default(), 81 106 labels: Default::default(), ··· 276 301 continue; 277 302 } 278 303 }; 279 - let Some(serde_json::Value::String(name)) = repo_record.get("name") else { 304 + let Some(serde_json::Value::String(repo_name)) = repo_record.get("name") else { 280 305 eprintln!("failed to get name for repo for {subject}"); 281 306 continue; 282 307 }; ··· 293 318 } 294 319 }; 295 320 296 - let issues_url = format!("https://tangled.org/{nice_tangled_repo_id}/{name}/issues"); 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}"); 297 323 298 - println!("hi: {issues_url}"); 324 + let issues_url = format!("https://tangled.org/{nice_tangled_repo_id}/{repo_name}/issues"); 299 325 300 - // let message = format!(r#""#); 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 + }; 301 336 302 - eprintln!("got {subject} {title:?} for {name}"); 337 + break; 303 338 } 304 339 305 340 // let u2: Url = "https://bad-example.com".parse()?;