Remplace la liste des derniers messages de la page d'accueil par un flux personnalisé. Cela permet notamment de se débarraser des messages envahissants en provenance de « l'Asile ».
// ==UserScript==// @name forumfr-last-messages-filter// @namespace http://tampermonkey.net/// @version 0.3.8// @description Remplace la liste des derniers messages de la page d'accueil par un flux personnalisé. Cela permet notamment de se débarraser des messages envahissants en provenance de « l'Asile ».// @author Ed38// @license MIT// @match https://www.forumfr.com/// @match https://www.forumfr.com/?_fromLogin=1// @match https://www.forumfr.com/discover/*// @icon https://www.google.com/s2/favicons?sz=64&domain=forumfr.com// @run-at document-body// @grant GM_getValue// @grant GM_setValue// @grant GM_deleteValue// @grant GM_addStyle// @grant GM_registerMenuCommand// @grant GM_unregisterMenuCommand// @grant window.onurlchange// @noframes// ==/UserScript==(function() {'use strict';const cacheAgeMax = 300;const cacheAgeMin = 60 ;const now = new Date().getTime();const defFeedUrl = "https://www.forumfr.com/discover/348" ;const defShowTime = true ;const feedSettingsUrlRegex = /^https:\/\/www.forumfr.com\/discover\/.*/i ;const feedSelectionUrlRegex = /^https:\/\/www.forumfr.com\/discover\/[0-9]+/i ;let menuResetDefaultsId = GM_registerMenuCommand("Réinitialiser les paramètres", resetDefaults);let menuShowTimeId ;let feedUrl = null ;let showTime = null ;let cacheTitle = null ;if (feedSettingsUrlRegex.test(document.location.href)) {GM_addStyle(`#stream_containers_topic ul[data-role="tokenList"]{max-height:180px;overflow:scroll;}#topicSelUnselAll{text-align:center;}#topicSelUnselAll span{display:inline-block;}`);document.body.addEventListener("mousedown", topicMenuMod, false);if(feedSelectionUrlRegex.test(document.location.href)){document.body.addEventListener("mousedown", saveMenuMod, false);}}else {feedUrl = GM_getValue("feedUrl", null);if (feedUrl === null){feedUrl = defFeedUrl;}showTime = GM_getValue("showTime", null);if (showTime === null){showTime = defShowTime;}GM_addStyle(`div[data-widgetarea="col2"] a, div[data-widgetarea="col2"] span {visibility:hidden ;}div[data-widgetarea="col2"].showLastMsgs li div *, div[data-widgetarea="col2"].showLastMsgs div span {visibility:visible !important;.lmfTime {position:absolute;right:4px;bottom:0px;}`);let cachedFeed = loadCache();if(cachedFeed){fillHome(cachedFeed);if(canRefresh()){loadFeed();}}else {preFillTitle() ;loadFeed() ;}}showTimeMenu() ;function resetDefaults() {let r = confirm("Réinitialiser les paramètres de personnalisation du flux d'accueil ?") ;if (r === true) {GM_deleteValue("feedUrl");GM_deleteValue("cache");GM_deleteValue("cacheTime");GM_deleteValue("showTime");GM_deleteValue("cacheTitle");}}function toggleShowTime(){if(showTime){showTime = false;} else {showTime = true;}GM_setValue("showTime",showTime) ;showTimeMenu();}function showTimeMenu() {if (menuShowTimeId) {GM_unregisterMenuCommand(menuShowTimeId) ;}let statusif (showTime) {status = "ON" ;} else {status = "OFF" ;}menuShowTimeId = GM_registerMenuCommand("Âge des messages : " + status, toggleShowTime);}function saveCache(data){GM_setValue("cache",data) ;GM_setValue("cacheTime",now);}function loadCache(){let cacheTime = GM_getValue("cacheTime",null);if ( cacheTime && ((now - cacheTime) < cacheAgeMax * 1000 )) {let data = GM_getValue("cache",null) ;if(data) return data ;}return false;}function canRefresh(){let cacheTime = GM_getValue("cacheTime",null);if ( cacheTime && ((now - cacheTime) > cacheAgeMin * 1000 )) return true ;return false ;}function saveMenuMod() {let feedOptionsMenu = document.body.querySelector("#elStreamOptions_menu");if (feedOptionsMenu ){document.body.removeEventListener("mousedown", saveMenuMod, false);let saveHomeHtml = `<li><a href="javascript:void(0)" id="saveHome">Utiliser ce flux en page d'accueil</a></li>`;let saveHomeNode = htmlText2Node(saveHomeHtml) ;saveHomeNode.classList = feedOptionsMenu.querySelector("li").classList ;feedOptionsMenu.appendChild(saveHomeNode) ;feedOptionsMenu.querySelector("#saveHome").addEventListener("mousedown", saveFeedUrl, false);}}function saveFeedUrl(){let newFeedUrl = document.location.href.match(feedSelectionUrlRegex);if (newFeedUrl) {GM_setValue("feedUrl",newFeedUrl) ;GM_deleteValue("cache");GM_deleteValue("cacheTime");GM_deleteValue("showTime");GM_deleteValue("cacheTitle");}}function topicMenuMod() {let topicList = document.body.querySelector('#ipsTabs_tabs_nodeSelect_stream_containers_topic_nodeSelect_stream_containers_topic_tab_global_panel');if (topicList){document.body.removeEventListener("mousedown", topicMenuMod,false);let topicSelectUnselectAllHtml = `<div id="topicSelUnselAll"><span id="topicSelectAll" class="ipsButton_veryLight">Tout sélectionner</span> <span id="topicUnselectAll" class="ipsButton_veryLight">Tout désélectionner</span></div>`;let topicSelectUnselectAllNode = htmlText2Node(topicSelectUnselectAllHtml) ;topicList.parentNode.insertBefore(topicSelectUnselectAllNode,topicList);document.getElementById("topicSelectAll").addEventListener("mousedown", topicSelectAll,"select" ,false);document.getElementById("topicUnselectAll").addEventListener("mousedown", topicUnselectAll,"unselect",false);}}function topicSelectAll(){topicSelectUnselectAll("select") ;}function topicUnselectAll(){topicSelectUnselectAll("unselect") ;}function topicSelectUnselectAll(cmd) {let list = document.getElementById("topicSelUnselAll").nextElementSibling;let itemClass="ipsSelectTree_item";let selectedClass="ipsSelectTree_selected";let items2click ;if (cmd === "unselect") {items2click = list.querySelectorAll('div.' + itemClass + '.' + selectedClass) ;}else if (cmd === "select") {items2click = list.querySelectorAll('div.' + itemClass + ':not(.' + selectedClass + ')') ;}else {return ;}items2click.forEach(item2click => item2click.click());}function htmlText2Node(text){let htmlNode = new DOMParser().parseFromString(text, "text/html") ;return htmlNode.body.firstChild ;}async function loadFeed() {// Chargement du flux personnalisé.let feedRequest = await fetch (feedUrl) ;let feedHtmlText = await feedRequest.text();fillHome(feedHtmlText);saveCache(feedHtmlText);}function fillHome(feedHtmlText) {// Remplissage de la page d'accueil.const homeListTest = 'div[data-widgetarea="col2"] li.ipsDataItem:nth-child(16)' ;if (document.body.querySelector(homeListTest)){writeHomeList(feedHtmlText);} else {waitForElement(homeListTest).then((element) => {writeHomeList(feedHtmlText);});}}function preFillTitle() {let cacheTitle = GM_getValue("cacheTitle",null);let titleSelector = 'div[data-widgetarea="col2"] h3' ;if (cacheTitle != null) {let elTitle = document.body.querySelector(titleSelector) ;if (elTitle) {elTitle.innerHTML = cacheTitle ;}else{waitForElement(titleSelector).then((element) => {element.innerHTML=cacheTitle ;//document.body.querySelector(titleSelector).innerHTML = cacheTitle ;});}}}function writeHomeList(feedHtmlText) {let feedHtmlNode = new DOMParser().parseFromString(feedHtmlText, "text/html");let feedItems = feedHtmlNode.querySelectorAll('li[data-role="activityItem"]');let homeMsgs = document.evaluate('//div[@data-widgetarea="col2"]//li[@class="ipsDataItem"]', document, null, XPathR###lt.ORDERED_NODE_SNAPSHOT_TYPE, null );if (homeMsgs.snapshotLength >=15){for (let i = 0; i < 15; i++) {let homeMsg = homeMsgs.snapshotItem(i) ;let msgLinksHome = homeMsg.querySelectorAll("a") ;let msgLinksNew = feedItems[i].querySelectorAll("a") ;let subjectHome = msgLinksHome[0] ;let subjectNew = msgLinksNew[2];subjectNew=feedItems[i].querySelector("a[data-linktype='link']") ;subjectHome.href = subjectNew.href ;let subjectText = subjectNew.innerHTML ;subjectHome.title = "Afficher le sujet " + subjectText ;if (subjectText.length > 61) {subjectText = subjectText.substring(0 ,61) + "..." ;}subjectHome.innerHTML = subjectText ;let authorHome = msgLinksHome[1];let authorNew = msgLinksNew[5];authorNew = feedItems[i].querySelector("p > a") ;authorHome.href = authorNew.href;authorHome.dataset.ipshoverTarget = authorNew.dataset.ipshoverTarget ;authorHome.innerHTML = authorNew.innerHTML;authorHome.title = authorNew.title ;if (showTime){let msgTime = feedItems[i].querySelector("time").getAttribute("data-short");let elTime = homeMsg.querySelector('*[class*="lmfTime"]') ;if (elTime === null) {let elTimeHtml = `<div class="lmfTime ipsType_light ipsType_small"><i class="fa fa-clock-o"></i><span>` + msgTime + `</span></div>`elTime = htmlText2Node(elTimeHtml);homeMsg.appendChild(elTime);}else {elTime.querySelector("span").innerHTML = msgTime;}}}homeMsgs.snapshotItem(15).querySelectorAll("a")[0].href=feedUrl;}let panel = document.body.querySelector('div[data-widgetarea="col2"]') ;let title = feedHtmlNode.querySelector('span[data-role="streamTitle"]').innerHTML ;panel.querySelector('h3').innerHTML = title ;panel.classList.add("showLastMsgs");GM_setValue("cacheTitle",title);}function waitForElement(selector) {return new Promise((resolve) => {const observer = new MutationObserver((mutations, observer) => {const element = document.body.querySelector(selector);if (element) {observer.disconnect();resolve(element);}});observer.observe(document.body, {childList: true,subtree: true,});});}})();