untitled paste

unlisted ⁨2⁩ ⁨files⁩ 2024-08-18 15:16:20 UTC

content.js

Raw
"use strict";

  function $$(selector){
    return document.querySelectorAll(selector);
  }

  function observe$$(selector, f){
    const observer = new MutationObserver(() => $$(selector).forEach(f));

    // Почему-то document.body вместо document вызывает ошибку на http://aeroexpress.wi-fi.ru/
    observer.observe(document, { childList: true, subtree: true });
  }

  const host = document.location.host;
  const hostpath = document.location.host + document.location.pathname;

  if(/^2ch\.(hk|pm|life)\/[^/?#]*\/res\/[0-9]*\.html$/.exec(hostpath)){
    // Фича
    {
      // Эта структура данных по-настоящему качественная, в отличие от всего остального скрипта
      // Массив - это список разрешённых значений для имени, указанного в посте
      // Если в посте указано имя, которого нет в массиве, то будет отображено то, которое указано в массиве первым
      // Массив не должен быть пустым
      // Элементы массива не должны быть пустыми строками и строками "Аноним"
      // Указан месяц, на который трип является свежим
      // Добавляю только информацию, в которой достаточно уверен. Если у разных трипов указаны разные имена, значит, я достаточно уверен, что это разные люди
      // Иногда люди набирают некоторые буквы не в той раскладке, и приходится добавлять несколько вариантов
      const tripCodes = {
        "!RFAsmTbreo": ["Страшно-кун"], // 2019-10
        "!K8VeUX39u6": ["Алкаш", "Алкaш", "Алkаш", "Алкащ"], // 2019-10
        "!SHIRRRSnEo": ["Шир"], // 2019-10
        "!PSEV/.UmnY": ["Псевдопонос"], // 2019-10
        "!!JSbovedxYg": ["Эстр"], // 2019-10. Ж-кун
        "!wOL8/VuJEE": ["Затыкан"], // 2019-10. Руслан, Русик
        "!8bty8qVkeU": ["Настик"], // 2019-10
        "!gwqonSTONE": ["Каста"], // 2019-10
        "!qCaTKKrzss": ["BAD (использовался Светой и, возможно, Затыканом)"],
        "!m9C5HL32TI": ["arien"], // 2019-10
        "!cLogAndGUQ": ["Логан"], // 2019-10. Бачок
        "!DquxP3teBo": ["Джиуб-кун", "Джиуб"], // 2019-10
        "!!FFWpc95Flo": ["Ира"], // 2019-10
        "!zWee040DmE": ["Света"], // 2019-10
        "!sxMkM3Rbnc": ["ДЦП-кун"], // 2019-10
        "!Poo/zwEta2": ["Света"], // 2019-10
        "!03BA8gvmdc": ["Кретин с сигарой"], // 2019-10
        "!E.jMev6iao": ["Нед", "ned", "pwned"], // 2019-10
        "!!p3UXx4oCp2": ["Ира"], // 2019-11. Трип подтверждён: https://2ch.hk/soc/res/5300851.html#5301448
        "!fRogMBPvaE": ["блонд"], // 2019-06
        "!qDkIknBZVU": ["Бро"], // 2019-11
        "!eokDynaTv6": ["Эстонка"], // 2020-01
        "!Mzu56eO.w.": ["Затыкан"], // 2020-02
        "!l45lkIoNGE": ["Затыкан"], // 2020-02
        "!KASTAUnLLc": ["Каста"], // 2020-03
        "!WtMWcLhPyw": ["Юлиус"], // 2020-09, скорее всего, именно он - главный мой травитель 2020-09
        "!!1MEjUKozOs": ["Настик"], // 2022-05
        "!jG14jPoLic": ["Тома"], // 2023-05. Тома II
        "!5.qkqkj0c6": ["Ира"], // 2023-06
        "!WWUKxYcCrQ": ["Затыкан"], // 2024-08
      };
      observe$$(".post__trip", trip => {
        if(trip.innerText in tripCodes){
          const name = trip.parentElement.querySelector(".post__anon");
          if(name !== null){ // Почему-то на практике name иногда равен null
            const trimmed = name.innerText.trim();
            if(trimmed === "" || trimmed === "Аноним"){
              trip.innerText = trip.innerText + " [[" + tripCodes[trip.innerText][0] + "]]";
              trip.style["color"] = "#00aa00";
              name.style["color"] = "#00aa00";
            }else if(tripCodes[trip.innerText].includes(trimmed)){
              trip.style["color"] = "#00aa00";
              name.style["color"] = "#00aa00";
            }else{
              trip.innerText = trip.innerText + " [[" + tripCodes[trip.innerText][0] + "]]";
              trip.style["color"] = "red";
              name.style["color"] = "red";
            }
          }
        }
      });
    }
  }

manifest.json

Raw
{
  "name": "2ch extension",
  "version": "0.1",
  "manifest_version": 2,
  "permissions": ["<all_urls>"],
  "content_scripts": [
    {
      "matches": ["<all_urls>"],
      "js": ["content.js"]
    }
  ]
}