// ==UserScript==
// @name [ONCHE] Blacklist
// @version 0.2.1
// @description Script pour https://onche.org, ajoute une liste noire locale au navigateur utilisé
// @author Programmafion
// @run-at document-start
// @match https://onche.org/forum/*
// @match https://onche.org/topic/*
// @downloadURL https://codeberg.org/programmafion1/onche_liste-noire/raw/branch/main/onche_blacklist.user.js
// @updateURL https://codeberg.org/programmafion1/onche_liste-noire/raw/branch/main/onche_blacklist.meta.js
// @icon https://risibank.fr/cache/medias/0/6/676/67632/full.png
// @grant GM_addStyle
// ==/UserScript==
window.addEventListener('DOMContentLoaded', () => {
GM_addStyle('.mdi-account-minus-outline::before {font-family: "material design icons"; content: "\\F0AEC";}.mdi-eye-off-outline::before {font-family: "material design icons"; content: "\\F06D1";}');
// ====== bouton paramètres ======
const id = location.pathname.includes('/forum/') ? 'forum' : 'topic';
document.getElementById(id).style.overflow = 'inherit';
document.querySelector('.title.is_sticky').style.overflow = 'inherit';
const settingsButton = new DOMParser().parseFromString(
`
`, 'text/html').body.firstChild;
settingsButton.addEventListener('click', onSettingsButtonClick);
settingsButton.addEventListener('dblclick', () => toggleDisplayMode());
document.querySelector('.title .right').prepend(settingsButton);
new MutationObserver((mutationsList, observer) => {
for (const mutation of mutationsList) {
if (mutation.type !== 'childList' || !mutation.addedNodes.length) {
continue;
}
const addedNode = mutation.addedNodes[0];
if (!addedNode.classList.contains('sticky-container')) {
continue;
}
// addedNode.querySelector('.mdi-cog.clickable').addEventListener('click', onSettingsButtonClick);
addedNode.querySelector('.mdi-cog.clickable').remove();
}
}).observe(document.getElementById(id), { childList: true, subtree: true });
function onSettingsButtonClick(event) {
const textAreaEl = this.firstElementChild;
if (event.target === textAreaEl) {
return;
}
event.stopPropagation();
textAreaEl.value = localStorage.getItem('blacklist_userscript.blacklist') ?? '';
textAreaEl.style.display = textAreaEl.style.display === 'block' ? 'none' : 'block';
document.addEventListener('mousedown', event => {
if (event.target !== textAreaEl && event.target !== this) {
textAreaEl.style.display = 'none';
}
});
textAreaEl.addEventListener('keydown', (event) => {
if (event.key === 'Enter' && !event.shiftKey) {
event.preventDefault();
const normalizedNicknames = Array.from(new Set(textAreaEl.value.replace(/^,+|,+$/g, '').replaceAll(' ', '').replaceAll(',,', ',').toLowerCase().split(','))).join(',');
localStorage.setItem('blacklist_userscript.blacklist', normalizedNicknames);
textAreaEl.style.backgroundColor = '#28a745';
requestAnimationFrame(() => {
textAreaEl.style.transition = 'background-color 1s ease-in';
textAreaEl.style.backgroundColor = 'white';
textAreaEl.addEventListener('transitionend', () => {
textAreaEl.style.transition = '';
}, {once: true});
});
textAreaEl.value = normalizedNicknames;
if (location.pathname.includes('/topic/')) {
updateWhitelistedMessagesState();
updateBlacklistedMessagesState();
} else {
updateTopicsState();
}
}
});
}
function getTitleAttribute(shouldHideMessages) {
shouldHideMessages ??= localStorage.getItem('blacklist_userscript.hide_messages') === 'true';
return 'Liste noire ' + (shouldHideMessages ? '(mode caché)' : '(mode réduit)');
}
function getOpacity(shouldBetransparent) {
shouldBetransparent ??= localStorage.getItem('blacklist_userscript.hide_messages') === 'true';
return 1 - (shouldBetransparent && .5);
}
function toggleDisplayMode(shouldHideMessages) {
shouldHideMessages ??= localStorage.getItem('blacklist_userscript.hide_messages') !== 'true';
localStorage.setItem('blacklist_userscript.hide_messages', shouldHideMessages);
settingsButton.style.opacity = getOpacity(shouldHideMessages);
settingsButton.title = getTitleAttribute(shouldHideMessages);
(location.pathname.includes('/forum/') ? updateTopicsState : updateMessagesState)();
}
// ====== collapse blacklist messages ======
function updateBlacklistedMessagesState(isFirstCall) {
const blacklist = (localStorage.getItem('blacklist_userscript.blacklist') ?? []).split(',');
const shouldHideMessages = localStorage.getItem('blacklist_userscript.hide_messages') === 'true';
document.querySelectorAll('.message').forEach(message => {
let author = message.querySelector('.message-username').textContent;
if (!blacklist.includes(author.toLowerCase())) {
return;
} else if (shouldHideMessages) {
if (!message.classList.contains('answer')) {
message.style.display = 'none';
}
return;
}
message.style.display = 'flex';
if (message.classList.contains('collapsible')) {
return;
}
// -- BL button --
// remove "blacklist" button if present
message.querySelector(':scope > .message-top .mdi-eye-off-outline')?.remove();
// add "whitelist" button if absent
if (!message.querySelector(':scope > .message-top .mdi-account-minus-outline')) {
const whitelistButtonEl = document.createElement('div');
whitelistButtonEl.classList.add('mdi', 'mdi-account-minus-outline');
whitelistButtonEl.setAttribute('title', `Retirer ${author} de la liste noire`);
whitelistButtonEl.addEventListener('click', event => {
const blacklist = localStorage.getItem('blacklist_userscript.blacklist') ?? '';
author = author.toLowerCase();
localStorage.setItem('blacklist_userscript.blacklist', blacklist.replaceAll(',' + author, '').replaceAll(author + ',', '').replaceAll(author, ''));
updateWhitelistedMessagesState();
});
message.querySelector('.right').prepend(whitelistButtonEl);
}
// -- collapsing --
const chevronEl = document.createElement('div');
chevronEl.classList.add('chevron', 'mdi', 'mdi-chevron-right');
chevronEl.style.transition = 'transform 0.5s ease';
message.querySelector('.right').append(chevronEl);
const messageTop = message.querySelector('.message-top');
const messageContent = message.parentElement.querySelector(`[data-id="${message.dataset.id}"] > .message-content`);
const bottomEl = message.querySelector('.message-bottom') ?? {style: -1};
const answerEl = message.querySelector('.answer');
bottomEl.style.display = 'none';
messageTop.childNodes.forEach(node => {
node.setAttribute('style', 'display: none !important');
});
messageTop.querySelector('.right').childNodes.forEach(node => {
node.setAttribute('style', 'display: none !important');
node.style.opacity = 0;
});
messageTop.querySelector('.right').lastChild.setAttribute('style', 'opacity: 1; display: block');
messageTop.querySelector('.right').style.display = 'block';
if (answerEl) {
answerEl.style.display = 'none';
messageContent.style.display = 'none';
} else {
if (isFirstCall) {
messageContent.style.display = 'none';
}
messageContent.style.maxHeight = '0px';
}
// -- collapsibility --
message.style.minHeight = '51px';
chevronEl.addEventListener('click', function() {
if (chevronEl.classList.contains('mdi-chevron-right')) {
chevronEl.classList.replace('mdi-chevron-right', 'mdi-chevron-down');
bottomEl.style.display = 'flex';
messageTop.childNodes.forEach(node => {
node.style.transition = 'opacity 0.5s ease';
node.setAttribute('style', 'display: flex');
});
messageTop.querySelector('.right').childNodes.forEach(node => {
node.style.transition = 'opacity 0.5s ease';
node.setAttribute('style', 'display: block');
node.style.opacity = 0;
});
messageTop.querySelector('.right').style.display = 'flex';
messageTop.querySelector('.right').lastChild.style.display = 'block';
setTimeout(() => {
messageTop.querySelector('.right').childNodes.forEach(node => {
node.style.opacity = 1;
});
}, 100);
if (answerEl) {
answerEl.style.display = 'block';
messageContent.style.display = 'block';
} else {
messageContent.style.display = 'block';
messageContent.style.transition = 'max-height 0.5s ease';
messageContent.style.maxHeight = messageContent.scrollHeight + 'px';
}
} else {
chevronEl.classList.replace('mdi-chevron-down', 'mdi-chevron-right');
bottomEl.style.display = 'none';
messageTop.childNodes.forEach(node => {
node.style.transition = 'opacity 0.5s ease';
node.setAttribute('style', 'display: none !important');
});
messageTop.querySelector('.right').childNodes.forEach(node => {
node.style.transition = 'opacity 0.5s ease';
node.setAttribute('style', 'display: none !important');
node.style.opacity = 0;
});
messageTop.querySelector('.right').lastChild.style.opacity = 1;
setTimeout(() => {
messageTop.querySelector('.right').style.display = 'block';
messageTop.querySelector('.right').lastChild.style.display = 'block';
}, 100);
if (answerEl) {
answerEl.style.display = 'none';
messageContent.style.display = 'none';
} else {
messageContent.style.transition = 'max-height 0.5s ease';
messageContent.style.maxHeight = '0px';
}
}});
message.classList.add('collapsible');
});
}
function updateWhitelistedMessagesState() {
document.querySelectorAll('.message').forEach(message => {
const author = message.querySelector('.message-username').textContent;
if ((localStorage.getItem('blacklist_userscript.blacklist') ?? '').includes(author.toLowerCase())) {
return;
}
message.style.display = 'flex';
// -- collapsibility --
message.classList.remove('collapsible');
message.querySelector(':scope > .message-top .mdi-chevron-right')?.click();
// -- BL button --
// remove whitelist button and chevron if present
message.querySelector(':scope > .message-top .mdi-account-minus-outline')?.remove();
message.querySelector(':scope > .message-top .chevron')?.remove();
// add "blacklist" button if absent
if (!message.querySelector(':scope > .message-top .mdi-eye-off-outline')) {
const blAddButtonEl = document.createElement('div');
blAddButtonEl.classList.add('mdi', 'mdi-eye-off-outline');
blAddButtonEl.setAttribute('title', `Ne plus voir les messages de ${author}`);
blAddButtonEl.addEventListener('click', event => {
const blacklist = localStorage.getItem('blacklist_userscript.blacklist') ?? '';
localStorage.setItem('blacklist_userscript.blacklist', (blacklist ? blacklist + ',' : '') + author.toLowerCase());
updateBlacklistedMessagesState();
});
message.querySelector('.right').prepend(blAddButtonEl);
}
});
}
function updateTopicsState() {
const blacklist = (localStorage.getItem('blacklist_userscript.blacklist') ?? []).split(',');
const shouldHideMessages = localStorage.getItem('blacklist_userscript.hide_messages') === 'true';
document.querySelectorAll('.topic-subject.link').forEach(topic => {
const authorEl = topic.querySelector('.topic-username');
const spoileredTitle = topic.querySelector('._format._spoiler');
topic.parentElement.style.display = 'flex';
if (!blacklist.includes(authorEl.textContent.toLowerCase().trim())) {
if (spoileredTitle) {
spoileredTitle.parentElement.insertBefore(new DOMParser().parseFromString(
`${spoileredTitle.textContent}`, 'text/html').body.firstChild, spoileredTitle);
topic.insertAdjacentHTML('beforeend',`${authorEl.textContent}
`);
spoileredTitle.remove();
authorEl.parentElement.remove();
}
return;
} else if (shouldHideMessages) {
return topic.parentElement.style.display = 'none';
} else if (spoileredTitle) {
return;
}
const titleEl = topic.querySelector('span:not([class])');
topic.insertBefore(new DOMParser().parseFromString(
``, 'text/html').body.firstChild, titleEl);
titleEl.remove();
if (!topic.parentElement.classList.contains('compact')) {
topic.insertAdjacentHTML('beforeend',``);
authorEl.remove();
}
});
}
if (location.pathname.includes('/forum/')) {
document.addEventListener('click', event => {
if (['_format', '_spoiler'].every(cls => event.target.classList.contains(cls))) {
event.preventDefault();
}
});
}
const updateMessagesState = (isFirstCall) => {
updateWhitelistedMessagesState();
updateBlacklistedMessagesState(isFirstCall);
};
const fn = location.pathname.includes('/forum/') ? updateTopicsState : updateMessagesState;
fn(true);
window.addEventListener('focus', () => {
fn();
toggleDisplayMode(localStorage.getItem('blacklist_userscript.hide_messages') === 'true');
});
});