+51
-16
src/main.rs
+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()?;