diff options
| author | Adam Soltys <[email protected]> | 2022-12-27 22:51:33 -0800 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2022-12-27 22:51:33 -0800 |
| commit | 2d2c991645f3b0ac7fb3ad88afdad0bb67c28b74 (patch) | |
| tree | cecb95f1c16ba3f1cf020bedc945706032df9d64 /lib/nostr.js | |
| parent | a487b5a2b80d270771f9932c17d2b6babf0fd49a (diff) | |
| download | coinos-server-2d2c991645f3b0ac7fb3ad88afdad0bb67c28b74.tar.gz coinos-server-2d2c991645f3b0ac7fb3ad88afdad0bb67c28b74.zip | |
follower endpoints
Diffstat (limited to 'lib/nostr.js')
| -rw-r--r-- | lib/nostr.js | 59 |
1 files changed, 50 insertions, 9 deletions
diff --git a/lib/nostr.js b/lib/nostr.js index 477d2b12..257bca9e 100644 --- a/lib/nostr.js +++ b/lib/nostr.js @@ -5,6 +5,7 @@ import store from "$lib/store"; import redis from "$lib/redis"; const { relays } = await got("https://nostr.watch/relays.json").json(); + export const pool = RelayPool(relays); pool.on("open", relay => { @@ -12,11 +13,18 @@ pool.on("open", relay => { relay.subscribe("live", { limit: 1 }); }); -let coinos; +export let coinos; let seen = []; let timeout; pool.on("event", async (relay, sub, ev) => { try { + let parsed; + try { + parsed = JSON.parse(ev.content); + } catch (e) { + parsed = ev.content; + } + if (sub === "live") { let { pubkey } = ev; @@ -28,26 +36,59 @@ pool.on("event", async (relay, sub, ev) => { seen.length > 1000 && seen.shift(); if (coinos && ev.kind < 5) { - let parsed; - try { - parsed = JSON.parse(ev.content); - } catch (e) { - parsed = ev.content; - } - coinos.send(["EVENT", ev]); - ev.user = JSON.parse(await redis.get(`user:${pubkey}`)) || { + let newuser = { username: pubkey.substr(0, 6), pubkey, anon: true }; + ev.user = JSON.parse(await redis.get(`user:${pubkey}`)) || newuser; + + if (!ev.user.initialized) { + relay.subscribe("zero", { + limit: 1, + kinds: [0], + authors: [pubkey] + }); + } + if (ev.kind === 1) { broadcast("event", ev); } } + } else if (sub === "zero") { + let { pubkey } = ev; + let newuser = { + username: pubkey.substr(0, 6), + pubkey, + anon: true + }; + + let user = JSON.parse(await redis.get(`user:${pubkey}`)) || newuser; + if (parsed.name && user.username === pubkey.substr(0, 6)) + user.username = parsed.name; + + delete parsed.name; + + user = { + ...user, + ...parsed, + initialized: true + }; + + await redis.set(`user:${pubkey}`, JSON.stringify(user)); + } else if (sub.includes("follows")) { + let pubkey = sub.split(":")[0]; + await redis.set(`${pubkey}:follows`, JSON.stringify(ev.tags)); + for (let f of ev.tags) { + await redis.sAdd(`${f[1]}:followers`, pubkey); + } + store.fetching[pubkey] = false; } else { + if (!relay.url.includes("coinos")) return; + let pubkey = sub; clearTimeout(store.timeouts[pubkey]); |
