diff options
| author | Adam Soltys <[email protected]> | 2026-10-19 18:10:31 -0700 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2026-10-19 18:10:31 -0700 |
| commit | 1a85347b0a37886e550497eab5ece05410fce923 (patch) | |
| tree | af4b5497eb89c5b6063ba772d8974f8057ec6b13 /src/features | |
| parent | 762bdcb558af94b540801a89cd16cd419d3a27d5 (diff) | |
| download | coinosv3-1a85347b0a37886e550497eab5ece05410fce923.tar.gz coinosv3-1a85347b0a37886e550497eab5ece05410fce923.zip | |
Posts: a relay named in a post (wss://…) is a link to what's on it — the raw firehose of that relay alone (/feed/all?r=…). Trailing punctuation stays outside the link.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013ZDf1cyCQLkfjftYhymZAg
Diffstat (limited to 'src/features')
| -rw-r--r-- | src/features/messages.js | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/src/features/messages.js b/src/features/messages.js index 0974839..094de0d 100644 --- a/src/features/messages.js +++ b/src/features/messages.js @@ -7844,7 +7844,7 @@ export function messagesFeature(ctx) { // A bare npub/nprofile — with or without an @ in front, no nostr: prefix — // is how Vector (and people) write a mention; it resolves to the name too. const BARE_KEY = '(?<![\\w/])@?(?:npub|nprofile)1[a-z0-9]{20,}(?![\\w])'; - const NOTE_SPLIT = new RegExp('(' + MD_LINK + '|https?:\\/\\/[^\\s]+|nostr:(?:npub|nprofile|note|nevent|naddr)1[a-z0-9]+|' + BARE_KEY + '|' + MENTION + '|' + HASHTAG + ')', 'gi'); + const NOTE_SPLIT = new RegExp('(' + MD_LINK + '|https?:\\/\\/[^\\s]+|wss?:\\/\\/[^\\s]+|nostr:(?:npub|nprofile|note|nevent|naddr)1[a-z0-9]+|' + BARE_KEY + '|' + MENTION + '|' + HASHTAG + ')', 'gi'); const MD_PARTS = new RegExp('^(!?)\\[([^\\]\\n]{0,300})\\]\\(\\s*<?(https?:\\/\\/[^\\s>)]+)>?[^)\\n]{0,300}\\)$', 'i'); // A YouTube link is a video, so show the video. All three shapes it comes @@ -10377,6 +10377,14 @@ export function messagesFeature(ctx) { } else if (/^https?:\/\//i.test(part)) { const pack = PACK_LINK_RE.exec(part); out.push(pack ? packLinkNode(part, pack[1]) : urlNode(part)); + } else if (/^wss?:\/\//i.test(part)) { + // a relay named in a post opens what's on it (the raw firehose) + const [, addr, tail] = /^(.*?)([.,;:!?)\]'"]*)$/.exec(part); + const relay = normRelay(addr); + out.push(relay ? h('a', { + href: '/feed/all?r=' + encodeURIComponent(relay), title: t('relayLinkOpen'), + onClick: (e) => { e.preventDefault(); e.stopPropagation(); openFeedUrl('all', '?r=' + encodeURIComponent(relay)); }, + }, addr) : addr, tail); } else if (/^(nostr:|@?)(npub|nprofile)1/i.test(part)) { const bare = part.replace(/^(nostr:|@)/i, ''); const ref = parseNostrRef(bare); |
