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