Something went wrong. Try again.
A Zig library for Bluesky activity and feed analytics, built on Zat.
Something went wrong. Try again.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546const std = @import("std");const tend = @import("tend");
pub fn main(init: std.process.Init) !void { const a = init.gpa; var args = std.process.Args.Iterator.init(init.minimal.args); _ = args.skip(); const format = std.meta.stringToEnum(tend.archive.Format, args.next() orelse return error.MissingFormat) orelse return error.InvalidFormat; const path = args.next() orelse return error.MissingArchive; const did = args.next() orelse return error.MissingDid; const until = try std.fmt.parseInt(i64, args.next() orelse return error.MissingWindowEnd, 10); const window: tend.activity.Window = .{ .since = std.math.sub(i64, until, 90 * std.time.us_per_day) catch return error.InvalidWindow, .until = until }; const file = try std.Io.Dir.cwd().openFile(init.io, path, .{}); defer file.close(init.io); var buffer: [64 * 1024]u8 = undefined; var input = file.reader(init.io, &buffer); var evidence = try tend.archive.read(a, &input.interface, .{ .format = format, .did = did, .window = window, .observed_at = std.Io.Timestamp.now(init.io, .real).toMicroseconds(), .retain_evidence = true, }); defer evidence.deinit(); const counts = try tend.activity.count(evidence.value.evidence.?, window); const targets = try tend.activity.interactions(a, evidence.value.evidence.?, window); defer targets.deinit(a); const post: tend.client.Profile = .{ .did = "did:plc:author", .handle = "author.test" }; const reposter: tend.client.Profile = .{ .did = "did:plc:reposter", .handle = "reposter.test" }; const entries: []const tend.feed.Entry = &.{.{ .uri = "at://did:plc:author/app.bsky.feed.post/one", .author = post, .introduced_by = reposter, .indexed_at = until, .is_reply = true, .is_repost = true }}; const authors = try tend.feed.rank(a, entries, .author); defer authors.deinit(a); const introducers = try tend.feed.rank(a, entries, .introducer); defer introducers.deinit(a); const output = try std.json.Stringify.valueAlloc(a, .{ .counts = counts, .pattern = tend.activity.pattern(counts), .interaction_targets = targets.rows.len, .example_author = authors.ranking[0].account.did, .example_introducer = introducers.ranking[0].account.did, }, .{ .whitespace = .indent_2 }); defer a.free(output); try std.Io.File.stdout().writeStreamingAll(init.io, output); try std.Io.File.stdout().writeStreamingAll(init.io, "\n");}