diff --git a/src/main.rs b/src/main.rs --- a/src/main.rs +++ b/src/main.rs @@ -53,18 +53,43 @@ jetstream_cursor: Option, } -async fn post_link(client: &AuthenticatedClient, identifier: &AtIdentifier<'_>, pre_text: &str, link: Url) -> Result<()> { - let link_text = link.to_string(); - let text = format!("{pre_text} {link_text}"); - let link_feature = serde_json::json!({ +async fn post( + client: &AuthenticatedClient, + identifier: &AtIdentifier<'_>, + repo_name: &str, + repo_url: &str, + title: &str, + repo_issues_url: &str, +) -> Result<()> { + let message = format!(r#"good-first-issue tagged for {repo_name}: + +> {title}"#); + + let repo_feature = serde_json::json!({ "$type": "app.bsky.richtext.facet#link", - "uri": link_text, + "uri": repo_url, }); - let link_facet = Facet { - features: vec![Data::from_json(&link_feature)?], + let repo_facet = Facet { + features: vec![Data::from_json(&repo_feature)?], index: ByteSlice { - byte_start: (pre_text.len() + 1) as i64, - byte_end: text.len() as i64, + byte_start: 28, + byte_end: 29 + repo_name.len() as i64, + extra_data: Default::default(), + }, + extra_data: Default::default(), + }; + + let title_starts_at = (29 + repo_name.len() + 5) as i64; + + let repo_issues_feature = serde_json::json!({ + "$type": "app.bsky.richtext.facet#link", + "uri": repo_issues_url, + }); + let issues_facet = Facet { + features: vec![Data::from_json(&repo_issues_feature)?], + index: ByteSlice { + byte_start: title_starts_at, + byte_end: title_starts_at + title.len() as i64, extra_data: Default::default(), }, extra_data: Default::default(), @@ -74,8 +99,8 @@ let post = Post { created_at: Datetime::now(), langs: Some(vec![Language::new("en")?]), - text: text.into(), - facets: Some(vec![link_facet]), + text: message.into(), + facets: Some(vec![repo_facet, issues_facet]), embed: Default::default(), entities: Default::default(), labels: Default::default(), @@ -276,7 +301,7 @@ continue; } }; - let Some(serde_json::Value::String(name)) = repo_record.get("name") else { + let Some(serde_json::Value::String(repo_name)) = repo_record.get("name") else { eprintln!("failed to get name for repo for {subject}"); continue; }; @@ -293,13 +318,23 @@ } }; - let issues_url = format!("https://tangled.org/{nice_tangled_repo_id}/{name}/issues"); + let repo_full_name = format!("{nice_tangled_repo_id}/{repo_name}"); + let repo_url = format!("https://tangled.org/{nice_tangled_repo_id}/{repo_name}"); - println!("hi: {issues_url}"); + let issues_url = format!("https://tangled.org/{nice_tangled_repo_id}/{repo_name}/issues"); - // let message = format!(r#""#); + if let Err(e) = post( + &client, + &bot_id, + &repo_full_name, + &repo_url, + title, + &issues_url, + ).await { + eprintln!("failed to post for {subject}: {e}"); + }; - eprintln!("got {subject} {title:?} for {name}"); + break; } // let u2: Url = "https://bad-example.com".parse()?;