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