Greasy Fork

Greasy Fork is available in English.

Anilist Activity Saver

Simple userscript/extension for AniList that allows users to save text activities.

当前为 2023-12-08 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name        Anilist Activity Saver
// @namespace   https://github.com/KanashiiDev
// @match       https://anilist.co/*
// @version     1.1.40
// @license     GPL-3.0-or-later
// @require     https://code.jquery.com/jquery-3.3.1.min.js
// @require     https://cdn.jsdelivr.net/npm/[email protected]/dist/purify.min.js
// @require     https://cdn.jsdelivr.net/npm/[email protected]/dist/showdown.min.js
// @require     https://cdn.jsdelivr.net/npm/[email protected]/libs/lz-string.min.js
// @author      KanashiiDev
// @supportURL  https://github.com/KanashiiDev/Ani-ActivitySaver/issues
// @description Simple userscript/extension for AniList that allows users to save text activities.
// @run-at      document-end
// ==/UserScript==

//Showdown Youtube Extension 1.2.1
//https://github.com/showdownjs/youtube-extension
//Changed some regex codes
!(function (e) {
  'use strict';
  if ('undefined' != typeof showdown) e(showdown);
  else if ('function' == typeof define && define.amd) define(['showdown'], e);
  else {
    if ('object' != typeof exports) throw Error('Could not find showdown library');
    module.exports = e(require('showdown'));
  }
})(function (e) {
  'use strict';
  var t = /(?:<p>)?<img.*?src="(.+?)"(.*?)\/?>(?:<\/p>)?/gi,
    o = /(?:(?:https?:)?(?:\/\/)?)(?:(?:www)?\.)?youtube\.(?:.+?)\/(?:(?:watch\?v=)|(?:embed\/|shorts|))([a-zA-Z0-9_-]{11})/i,
    i = /(?:(?:https?:)?(?:\/\/)?)?youtu\.be\/([a-zA-Z0-9_-]{11})/i,
    r = /(?:(?:https?:)?(?:\/\/)?)(?:(?:www)?\.)?vimeo.com\/(\d+)/;
  e.extension('youtube', function () {
    return [
      {
        type: 'output',
        filter: function (e, s, n) {
          var l = '<iframe src="%1" width="%2" height="%3" frameborder="0" allowfullscreen></iframe>';
          return (
            n.smoothLivePreview &&
              (l = n.youtubeUseSimpleImg
                ? '<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=" width="%2" height="%3">'
                : '<div class="youtube-preview" style="width:%2; height:%3; background-color:#333; position:relative;"><svg version="1.1" xmlns="http://www.w3.org/2000/svg"      width="100" height="70" viewBox="0 0 100 70"     style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);">    <defs>      <linearGradient id="grad1" x1="0%" x2="0%" y1="0%" y2="100%">        <stop offset="0%" style="stop-color:rgb(229,45,49);stop-opacity:1" />        <stop offset="100%" style="stop-color:rgb(191,23,29);stop-opacity:1" />      </linearGradient>    </defs>    <rect width="100%" height="100%" rx="26" fill="url(#grad1)"/>    <polygon points="35,20 70,35 35,50" fill="#fff"/>    <polygon points="35,20 70,35 64,37 35,21" fill="#e8e0e0"/></svg><div style="text-align:center; padding-top:10px; color:#fff"><a href="%1">%1</a></div></div>'),
            e.replace(t, function (e, t, s) {
              var d,
                f = (function (e, t) {
                  var o, i, r, s, n;
                  return (
                    (s = t.youtubeWidth ? t.youtubeWidth : 420),
                    (n = t.youtubeHeight ? t.youtubeHeight : 315),
                    e && ((o = (r = /width="(.+?)"/.exec(e)) ? r[1] : s), (i = (r = /height="(.+?)"/.exec(e)) ? r[1] : n)),
                    /^\d+$/gm.exec(o) && (o += 'px'),
                    /^\d+$/gm.exec(i) && (i += 'px'),
                    { width: o, height: i }
                  );
                })(s, n),
                h = '';
              if ((d = i.exec(t)) || (d = o.exec(t))) h = 'https://www.youtube.com/embed/' + d[1] + '?rel=0';
              else {
                if (!(d = r.exec(t))) return e;
                h = 'https://player.vimeo.com/video/' + d[1];
              }
              return l.replace(/%1/g, h).replace('%2', f.width).replace('%3', f.height);
            })
          );
        },
      },
    ];
  });
});

/*! showdown Options. */
showdown.setOption('strikethrough', true);
showdown.setOption('ghMentions', true);
showdown.setOption('emoji', true);
showdown.setOption('tables', true);
showdown.setOption('simpleLineBreaks', true);
showdown.setOption('simplifiedAutoLink', true);
showdown.setOption('noHeaderId', true);
showdown.setOption('omitExtraWLInCodeBlocks', true);
showdown.setOption('ghMentionsLink', 'https://anilist.co/user/{u}/');
showdown.setOption('youtubeHeight', '300px');
showdown.setOption('youtubeWidth', '300px');
const converter = new showdown.Converter({ extensions: ['youtube'] });

//make HTML
let makeHtml = function (e) {
  let t = (e = e.replace('----', '---')).split('~~~'),
    r = /img(\d+%?)?\(http.+?\)/gi;
  t = t.map((e) => {
    let t = e.match(r);
    return (
      t &&
        t.forEach((t) => {
          let r = t.match(/^img(\d+%?)?\((http.+?)\)$/i);
          e = e.replace(t, `<img width="${r[1] || ''}" src="${r[2]}">`);
        }),
      e
    );
  });
  let a = /webm\(http.+?\)/gi;
  t = t.map((e) => {
    let t = e.match(a);
    return (
      t &&
        t.forEach((t) => {
          let r = t.match(/^webm\((http.+?)\)$/i);
          e = e.replace(t, `<video src="${r[1]}" controls="true" muted=""></video>`);
        }),
      e
    );
  });
  let c = /youtube\(.+?\)/gi,
    l = [
      (t = t.map((e) => {
        let t = e.match(c);
        return (
          t &&
            t.forEach((t) => {
              let r = t.match(/^youtube\((.+?)\)$/i);
              e = e.replace(t, `<a href="${r[1]}">${r[1]}</a>`);
            }),
          e
        );
      }))[0],
    ],
    m = !1;
  for (let n = 1; n < t.length; n++) m ? l.push('</center>') : l.push('<center>'), l.push(t[n]), (m = !m);
  return (l = l.map((e) => (/~!/.test(e) || /!~/.test(e) ? e.replace(/~!/g, '<span class="markdown_spoiler">').replace(/!~/g, '</span>') : e))), converter.makeHtml(l.join(''));
};

//Anilist - AuthAPIQuery
let APIlimit = 90,
  APIcallsUsed = 0,
  APIcallsUsed_shortTerm = 0,
  pending = {},
  APIcounter = setInterval(function () {
    APIcallsUsed = 0;
  }, 6e4),
  APIcounter2 = setInterval(function () {
    APIcallsUsed_shortTerm = 0;
  }, 1e4),
  handleResponse = function (e) {
    APIcallsUsed = (APIlimit = e.headers.get('x-ratelimit-limit')) - e.headers.get('x-ratelimit-remaining');
    try {
      return e.json().then(function (t) {
        return e.ok ? t : Promise.reject(t);
      });
    } catch (t) {
      throw (console.warn(t, e), t);
    }
  };
function authAPIcall(e, t, r, a, n, i, s, l) {
  if (!accessToken) return;
  if (APIcallsUsed_shortTerm > 18 || APIcallsUsed > APIlimit - 2) {
    setTimeout(function () {
      authAPIcall(e, t, r, a, n, i, s, l);
    }, 2e3);
    return;
  }
  if (
    ('object' == typeof e &&
      ((t = e.variables), (r = e.callback), (a = e.cacheKey), (n = e.timeFresh), (i = e.useLocalStorage), (s = e.overWrite), (l = e.oldCallback), (e = e.query)),
    a)
  ) {
    let o = JSON.parse(i ? localStorage.getItem(a) : sessionStorage.getItem(a));
    if (o) {
      if ((!o.duration || NOW() < o.time + o.duration) && !s) {
        r(o.data, t);
        return;
      }
      l && l(o.data, t), i ? localStorage.removeItem(a) : sessionStorage.removeItem(a);
    }
  }
  let c = function (e, s) {
      if ((r(e, t, s), a)) {
        let l = JSON.stringify({ data: e, time: NOW(), duration: n });
        i ? localStorage.setItem(a, l) : sessionStorage.setItem(a, l);
      }
    },
    u = {
      method: 'POST',
      headers: { Authorization: 'Bearer ' + accessToken, 'Content-Type': 'application/json', Accept: 'application/json' },
      body: JSON.stringify({ query: e, variables: t }),
    },
    m = function (t) {
      if ((console.error(t), t.errors && t.errors.some((e) => 'Invalid token' === e.message))) {
        let loginLink = create(
          'a',
          { class: 'mainbtns', id: 'signIn', href: 'https://anilist.co/api/v2/oauth/authorize?client_id=12455&response_type=token' },
          '<b>Error: Expired Token. Click here to renew token.</b>',
        );
        listDiv2.insertBefore(loginLink, listDiv2.children[1]);
        (accessToken = ''), localStorage.setItem('savetkn', accessToken);
        return;
      }
      e.includes('mutation') ? r(t.errors) : c(null, t);
    };
  fetch('https://graphql.anilist.co', u).then(handleResponse).then(c).catch(m), APIcallsUsed++, APIcallsUsed_shortTerm++;
}

//SVG
const svgns = 'http://www.w3.org/2000/svg',
  svgShape = function (e, t, a, c, r) {
    e = e || 'g';
    let l = document.createElementNS('http://www.w3.org/2000/svg', e);
    return (
      Object.keys(a || {}).forEach((e) => {
        l.setAttributeNS(null, e, a[e]);
      }),
      r && l.appendChild(document.createTextNode(r)),
      t && t.appendChild(l),
      (c || []).forEach((e) => {
        e.element ? svgShape(e.element, l, e.attributes, e.children, e.content) : l.appendChild(e);
      }),
      l
    );
  },
  svg = {};
[
  {
    name: 'pinned',
    shape: {
      element: 'svg',
      attributes: {
        focusable: 'false',
        'data-prefix': 'fas',
        'data-icon': 'thumbtack',
        role: 'img',
        xmls: 'http://www.w3.org/2000/svg',
        viewBox: '0 0 384 512',
        class: 'svg-inline--fa fa-link fa-w-16 fa-sm',
        'aria-hidden': 'true',
      },
      children: [
        {
          element: 'path',
          attributes: {
            fill: 'currentColor',
            d: 'M298.028 214.267L285.793 96H328c13.255 0 24-10.745 24-24V24c0-13.255-10.745-24-24-24H56C42.745 0 32 10.745 32 24v48c0 13.255 10.745 24 24 24h42.207L85.972 214.267C37.465 236.82 0 277.261 0 328c0 13.255 10.745 24 24 24h136v104.007c0 1.242.289 2.467.845 3.578l24 48c2.941 5.882 11.364 5.893 14.311 0l24-48a8.008 8.008 0 0 0 .845-3.578V352h136c13.255 0 24-10.745 24-24-.001-51.183-37.983-91.42-85.973-113.733z',
          },
        },
      ],
    },
  },
  {
    name: 'likeNative',
    shape: {
      element: 'svg',
      attributes: {
        'aria-hidden': 'true',
        'data-prefix': 'fas',
        'data-icon': 'heart',
        role: 'img',
        xmls: 'http://www.w3.org/2000/svg',
        viewBox: '0 0 512 512',
        class: 'svg-inline--fa fa-heart fa-w-16 fa-sm',
      },
      children: [
        {
          element: 'path',
          attributes: {
            fill: 'currentColor',
            d: 'M462.3 62.6C407.5 15.9 326 24.3 275.7 76.2L256 96.5l-19.7-20.3C186.1 24.3 104.5 15.9 49.7 62.6c-62.8 53.6-66.1 149.8-9.9 207.9l193.5 199.8c12.5 12.9 32.8 12.9 45.3 0l193.5-199.8c56.3-58.1 53-154.3-9.8-207.9z',
          },
        },
      ],
    },
  },
  {
    name: 'reply',
    shape: {
      element: 'svg',
      attributes: {
        'aria-hidden': 'true',
        'data-prefix': 'fas',
        'data-icon': 'comments',
        role: 'img',
        xmls: 'http://www.w3.org/2000/svg',
        viewBox: '0 0 576 512',
        class: 'svg-inline--fa fa-comments fa-w-16 fa-sm',
      },
      children: [
        {
          element: 'path',
          attributes: {
            fill: 'currentColor',
            d: 'M416 192c0-88.4-93.1-160-208-160S0 103.6 0 192c0 34.3 14.1 65.9 38 92-13.4 30.2-35.5 54.2-35.8 54.5-2.2 2.3-2.8 5.7-1.5 8.7S4.8 352 8 352c36.6 0 66.9-12.3 88.7-25 32.2 15.7 70.3 25 111.3 25 114.9 0 208-71.6 208-160zm122 220c23.9-26 38-57.7 38-92 0-66.9-53.5-124.2-129.3-148.1.9 6.6 1.3 13.3 1.3 20.1 0 105.9-107.7 192-240 192-10.8 0-21.3-.8-31.7-1.9C207.8 439.6 281.8 480 368 480c41 0 79.1-9.2 111.3-25 21.8 12.7 52.1 25 88.7 25 3.2 0 6.1-1.9 7.3-4.8 1.3-2.9.7-6.3-1.5-8.7-.3-.3-22.4-24.2-35.8-54.5z',
          },
        },
      ],
    },
  },
  {
    name: 'expand',
    shape: {
      element: 'svg',
      attributes: {
        'aria-hidden': 'true',
        'data-prefix': 'fas',
        'data-icon': 'expand',
        role: 'img',
        xmls: 'http://www.w3.org/2000/svg',
        viewBox: '0 0 448 512',
        class: 'svg-inline--fa fa-link fa-w-16 fa-sm',
      },
      children: [
        {
          element: 'path',
          attributes: {
            fill: 'currentColor',
            d: 'M0 180V56c0-13.3 10.7-24 24-24h124c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12H64v84c0 6.6-5.4 12-12 12H12c-6.6 0-12-5.4-12-12zM288 44v40c0 6.6 5.4 12 12 12h84v84c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12V56c0-13.3-10.7-24-24-24H300c-6.6 0-12 5.4-12 12zm148 276h-40c-6.6 0-12 5.4-12 12v84h-84c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h124c13.3 0 24-10.7 24-24V332c0-6.6-5.4-12-12-12zM160 468v-40c0-6.6-5.4-12-12-12H64v-84c0-6.6-5.4-12-12-12H12c-6.6 0-12 5.4-12 12v124c0 13.3 10.7 24 24 24h124c6.6 0 12-5.4 12-12z',
          },
        },
      ],
    },
  },
  {
    name: 'compress',
    shape: {
      element: 'svg',
      attributes: {
        'aria-hidden': 'true',
        'data-prefix': 'fas',
        'data-icon': 'compress',
        role: 'img',
        xmls: 'http://www.w3.org/2000/svg',
        viewBox: '0 0 448 512',
        class: 'svg-inline--fa fa-link fa-w-16 fa-sm',
      },
      children: [
        {
          element: 'path',
          attributes: {
            fill: 'currentColor',
            d: 'M436 192H312c-13.3 0-24-10.7-24-24V44c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v84h84c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12zm-276-24V44c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v84H12c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h124c13.3 0 24-10.7 24-24zm0 300V344c0-13.3-10.7-24-24-24H12c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h84v84c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm192 0v-84h84c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12H312c-13.3 0-24 10.7-24 24v124c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12z',
          },
        },
      ],
    },
  },
  {
    name: 'link',
    shape: {
      element: 'svg',
      attributes: {
        'aria-hidden': 'true',
        'data-prefix': 'fas',
        'data-icon': 'link',
        role: 'img',
        xmls: 'http://www.w3.org/2000/svg',
        viewBox: '0 0 512 512',
        class: 'svg-inline--fa fa-link fa-w-16 fa-sm',
      },
      children: [
        {
          element: 'path',
          attributes: {
            fill: 'currentColor',
            d: 'M326.612 185.391c59.747 59.809 58.927 155.698.36 214.59-.11.12-.24.25-.36.37l-67.2 67.2c-59.27 59.27-155.699 59.262-214.96 0-59.27-59.26-59.27-155.7 0-214.96l37.106-37.106c9.84-9.84 26.786-3.3 27.294 10.606.648 17.722 3.826 35.527 9.69 52.721 1.986 5.822.567 12.262-3.783 16.612l-13.087 13.087c-28.026 28.026-28.905 73.66-1.155 101.96 28.024 28.579 74.086 28.749 102.325.51l67.2-67.19c28.191-28.191 28.073-73.757 0-101.83-3.701-3.694-7.429-6.564-10.341-8.569a16.037 16.037 0 0 1-6.947-12.606c-.396-10.567 3.348-21.456 11.698-29.806l21.054-21.055c5.521-5.521 14.182-6.199 20.584-1.731a152.482 152.482 0 0 1 20.522 17.197zM467.547 44.449c-59.261-59.262-155.69-59.27-214.96 0l-67.2 67.2c-.12.12-.25.25-.36.37-58.566 58.892-59.387 154.781.36 214.59a152.454 152.454 0 0 0 20.521 17.196c6.402 4.468 15.064 3.789 20.584-1.731l21.054-21.055c8.35-8.35 12.094-19.239 11.698-29.806a16.037 16.037 0 0 0-6.947-12.606c-2.912-2.005-6.64-4.875-10.341-8.569-28.073-28.073-28.191-73.639 0-101.83l67.2-67.19c28.239-28.239 74.3-28.069 102.325.51 27.75 28.3 26.872 73.934-1.155 101.96l-13.087 13.087c-4.35 4.35-5.769 10.79-3.783 16.612 5.864 17.194 9.042 34.999 9.69 52.721.509 13.906 17.454 20.446 27.294 10.606l37.106-37.106c59.271-59.259 59.271-155.699.001-214.959z',
          },
        },
      ],
    },
  },
  {
    name: 'xmark',
    shape: {
      element: 'svg',
      attributes: {
        'aria-hidden': 'true',
        'data-prefix': 'fas',
        'data-icon': 'link',
        role: 'img',
        xmls: 'http://www.w3.org/2000/svg',
        viewBox: '0 55 400 400',
        class: 'svg-inline--fa fa-link fa-w-16 fa-sm',
      },
      children: [
        {
          element: 'path',
          attributes: {
            fill: 'currentColor',
            d: 'M342.6 150.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L192 210.7 86.6 105.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L146.7 256 41.4 361.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L192 301.3 297.4 406.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L237.3 256 342.6 150.6z',
          },
        },
      ],
    },
  },
  {
    name: 'gear',
    shape: {
      element: 'svg',
      attributes: {
        'aria-hidden': 'true',
        'data-prefix': 'fas',
        'data-icon': 'link',
        role: 'img',
        xmls: 'http://www.w3.org/2000/svg',
        viewBox: '0 0 512 512',
        class: 'svg-inline--fa fa-link fa-w-16 fa-sm',
      },
      children: [
        {
          element: 'path',
          attributes: {
            fill: 'currentColor',
            d: 'M495.9 166.6c3.2 8.7 .5 18.4-6.4 24.6l-43.3 39.4c1.1 8.3 1.7 16.8 1.7 25.4s-.6 17.1-1.7 25.4l43.3 39.4c6.9 6.2 9.6 15.9 6.4 24.6c-4.4 11.9-9.7 23.3-15.8 34.3l-4.7 8.1c-6.6 11-14 21.4-22.1 31.2c-5.9 7.2-15.7 9.6-24.5 6.8l-55.7-17.7c-13.4 10.3-28.2 18.9-44 25.4l-12.5 57.1c-2 9.1-9 16.3-18.2 17.8c-13.8 2.3-28 3.5-42.5 3.5s-28.7-1.2-42.5-3.5c-9.2-1.5-16.2-8.7-18.2-17.8l-12.5-57.1c-15.8-6.5-30.6-15.1-44-25.4L83.1 425.9c-8.8 2.8-18.6 .3-24.5-6.8c-8.1-9.8-15.5-20.2-22.1-31.2l-4.7-8.1c-6.1-11-11.4-22.4-15.8-34.3c-3.2-8.7-.5-18.4 6.4-24.6l43.3-39.4C64.6 273.1 64 264.6 64 256s.6-17.1 1.7-25.4L22.4 191.2c-6.9-6.2-9.6-15.9-6.4-24.6c4.4-11.9 9.7-23.3 15.8-34.3l4.7-8.1c6.6-11 14-21.4 22.1-31.2c5.9-7.2 15.7-9.6 24.5-6.8l55.7 17.7c13.4-10.3 28.2-18.9 44-25.4l12.5-57.1c2-9.1 9-16.3 18.2-17.8C227.3 1.2 241.5 0 256 0s28.7 1.2 42.5 3.5c9.2 1.5 16.2 8.7 18.2 17.8l12.5 57.1c15.8 6.5 30.6 15.1 44 25.4l55.7-17.7c8.8-2.8 18.6-.3 24.5 6.8c8.1 9.8 15.5 20.2 22.1 31.2l4.7 8.1c6.1 11 11.4 22.4 15.8 34.3zM256 336a80 80 0 1 0 0-160 80 80 0 1 0 0 160z',
          },
        },
      ],
    },
  },
  {
    name: 'edit',
    shape: {
      element: 'svg',
      attributes: {
        'aria-hidden': 'true',
        'data-prefix': 'fas',
        'data-icon': 'link',
        role: 'img',
        xmls: 'http://www.w3.org/2000/svg',
        viewBox: '0 0 512 512',
        class: 'svg-inline--fa fa-link fa-w-16 fa-sm',
      },
      children: [
        {
          element: 'path',
          attributes: {
            fill: 'currentColor',
            d: 'M362.7 19.3L314.3 67.7 444.3 197.7l48.4-48.4c25-25 25-65.5 0-90.5L453.3 19.3c-25-25-65.5-25-90.5 0zm-71 71L58.6 323.5c-10.4 10.4-18 23.3-22.2 37.4L1 481.2C-1.5 489.7 .8 498.8 7 505s15.3 8.5 23.7 6.1l120.3-35.4c14.1-4.2 27-11.8 37.4-22.2L421.7 220.3 291.7 90.3z',
          },
        },
      ],
    },
  },
  {
    name: 'cross',
    shape: {
      element: 'svg',
      attributes: {
        'aria-hidden': 'true',
        'data-prefix': 'fas',
        'data-icon': 'cross',
        role: 'img',
        xmls: 'http://www.w3.org/2000/svg',
        viewBox: '0 0 448 512',
        class: 'svg-inline--fa fa-link fa-w-16 fa-sm',
      },
      children: [
        {
          element: 'path',
          attributes: {
            fill: 'currentColor',
            d: 'M135.2 17.7L128 32H32C14.3 32 0 46.3 0 64S14.3 96 32 96H416c17.7 0 32-14.3 32-32s-14.3-32-32-32H320l-7.2-14.3C307.4 6.8 296.3 0 284.2 0H163.8c-12.1 0-23.2 6.8-28.6 17.7zM416 128H32L53.2 467c1.6 25.3 22.6 45 47.9 45H346.9c25.3 0 46.3-19.7 47.9-45L416 128z',
          },
        },
      ],
    },
  },
].forEach((e) => {
  svg[e.name] = svgShape(e.shape.element, !1, e.shape.attributes, e.shape.children, e.shape.content);
});

//Element Functions
var ElementPrototype = Element.prototype,
  hasOwnProperty = Object.hasOwnProperty,
  setPrototypeOf = Object.setPrototypeOf,
  isFrozen = Object.isFrozen,
  getPrototypeOf = Object.getPrototypeOf,
  getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor,
  cloneNode = lookupGetter(ElementPrototype, 'cloneNode');
function lookupGetter(e, t) {
  for (; null !== e; ) {
    var a = getOwnPropertyDescriptor(e, t);
    if (a) {
      if (a.get) return unapply(a.get);
      if ('function' == typeof a.value) return unapply(a.value);
    }
    e = getPrototypeOf(e);
  }
  return function (e) {
    return console.warn('fallback value for', e), null;
  };
}
function hasOwn(e, t) {
  return Object.hasOwn ? Object.hasOwn(e, t) : Object.prototype.hasOwnProperty.call(e, t);
}
function unapply(e) {
  return function (t) {
    for (var a = arguments.length, c = new Array(a > 1 ? a - 1 : 0), r = 1; r < a; r++) c[r - 1] = arguments[r];
    return apply(e, t, c);
  };
}

//Delay Function
const delay = (delayInms) => {
  return new Promise((resolve) => setTimeout(resolve, delayInms));
};

//Time Function for Activities
function nativeTimeElement(e) {
  let n = new Date(1e3 * e),
    o = create2('time', 'activitytime');
  o.setAttribute('datetime', n), (o.title = n.toLocaleString(void 0));
  let t = function () {
    let e = Math.round(new Date().valueOf() / 1e3) - Math.round(n.valueOf() / 1e3);
    0 === e && (o.innerText = 'Now'),
      1 === e
        ? (o.innerText = '1 second ago')
        : e < 60
          ? (o.innerText = e + ' seconds ago')
          : 1 === (e = Math.floor(e / 60))
            ? (o.innerText = '1 minute ago')
            : e < 60
              ? (o.innerText = e + ' minutes ago')
              : 1 === (e = Math.floor(e / 60))
                ? (o.innerText = '1 hour ago')
                : e < 24
                  ? (o.innerText = e + ' hours ago')
                  : 1 === (e = Math.floor(e / 24))
                    ? (o.innerText = '1 day ago')
                    : e < 7
                      ? (o.innerText = e + ' days ago')
                      : e < 14
                        ? (o.innerText = '1 week ago')
                        : e < 30
                          ? (o.innerText = Math.floor(e / 7) + ' weeks ago')
                          : e < 365
                            ? 1 === Math.floor(e / 30)
                              ? (o.innerText = '1 month ago')
                              : (o.innerText = Math.floor(e / 30) + ' months ago')
                            : 1 === (e = Math.floor(e / 365))
                              ? (o.innerText = '1 year ago')
                              : (o.innerText = e + 'years ago'),
      setTimeout(function () {
        document.body.contains(o) && t();
      }, 2e4);
  };
  return t(), o;
}

//Create Element Function
function create(e, t, n) {
  if (!e) throw new SyntaxError("'tag' not defined");
  var r,
    i,
    f = document.createElement(e);
  if (t)
    for (r in t)
      if ('style' === r) for (i in t.style) f.style[i] = t.style[i];
      else t[r] && f.setAttribute(r, t[r]);
  return n && (f.innerHTML = n), f;
}
//Create Element Function 2
function create2(t, e, a, s, n) {
  let i = document.createElement(t);
  return (
    Array.isArray(e)
      ? (i.classList.add(...e), e.includes('newTab') && i.setAttribute('target', '_blank'))
      : e && ('#' === e[0] ? (i.id = e.substring(1)) : (i.classList.add(e), 'newTab' === e && i.setAttribute('target', '_blank'))),
    (a || 0 === a) && (i.innerText = a),
    s && s.appendChild && s.appendChild(i),
    n && (i.style.cssText = n),
    i
  );
}

//Set Element Function
function set(t, e, n) {
  if (!t) throw new SyntaxError("'tag' not defined");
  var r,
    i,
    f = t;
  if (e)
    for (r in e)
      if ('style' === r) for (i in e.style) f.style[i] = e.style[i];
      else e[r] && f.setAttribute(r, e[r]);
  return n && (f.innerHTML = n), f;
}

//CSS
var styles = `
.activitydata span.markdown_spoiler {
    display:block;
    margin:10px
}

.activitydata span.markdown_spoiler_cont {
    margin-top:10px
}

.activitydata span.markdown_spoiler_show {
    cursor: pointer;
    padding: 5px;
    padding-top: 3px;
    font-weight: 700;
    padding-bottom: 3px;
    background: rgb(var(--color-foreground));
    font-size:12px;
    color: rgb(var(--color-blue));
    -webkit-border-radius: 5px;
            border-radius: 5px
}

.activitydata .button.liked {
  color: rgb(var(--color-red));
}

.activitydata .activitylinksdiv {
  color: rgb(var(--color-blue-dim));
  position: relative;
  left: -webkit-calc(100% - 105px);
  left: calc(100% - 105px);
  display: -webkit-inline-box;
  display: -ms-inline-flexbox;
  display: -webkit-inline-flex;
  display: inline-flex;
  font-family: Overpass,-apple-system,BlinkMacSystemFont,Segoe UI,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;
  font-weight: 800;
}

.activitydata .actions {
    color: rgb(var(--color-blue-dim));
    position: relative;
    left: -webkit-calc(100% - 85px);
    left: calc(100% - 85px);
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    width: 95px;
    font-family: Overpass,-apple-system,BlinkMacSystemFont,Segoe UI,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;
    font-weight: 800;
    -webkit-box-pack: end;
    -webkit-justify-content: flex-end;
        -ms-flex-pack: end;
            justify-content: flex-end;
}

.activitydata .action {
  color: rgb(var(--color-blue-dim))!important;
  cursor: pointer;
  display: inline-block;
  padding-left: 5px;
  -webkit-transition: .2s;
  -o-transition: .2s;
  transition: .2s;
}

.activitydata .time {
  font: 800 1.1rem Overpass,-apple-system,BlinkMacSystemFont,Segoe UI,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;
  color: rgb(var(--color-text-lighter));
  position: relative;
  right: 12px;
  top: 12px;
}

.activitydata .acttime {
  font: 800 1.1rem Overpass,-apple-system,BlinkMacSystemFont,Segoe UI,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;
  color: rgb(var(--color-text-lighter));
  margin-top:3px
}

.activitydata .reply .actions {
  font-family: Overpass,-apple-system,BlinkMacSystemFont,Segoe UI,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;
  font-weight: 700;
  top: 12px;
  position: absolute;
  width:125px;
  left: -webkit-calc(100% - 135px);
  left: calc(100% - 135px);
  -webkit-box-align: center;
      -ms-flex-align: center;
          -webkit-align-items: center;
          align-items: center
}

.activitydata .reply .action {
  padding-left: 5px;
  -webkit-transition: .2s;
  -o-transition: .2s;
  transition: .2s;
}

.activitydata .reply  .action.likes {
  padding-right: 10px;
}

.activitydata .reply .time {
  color: rgb(var(--color-text-lighter));
  display: contents!important;
}

.activitydata .reply {
  background: rgb(var(--color-foreground));
  -webkit-border-radius: 3px;
          border-radius: 3px;
  font-size: 1.3rem;
  margin-top: 15px;
  padding: 14px;
  padding-bottom: 4px;
  position: relative;
}
.activitydata .reply-markdown {
  padding: 0px 2px
}
.activitydata .reply-wrap .name {
    padding: 8px 2px
}

.activitydata .name {
  margin-left: 5px;
  position: absolute;
  font-weight: bold;
}

.activitydata .reply {
  margin-bottom: 10px;
  background: rgba(var(--color-foreground));
  -webkit-border-radius: 10px;
          border-radius: 10px;
  padding-top: 10px;
  padding-bottom: 10px;
  padding-left: 10px;
}

.activitydata {
  min-width: 100%;
  padding: 20px 25px 10px;
  margin-bottom: 15px;
  -webkit-border-radius: 10px;
          border-radius: 10px;
  background: rgb(var(--color-background))
}
.activityinner {
  text-align: -webkit-center;
  margin-bottom:10px
}

.activitydata img {
  max-width: 100%;
  margin-bottom:5px
}

.activitydata blockquote {
  background: rgb(var(--color-foreground));
  border-left: solid 7px rgb(var(--color-text));
  -webkit-border-radius: 3px;
          border-radius: 3px;
  display: inline-block;
  font-style: italic;
  margin-left: 10px;
  padding: 10px 14px;
}

.activitydata iframe,
.activitydata video {
    -webkit-border-radius: 3px;
            border-radius: 3px;
    height: 200px;
    max-width: 500px;
    width: 100%;
    margin-bottom: 5px;
    display: block;
}

.activitydataimg {
 background-size: cover;
    background-repeat: no-repeat;
    display: inline-block;
    width: 45px;
    -webkit-border-radius: 5px;
    border-radius: 5px;
    margin-bottom: 10px;
    height: 45px
}

.activitydatausername {
    font-weight: 700;
    left: 50px;
    top: 7px;
    position: relative;
    width: 150px;
    display: block;
}

.reply-wrap .activitydataimg {
    width: 30px;
    height: 30px
}
.reply-wrap .reply .header {
   height:40px
}
.activitydata .saveembed {
    background: rgb(var(--color-foreground));
    font-size: 12px;
    color: rgb(var(--color-text));
    -webkit-border-radius: 3px;
            border-radius: 3px;
    display: -ms-inline-grid;
    display: inline-grid;
    grid-auto-flow: column;
    -ms-grid-columns: 50px;
    grid-template-columns: 50px;
    justify-items: center;
}
.activitydata .reply-markdown .markdown{
overflow:hidden!important
}
.activitydata .reply-markdown .saveembed,
.activitydata blockquote span.markdown_spoiler_show,
.activitydata blockquote .saveembed{
   background: rgb(var(--color-background))
}
#removereply:hover,
#editreply:hover,
.activitydata .action:hover,
.activitydata .activitylink:hover{
  color: rgb(var(--color-blue))!important;
}

.activitydata .saveembed b {
    display: -ms-grid;
    display: grid;
    word-break: break-word;
    margin: 3px;
    padding: 10px;
    justify-items: center;
    line-height:18px
}

.activitydata .saveembed .cover {
  background-repeat: no-repeat;
  background-position: 50%;
  background-size: cover;
  height: 100%;
  width: 100%;
  -webkit-border-top-left-radius: 3px;
          border-top-left-radius: 3px;
  -webkit-border-bottom-left-radius: 3px;
          border-bottom-left-radius: 3px;
}

.saveembedDetails {
  font-size: 1rem;
  display: -webkit-inline-box;
  display: -ms-inline-flexbox;
  display: -webkit-inline-flex;
  display: inline-flex;
  color: rgb(var(--color-text-light))!important;
  pointer-events: none;
}

.activitydata p {
  word-break: break-word;
}

.activitydata p:first-of-type {
  margin: 0;
}

.activitydata a,
.activitydata a.embedLink a.saveembed{
  color: rgb(var(--color-blue));
}
.activitydata a[href^="https://anilist.co/manga/"],
.activitydata a.embedLink[href^="https://anilist.co/manga/"] a.saveembed{
  color: rgb(var(--color-green));
}


.activitydatauserdiv {
  width: 100%;
  display: -webkit-inline-box;
  display: -ms-inline-flexbox;
  display: -webkit-inline-flex;
  display: inline-flex;
}

.activitylink {
  padding-left: 15px;
  height: 0;
  display: inline-block;
  position: relative;
  cursor: pointer;
  color: rgba(var(--color-text))!important;
}

.activitydata hr {
  border: solid 1px rgba(40,56,77,.5);
  -webkit-border-radius: 5px;
          border-radius: 5px;
  width: 100%;
}

.saveActivity {
  -webkit-box-align: center;
      -ms-flex-align: center;
          -webkit-align-items: center;
          align-items: center;
  display: -ms-grid;
  display: grid;
  grid-gap: 8px;
  -ms-grid-columns: 20px 8px 1fr;
  grid-template-columns: 20px 1fr;
  padding: 2px 12px;
  padding-right: 17px;
}

.mainbtn {
  list-style: none;
  cursor: pointer;
  color: rgb(var(--color-text));
}

.mainbtns {
  font: 900 1.3rem Overpass,-apple-system,BlinkMacSystemFont,"Segoe UI",Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",sans-serif;
  -webkit-transition: .25s;
  -o-transition: .25s;
  transition: .25s;
  border: 0;
  -webkit-border-radius: 4px;
          border-radius: 4px;
  padding: 4px;
  margin: 4px;
  text-align:center;
  cursor: pointer;
  background: rgb(var(--color-background));
  color: rgb(var(--color-text));
}

.btn-active {
  background: #28384d;
  color: #9fadbd;
}

.mainbtns:active {
  background: rgba(40,56,77);
}

.mainbtns:hover {
  color: rgb(var(--color-blue));
}

.maindiv {
  width: 100%;
  -webkit-transition: 1s;
  -o-transition: 1s;
  transition: 1s;
  position: relative;
  background: rgb(var(--color-foreground));
  overflow-y: scroll;
  display: -ms-grid;
  display: grid;
  color: rgb(var(--color-text));
  padding: 10px;
  padding-bottom: 0;
  margin-right: 10px;
  margin-bottom: 20px;
  border: 1px solid #6969694d;
  -webkit-border-radius: 10px;
          border-radius: 10px;
}

.expanded {
  margin-top: 10px;
}

.expanded2 {
  max-height: 87vh!important;
}

.ResultDivInside {
  overflow-y: scroll;
  -webkit-border-radius: 10px;
          border-radius: 10px;
  padding: 10px;
  padding-top: 20px;
  padding-bottom: 0;
  margin-top: 10px;
  margin-bottom: 10px;
}

.activitydataDiv {
  display: -ms-grid;
  display: grid;
  max-height: 330px;
  overflow-y: scroll;
  padding-top: 10px;
  margin-top: 3px;
}

.ResultDivInside,
.activitydataDiv {
  -webkit-mask-image: -webkit-gradient(linear,left top, left bottom,color-stop(0, transparent),color-stop(black),color-stop(black),to(transparent));
  -webkit-mask-image: linear-gradient(to bottom,transparent 0,black var(--top-mask-size),black -webkit-calc(100% - var(--bottom-mask-size)),transparent 100%);
          mask-image: -webkit-gradient(linear,left top, left bottom,color-stop(0, transparent),color-stop(black),color-stop(black),to(transparent));
          mask-image: linear-gradient(to bottom,transparent 0,black var(--top-mask-size),black calc(100% - var(--bottom-mask-size)),transparent 100%);
  --bottom-mask-size: 10px;
  --top-mask-size: 10px;
}
#settingDiv {
  top:5px;
  padding-bottom: 5px;
  padding-top: 5px;
  margin-bottom:5px
}
button#removereply,
button#expandbtn,
button#settingsbtn,
button#closedivbtn{
  position: absolute;
  right: 0;
  top:4px;
  background:transparent
}
button#settingsbtn {
  right:20px
}
button#expandbtn {
  right:40px
}
#importBtn{
-moz-text-align-last:center;
     text-align-last:center
}
.reply-wrap .replybutton {
align-items: center;
    background: rgb(var(--color-blue));
    border-radius: 4px;
    color: rgb(var(--color-text-bright));
    cursor: pointer;
    display: inline-flex;
    font-family: Overpass,-apple-system,BlinkMacSystemFont,Segoe UI,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;
    font-size: 1.3rem;
    font-weight: 900;
    margin-left: 18px;
    padding: 10px 15px;
    transition: .2s;
}
.reply-wrap .replybutton .cancel{
background: rgb(var(--color-foreground));
    color: rgb(var(--color-text-lighter));
}
.reply-wrap textarea{width: 96%;border-width: 1px;font-size: 1.3rem;padding: 8px 15px;resize: none;min-height: 36px;border-radius: 5px;}
#removereply,#editreply{visibility:hidden;transition:0.5s}
.reply-wrap .header:hover #removereply,
.reply-wrap .header:hover #editreply{
    visibility: visible!important;
}
`;

//Add CSS
var styleSheet = document.createElement('style');
styleSheet.innerText = styles;
document.head.appendChild(styleSheet);

//localStorage requirement
try {
  localStorage.setItem('test', 'test');
  localStorage.removeItem('test');
} catch (e) {
  alert('LocalStorage, required for saving settings, is not available.');
}

//get username
let auth;
let user = '';
let userid = 0;
try {
  auth = JSON.parse(localStorage.getItem('auth'));
} catch (e) {
  console.warn('could not get auth');
}
if (auth) (user = auth.name), (userid = auth.id);
else
  try {
    user = document.querySelector(".nav .links .link[href^='/user/']").href.match(/\/user\/(.*)\//)[1];
  } catch (e) {
    alert('Please login before to use -Activity Saver- script.');
  }

//Variables
let username = String(user);
let usernameurl = String('https://anilist.co/user/' + user + '/');
var val = 0;
var active = false;
var mainarray = [];
let onMainDiv = false;
var autosave = false;
var expanded = false;
var settings = false;
var oldHref = document.location.href;
interval = null;
var accessToken = '';

//Check LocalStorage for Token
check();
if (localStorage.getItem('savetkn')) {
  let lztkn = LZString.decompressFromBase64(localStorage.getItem('savetkn'));
  if (lztkn.length > 10) {
    accessToken = JSON.parse(LZString.decompressFromBase64(localStorage.getItem('savetkn')));
  } else {
    localStorage.removeItem('savetkn');
  }
}

//Create Saved Activities Button
var button = create(
  'li',
  {
    class: 'el-dropdown-menu__item mainbtn',
    id: 'Saved Activities',
  },
  'Saved Activities',
);
button.onclick = () => {
  getSavedDiv();
};

//Start
start();
function start() {
  if (!/^\/(home)\/?([\w-]+)?\/?$/.test(location.pathname)) {
    return;
  }
  let filters = document.querySelector('.el-dropdown-menu:not(.details *):not(.time *):not(.actions *)');
  if (!filters) {
    setTimeout(start, 100);
    return;
  }
  if (filters.children[0].innerText.trim() === 'All') {
    filters.appendChild(button);
  } else {
    setTimeout(start, 100);
    return;
  }
  let autosaved = JSON.parse(localStorage.getItem('actautosave'));
  if (autosaved && accessToken.length > 5) {
    autosave = true;
  } else {
    autosave = false;
  }
  addSavetoActivities();
}

//Remove Activity
function removeactivity(id) {
  if (mainarray.length == 1) {
    mainarray = [];
  }
  let activitiesidarray = window.localStorage.getItem('savedactivites');
  let x = activitiesidarray.split(/[.,!,?]/);
  for (var i in x) {
    if (x[i] == id) {
      x.splice(i, 1);
      break;
    }
  }
  mainarray = x;
  localStorage.setItem('savedactivites', [x]);
  if (autosave) {
    autosaveact();
    delay(1000).then(() => buildactivity());
  } else {
    buildactivity();
  }
}

//Build Saved Activities
function buildactivity() {
  let activitydataDiv = document.getElementById('activitydataDiv');
  let activitiesidarray = window.localStorage.getItem('savedactivites');
  var x = '';
  if (activitydataDiv) {
    activitydataDiv.innerHTML = '';
  }
  if (autosave) {
    const query = `query($userName: String) {User(name: $userName){about}}`;
    var variables = {
      userName: username,
    };
    var url = 'https://graphql.anilist.co',
      options = {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
          Accept: 'application/json',
        },
        body: JSON.stringify({
          query: query,
          variables: variables,
        }),
      };
    function handleResponse(e) {
      return e.json().then(function (n) {
        return e.ok ? n : Promise.reject(n);
      });
    }
    fetch(url, options).then(handleResponse).then(handleData);
    function handleData(data) {
      let actiddata = '';
      actiddata = data.data.User.about;
      let jsonMatch = actiddata.match(/\[\]\(actjson([A-Za-z0-9+\/=]+)\)/);
      if (jsonMatch) {
        let data2 = JSON.parse(LZString.decompressFromBase64(jsonMatch[1]));
        var values = Object.keys(data2).map(function (key) {
          return data2[key];
        });
        x = JSON.stringify(values)
          .replace(/\\*"|\[|\]/g, '')
          .split(/[.,!,?]/);
        buildacts();
        console.log(x);
        if (x.length > 1) {
          window.localStorage.setItem('savedactivites', x);
        }
      } else {
        autosaveact();
        return buildactivity();
      }
    }
  } else {
    if (activitiesidarray !== null) {
      x = activitiesidarray.split(/[.,!,?]/);
      buildacts();
    }
  }
  function buildacts() {
    for (var i = 0; i < x.length; i++) {
      if (x.length > 0) {
        getlist(x[i]);
      }
    }
  }
}

//AutoSave Function
function autosaveact() {
  if (autosave && accessToken.length > 5) {
    let activitiesidarray = JSON.stringify(window.localStorage.getItem('savedactivites'));
    let profileJson = {
      activitiesidarray,
    };
    let auth = '';
    const query = `
	query($userName: String) {User(name: $userName){about}}`;
    var variables = {
      userName: username,
    };
    var url = 'https://graphql.anilist.co',
      options = {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
          Accept: 'application/json',
        },
        body: JSON.stringify({
          query: query,
          variables: variables,
        }),
      };
    function handleResponse(e) {
      return e.json().then(function (n) {
        return e.ok ? n : Promise.reject(n);
      });
    }
    fetch(url, options).then(handleResponse).then(handleData);
    function handleData(data) {
      auth = data.data.User.about;
      let jsonMatch = (auth || '').match(/\[\]\(actjson([A-Za-z0-9+\/=]+)\)/g);
      let customcssmatch = (auth || '').match(/\[\]\(json([A-Za-z0-9+\/=]+)\)/);
      let customcssmatched;
      if (customcssmatch) {
        customcssmatched = customcssmatch[0];
      } else {
        customcssmatched = '';
      }
      let newDescription = '';
      if (jsonMatch) {
        newDescription =
          customcssmatched +
          '[](actjson' +
          LZString.compressToBase64(JSON.stringify(profileJson)) +
          ')' +
          (auth || '').replace(/\[\]\(actjson([A-Za-z0-9+\/=]+)\)/, '').replace(/\[\]\(json([A-Za-z0-9+\/=]+)\)/, '');
      } else {
        newDescription =
          customcssmatched + '[](actjson' + LZString.compressToBase64(JSON.stringify(profileJson)) + ')' + (auth || '').replace(/\[\]\(json([A-Za-z0-9+\/=]+)\)/, '');
      }
      authAPIcall(
        `mutation($about: String){UpdateUser(about: $about){about}}`,
        {
          about: newDescription,
        },
        function (data) {
          if (!data) {
            return;
          }
        },
      );
    }
  }
}

//Create Main Div
function creatediv() {
  button.setAttribute('class', 'el-dropdown-menu__item active');
  var listDiv2 = create(
    'div',
    {
      class: 'maindiv',
      id: 'listDiv2',
    },
    '<b>' + button.innerText + '</b>',
  );
  let expandbtn = create('button', {
    class: 'mainbtns',
    id: 'expandbtn',
  });
  let settingsbtn = create('button', {
    class: 'mainbtns',
    id: 'settingsbtn',
  });
  let closebtn = create('button', {
    class: 'mainbtns',
    id: 'closedivbtn',
  });
  expandbtn.insertBefore(svg.expand.cloneNode(true), expandbtn.children[0]);
  settingsbtn.insertBefore(svg.gear.cloneNode(true), settingsbtn.children[0]);
  closebtn.insertBefore(svg.xmark.cloneNode(true), closebtn.children[0]);
  expandbtn.onclick = () => {
    expandDiv();
  };
  settingsbtn.onclick = () => {
    settingsDiv();
  };
  closebtn.onclick = () => {
    closeDiv();
  };
  var list = document.querySelector('.activity-feed-wrap + div');
  listDiv2.append(expandbtn, settingsbtn, closebtn);
  list.insertBefore(listDiv2, list.children[0]);
  var activitydataDiv = create('div', {
    class: 'activitydataDiv',
    id: 'activitydataDiv',
  });
  listDiv2.appendChild(activitydataDiv);
  if (!accessToken) {
    let loginLink = create(
      'a',
      {
        class: 'mainbtns',
        id: 'signIn',
        href: 'https://anilist.co/api/v2/oauth/authorize?client_id=12455&response_type=token',
      },
      '<b>Sign In</b>',
    );
    listDiv2.insertBefore(loginLink, listDiv2.children[1]);
  }
}

//Export Activities
function saveAs(data, fileName, pureText) {
  let link = create2('a');
  document.body.appendChild(link);
  let json = pureText ? data : JSON.stringify(data);
  let blob = new Blob([json], {
    type: 'octet/stream',
  });
  let url = window.URL.createObjectURL(blob);
  link.href = url;
  link.download = fileName;
  link.click();
  window.URL.revokeObjectURL(url);
  document.body.removeChild(link);
}

//Settings Div
function settingsDiv() {
  settings = !settings;
  if (settings) {
    let settingDiv = create(
      'div',
      {
        class: 'maindiv',
        id: 'settingDiv',
      },
      '<b>Settings</b>',
    );
    let importBtn = create('input', {
      class: 'mainbtns',
      id: 'importBtn',
      type: 'button',
      value: 'Import Saved Activites',
    });
    let exportBtn = create(
      'a',
      {
        class: 'mainbtns',
        id: 'exportBtn',
      },
      '<b>Export Saved Activites</b>',
    );
    exportBtn.onclick = function () {
      let activitiesidarray = window.localStorage.getItem('savedactivites');
      let export_activities = '[](actjson' + LZString.compressToBase64(JSON.stringify(activitiesidarray)) + ')';
      if (username && activitiesidarray !== null && activitiesidarray !== '') {
        saveAs(export_activities, 'ActivitySaver' + '_activities_' + username + '.json');
      } else {
        exportBtn.innerText = 'Error: The list is empty.';
        delay(3000).then(() => (exportBtn.innerText = 'Export Saved Activites'));
      }
    };
    importBtn.onclick = function () {
      importBtn.setAttribute('type', 'file');
      importBtn.setAttribute('name', 'json');
      importBtn.setAttribute('accept', 'application/json');
      importBtn.oninput = function () {
        let reader = new FileReader();
        reader.readAsText(importBtn.files[0], 'UTF-8');
        reader.onload = function (evt) {
          let data = '';
          try {
            data = JSON.parse(evt.target.result);
            let datamatch = data.match(/\[\]\(actjson([A-Za-z0-9+\/=]+)\)/);
            if (datamatch && data !== '[](actjsonETI=)') {
              let data2 = data.replace(/\[\]\(actjson([A-Za-z0-9+\/=]+)\)/, '$1');
              let data3 = JSON.parse(LZString.decompressFromBase64(data2));
              let data4 = JSON.stringify(data3)
                .replace(/\\*"|\[|\]/g, '')
                .split(/[.,!,?]/);
              window.localStorage.setItem('savedactivites', data4);
            } else {
              importBtn.setAttribute('type', 'button');
              importBtn.removeAttribute('accept');
              importBtn.removeAttribute('name');
              importBtn.value = 'Error: not valid backup file.';
              delay(3000).then(() => (importBtn.value = 'Import Saved Activites'));
              return;
            }
            if (autosave) {
              autosaveact();
              if (activitydataDiv) {
                delay(1000).then(() => buildactivity());
              }
            }
            importBtn.setAttribute('type', 'button');
            importBtn.removeAttribute('accept');
            importBtn.removeAttribute('name');
            buildactivity();
            importBtn.value = 'Activites Imported!';
            delay(3000).then(() => (importBtn.value = 'Import Saved Activites'));
          } catch (e) {
            importBtn.setAttribute('type', 'button');
            importBtn.removeAttribute('accept');
            importBtn.removeAttribute('name');
            importBtn.value = 'Error: not valid backup file.';
            delay(3000).then(() => (importBtn.value = 'Import Saved Activites'));
            return;
          }
        };
      };
    };
    let SavetoBtn = create(
      'a',
      {
        class: 'mainbtns',
        id: 'SavetoBtn',
      },
      '<b>Auto Backup Activities to Profile</b>',
    );
    SavetoBtn.classList.toggle('btn-active', JSON.parse(localStorage.getItem('actautosave')));
    if (accessToken.length < 5) {
      localStorage.setItem('actautosave', autosave);
      SavetoBtn.classList.toggle('btn-active', JSON.parse(localStorage.getItem('actautosave')));
    }
    SavetoBtn.onclick = function () {
      if (accessToken.length > 5) {
        autosaveact();
        autosave = !autosave;
        localStorage.setItem('actautosave', autosave);
        SavetoBtn.classList.toggle('btn-active', JSON.parse(localStorage.getItem('actautosave')));
      } else {
        SavetoBtn.innerText = 'Error: Token not found. Please Sign in.';
        delay(3000).then(() => (SavetoBtn.innerText = 'Auto Backup Activities to Profile'));
      }
    };
    listDiv2.insertBefore(settingDiv, listDiv2.children[1]);
    settingDiv.append(importBtn, exportBtn, SavetoBtn);
  } else {
    if (document.getElementById('settingDiv')) {
      document.getElementById('settingDiv').remove();
    }
  }
}

//Expand Button Function
function expandDiv() {
  expanded = !expanded;
  if (expanded) {
    let x = document.querySelector('.container');
    x.insertBefore(listDiv2, x.children[0]);
    expandbtn.innerHTML = '';
    expandbtn.insertBefore(svg.compress.cloneNode(true), expandbtn.children[0]);
    listDiv2.setAttribute('class', 'maindiv expanded');
    activitydataDiv.setAttribute('class', 'activitydataDiv expanded2');
  } else {
    let x = document.querySelector('.activity-feed-wrap + div');
    x.insertBefore(listDiv2, x.children[0]);
    expandbtn.innerHTML = '';
    expandbtn.insertBefore(svg.expand.cloneNode(true), expandbtn.children[0]);
    listDiv2.className = listDiv2.className.replace(/(?:^|\s)expanded(?!\S)/g, '');
    activitydataDiv.className = activitydataDiv.className.replace(/(?:^|\s)expanded2(?!\S)/g, '');
  }
}

//Get Saved Divs
function getSavedDiv() {
  active = !active;
  let activefilter = document.querySelector('li.el-dropdown-menu__item.active');
  if (activefilter) {
    delay(1000).then(() => (activefilter.className = activefilter.className.replace(/(?:^|\s)active(?!\S)/g, '')));
  }
  if (active) {
    creatediv();
    buildactivity();
  }
  if (!active) {
    closeDiv();
  }
}

//Close Button Function
function closeDiv() {
  var list = document.querySelectorAll('li:nth-child(1)');
  button.setAttribute('class', 'el-dropdown-menu__item');
  listDiv2.remove();
  active = false;
}

//Save Activity Button Function
function addSavetoActivities() {
  var ActivitySave = false;
  if (!/^\/(home|user|activity)\/?([\w-]+)?\/?$/.test(location.pathname)) {
    return;
  }
  setTimeout(addSavetoActivities, 500);
  let activityCollection = document.querySelectorAll('.activity-extras-dropdown');
  activityCollection.forEach(function (activity) {
    if (!hasOwn(activity, 'ActivitySave')) {
      activity.ActivitySave = true;
      let activitySave = create(
        'a',
        {
          dataIcon: 'link',
          class: 'saveActivity el-dropdown-menu__item',
          id: 'saveActivity',
        },
        '<b>Save Activity</b>',
      );
      activitySave.onclick = function () {
        let el = activitySave;
        let id = el.parentElement.children[0].href.split('/')[4];
        el.click();
        el.click();
        el.onclick = () => {
          el.lastElementChild.innerText = 'Saved!';
          let activitiesidarray = window.localStorage.getItem('savedactivites');
          if (activitiesidarray !== null) {
            let x = activitiesidarray.split(/[.,!,?]/);
            for (var i in x) {
              if (x[i] == id) {
                x.splice(i, 1);
                break;
              }
            }
            mainarray = x;
          }
          var id = el.parentElement.children[0].href.split('/')[4];
          for (var i = 0; i <= mainarray.length; i++) {
            if (id == mainarray[i]) {
              el.lastElementChild.innerText = 'Already Saved!';
              return;
            }
          }
          mainarray.push(id);
          localStorage.setItem('savedactivites', [mainarray]);
          let activitydataDiv = document.getElementById('activitydataDiv');
          if (autosave) {
            autosaveact();
            if (activitydataDiv) {
              delay(1000).then(() => buildactivity());
            }
          } else {
            if (activitydataDiv) {
              buildactivity();
            }
          }
        };
      };
      if (activity.closest('.activity-text') || activity.closest('.activity-message')) {
        activity.append(activitySave);
        activitySave.insertBefore(svg.pinned.cloneNode(true), activitySave.children[0]);
      }
    }
  });
}

//MakeHTML saved Activity
let actfixtext = '';
function htmlfix(text) {
  let acttextfix = text
    .replace(/((?:(?:https?:)?(?:\/\/)?)(?:(?:www)?\.)?youtube\.(?:.+?)\/(?:(?:watch\?v=))[a-zA-Z0-9_-]{11}).*(&list.*(\n)|).*(\))/i, '$1$4')
    .replace(/youtube\(+((?!https:).*).*\)/gim, ' youtube(https://www.youtube.com/watch?v=$1)')
    .replace(/(~~~)/g, ' ' + '$1' + ' ')
    .replace(/(__)([A-Za-z0-9\ ,.-<>\]*[A-Za-z0-9\ ,.-].*?(\s*))(__)/g, '<strong>' + '$2' + '</strong>')
    .replace(/((?<!\[)\[)(.*?)(]).*?((?<!\()\()(.*?)(\))/gm, '<a href=' + '$5' + '>' + '$2' + '</a>')
    .replace(/``([\s\S]*?)/g, '<code></code>')
    .replace(/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/gm, '<hr>')
    .replace(/(img.*)[\s\S]\/*?(.*())/g, (imgfix) => {
      let imgfixed = imgfix.replace(/(\r\n|\n|\r)/g, '');
      return imgfixed;
    })
    .replace(/youtube.(h).((.*?).*\))/gi, ' ![](ht$2')
    .replace(/(?<!\(|"|=)\b(https:\/\/)(anilist\.co\/(anime|manga)\/)([0-9]+).([^\W]+.*?\/|[^\s]+)/gm, (embedlink) => {
      let embedlinked = embedlink.match(/(?<!\(|"|=)\b(https:\/\/)(anilist\.co\/(anime|manga)\/)([0-9]+).([^\W]+.*?\/|[^\s]+)/gm);
      return "<a class='embedLink' href=\"" + embedlinked + '">' + '</a>' + '</br>';
    });
  function spoiler() {
    var actspoiled = false;
    let actspoiler = document.querySelectorAll('.activitydata span.markdown_spoiler');
    actspoiler.forEach(function (spoilers) {
      if (!hasOwn(spoilers, 'actspoiled')) {
        spoilers.actspoiled = true;
        let contspoiler = create('span', {
          class: 'markdown_spoiler_cont',
        });
        let showspoiler = create('span', {
          class: 'markdown_spoiler_show',
        });
        showspoiler.innerHTML = 'Spoiler, click to view';
        contspoiler.innerHTML = spoilers.innerHTML;
        contspoiler.style.display = 'none';
        spoilers.innerHTML = '';
        spoilers.insertBefore(showspoiler, spoilers.children[0]);
        spoilers.append(contspoiler);
        showspoiler.onclick = function () {
          if (contspoiler.style.display === 'none') {
            showspoiler.innerHTML = 'Hide';
            contspoiler.style.display = 'block';
          } else {
            showspoiler.innerHTML = 'Spoiler, click to view';
            contspoiler.style.display = 'none';
          }
        };
      }
    });
  }
  function embed() {
    var Activityembedded = false;
    let embeds = document.querySelectorAll('.embedLink');
    embeds.forEach(function (activity) {
      if (!hasOwn(activity, 'Activityembedded')) {
        activity.Activityembedded = true;
        var id = activity.href.split('/')[4];
        if (id !== undefined) {
          getanime(id);
          function getanime(embedid) {
            var query = `query ($id: Int, $page: Int) {Page (page: $page) {media (id: $id) {type format status startDate {year} endDate {year}	season seasonYear averageScore id siteUrl title { romaji } coverImage { large  }}}}`;
            var variables = {
              id: embedid,
              page: 1,
            };
            var url = 'https://graphql.anilist.co',
              options = {
                method: 'POST',
                headers: {
                  'Content-Type': 'application/json',
                  Accept: 'application/json',
                },
                body: JSON.stringify({
                  query: query,
                  variables: variables,
                }),
              };
            function handleResponse(e) {
              return e.json().then(function (n) {
                return e.ok ? n : Promise.reject(n);
              });
            }
            fetch(url, options).then(handleResponse).then(handleData).catch(handleError);
            function handleData(data) {
              let activitySave = create(
                'a',
                {
                  class: 'saveembed',
                },
                '<b>' + data.data.Page.media[0].title.romaji + '</b>',
              );
              let embedimg = create('a', {
                class: 'cover',
                style: {
                  backgroundImage: 'url(' + data.data.Page.media[0].coverImage.large + ')',
                },
              });
              activity.append(activitySave);
              activity.href = data.data.Page.media[0].siteUrl;
              activitySave.insertBefore(embedimg, activitySave.children[0]);
              if (data.data.Page.media[0].averageScore !== null) {
                var avg = ' · ' + data.data.Page.media[0].averageScore + '%';
              } else {
                avg = '';
              }
              if (data.data.Page.media[0].season !== null) {
                var season = ' · ' + data.data.Page.media[0].season + ' ' + data.data.Page.media[0].seasonYear;
              } else {
                season = '';
              }
              let activitySaveDetails = create('a', {
                class: 'saveembedDetails',
              });
              if (data.data.Page.media[0].type === 'MANGA') {
                activitySaveDetails.innerHTML =
                  '<b>' + data.data.Page.media[0].format + ' · ' + data.data.Page.media[0].status + ' · ' + data.data.Page.media[0].startDate.year + avg;
              } else if (data.data.Page.media[0].format === 'MUSIC') {
                activitySaveDetails.innerHTML = '<b>' + data.data.Page.media[0].format + ' · ' + data.data.Page.media[0].endDate.year + avg + '</b>';
              } else {
                activitySaveDetails.innerHTML = '<b>' + data.data.Page.media[0].format + season + ' · ' + data.data.Page.media[0].status + avg + '</b>';
              }
              embedimg.nextSibling.append(activitySaveDetails);
              let fix = activitySaveDetails.text.replace(/(_)/g, ' ');
              activitySaveDetails.text = fix;
            }
            function handleError(error) {
              console.error(error);
            }
          }
        }
      }
    });
  }
  DOMPurify.sanitize(acttextfix);
  let fix = acttextfix
    .replace(/(<strong>.*<\/strong>)((\n|)img\d.*\))/gm, '$1' + '<br>' + '$2' + '<br>')
    .replace(/((img.*\d.*\)).*(img\d))/g, '$2' + '<br>' + '$3')
    .replace(/(<br>*[\W]<br>){1,}/g, '')
    .replace(/((https:.*)(<b>).*(<\/b>))/g, '$2')
    .replace(/(<br>)/g, '$1 \n')
    .replace(/((<\/a>)<br> \n (\W))/gm, '$2 $3')
    .replace(/(?<!<\/br>)(\n).*(<a class='embedLink' href=".*">)/gm, '<br>' + '$2')
    .replace(/<br>.*(\n).*(<a href=.*>)/gm, '$2');
  actfixtext = makeHtml(fix)
    .replace(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/gm, '<blockquote>' + '$2' + '</blockquote>')
    .replace(/(?<![a-z&])#/g, '')
    .replace(/(<img.*)(<a)/g, '$1<br>$2')
    .replace(/\&lt;/g, '<')
    .replace(/\&gt;/g, '>')
    .replace(/(.*<img\b[^>]*>).*(\s*<a\b[^>]*>[^<]*<\/a>)/g, '$1' + '<br>' + '$2');
  delay(10).then(() => spoiler());
  delay(10).then(() => embed());
}

//Get Activity from API
function getlist(id) {
  if (id === '') {
    return;
  }
  var query = `query($id: Int){Activity(id: $id){
    ... on TextActivity{id type siteUrl createdAt text user{name avatar{medium}}likes{name}replies{id createdAt text user{name avatar{medium}}likes{name}}}
		... on MessageActivity{id type siteUrl createdAt text: message user: messenger{name avatar{medium}}recipient{name}likes{name}replies{id createdAt text user{name avatar{medium}}likes{name}}}}}`;
  var variables = {
      id: id,
    },
    url = 'https://graphql.anilist.co',
    options = {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        Accept: 'application/json',
      },
      body: JSON.stringify({
        query: query,
        variables: variables,
      }),
    };
  fetch(url, options).then(handleResponse).then(handleData).catch(handleError);
  let APIlimit = 90,
    APIcallsUsed = 0,
    APIcallsUsed_shortTerm = 0,
    pending = {},
    APIcounter = setInterval(function () {
      APIcallsUsed = 0;
    }, 6e4),
    APIcounter2 = setInterval(function () {
      APIcallsUsed_shortTerm = 0;
    }, 1e4);
  function handleResponse(e) {
    (APIlimit = e.headers.get('x-ratelimit-limit')), (APIcallsUsed = APIlimit - e.headers.get('x-ratelimit-remaining'));
    try {
      return e.json().then(function (t) {
        return e.ok ? t : Promise.reject(t);
      });
    } catch (t) {
      throw (console.warn(t, e), t);
    }
  }
  function handleData(data) {
    let activity = data.data.Activity;
    let id = activity.id;
    let acttext = activity.text;
    if (active) {
      let activityinner = create('div', {
        class: 'activityinner',
      });
      let aimg = create('a', {
        class: 'activitydataimg',
        id: 'activitydataimg',
        href: 'https://anilist.co/user/' + activity.user.name,
        style: {
          backgroundImage: 'url(' + activity.user.avatar.medium + ')',
        },
      });
      let actusername = create(
        'a',
        {
          class: 'activitydatausername',
          id: 'activitydatausername',
          href: 'https://anilist.co/user/' + activity.user.name,
        },
        '' + activity.user.name,
      );
      let activitydiv = create('div', {
        class: 'activitydata',
        id: activity.id,
      });
      let actlinks = create('a', {
        class: 'activitylinksdiv',
      });
      let actlink = create('a', {
        class: 'activitylink',
        id: activity.id,
        href: activity.siteUrl,
      });
      let actremove = create('a', {
        class: 'activitylink',
        id: activity.id,
      });
      actremove.onclick = () => {
        removeactivity(id);
      };
      let userdiv = create('div', {
        class: 'activitydatauserdiv',
        id: activity.id,
      });
      if (acttext === undefined) {
        removeactivity(id);
        return;
      }
      if (acttext !== undefined) {
        htmlfix(acttext);
        activityinner.innerHTML = actfixtext;
      }
      activitydataDiv.appendChild(activitydiv);
      activitydiv.appendChild(activityinner);
      activitydiv.appendChild(userdiv);
      aimg.appendChild(actusername);
      activitydiv.appendChild(actlinks);
      actlinks.append(actlink, actremove);
      actlink.insertBefore(svg.link.cloneNode(true), actlink.children[0]);
      actremove.insertBefore(svg.cross.cloneNode(true), actremove.children[0]);
      activitydiv.insertBefore(userdiv, activitydiv.children[0]);
      userdiv.append(aimg, actlinks);
      let timeWrapper = create2('div', 'acttime', false, actusername);
      let time = nativeTimeElement(activity.createdAt);
      timeWrapper.appendChild(time);
      let actions = create2('div', 'actions', false, activitydiv);
      let actionReplies = create2('a', ['action', 'replies'], false, actions);
      let replyCount = create2('span', ['count'], activity.replies.length || '', actionReplies);
      replyCount.appendChild(document.createTextNode(' '));
      actionReplies.appendChild(svg.reply.cloneNode(true));
      actions.appendChild(document.createTextNode(' '));
      let actionLikes = create2('div', ['action', 'likes'], false, actions);
      actionLikes.title = activity.likes.map((like) => like.name).join('\n');
      let likeWrap = create2('div', ['like-wrap', 'activity'], false, actionLikes);
      let likeButton = create2('div', 'button', false, likeWrap);
      let likeCount = create2('span', 'count', activity.likes.length || '', likeButton);
      likeButton.appendChild(document.createTextNode(' '));
      likeButton.appendChild(svg.likeNative.cloneNode(true));
      if (activity.likes.findIndex((thing) => thing.name === username) !== -1) {
        likeButton.classList.add('liked');
      }
      if (accessToken) {
        likeButton.onclick = function () {
          let indexPlace = activity.likes.findIndex((thing) => thing.name === username);
          if (indexPlace === -1) {
            activity.likes.push({
              name: username,
            });
            likeButton.classList.add('liked');
          } else {
            activity.likes.splice(indexPlace, 1);
            likeButton.classList.remove('liked');
          }
          likeCount.innerText = activity.likes.length || '';
          authAPIcall(
            'mutation($id:Int){ToggleLike(id:$id,type:ACTIVITY){id}}',
            {
              id: activity.id,
            },
            function (data) {
              if (!data) {
                authAPIcall(
                  'mutation($id:Int){ToggleLike(id:$id,type:ACTIVITY){id}}',
                  {
                    id: activity.id,
                  },
                  (data) => {},
                );
              }
            },
          );
        };
      }
      let replyWrap = create2('div', 'reply-wrap', false, activitydiv, 'display:none;');
      actionReplies.onclick = function () {
        if (replyWrap.style.display === 'none') {
          replyWrap.style.display = 'block';
        } else {
          replyWrap.style.display = 'none';
        }
      };
      let activityReplies = create2('div', 'activity-replies', false, replyWrap);
      activity.replies.forEach((rep) => {
        let reply = create2('div', 'reply', false, activityReplies);
        let header = create2('div', 'header', false, reply);
        let replyAvatar = create2('a', 'activitydataimg', false, header);
        replyAvatar.href = '/user/' + rep.user.name;
        replyAvatar.style.backgroundImage = `url("${rep.user.avatar.medium}")`;
        header.appendChild(document.createTextNode(' '));
        let repName = create2('a', 'name', rep.user.name, header);
        repName.href = '/user/' + rep.user.name;
        let corner = create2('div', 'actions', false, header);
        let replyActionLikes = create2('div', ['action', 'likes'], false, corner, 'display: inline-block');
        const randomDataHate = 'data-v-977827fa';
        let replyLikeWrap = create2('div', 'like-wrap', false, replyActionLikes);
        let replyLikeButton = create2('div', 'button', false, replyLikeWrap);
        let replyLikeCount = create2('span', 'count', rep.likes.length || '', replyLikeButton);
        replyLikeButton.appendChild(document.createTextNode(' '));
        replyLikeButton.appendChild(svg.likeNative.cloneNode(true));
        replyLikeButton.title = rep.likes.map((a) => a.name).join('\n');
        if (rep.likes.some((like) => like.name === username)) {
          replyLikeButton.classList.add('liked');
        }
        if (accessToken) {
          replyLikeButton.onclick = function () {
            authAPIcall(
              'mutation($id:Int){ToggleLike(id:$id,type:ACTIVITY_REPLY){id}}',
              {
                id: rep.id,
              },
              function (data2) {
                if (!data2) {
                  authAPIcall(
                    'mutation($id:Int){ToggleLike(id:$id,type:ACTIVITY_REPLY){id}}',
                    {
                      id: rep.id,
                    },
                    function (data3) {},
                  );
                }
              },
            );
            if (rep.likes.some((like) => like.name === username)) {
              rep.likes.splice(
                rep.likes.findIndex((user) => user.name === username),
                1,
              );
              replyLikeButton.classList.remove('liked');
              if (rep.likes.length > 0) {
                replyLikeButton.querySelector('.count').innerText = rep.likes.length;
              } else {
                replyLikeButton.querySelector('.count').innerText = '';
              }
            } else {
              rep.likes.push({
                name: username,
              });
              replyLikeButton.classList.add('liked');
              replyLikeButton.querySelector('.count').innerText = rep.likes.length;
            }
          };
          if (rep.user.name === username) {
            corner.style.cssText = 'width: 165px;left: calc(100% - 175px);top: 6px';
            let replyEdit = create('div', {
              class: 'mainbtns',
              id: 'editreply',
              style: {
                background: 'transparent',
                color: 'rgb(var(--color-blue-dim))',
              },
            });
            replyEdit.insertBefore(svg.edit.cloneNode(true), replyEdit.children[0]);
            corner.insertBefore(replyEdit, corner.children[0]);
            let active = true;
            replyEdit.onclick = function () {
              if (active) {
                let statusInput = create2('div', 'inputbox', false, 'text-align: -webkit-center;');
                let inputArea = create2('textarea', 'el-textarea__inner', false, statusInput);
                let inputButtons = create2('div', 'inputButtons', false, statusInput, 'margin-bottom:10px;float: right;padding: 20px 2% 15px 15px;');
                let cancelButton = create2(
                  'div',
                  ['replybutton', 'cancel'],
                  'Cancel',
                  inputButtons,
                  'background: rgb(var(--color-foreground));display:none;color: rgb(159, 173, 189);',
                );
                let publishButton = create2('div', 'replybutton', 'Publish', inputButtons, 'display:none;');
                inputArea.value = rep.text;
                reply.parentNode.insertBefore(statusInput, reply.nextSibling);
                inputArea.style.cssText = 'height:0px';
                statusInput.style.cssText = 'display: flow-root';
                inputArea.onfocus = function () {
                  cancelButton.style.display = 'inline';
                  publishButton.style.display = 'inline';
                };
                inputArea.addEventListener('keydown', autosize);
                function autosize() {
                  var el = this;
                  setTimeout(function () {
                    el.style.cssText = 'height:auto';
                    el.style.cssText = 'height:' + el.scrollHeight + 'px';
                  }, 0);
                }
                cancelButton.onclick = function () {
                  inputArea.value = '';
                  inputArea.style.cssText = 'height:0px';
                  cancelButton.style.display = 'none';
                  publishButton.style.display = 'none';
                  active = true;
                  statusInput.remove();
                };
                publishButton.onclick = function () {
                  authAPIcall(
                    `mutation($text: String,$Id: Int){id text(asHtml: true)}}`,
                    {
                      text: inputArea.value,
                      Id: rep.id,
                    },
                    (data) => {
                      if (data) {
                        delay(1000).then(() => buildactivity());
                      }
                    },
                  );
                };
                cancelButton.style.display = 'none';
                publishButton.style.display = 'none';
              }
              active = false;
            };
            let replyRemove = create('div', {
              class: 'mainbtns',
              id: 'removereply',
              style: {
                background: 'transparent',
                transform: 'translateX(2px)',
                color: 'rgb(var(--color-blue-dim))',
              },
            });
            replyRemove.insertBefore(svg.xmark.cloneNode(true), replyRemove.children[0]);
            corner.insertBefore(replyRemove, corner.children[0]);
            replyRemove.onclick = function () {
              authAPIcall(
                `mutation($Id: Int){DeleteActivityReply(id: $Id) {deleted}}`,
                {
                  Id: rep.id,
                },
                (data) => {
                  if (data) {
                    delay(1000).then(() => buildactivity());
                  }
                },
              );
            };
          }
        }
        let replyActionTime = create2('div', ['action', 'time'], false, corner, 'display: inline-block');
        let replyTime = nativeTimeElement(rep.createdAt);
        replyActionTime.appendChild(replyTime);
        let replyMarkdown = create2('div', 'reply-markdown', false, reply);
        let markdown = create2('div', 'markdown', false, replyMarkdown);
        let repText = rep.text;
        if (repText !== undefined) {
          htmlfix(repText);
          markdown.innerHTML = actfixtext;
        }
      });
      if (accessToken) {
        let statusInput = create2('div', false, false, replyWrap, 'padding-top:10px; text-align: -webkit-center;');
        let inputArea = create2('textarea', 'el-textarea__inner', false, statusInput);
        let inputButtons = create2('div', 'inputButtons', false, statusInput, 'float: right;padding: 20px 2% 15px 15px;');
        let cancelButton = create2('div', ['replybutton', 'cancel'], 'Cancel', inputButtons, 'background: rgb(var(--color-foreground));display:none;color: rgb(159, 173, 189);');
        let publishButton = create2('div', 'replybutton', 'Publish', inputButtons, 'display:none;');
        inputArea.placeholder = 'Write a reply..';
        inputArea.style.cssText = 'height:0px';
        inputArea.onfocus = function () {
          cancelButton.style.display = 'inline';
          publishButton.style.display = 'inline';
        };
        inputArea.addEventListener('keydown', autosize);
        function autosize() {
          var el = this;
          setTimeout(function () {
            if (inputArea.scrollHeight > 54) {
              el.style.cssText = 'height:auto';
              el.style.cssText = 'height:' + el.scrollHeight + 'px';
            }
            if (inputArea.value.length < 20) {
              el.style.cssText = 'height:0';
            }
          }, 0);
        }
        cancelButton.onclick = function () {
          inputArea.value = '';
          inputArea.style.cssText = 'height:0px';
          cancelButton.style.display = 'none';
          publishButton.style.display = 'none';
        };
        publishButton.onclick = function () {
          authAPIcall(
            `mutation($text: String,$activityId: Int){
									SaveActivityReply(text: $text,activityId: $activityId){
										id
										user{name}
										likes{name}
										text(asHtml: true)
										createdAt
									}
								}`,
            {
              text: inputArea.value,
              activityId: activity.id,
            },
            (data) => {
              if (data) {
                delay(1000).then(() => buildactivity());
              }
            },
          );
        };
        inputArea.value = '';
        cancelButton.style.display = 'none';
        publishButton.style.display = 'none';
      }
    }
  }
  function handleError(e) {
    console.log(e);
    if (e.errors) {
      if (e.errors.some((thing) => thing.message === 'Not Found.')) {
        removeactivity(id);
      }
    }
  }
}

//Check Token
function check() {
  let current = '';
  let mainLoop = setInterval(() => {
    if (document.URL !== current) {
      let oldURL = current + '';
      current = document.URL;
      if (/^https:\/\/anilist\.co\/home#access_token/.test(current)) {
        let tokenList = location.hash.split('&').map((a) => a.split('='));
        accessToken = tokenList[0][1];
        localStorage.setItem('savetkn', LZString.compressToBase64(JSON.stringify(accessToken)));
        location.replace(location.protocol + '//' + location.hostname + location.pathname);
      }
    }
  }, 200);
}

//Add Save Button to Activities
var target = document.querySelector('body');
var observer = new MutationObserver(function (mutationsList, observer) {
  for (var mutation of mutationsList) {
    if (/^\/(home)\/?([\w-]+)?\/?$/.test(location.pathname) && mutation.addedNodes[0] !== undefined && mutation.addedNodes[0].className === 'activity-entry activity-text') {
      addSavetoActivities();
    }
    if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
      if (oldHref != document.location.href) {
        oldHref = document.location.href;
        active = false;
        start();
        set(button, {
          class: 'el-dropdown-menu__item',
        });
      }
    }
  }
});
observer.observe(target, {
  childList: true,
  subtree: true,
});