-
@ かめさんです。
2023-12-03 14:13:18Yakihonneに投稿したいので、わざわざ、のす本演習1-2をnostr-toolshttps://github.com/nbd-wtf/nostr-toolsのサンプルを参考に複数リレー対応のコードを考えてみた。
複数リレーに繋いでいるので、同じPostが繋いでいるリレー分だけ取得するんだろなと思っていて、リレー別のPost を確認しようと試みたがよくわからなくて、見る限りガンガン取得したPostが画面を流れて行くので演習2-3で定義されていたisSafeToReply関数を使ってCOOL_TIME_DUR_SECで設定している秒数以内に取得するすでに取得済みのpubkeyのPostは弾くようにするとそれらしくなったので良しとした。
これであってるかな?
追記 2023/12/03 23:12: SimplePoolで複数リレーのPostを取得したら重複は弾かれてるような気がする。 ちなみにwss://nos.lolを含めているので外国語を取得してるけど除くと外国語がなくなるので、複数リレーで取得しているのが確認できました。
``` const { currUnixtime } = require("./utils.js"); const { SimplePool } = require("nostr-tools"); require("websocket-polyfill");
const relayUrl = [ "wss://relay-jp.nostr.wirednet.jp", "wss://yabu.me", "wss://nostr.fediverse.jp", "wss://relay.nostr.wirednet.jp", "wss://nostr.holybea.com", "wss://nostr-relay.nokotaro.com", "wss://r.kojira.io", "wss://nrelay.c-stellar.net", "wss://r.hostr.cc", "wss://relay-jp.shino3.net", "wss://nos.lol" ];
const COOL_TIME_DUR_SEC = 5 const lastReplyTimePerPubkey = new Map() const isSafeToReply = ({ pubkey, created_at }) => { const now = currUnixtime(); if (created_at < now - COOL_TIME_DUR_SEC) { return false; }
const lastReplyTime = lastReplyTimePerPubkey.get(pubkey); if (lastReplyTime !== undefined && now - lastReplyTime < COOL_TIME_DUR_SEC) { return false; } lastReplyTimePerPubkey.set(pubkey, now); return true; }
const main = async () => { const pool = new SimplePool(); const sub = pool.sub( [...relayUrl], [ { kinds: [1] } ], );
sub.on("error", () => { console.error("failed to connect"); pool.close() });
sub.on("eose", () => { console.log("** EOSE ****"); });
sub.on("event", (ev) => { if (isSafeToReply(ev)) { console.log(ev.content); } }); };
main().catch((e) => console.error(e));
```