show comment on this URL

    
      
  • /*
     * @title show comment on this URL
     * @description このページに言及しているNostrのコメントを表示する
     * @include https://*
     * @license CC0 1.0
     * @require
     */
    
    (() => {
    	const relayUrl = 'wss://yabu.me/';
    
    	const getEvent = (url) => {
    		return new Promise((resolve) => {
    			const ws = new WebSocket(relayUrl);
    			const subscription_id = 'getcommentofthispage';
    			let res = [];
    			ws.onopen = () => {
    				const req = ['REQ', subscription_id, { kinds: [1], '#r': [url] }];
    				ws.send(JSON.stringify(req));
    			};
    			ws.onmessage = (e) => {
    				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 = () => {
    				console.error('failed to connect');
    			};
    		});
    	};
    
    	const tag = (name, props = {}, children = []) => {
    		const e = Object.assign(document.createElement(name), props);
    		if (typeof props.style === 'object') Object.assign(e.style, props.style);
    		(children.forEach ? children : [children]).forEach((c) => e.appendChild(c));
    		return e;
    	};
    
    	const main = async () => {
    		let events;
    		try {
    			events = await getEvent(location.href.replace(/#.*$/, ''));
    		} catch (error) {
    			console.warn(error);
    			return;
    		}
    		const comments = events.slice(0, 10).map((ev) => ev.content);
    		console.log(comments);
    		const div = document.createElement('div');
    		div.style.position = 'fixed';
    		div.style.top = '10px';
    		div.style.right = '10px';
    		div.style.whiteSpace = 'pre-wrap';
    		div.addEventListener('click', () => {
    			div.style.display = 'none';
    		});
    		document.body.append(div);
    		for (const comment of comments) {
    			const p = document.createElement('p');
    			const text = document.createTextNode(comment);
    			div.append(
    				tag(
    					'p',
    					{
    						style:
    							'width: 30em; min-height: 3em; background-color: rgba(200, 200, 200, 0.95); border-bottom: 1px solid #333'
    					},
    					[text]
    				)
    			);
    		}
    	};
    
    	main();
    })();
    
  • Permalink
    このページへの個別リンクです。
    RAW
    書かれたコードへの直接のリンクです。
    Packed
    文字列が圧縮された書かれたコードへのリンクです。
    Userscript
    Greasemonkey 等で利用する場合の .user.js へのリンクです。
    Loader
    @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
    Metadata
    コード中にコメントで @xxx と書かれたメタデータの JSON です。

History

  1. 2024/12/31 18:07:47 - 2024-12-31
  2. 2024/12/27 12:08:27 - 2024-12-27
  3. 2024/12/27 10:42:16 - 2024-12-27
  4. 2024/12/27 10:28:30 - 2024-12-27
  5. 2024/12/27 10:12:52 - 2024-12-27