// ==UserScript==
// @description Автоскрытие кремлеботов и ватных дегенератов.
// @exclude https://2ch.hk/b/catalog.html
// @exclude https://2ch.pm/b/catalog.html
// @exclude https://2ch.hk/po/catalog.html
// @exclude https://2ch.pm/po/catalog.html
// @exclude https://2ch.hk/news/catalog.html
// @exclude https://2ch.pm/news/catalog.html
// @include https://2ch.hk/b/*
// @include https://2ch.pm/b/*
// @include https://2ch.hk/po/*
// @include https://2ch.pm/po/*
// @include https://2ch.hk/news/*
// @include https://2ch.pm/news/*
// @icon https://2ch.hk/favicon.ico
// @name 2ch autoHide
// @name:ru 2ch автохайд по списку спеллов
// @namespace poRussia
// @run-at document-end
// @version 220319
// ==/UserScript==
// ВНИМАНИЕ! СКРИПТ НЕСОВМЕСТИМ С ДРУГИМИ ВАРИАНТАМИ АВТОСКРЫТИЯ!
// (такими как через куклоскрипт или через настройки 2ch)
const POST = 1;
const BOTH = 2;
const HEAD = 3;
const RAGE = 1;
const HIDE = 3;
// ============[НАЧАЛО НАСТРОЕК]============
// клики по дизлайкам ставятся в случайном интервале между этими двумя значениями
const minClickDelay = 5500; // минимальная задержка между кликами, мс
const maxClickDelay = 7000; // максимальная задержка между кликами, мс
const showInTitle = 1; // Показывать счётчик дизлайков в заголовке вкладки браузера? 1 = да, 0 = нет
const ignoreQuotes = 1; // Игнорировать совпадения выражений в >цитируемом тексте? 1 = да, 0 = нет
/* ignoreQuotes = 0 проверяет чистый текст, поэтому будет работать быстрее и проще, но не позволит
игнорировать совпадения регулярных выражений в цитируемом тексте и будет скрывать посты, в которых
наивный анон цитирует животных и ботов, чтобы им ответить.
ignoreQuotes = 1 проверяет текст с тегами, поэтому не будет ставить RAGE и скрывать посты из-за цитат,
также конструкции типа св[b][/b]инья будут корректно определены, но этот метод работает чуть медленнее
(разница составляет миллисекунды, но на некрокомпах может быть заметно).
Рекомендуется использовать ignoreQuotes = 1. */
const openPostTimeout = 300; // Задержка перед раскрытием поста, мс. Не менее 100 мс.
const popupChars = 0; /* Количество символов во всплывающей подсказке над скрытым постом.
Наведи на слово 'hide', чтобы увидеть подсказку.
Если указать 0, то при наведении мыши на "hide" пост будет раскрываться. */
const highlight = 1; /* Подсвечивать посты зелёным/красным? 1 = да, 0 = нет
Добавляет цветной фон к постам на основании соотношения рейджей и лайков. */
const detectUnicode = 1; /* Определять специальные символы юникода и наказывать за них?
1 = да(ограниченный набор), 0 = нет, 2 = банить всё, кроме русского и английского. */
/* Есть особо одарённые тролли, которые, обладая некоторыми знаниями, пытаются смутить анона, вставляя
внутрь слов невидимые спецсимволы юникода, что мешает определению этих слов, либо заменяют русские буквы
схожими символами из других языков. Это временно, и они перебесятся, но пока такая опция будет полезна.
Эта дополнительная проверка позволит определять такие символы и применять к ним правила скрытия и рагу.
Такого рода троллей единицы, поэтому при желании эту настройку можно отключить. На данный момент это
экспериментальная опция, которая тщательно не тестировалась. */
const removePosts = 0; /* Удалять полностью посты с совпадениями запрещённых слов?
0 = нет, 1 = удалять только посты, 2 = удалять только треды, 3 = удалять всё
Дизлайки проставляются(в зависимости от настроек) и в удалённых постах. */
const hideEmptyText = 1; /* Скрывать посты, в которых нет никакого текста и нет картинки?
(Например, сообщения со ссылкой на другое сообщение или просто пустое)
0 = нет, 1 = скрывать, 2 = удалять */
const hideEmptyTextImg = 0; /* Скрывать посты, в которых нет никакого текста и есть картинка?
0 = нет,
1 = скрывать,
2 = ставить дизлайк,
3 = скрывать и ставить дизлайк
4 = удалять
5 = удалять и ставить дизлайк */
const hideGreenText = 0; /* Скрывать посты, в которых только гринтекст(цитата) и нет картинки?
0 = нет,
1 = скрывать,
2 = ставить дизлайк,
3 = скрывать и ставить дизлайк
4 = удалять
5 = удалять и ставить дизлайк */
const hideGreenTextImg = 0; /* Скрывать посты, в которых только гринтекст(цитата) и есть картинка?
0 = нет,
1 = скрывать,
2 = ставить дизлайк,
3 = скрывать и ставить дизлайк
4 = удалять
5 = удалять и ставить дизлайк */
const refreshTimer = 30; // Количество секунд, через которые нулевая страница автообновляется.
const refreshFrontPage = 0; // Обновлять нулевую и отправлять дизлайки раз в refreshTimer секунд?
/* 0 - ничего не делать, 1 = работать в /po/, 2 = в /news/, 3 = /po/ и /news/ по очереди
Это злая настройка, которая будет обновлять нулевую страницу выбранного раздела и автоматически
проставлять дизлайки(если нужно, согласно правилам) на последние три поста каждого треда.
Не нужно заходить в каждый тред, не нужно проверять всё вручную. Можно просто поставить в фоновой
вкладке, оставить на ночь, оставить работать, пока вас нет дома и так далее. С такой низкой скоростью
постинга, которая сейчас проявляется на полумёртвой борде, посты не будут пропускаться, и вы пассивно
будете обрабатывать все проходящие через раздел сообщения. */
/*Вложенный массив с регулярными выражениями для скрытия/лайков.
Первый элемент - место поиска выражения:
POST - искать только в тексте поста;
BOTH - искать и в тексте, и в заголовке;
HEAD - искать только в заголовке треда(для скрытия номерных тредов, например).
Второй элемент - действие при обнаружении:
RAGE - ставить дизлайк;
BOTH - ставить дизлайк и скрывать;
HIDE - просто скрытие.
Третий элемент - регулярное выражение.
Четвёртый элемент - краткое описание, которое появится в заголовке скрытого поста/треда.
Узнать больше про регулярные выражения можно тут:
https://www.google.com/search?q=regex+javascript
Потестировать работоспособность и создать спеллы можно тут:
https://regex101.com/
(не забыть слева выбрать "ECMAScript (JavaScript)", справа от строки во флагах выбрать /im)
[где искать, что делать, /регулярное выражение/im, "описание"]*/
var regexArray = [
[BOTH, BOTH, /(?:^|\s)[aaoo0]?л[еeё]ш(?:[еe][нh][ьb])?[кk][аaуyиеe]/im, "алёшка"],
[BOTH, BOTH, /[з3][аa][пn][аa][дg][нh]\S{2,3}\s[б6][аa][рp][иiuеe]/im, "западный барин"],
[BOTH, BOTH, /[сc]?[кk][аaеeоo0][кk][хx]?[еeёоo0]?л/im, "какол"],
[BOTH, BOTH, /[кk][ийiu][б6][еe][pр][сc][оo0][тt]/im, "киберсотня"],
[BOTH, BOTH, /[кпkn][оo0][кпkn][оo0][з3][ийiu]ц/im, "кокозиция"],
[BOTH, BOTH, /(?:^|\s)[кk][оo0][пn][рp][оo0](?!т|сл)/im, "копро"],
[BOTH, BOTH, /[кk][рp][оo0][хx][оo0][тt][уy][сc][иiu][кk]/im, "крохотусик"],
[BOTH, BOTH, /[кk][рp]я[кk]л/im, "крякл"],
[BOTH, BOTH, /л[еe][хx][аa][ийu][мm]/im, "лехаим"],
[BOTH, BOTH, /л[еeиuя][б6][еeийuуyя][рp](?:[дg]|[аa][кkнhсcхxш]|[оo0][ийu][дg])/im, "либераш"],
[BOTH, BOTH, /[мm][аa][ийiu][дg][аa][уy][нh]/im, "майдаун"],
[BOTH, BOTH, /(?:^|\s)[мm][аa][нh](?:я(?:[\s.,!?]|$)|ю[нh]|[ьb][кk]?)/im, "маня"],
[BOTH, BOTH, /(?:^|\s)[мm][аa]ш[кk]/im, "машк"],
[BOTH, BOTH, /[мm][ийui][вb][ийui][нh]\S/im, "мивина"],
[BOTH, BOTH, /[нh][аaоo0][вb][аaоo0]л(?:яш|[ьb][нh](?:[еёeоo](?![вгм]))|я[тt])/im, "навальнята"],
[BOTH, BOTH, /[оo0][кk][аa][тt][ыьb]ш/im, "окатыш"],
[BOTH, BOTH, /(?:[оo]л[ьb][кk]|л[аa][хx][тt]|[б6][оo0][тt])\S+\s(?:\S{0,3}\s)?ф[б6][кk]/im, "ольки из фбк"],
[BOTH, BOTH, /([нh][аa][сc][рp][аa]|(?:[xх][уy]|[пn]ы[нh])я|(?:^|\s)[оo0][вbнh][аa])л[ьb][нh]/im, "насральный"],
[BOTH, BOTH, /[пn][еeийu][нh][дg][оo0][сc]/im, "пиндос"],
[BOTH, BOTH, /[пn][оo0][дg]\s[кk][рp][оo0][вb][аa][тt][ьb]ю/im, "под кроватью"],
[BOTH, BOTH, /[пn][оo0][нh][аa][дg][уy][сc]/im, "понадусёровый"],
[BOTH, BOTH, /(?:^|\s)[пn][оo0][рp][оo0][сc]\S/im, "порось"],
[BOTH, BOTH, /[пn][оo0][рp][оo0][хx][оo0](?![вм])/im, "порохобот"],
[BOTH, BOTH, /[пn]я[тt][аa](?:ч[оo0])?[кk]/im, "пятак"],
[BOTH, BOTH, /[рp][аaоo]г[уy]л/im, "рагуль"],
[BOTH, BOTH, /[рp][еe][дg][аa]\S{4,7}\s(?:\S+\s)?[сc][оo0]ц\S*?\s?[сc][еe][тt]/im, "редактор"],
[BOTH, BOTH, /[сc][вb][ийuыi][дg][оo0][мm]/im, "свидомый"],
[BOTH, BOTH, /\S[сc][вb][ийuыi][нh]|[сc][вb][ийuыi][нh](?!ин|ь|оф|с[кт]|е?[йц]|[тч]и|(?:ая|о(?:го|е|й|му)|ую|ым)([\s.,!?]|$))/im, "свинявый"],
[BOTH, BOTH, /[сc][иuыi][сc][ьb][кk]\S{4,}/im, "сиськобот"],
[BOTH, BOTH, /(?:^|\s|[пn][оo0][дg])[сc][ийu][сc]([яийiu](л[ьb])?[нh]+(?!д))/im, "сисян"],
[BOTH, BOTH, /[сc][рp]ы[нh][оo0ь]?[кkч]/im, "срыночек"],
[BOTH, BOTH, /сшашк/im, "сшашка"],
[BOTH, BOTH, /(?:^|\s)[тt][аa][рp][аa][сc]\S*?(?!\sшев)/im, "тарас"],
[BOTH, BOTH, /[уy][кk][рp][оo0][пn]/im, "укроп"],
[BOTH, BOTH, /[уy]([сc][рp]|[рp][кk])([аaоo0уy][иiu]|[уy][аa])[нh]/im, "усраина"],
[BOTH, BOTH, /[хx][аийоao0ui][хx][ийuоo0i]?л/im, "хахлы"],
[BOTH, BOTH, /[хx][рp]([ю](?!че)|я[кk])/im, "хрю"],
[BOTH, BOTH, /ч[уy][б6][аa][тt]/im, "чубатый"],
[BOTH, BOTH, /ш[вb][аa][йийiu][нh]/im, "швайн"],
[BOTH, BOTH, /(?:^|\s)[шщ][вb][яи][тt]/im, "швятая"],
[BOTH, BOTH, /ш[пn][рp][оo][тt]/im, "шпрот"],
[HEAD, BOTH, /Шульман/im, "(((Шульман)))"],
[HEAD, HIDE, /Месяцеслов/im, "Месяцеслов"],
[HEAD, BOTH, /[кk].{0,5}[рp].{0,5}ы.{0,5}[мm].{0,5}[ийu].*[нh].*[оo].*[вb].*[оo].*[рp].*[оo].*[сc].*[ийu].*я/im, "крымодебилы"],
[HEAD, BOTH, /(?=[кkрpымmнhоoвbсcийuiя\s]{17,23})(?:[кk]?[рp]?ы?[мm]?\s?[нh]?[оo]?[вb]?[оo]?[рp]?[оo]?[сc]*[ийui]?я?){17,23}/im, "крымодебилы"]
];
// ============[КОНЕЦ НАСТРОЕК]============
var clicksArray = [];
var clicksTaskActive = 0;
var timeoutID;
const displayBlock = document.getElementById("fullscreen-container");
const title = document.title;
const pager = document.getElementsByClassName("pager")[0];
const inputListener = () => { delayClicksAfterUserInput(event.target, event.button); };
if (detectUnicode == 1) {
regexArray.push([BOTH, BOTH, /[\u0080-\u00a0\u00ad\u00c0-\u036F\u0400\u0402-\u040f\u0450\u0452-\u04ff\u2000-\u200f\u2028-\u2037\u205f-\u206f]/, "unicode"])
} else if (detectUnicode == 2) {
regexArray.push([BOTH, BOTH, /[\u0080-\u00a0\u00ad\u00c0-\u0400\u0402-\u040f\u0450\u0452-\u200f\u2028-\u2037\u205f-\u218f\u2460-\u24ff\u2c60-\uffff]/, "unicode"])
}
if (!document.URL.includes("res")) {
hideOpPosts();
hidePosts(0);
if (refreshFrontPage) { refreshFPage(); }
if (pager.style.display == "") { return; }
var callback = function(mutationsList, observer) {
for(let m of mutationsList) {
if (!m.addedNodes.length || m.addedNodes[0].tagName != "DIV" || m.addedNodes[0].className != "thread") { continue; }
hideOpPosts(m.addedNodes[0].firstChild.firstChild);
for (let i = 1; i < m.addedNodes[0].childNodes.length; i++) {
hidePosts(0, m.addedNodes[0].childNodes[i].firstChild.firstChild);
}
}
};
var observer = new MutationObserver(callback);
observer.observe(document.getElementById('posts-form'), { attributes: false, childList: true, subtree: false });
} else {
var hideTotalSpan = document.createElement("span");
hideTotalSpan.className = "post__anon";
var opPostEnd = document.getElementsByClassName("post post_type_oppost")[0].childNodes[1];
hideTotalSpan = opPostEnd.insertBefore(hideTotalSpan, opPostEnd.childNodes[opPostEnd.childNodes.length - 2]);
var hiddenCount = 0;
hidePosts(1);
var callback = function(mutationsList, observer) {
for(let m of mutationsList) {
if (!m.addedNodes.length || m.addedNodes[0].tagName != "DIV" || m.addedNodes[0].className != "" || m.addedNodes[0].firstChild.className != "thread__post") { continue; }
hidePosts(1, m.addedNodes[0].firstChild.firstChild);
}
};
var observer = new MutationObserver(callback);
observer.observe(document.getElementsByClassName('thread')[0], { attributes: false, childList: true, subtree: false });
}
function hideOpPosts(node) {
var opPost,
msgText,
opPostsCollection = [];
if (node) { opPostsCollection.push(node); }
else { opPostsCollection = document.getElementsByClassName("post post_type_oppost"); }
for (let i = 0; i < opPostsCollection.length; i++) {
opPost = opPostsCollection[i];
if (opPost.parentNode.parentNode.style.display == "none") { continue; }
var regexResult = regexCheck(opPost);
if (regexResult > -1) {
if (regexArray[regexResult][1] < 3) { requestDislike(opPost); }
if (regexArray[regexResult][1] > 1) {
if (removePosts < 2) {
var hideDiv = document.createElement("div");
hideDiv.className = "thread thread_hidden";
var msgText = opPost.getElementsByClassName("post__message post__message_op")[0].innerText.trim();
if (msgText.length > 800) { hideDiv.title = msgText.substring(0, 800) + "..."; } //TODO: fix this
else { hideDiv.title = msgText; }
let divPostDetailsSpans = opPost.getElementsByClassName("post__detailpart");
hideDiv.innerHTML = "Скрытый тред (" + opPost.getElementsByClassName("post__title")[0].textContent.trim() + ") • hide: " + regexArray[regexResult][3] + " " + divPostDetailsSpans[divPostDetailsSpans.length - 1].innerHTML;
opPost.parentNode.parentNode.parentNode.insertBefore(hideDiv, opPost.parentNode.parentNode);
}
opPost.parentNode.parentNode.style.display = "none";
}
}
}
}
function hidePosts(inThread, node) {
var post,
postsCollection = [];
if (node) { postsCollection.push(node); }
else { postsCollection = document.getElementsByClassName("post post_type_reply"); }
for (let i = 0; i < postsCollection.length; i++) {
post = postsCollection[i];
if (post.className == "post post_type_reply post_type_hidden") { continue; }
if (highlight && !node) { highlightPosts(post); }
if (greentextCheck(post)) {
if (inThread) { hiddenCount++; }
continue;
}
var regexResult = regexCheck(post);
if (regexResult > -1) {
if (regexArray[regexResult][1] < 3) { requestDislike(post); }
if (regexArray[regexResult][1] > 1) {
if (removePosts == 1 || removePosts == 3) {
post.style.display = "none";
} else {
insertHideSpan(post, regexArray[regexResult][3]);
post.className = "post post_type_reply post_type_hidden";
}
if (inThread) { hiddenCount++; }
}
}
}
if (inThread) { hideTotalSpan.textContent = "(скрыто постов: " + String(hiddenCount) + ")"; }
}
function insertHideSpan(post, reasonText) {
var hideSpan = document.createElement("span");
hideSpan.className = "post__time";
hideSpan.style.cursor = "help";
hideSpan.textContent = "• hide: " + reasonText;
if (popupChars) {
var msgText = post.getElementsByClassName("post__message")[0].innerText.trim();
if (msgText.length > popupChars) { hideSpan.title = msgText.substring(0, popupChars) + "..."; }
else { hideSpan.title = msgText; }
} else {
hideSpan.onmouseenter = function() { this.id = setTimeout(openPost, (openPostTimeout < 100 ? 100 : openPostTimeout), this, post); }
hideSpan.onmouseleave = function() {
this.id = "";
if (!post.className.includes("post_type_hidden")) { post.className = "post post_type_reply post_type_hidden"; }
}
}
post.getElementsByClassName("post__details")[0].insertBefore(hideSpan, post.getElementsByClassName("turnmeoff")[1]);
}
function openPost(elem, post) {
if (elem.id && (post.className.includes("post_type_hidden"))) {
post.className = "post post_type_reply";
}
}
function greentextCheck(post) {
if (!hideEmptyText && ! hideEmptyTextImg && !hideGreenText && !hideGreenTextImg) { return false; }
var hasImages = post.getElementsByClassName("post__images").length;
var msgText = post.getElementsByClassName("post__message")[0].innerHTML.trim();
msgText = msgText.replace(/<a href="\/(?:po|news)\/res\/.*?<\/a>/g, "");
msgText = msgText.replace(/<br>/g, "");
if (hideEmptyText && !hasImages && !msgText.trim().length) {
switch (hideEmptyText) {
case 1:
insertHideSpan(post, "пустой пост");
post.className = "post post_type_reply post_type_hidden";
return true;
case 2:
post.style.display = "none";
return true;
}
}
if (hideEmptyTextImg && hasImages && !msgText.trim().length) {
if (hideEmptyTextImg == 2) {
requestDislike(post);
return false;
} else if (hideEmptyTextImg == 3 || hideEmptyTextImg == 5) {
requestDislike(post);
}
if (hideEmptyTextImg == 1 || hideEmptyTextImg == 3) {
insertHideSpan(post, "картинка без текста");
post.className = "post post_type_reply post_type_hidden";
return true;
}
if (hideEmptyTextImg == 4 || hideEmptyTextImg == 5) {
post.style.display = "none";
return true;
}
}
msgText = msgText.replace(/<span class=\"unkfunc\">.*?<\/span>/g, "");
if (msgText.trim().length) { return false; }
if (hideGreenText && !hasImages) {
if (hideGreenText == 2) {
requestDislike(post);
return false;
} else if (hideGreenText == 3 || hideGreenText == 5) {
requestDislike(post);
}
if (hideGreenText == 1 || hideGreenText == 3) {
insertHideSpan(post, "гринтекст");
post.className = "post post_type_reply post_type_hidden";
return true;
}
if (hideGreenText == 4 || hideGreenText == 5) {
post.style.display = "none";
return true;
}
}
if (hideGreenTextImg && hasImages) {
if (hideGreenTextImg == 2) {
requestDislike(post);
return false;
} else if (hideGreenTextImg == 3 || hideGreenTextImg == 5) {
requestDislike(post);
}
if (hideGreenTextImg == 1 || hideGreenTextImg == 3) {
insertHideSpan(post, "гринтекст с картинкой");
post.className = "post post_type_reply post_type_hidden";
return true;
}
if (hideGreenTextImg == 4 || hideGreenTextImg == 5) {
post.style.display = "none";
return true;
}
}
return false;
}
function regexCheck(post, isOpPost = false) {
var postTitle;
var postMsg;
var postTitleText = "";
var found = false;
var msgText = "";
if ((postTitle = post.getElementsByClassName("post__title")).length && (postTitleText = postTitle[0].textContent.trim())) {
if (detectUnicode) { postTitleText = postTitleText.replace(/[^a-zA-zА-я \dёЁ]/g, ""); }
for (let j = 0; j < regexArray.length; j++) {
if (regexArray[j][0] > 1 && regexArray[j][2].test(postTitleText)) { return j; }
}
}
if ((postMsg = post.getElementsByClassName(isOpPost ? "post__message post__message_op" : "post__message")).length && (msgText = postMsg[0].innerText.trim())) {
if (detectUnicode) { msgText = msgText.replace(/[^a-zA-zА-я \dёЁ]/g, ""); }
for (let j = 0; j < regexArray.length; j++) {
if (regexArray[j][0] < 3 && regexArray[j][2].test(msgText)) {
found = true;
if (!ignoreQuotes) { return j; }
break;
}
}
if (found && ignoreQuotes) { //double check posts
msgText = postMsg[0].innerHTML;
msgText = msgText.replace(/<a href=.*?<\/a>|<\/?strong>|<\/?em>|<\/?su[bp]>|<span class="[suo](?:poiler)?">/g, "");
msgText = msgText.replace(/<br>/g, " ");
var splitStart = -1;
while ((splitStart = msgText.indexOf("<span class=\"unkfunc\">")) > -1 ) {
msgText = msgText.substring(0, splitStart) + msgText.substring(msgText.indexOf("</span>", splitStart + 22) + 7);
}
msgText = msgText.replace(/<\/span>/g, "");
if (detectUnicode) { msgText = msgText.replace(/[^a-zA-zА-я \dёЁ]/g, ""); }
for (let j = 0; j < regexArray.length; j++) {
if (regexArray[j][0] < 3 && regexArray[j][2].test(msgText)) { return j; }
}
}
}
return -1;
}
function highlightPosts(node) {
var like,
dislike,
likeSpan,
dislikeSpan,
likeCount,
dislikeCount,
r,
c = 120;
if ((like = node.getElementsByClassName("post__detailpart post__rate post__rate_type_like")[0]) && (likeSpan = like.children[1])) {
likeCount = parseInt(likeSpan.innerHTML, 10);
}
if ((dislike = node.getElementsByClassName("post__detailpart post__rate post__rate_type_dislike")[0]) && (dislikeSpan = dislike.children[1])) {
dislikeCount = parseInt(dislikeSpan.innerHTML, 10);
}
if (!likeCount) { likeCount = 1; }
if (!dislikeCount) { dislikeCount = 1; }
r = likeCount / dislikeCount;
if (r > 1.33) {
node.style.backgroundColor = 'rgba('+String(c)+',' + String(Math.min(c+r*13,250)) + ','+String(c)+',0.2)';
} else if (r < 0.75) {
node.style.backgroundColor = 'rgba(' + String(Math.min(c+1/r*13,250)) + ','+String(c)+','+String(c)+',0.2)';
} else if (likeCount + dislikeCount > 30) {
node.style.backgroundColor = 'rgba('+String(c)+','+String(c)+','+String(c+100)+',0.2)';
}
}
function delayClicksAfterUserInput(element, mouseButton) {
if (!clicksTaskActive || !timeoutID || mouseButton != 0) { return; }
var cname = String(element.className);
if (String(element.id).includes("like-count") || cname.includes("SVGAnimatedString") || cname.includes("post__rate")) {
clearTimeout(timeoutID);
timeoutID = setTimeout(scheduledDislike, minClickDelay + Math.random() * (maxClickDelay - minClickDelay));
}
}
function requestDislike(post) {
var element = post.getElementsByClassName("post__detailpart post__rate post__rate_type_dislike")[0];
if (element && element.className !== "post__detailpart post__rate post__rate_type_dislike post__rate_disliked") {
clicksArray.push(element);
if (showInTitle) { document.title = "[👎"+clicksArray.length+"] " + title; }
if (clicksTaskActive == 0) {
clicksTaskActive = 1;
document.addEventListener("click", inputListener);
timeoutID = setTimeout(scheduledDislike, minClickDelay + Math.random() * (maxClickDelay - minClickDelay));
}
}
}
function scheduledDislike() {
if (displayBlock.style.display == "block") {
timeoutID = setTimeout(scheduledDislike, 1000);
return;
}
timeoutID = 0;
var element = clicksArray.shift();
element.click();
element.parentNode.parentNode.className = "post post_type_reply post_type_hidden";
if (clicksArray.length) {
if (showInTitle) { document.title = "[👎"+clicksArray.length+"] " + title; }
timeoutID = setTimeout(scheduledDislike, minClickDelay + Math.random() * (maxClickDelay - minClickDelay));
} else {
document.title = title;
clicksTaskActive = 0;
document.removeEventListener("click", inputListener);
}
}
function refreshFPage() {
var targetUrl = "https://2ch." + (document.URL.includes("hk", 6) ? "hk" : "pm");
switch (refreshFrontPage) {
case 1:
if (document.URL.slice(-4) != "/po/") { return; }
targetUrl = targetUrl +"/po/";
break;
case 2:
if (document.URL.slice(-6) != "/news/") { return; }
targetUrl = targetUrl +"/news/";
break;
case 3:
if (document.URL.includes("/po/", 6)) {
targetUrl = targetUrl +"/news/";
} else {
targetUrl = targetUrl +"/po/";
}
}
setTimeout(refresh, refreshTimer * 1000, targetUrl);
}
function refresh(link) {
document.location = link;
}