about summary refs log tree commit diff stats
path: root/src/assets/javascripts/twitter.js
diff options
context:
space:
mode:
authorManeraKai <manerakai@protonmail.com>2022-05-30 01:02:59 +0300
committerManeraKai <manerakai@protonmail.com>2022-05-30 01:02:59 +0300
commitc5a6623e0f320b2a789e0d2667ccfe2e1bd4335f (patch)
treedabfa0f2cecf137771f276996f9368922c5aeb64 /src/assets/javascripts/twitter.js
parentFixed typo for CopyRaw #291 (diff)
downloadlibredirect-c5a6623e0f320b2a789e0d2667ccfe2e1bd4335f.zip
Fixed settings theme and translation flashing #286
Diffstat (limited to 'src/assets/javascripts/twitter.js')
-rw-r--r--src/assets/javascripts/twitter.js241
1 files changed, 241 insertions, 0 deletions
diff --git a/src/assets/javascripts/twitter.js b/src/assets/javascripts/twitter.js
new file mode 100644
index 00000000..d03c269f
--- /dev/null
+++ b/src/assets/javascripts/twitter.js
@@ -0,0 +1,241 @@
+window.browser = window.browser || window.chrome;
+
+import utils from './utils.js'
+
+const targets = [
+  /^https?:\/{2}(www\.|mobile\.|)twitter\.com/,
+  /^https?:\/{2}(pbs\.|video\.|)twimg\.com/,
+  /^https?:\/{2}platform\.twitter\.com\/embed/,
+  /^https?:\/{2}t\.co/
+];
+
+let redirects = {
+  "nitter": {
+    "normal": [],
+    "tor": []
+  },
+};
+
+function setRedirects(val) {
+  browser.storage.local.get('cloudflareList', r => {
+    redirects.nitter = val;
+    nitterNormalRedirectsChecks = [...redirects.nitter.normal];
+    for (const instance of r.cloudflareList) {
+      let i = nitterNormalRedirectsChecks.indexOf(instance);
+      if (i > -1) nitterNormalRedirectsChecks.splice(i, 1);
+    }
+    browser.storage.local.set({
+      twitterRedirects: redirects,
+      nitterNormalRedirectsChecks,
+      nitterTorRedirectsChecks: [...redirects.nitter.tor]
+    })
+  })
+}
+
+let
+  disableTwitter,
+  twitterProtocol,
+  twitterRedirects,
+  nitterNormalRedirectsChecks,
+  nitterNormalCustomRedirects,
+  nitterTorRedirectsChecks,
+  nitterTorCustomRedirects;
+
+function init() {
+  return new Promise(async resolve => {
+    browser.storage.local.get(
+      [
+        "disableTwitter",
+        "twitterProtocol",
+        "twitterRedirects",
+        "nitterNormalRedirectsChecks",
+        "nitterNormalCustomRedirects",
+        "nitterTorRedirectsChecks",
+        "nitterTorCustomRedirects",
+      ],
+      r => {
+        disableTwitter = r.disableTwitter;
+        twitterProtocol = r.twitterProtocol;
+        twitterRedirects = r.twitterRedirects;
+        nitterNormalRedirectsChecks = r.nitterNormalRedirectsChecks;
+        nitterNormalCustomRedirects = r.nitterNormalCustomRedirects;
+        nitterTorRedirectsChecks = r.nitterTorRedirectsChecks;
+        nitterTorCustomRedirects = r.nitterTorCustomRedirects;
+        resolve();
+      }
+    )
+  })
+}
+
+init();
+browser.storage.onChanged.addListener(init)
+
+function all() {
+  return [
+    ...nitterNormalRedirectsChecks,
+    ...nitterTorRedirectsChecks,
+    ...nitterNormalCustomRedirects,
+    ...nitterTorCustomRedirects,
+  ];
+}
+
+function redirect(url, initiator) {
+  if (disableTwitter) return;
+  if (!targets.some(rx => rx.test(url.href))) return;
+  if (url.pathname.split("/").includes("home")) return;
+  if (initiator && all().includes(initiator.origin)) return 'BYPASSTAB';
+
+  let instancesList;
+  if (twitterProtocol == 'normal') instancesList = [...nitterNormalRedirectsChecks, ...nitterNormalCustomRedirects];
+  else if (twitterProtocol == 'tor') instancesList = [...nitterTorRedirectsChecks, ...nitterTorCustomRedirects];
+  if (instancesList.length === 0) return;
+
+  const randomInstance = utils.getRandomInstance(instancesList);
+  // https://pbs.twimg.com/profile_images/648888480974508032/66_cUYfj_400x400.jpg
+  if (url.host.split(".")[0] === "pbs" || url.host.split(".")[0] === "video")
+    return `${randomInstance}/pic/${encodeURIComponent(`${url.host}${url.pathname}`)}`;
+  else if (url.pathname.split("/").includes("tweets"))
+    return `${randomInstance}${url.pathname.replace("/tweets", "")}${url.search}`;
+  else if (url.host == 't.co')
+    return `${randomInstance}/t.co${url.pathname}`;
+  else
+    return `${randomInstance}${url.pathname}${url.search}`;
+}
+
+function reverse(url) {
+  return new Promise(async resolve => {
+    await init();
+    const protocolHost = utils.protocolHost(url);
+    if (!all().includes(protocolHost)) { resolve(); return; }
+    resolve(`https://twitter.com${url.pathname}${url.search}`);
+  })
+}
+
+function switchInstance(url) {
+  return new Promise(async resolve => {
+    await init();
+    const protocolHost = utils.protocolHost(url);
+    if (!all().includes(protocolHost)) { resolve(); return; }
+    let instancesList;
+    if (twitterProtocol == 'normal') instancesList = [...nitterNormalRedirectsChecks, ...nitterNormalCustomRedirects];
+    else if (twitterProtocol == 'tor') instancesList = [...nitterTorRedirectsChecks, ...nitterTorCustomRedirects];
+
+    let index = instancesList.indexOf(protocolHost);
+    if (index > -1) instancesList.splice(index, 1);
+    if (instancesList.length === 0) { resolve(); return; }
+
+    const randomInstance = utils.getRandomInstance(instancesList);
+    resolve(`${randomInstance}${url.pathname}${url.search}`);
+  })
+}
+
+function removeXFrameOptions(e) {
+  let url = new URL(e.url);
+  let protocolHost = utils.protocolHost(url);
+  if (!all().includes(protocolHost) || e.type != 'sub_frame') return;
+  let isChanged = false;
+  for (const i in e.responseHeaders) if (e.responseHeaders[i].name == 'x-frame-options') {
+    e.responseHeaders.splice(i, 1);
+    isChanged = true;
+  }
+  if (isChanged) return { responseHeaders: e.responseHeaders };
+}
+
+function initNitterCookies(test, from) {
+  return new Promise(async resolve => {
+    await init();
+    const protocolHost = utils.protocolHost(from);
+    if (!all().includes(protocolHost)
+    ) { resolve(); return; }
+
+    if (!test) {
+      let checkedInstances;
+      if (twitterProtocol == 'normal') checkedInstances = [...nitterNormalRedirectsChecks, ...nitterNormalCustomRedirects]
+      else if (twitterProtocol == 'tor') checkedInstances = [...nitterTorRedirectsChecks, ...nitterTorCustomRedirects]
+      for (const to of checkedInstances) {
+        utils.copyCookie('nitter', from, to, 'theme');
+        utils.copyCookie('nitter', from, to, 'infiniteScroll');
+        utils.copyCookie('nitter', from, to, 'stickyProfile');
+        utils.copyCookie('nitter', from, to, 'bidiSupport');
+        utils.copyCookie('nitter', from, to, 'hideTweetStats');
+        utils.copyCookie('nitter', from, to, 'hideBanner');
+        utils.copyCookie('nitter', from, to, 'hidePins');
+        utils.copyCookie('nitter', from, to, 'hideReplies');
+        utils.copyCookie('nitter', from, to, 'squareAvatars');
+        utils.copyCookie('nitter', from, to, 'mp4Playback');
+        utils.copyCookie('nitter', from, to, 'hlsPlayback');
+        utils.copyCookie('nitter', from, to, 'proxyVideos');
+        utils.copyCookie('nitter', from, to, 'muteVideos');
+        utils.copyCookie('nitter', from, to, 'autoplayGifs');
+      }
+    }
+    resolve(true);
+  })
+}
+
+function setNitterCookies() {
+  return new Promise(async resolve => {
+    await init();
+    if (disableTwitter || twitterProtocol === undefined) { resolve(); return; }
+    let checkedInstances;
+    if (twitterProtocol == 'normal') checkedInstances = [...nitterNormalRedirectsChecks, ...nitterNormalCustomRedirects]
+    else if (twitterProtocol == 'tor') checkedInstances = [...nitterTorRedirectsChecks, ...nitterTorCustomRedirects]
+    for (const to of checkedInstances) {
+      utils.getCookiesFromStorage('nitter', to, 'theme');
+      utils.getCookiesFromStorage('nitter', to, 'infiniteScroll');
+      utils.getCookiesFromStorage('nitter', to, 'stickyProfile');
+      utils.getCookiesFromStorage('nitter', to, 'bidiSupport');
+      utils.getCookiesFromStorage('nitter', to, 'hideTweetStats');
+      utils.getCookiesFromStorage('nitter', to, 'hideBanner');
+      utils.getCookiesFromStorage('nitter', to, 'hidePins');
+      utils.getCookiesFromStorage('nitter', to, 'hideReplies');
+      utils.getCookiesFromStorage('nitter', to, 'squareAvatars');
+      utils.getCookiesFromStorage('nitter', to, 'mp4Playback');
+      utils.getCookiesFromStorage('nitter', to, 'hlsPlayback');
+      utils.getCookiesFromStorage('nitter', to, 'proxyVideos');
+      utils.getCookiesFromStorage('nitter', to, 'muteVideos');
+      utils.getCookiesFromStorage('nitter', to, 'autoplayGifs');
+    }
+    resolve();
+  }
+  )
+}
+
+function initDefaults() {
+  return new Promise(resolve => {
+    fetch('/instances/data.json').then(response => response.text()).then(data => {
+      let dataJson = JSON.parse(data);
+      redirects.nitter = dataJson.nitter;
+      browser.storage.local.get('cloudflareList', async r => {
+        nitterNormalRedirectsChecks = [...redirects.nitter.normal];
+        for (const instance of r.cloudflareList) {
+          let i = nitterNormalRedirectsChecks.indexOf(instance);
+          if (i > -1) nitterNormalRedirectsChecks.splice(i, 1);
+        }
+        await browser.storage.local.set({
+          disableTwitter: false,
+          twitterRedirects: redirects,
+          twitterProtocol: "normal",
+
+          nitterNormalRedirectsChecks,
+          nitterNormalCustomRedirects: [],
+
+          nitterTorRedirectsChecks: [...redirects.nitter.tor],
+          nitterTorCustomRedirects: [],
+        })
+        resolve();
+      })
+    })
+  })
+}
+
+export default {
+  setRedirects,
+  redirect,
+  switchInstance,
+  reverse,
+  removeXFrameOptions,
+  initNitterCookies,
+  setNitterCookies,
+  initDefaults,
+};