aboutsummaryrefslogtreecommitdiffstats
path: root/lib/nostr.js
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2022-12-27 22:51:33 -0800
committerAdam Soltys <[email protected]>2022-12-27 22:51:33 -0800
commit2d2c991645f3b0ac7fb3ad88afdad0bb67c28b74 (patch)
treececb95f1c16ba3f1cf020bedc945706032df9d64 /lib/nostr.js
parenta487b5a2b80d270771f9932c17d2b6babf0fd49a (diff)
downloadcoinos-server-2d2c991645f3b0ac7fb3ad88afdad0bb67c28b74.tar.gz
coinos-server-2d2c991645f3b0ac7fb3ad88afdad0bb67c28b74.zip
follower endpoints
Diffstat (limited to 'lib/nostr.js')
-rw-r--r--lib/nostr.js59
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]);