manifest.json
@@ -0,0 +1,12 @@
+{
+ "name": "2ch extension",
+ "version": "0.1",
+ "manifest_version": 2,
+ "permissions": ["<all_urls>"],
+ "content_scripts": [
+ {
+ "matches": ["<all_urls>"],
+ "js": ["content.js"]
+ }
+ ]
+}
content.js
@@ -0,0 +1,81 @@
+"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";
+ }
+ }
+ }
+ });
+ }
+ }