···
from datetime import datetime, timezone
···
async def bsky_activity():
32
-
redis_cnx = redis.Redis()
33
-
relay_url = 'wss://bsky.network/xrpc/com.atproto.sync.subscribeRepos'
34
-
firehose_seq = redis_cnx.get('dev.edavis.muninsky.seq')
36
-
relay_url += f'?cursor={firehose_seq.decode()}'
33
+
relay_url = 'ws://localhost:6008/subscribe'
sys.stdout.write(f'opening websocket connection to {relay_url}\n')
async with websockets.connect(relay_url, ping_timeout=60) as firehose:
43
-
frame = BytesIO(await firehose.recv())
44
-
header = dag_cbor.decode(frame, allow_concat=True)
45
-
if header['op'] != 1 or header['t'] != '#commit':
40
+
payload = BytesIO(await firehose.recv())
48
-
payload = dag_cbor.decode(frame)
49
-
if payload['tooBig']:
50
-
# TODO(ejd): figure out how to get blocks out-of-band
53
-
# TODO(ejd): figure out how to validate blocks
54
-
blocks = payload.pop('blocks')
55
-
car_parsed = CAR.from_bytes(blocks)
57
-
message = payload.copy()
59
-
message['commit'] = message['commit'].encode('base32')
61
-
for commit_op in payload['ops']:
62
-
op = commit_op.copy()
63
-
if op['cid'] is not None:
64
-
op['cid'] = op['cid'].encode('base32')
65
-
op['record'] = car_parsed.blocks.get(op['cid'])
42
+
yield json.load(payload)
redis_cnx = redis.Redis()
···
92
-
async for commit, op in bsky_activity():
93
-
if op['action'] != 'create':
67
+
async for payload in bsky_activity():
68
+
if payload['opType'] != 'c':
96
-
collection, _ = op['path'].split('/')
71
+
collection = payload['collection']
if collection not in app_bsky_allowlist:
100
-
repo_did = commit['repo']
101
-
repo_update_time = datetime.strptime(commit['time'], '%Y-%m-%dT%H:%M:%S.%fZ').replace(tzinfo=timezone.utc)
75
+
repo_did = payload['did']
76
+
repo_update_time = datetime.now(timezone.utc)
'insert into users values (:did, :ts) on conflict (did) do update set ts = :ts',
{'did': repo_did, 'ts': repo_update_time.timestamp()}
···
now = datetime.now(timezone.utc)
114
-
payload_seq = commit['seq']
89
+
payload_seq = payload['seq']
payload_lag = now - repo_update_time
sys.stdout.write(f'seq: {payload_seq}, lag: {payload_lag.total_seconds()}\n')