// ==UserScript== // @name 巴哈黑名單、關鍵詞、字數過少隱藏顯示 // @namespace https://home.gamer.com.tw/moontai0724 // @version 2.4.4 // @description 在巴哈姆將黑名單、關鍵詞、字數過少過濾文章留言,在頂端列可以開關過濾器(一次性) // @author moontai0724 // @match https://forum.gamer.com.tw/B.php* // @match https://forum.gamer.com.tw/Bo.php* // @match https://forum.gamer.com.tw/C.php* // @match https://forum.gamer.com.tw/Co.php* // @match https://forum.gamer.com.tw/search.php* // @grant GM_xmlhttpRequest // @connect home.gamer.com.tw // @require https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js // @supportURL https://home.gamer.com.tw/moontai0724 // @downloadURL none // ==/UserScript== (function () { 'use strict'; console.log('Start, setting: ', localStorage.getItem("BLH_Setting")); if (!localStorage.getItem("BLH_Setting") || JSON.parse(localStorage.getItem("BLH_Setting")) == null) (localStorage.setItem("BLH_Setting", JSON.stringify({ switch: { keywordPostFliter: true, keywordCommentFliter: true, blacklistPostFliter: true, blacklistCommentFliter: true, contentLengthPostFliter: false, contentLengthCommentFliter: false, }, lengthLimit: { contentLengthPostLimit: 2, contentLengthCommentLimit: 2 }, data: { forceShowList: [], forceHideList: [], blockKeywordsPC: [], postBlockKeywordsPC: [], commentBlockKeywordsPC: [], blockKeywordsFC: [], postBlockKeywordsFC: [], commentBlockKeywordsFC: [] } })), console.log('New Setting')); var setting = JSON.parse(localStorage.getItem("BLH_Setting")); // 新舊轉換 if (!setting.data.blockKeywordsFC) { setting = { switch: { keywordPostFliter: setting.switch.keywordPostFliter, keywordCommentFliter: setting.switch.keywordCommentFliter, blacklistPostFliter: setting.switch.blacklistPostFliter, blacklistCommentFliter: setting.switch.blacklistCommentFliter, contentLengthPostFliter: setting.switch.contentLengthPostFliter, contentLengthCommentFliter: setting.switch.contentLengthCommentFliter }, lengthLimit: { contentLengthPostLimit: setting.lengthLimit.contentLengthPostLimit, contentLengthCommentLimit: setting.lengthLimit.contentLengthCommentLimit }, data: { forceShowList: setting.data.forceShowList, forceHideList: setting.data.forceHideList, blockKeywordsPC: setting.data.blockKeywords, postBlockKeywordsPC: setting.data.postBlockKeywords, commentBlockKeywordsPC: setting.data.commentBlockKeywords, blockKeywordsFC: [], postBlockKeywordsFC: [], commentBlockKeywordsFC: [] } }; localStorage.setItem("BLH_Setting", JSON.stringify(setting)); } // 加入隱藏切換 jQuery('head').append(''); jQuery('.BH-menuE').append('
  • 關閉過濾器
  • '); jQuery('.BH-menuE').append('
  • '); jQuery('.BH-menuE').append('
  • 過濾器設定
  • '); jQuery('body').append(''); document.getElementById('BLH_FliterSetting').onclick = () => openSettingWindow(); // 將 blockKeywords 加入 postBlockKeywords 和 commentBlockKeywords 中 for (let i = 0; i < setting.data.blockKeywordsPC.length; i++) setting.data.postBlockKeywordsPC[setting.data.postBlockKeywordsPC.length] = setting.data.commentBlockKeywordsPC[setting.data.commentBlockKeywordsPC.length] = setting.data.blockKeywordsPC[i]; for (let i = 0; i < setting.data.blockKeywordsFC.length; i++) setting.data.postBlockKeywordsFC[setting.data.postBlockKeywordsFC.length] = setting.data.commentBlockKeywordsFC[setting.data.commentBlockKeywordsFC.length] = setting.data.blockKeywordsFC[i]; //BC頁分開 switch (location.pathname) { case '/B.php': console.group('Fliter log message'); setTimeout(() => console.groupEnd(), 200); // blacklist post fliter if (setting.switch.blacklistPostFliter) startFliter('blacklist', 'post', '.b-list__count__user>a', '.b-list__row'); // keywords post title fliter if (setting.switch.keywordPostFliter) (startFliter('postBlockKeywordsPC', 'post', '.b-list__main__title', '.b-list__row'), startFliter('postBlockKeywordsFC', 'post', '.b-list__main__title', '.b-list__row')); // popular recommend title fliter if (setting.switch.keywordPostFliter) (startFliter('postBlockKeywordsPC', 'post', '.popular .name', '.popular__item'), startFliter('postBlockKeywordsFC', 'post', '.popular .name', '.popular__item')); break; case '/C.php': case '/Co.php': console.group('Fliter log message'); setTimeout(() => console.groupEnd(), 200); // 擷取展開按鈕事件:當展開留言按鈕被點擊,執行原生展開留言指令並處理內容 jQuery('body').append(''); jQuery('.more-reply').each((index, element) => element.setAttribute("onclick", element.getAttribute("onclick") + " [document.getElementById('extendCommentListener').dataset.bsn, document.getElementById('extendCommentListener').dataset.postid] = [" + element.getAttribute('onclick').replace('extendComment(', '').replace(');', '').split(', ') + "]; jQuery('#Commendlist_" + element.getAttribute('onclick').replace('extendComment(', '').replace(');', '').split(', ')[1] + "').append('
    '); document.getElementById('extendCommentListener').click();")); // 當按鈕點擊就執行 document.getElementById('extendCommentListener').onclick = function () { let [bsn, postid] = [document.getElementById('extendCommentListener').dataset.bsn, document.getElementById('extendCommentListener').dataset.postid], times = 0, ms = 0; setTimeout(function restartFliter(ms) { setTimeout(function () { if (!document.getElementById('extendCommentAreaListener')) { jQuery('#Commendlist_' + postid).each((index, element) => { if (setting.switch.blacklistCommentFliter) { getBlackList().then(BlackList => jQuery(element).find('.reply-content__user').each((index, value) => { if (BlackList.includes(value.href.replace('https://home.gamer.com.tw/', '').toLowerCase())) { jQuery(value).parents('.c-reply__item').addClass('BlockHide'); console.log('Hid a comment with block user: ' + value.innerText.toLowerCase(), jQuery(value).parents('.c-reply__item')); } })); } if (setting.switch.keywordCommentFliter) { jQuery(element).find('.reply-content__article').each((index, value) => { setting.data.commentBlockKeywordsPC.forEach(data => { if (value.innerText.toLowerCase().includes(data)) { jQuery(value).parents('.c-reply__item').addClass('BlockHide'); console.log('Hid a post includes keyword: ' + data, jQuery(value).parents('.c-reply__item')); } }); setting.data.commentBlockKeywordsFC.forEach(data => { if (value.innerText.toLowerCase() == data) { jQuery(value).parents('.c-reply__item').addClass('BlockHide'); console.log('Hid a post includes keyword: ' + data, jQuery(value).parents('.c-reply__item')); } }); }); } if (setting.switch.contentLengthCommentFliter) { jQuery(element).find('.reply-content__article').each((index, value) => { let data = value.innerText.replace(/\s/g, '').length; if (data < setting.lengthLimit.contentLengthCommentLimit) { jQuery(value).parents('.c-reply__item').addClass('BlockHide'); console.log('Hid a comment less then setting text totalLength limit: ' + setting.lengthLimit.contentLengthCommentLimit, data, jQuery(value).parents('.c-reply__item')); } }); } }); } else if (times++ < 50) restartFliter(100); }, ms); }); }; // blacklist post fliter if (setting.switch.blacklistPostFliter) startFliter('blacklist', 'post', '.c-post__header__author>.userid', '.c-section'); // blacklist comment fliter if (setting.switch.blacklistCommentFliter) startFliter('blacklist', 'comment', '.reply-content__user', '.c-reply__item'); // keywords post fliter if (setting.switch.keywordPostFliter) (startFliter('postBlockKeywordsPC', 'post', '.c-article__content', '.c-section'), startFliter('postBlockKeywordsFC', 'post', '.c-article__content', '.c-section')); // keywords comment fliter if (setting.switch.keywordCommentFliter) (startFliter('commentBlockKeywordsPC', 'post', '.reply-content__article', '.c-reply__item'), startFliter('commentBlockKeywordsFC', 'post', '.reply-content__article', '.c-reply__item')); // post content length fliter if (setting.switch.contentLengthPostFliter) startFliter('contentLengthPostLimit', 'post', '.c-article__content', '.c-section'); // comment content length fliter if (setting.switch.contentLengthCommentFliter) startFliter('contentLengthCommentLimit', 'comment', '.reply-content__article', '.c-reply__item'); // popular recommend title fliter if (setting.switch.keywordPostFliter) (startFliter('postBlockKeywordsPC', 'post', '.popular .name', '.popular__item'), startFliter('postBlockKeywordsFC', 'post', '.popular .name', '.popular__item')); break; case '/Bo.php': console.group('Fliter log message'); setTimeout(() => console.groupEnd(), 200); // blacklist post fliter if (setting.switch.blacklistPostFliter) startFliter('blacklist', 'post', '.FM-blist6>a[href*="home.gamer.com.tw"]', 'tr'); // keywords post title fliter if (setting.switch.keywordPostFliter) (startFliter('postBlockKeywordsPC', 'post', '.FM-blist3', 'tr'), startFliter('postBlockKeywordsFC', 'post', '.FM-blist3', 'tr')); break; case '/search.php': setTimeout(function restartFliter(ms) { setTimeout(() => { if (jQuery('.gsc-table-cell-snippet-close').length > 0) { console.group('Fliter log message'); setTimeout(() => console.groupEnd(), 100); if (setting.switch.keywordPostFliter) (startFliter('postBlockKeywordsPC', 'post', '.gsc-table-cell-snippet-close', '.gsc-result'), startFliter('postBlockKeywordsFC', 'post', '.gsc-table-cell-snippet-close', '.gsc-result')); } else restartFliter(100); }, ms); }); break; } function startFliter(fliterType, elementType, target, hideClass) { if (fliterType.includes('Keyword') && fliterType.includes('PC')) { jQuery(target).each((index, element) => setting.data[fliterType].forEach(value => { if (element.innerText.toLowerCase().includes(value)) { jQuery(element).parents(hideClass).addClass('BlockHide'); console.log('Hid a ' + elementType + ' includes keyword: ' + value, jQuery(element).parents(hideClass)); } })); } else if (fliterType.includes('Keyword') && fliterType.includes('FC')) { jQuery(target).each((index, element) => setting.data[fliterType].forEach(value => { if (element.innerText.toLowerCase() == value) { jQuery(element).parents(hideClass).addClass('BlockHide'); console.log('Hid a ' + elementType + ' includes keyword: ' + value, jQuery(element).parents(hideClass)); } })); } else if (fliterType.includes('blacklist')) { getBlackList().then(BlackList => jQuery(target).each((index, element) => { if (BlackList.includes(element.href.replace('https://home.gamer.com.tw/', '').toLowerCase())) { jQuery(element).parents(hideClass).addClass('BlockHide'); console.log('Hid a ' + elementType + ' with block user: ' + element.href.replace('https://home.gamer.com.tw/', '').toLowerCase(), jQuery(element).parents(hideClass)); } })); } else if (fliterType.includes('Length')) { jQuery(target).each((index, element) => { let value = element.innerText.replace(/\s/g, '').length; if (value < setting.lengthLimit[fliterType]) { jQuery(element).parents(hideClass).addClass('BlockHide'); console.log('Hid a ' + elementType + ' less then setting text totalLength limit: ' + setting.lengthLimit[fliterType], value, jQuery(element).parents(hideClass)); } }); } } function BlackListHandle(BlackList) { let removeNum = []; setting.data.forceHideList.forEach(value => BlackList.includes(value.replace(/\s/g, '').toLowerCase()) ? void (0) : BlackList[BlackList.length] = value.replace(/\s/g, '').toLowerCase()); BlackList.forEach((value, index) => setting.data.forceShowList.includes(value.toLowerCase()) ? removeNum[removeNum.length] = index : void (0)); for (let i = removeNum.length - 1; i >= 0; i--) BlackList.splice(removeNum[i], 1); console.log('BlackList handle process over, returned blacklist: ', BlackList); return BlackList; } function getBlackList(forceReload) { return new Promise(resolve => { if (localStorage.getItem('BHBlackList') && !forceReload) { let BHBlackList = JSON.parse(localStorage.getItem('BHBlackList')), today = new Date((new Date()).getFullYear(), (new Date()).getMonth(), (new Date()).getDate(), 0, 0, 0, 0); if (today.getTime() < BHBlackList.time && BHBlackList.time < today.getTime() + 86400000) { console.log('Already requested blacklist today, resolve.'); resolve(BlackListHandle(BHBlackList.BlackList)); } else { console.log('Today not requested blacklist yet, start request.'); getBlackList(true).then(data => resolve(BlackListHandle(data))); } } else GM_xmlhttpRequest({ method: "GET", url: "https://home.gamer.com.tw/ajax/friend_getData.php?here=0", onload: data => { let BlackList = data.response.includes('