Greasy Fork is available in English.
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 status if (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, }); }); } })();