<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns="http://purl.org/rss/1.0/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel rdf:about="https://let.hatelabo.jp/YTYT0707/rss">
    <link>https://let.hatelabo.jp/YTYT0707/rss</link>
    <description></description>
    <title>Bookmarklets from YTYT0707</title>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="https://let.hatelabo.jp/YTYT0707/let/ktTwtf6SgKAA"/>
      </rdf:Seq>
    </items>
  </channel>
  <item rdf:about="https://let.hatelabo.jp/YTYT0707/let/ktTwtf6SgKAA">
    <link>https://let.hatelabo.jp/YTYT0707/let/ktTwtf6SgKAA</link>
    <dc:date>2025-02-27T23:50:17Z</dc:date>
    <description>リレーからkind30002イベントを取得してRabbitにリレーセットをインポートする</description>
    <dc:creator>YTYT0707</dc:creator>
    <title>[Let] import relay set to Rabbit</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2FYTYT0707%2Flet%2FktTwtf6SgKAA.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;import relay set to Rabbit&lt;/a&gt;&lt;pre&gt;/*
 * @title import relay set to Rabbit
 * @description リレーからkind30002イベントを取得してRabbitにリレーセットをインポートする
 * @include https://rabbit.syusui.net/*
 * @license CC0 1.0
 * @require
 */

(async () =&amp;gt; {
	let relayUrl = 'wss://relay-jp.nostr.wirednet.jp';

	const getPubkey = async () =&amp;gt; {
		let pubkey; //Node.jsでデバッグする際はここに初期値を入れてください。無ければ最新の誰かのイベントで代用します。
		const nostr = globalThis.window?.nostr;
		if (nostr?.getPublicKey) {
			try {
				pubkey = await nostr.getPublicKey();
			} catch (error) {
				console.warn(error);
			}
		}
		return pubkey;
	};

	const getEvent30002 = async (pubkey) =&amp;gt; {
		return new Promise((resolve) =&amp;gt; {
			const ws = new WebSocket(relayUrl);
			const subscription_id = 'getrelaysetinrabbit';
			let res = [];
			ws.onopen = () =&amp;gt; {
				const req = [
					'REQ',
					subscription_id,
					pubkey ? { kinds: [30002], authors: [pubkey] } : { kinds: [30002], limit: 1 }
				];
				ws.send(JSON.stringify(req));
			};
			ws.onmessage = (e) =&amp;gt; {
				const msg = JSON.parse(e.data);
				switch (msg[0]) {
					case 'EVENT':
						res.push(msg[2]);
						break;
					case 'EOSE':
						ws.send(JSON.stringify(['CLOSE', subscription_id]));
						ws.close();
						resolve(res);
						break;
					default:
						console.log(msg);
						break;
				}
			};
			ws.onerror = () =&amp;gt; {
				console.error('failed to connect');
			};
		});
	};

	const main = async () =&amp;gt; {
		relayUrl = window.prompt('Input relay URL.', relayUrl);
		if (!URL.canParse(relayUrl)) {
			console.warn(`Invalid URL: ${relayUrl}`);
			return;
		}
		let pubkey;
		try {
			pubkey = await getPubkey();
		} catch (error) {
			console.warn(error);
			return;
		}
		if (globalThis.window &amp;amp;&amp;amp; !pubkey) {
			console.warn('pubkey is empty.');
			return;
		}
		let ev30002s;
		try {
			ev30002s = await getEvent30002(pubkey);
		} catch (error) {
			console.warn(error);
			return;
		}
		let relays;
		for (const ev of ev30002s) {
			const d = ev.tags.find((tag) =&amp;gt; tag.length &amp;gt;= 2 &amp;amp;&amp;amp; tag[0] === 'd')?.at(1) ?? '';
			const rs = ev.tags
				.filter((tag) =&amp;gt; tag.length &amp;gt;= 2 &amp;amp;&amp;amp; tag[0] === 'relay' &amp;amp;&amp;amp; URL.canParse(tag[1]))
				.map((tag) =&amp;gt; tag[1]);
			if (window.confirm(`Do you want to use &amp;quot;${d}&amp;quot; ?\n\n` + rs.join('\n'))) {
				relays = rs;
				break;
			}
		}
		if (relays === undefined) {
			return;
		}
		if (globalThis.window) {
			const config = JSON.parse(localStorage['RabbitConfig']);
			config.relayUrls = Array.from(new Set([...config.relayUrls, ...relays]));
			localStorage['RabbitConfig'] = JSON.stringify(config);
			alert('Complete. Please reload by yourself.');
		} else {
			console.log({ relays });
			console.log('Complete.');
		}
	};

	main();
})();
&lt;/pre&gt;</content:encoded>
  </item>
</rdf:RDF>
