From d929f8935b2ad597ebd7734878dd2d74d4eb82a5 Mon Sep 17 00:00:00 2001 From: Gordon Pedersen Date: Sat, 11 May 2024 12:43:50 +1000 Subject: [PATCH] Add some very basic fediverse integration It doesn't go as far as I wanted, because I don't know how to get the counts I need as yet. --- configuration/template.html | 4 + fediverse.js | 1 + weblog/B0. Template/fediverse.js.md | 126 ++++++++++++++++++++-------- weblog/B0. Template/styles.css.md | 2 +- 4 files changed, 97 insertions(+), 36 deletions(-) create mode 120000 fediverse.js diff --git a/configuration/template.html b/configuration/template.html index c44145f..4f57304 100644 --- a/configuration/template.html +++ b/configuration/template.html @@ -29,6 +29,10 @@ via status.lol Interact on the Fediverse + diff --git a/fediverse.js b/fediverse.js new file mode 120000 index 0000000..a2d5558 --- /dev/null +++ b/fediverse.js @@ -0,0 +1 @@ +./weblog/B0. Template/fediverse.js.md \ No newline at end of file diff --git a/weblog/B0. Template/fediverse.js.md b/weblog/B0. Template/fediverse.js.md index fce0cb7..11200f7 100644 --- a/weblog/B0. Template/fediverse.js.md +++ b/weblog/B0. Template/fediverse.js.md @@ -6,46 +6,102 @@ Location: /fediverse.js /**/ const SUBSCRIBE_LINK_REL = 'http://ostatus.org/schema/1.0/subscribe' -function share(uri, handle) { - if(!handle){ - handle = prompt("Please enter your fediverse / mastodon handle (e.g. '@user@domain.social')\n(remember to look for blocked pop-ups)", "@") +async function getSubscribeTemplate() { + const input = prompt("Please enter your fediverse / mastodon handle (e.g. '@user@domain.social')", "@") + let handle = input.trim().replace(/^@/,'') + const split = handle.split('@') + if(split.length == 2) { + const resource = `acct:${handle}` + const domain = split[1] + + // look up remote user via webfinger + const url = `https://${domain}/.well-known/webfinger?resource=${resource}` + return fetch(url, {headers: { + 'Content-Type': 'application/json' + }}).then(async result => { + const json = await result.json() + const subscribe = json.links.find(link => link.rel && link.rel == SUBSCRIBE_LINK_REL) + let template = subscribe.template + return template + }) + .catch(e => { + console.error(e) + alert(`Sorry, we couldn't find an uri for ${input}.\n\nTry searching for "${uri}" on ${domain} (or in your fediverse client of choice)`) + return null + }) } - - if(handle) { - const input = handle - handle = handle.trim().replace(/^@/,'') - const split = handle.split('@') - if(split.length == 2) { - const resource = `acct:${handle}` - const domain = split[1] - - // look up remote user via webfinger - const url = `https://${domain}/.well-known/webfinger?resource=${resource}` - fetch(url, {headers: { - 'Content-Type': 'application/activity+json' - }}).then(async result => { - const json = await result.json() - const subscribe = json.links.find(link => link.rel && link.rel == SUBSCRIBE_LINK_REL) - let template = subscribe.template - window.open(template.replace("{uri}", uri), '_blank').focus() - }) - .catch(e => { - console.error(e) - throw `Sorry, we couldn't find an uri for ${input}.\n\nTry searching for "${uri}" on ${domain} (or in your fediverse client of choice)` - }) - + else { + alert('Please enter your fediverse address in @user@domain.social format') + return null + } + return null +} + +function linkToUrl(uri) { + // window.open(uri, '_blank').focus() + const link = document.createElement('a') + link.href = uri + link.target = "_blank" + link.click() +} + +function noDataCick(href) { + return async (e) => { + e.preventDefault() + let subscribe_template = await getSubscribeTemplate() + if(subscribe_template) { + localStorage.setItem('subscribe_template', subscribe_template) + const url = subscribe_template.replace("{uri}", href) + linkToUrl(url) + addSocialButtons(this, url) } else { - throw 'Please enter your fediverse address in @user@domain.social format' + linkToUrl(href) } } } +function addSocialButtons(el, href) { + // TODO: fetch the post from the fediverse to add in comment, like and retweet count + // the following fetches the activitypub object but has no reference to the likes, etc + // if I had the local id, I could use the mastodon API to get it, but friendica uses the diaspora:guid in the link + // const url = new URL(href).searchParams.get("uri") + // fetch(url, { + // headers: { + // 'Accept': 'application/json' + // } + // }).then(async result => { + // const json = await result.text() + // console.log(json) + // }) + // .catch(e => { + // console.error(e) + // }) + + const innerHTML = ` + + + + ` + + const span = document.createElement('span') + span.classList.add('fediverse') + span.innerHTML = innerHTML + + el.insertAdjacentElement('afterend', span) + el.remove() +} + function fediverse() { - document.querySelectorAll("a.external_url:not([href='{external_url}'])").forEach(el => { - el.addEventListener('click', e => { - e.preventDefault() - share(el.href) - }) - }) -} \ No newline at end of file + let subscribe_template = localStorage.getItem('subscribe_template'); + + document.querySelectorAll("a.external_url:not([href='{external_url}'])").forEach(el => { + if(subscribe_template) { + console.log(subscribe_template.replace("{uri}", el.href)) + addSocialButtons(el, subscribe_template.replace("{uri}", el.href)) + } + else { + el.addEventListener('click', noDataCick(el.href)) + } + }) +} diff --git a/weblog/B0. Template/styles.css.md b/weblog/B0. Template/styles.css.md index 1ded9d0..c9f8665 100644 --- a/weblog/B0. Template/styles.css.md +++ b/weblog/B0. Template/styles.css.md @@ -93,7 +93,7 @@ main.page { margin-left: .75em; } -.post-info>a { +.post-info a { margin-left: 1em; background: none; }