您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Почтовый помощник ГВД. Подсветка желтым цветом ещё не просмотренных клановых рассылок. Исправление ссылок в письмах.
// ==UserScript== // @name HWM_Mail_Helper // @namespace Zeleax // @version 0.7 // @description Почтовый помощник ГВД. Подсветка желтым цветом ещё не просмотренных клановых рассылок. Исправление ссылок в письмах. // @author Zeleax // @include /https:\/\/(www.heroeswm.ru|www.lordswm.com|my.lordswm.com)\/sms_clans.php.*/ // @grant GM_deleteValue // @grant GM_getValue // @grant GM_setValue // @license MIT // ==/UserScript== // GM functions if (typeof GM_getValue != 'function') {this.GM_getValue=function (key,def) {return localStorage[key] || def;};this.GM_setValue=function (key,value) {return localStorage[key]=value;}; this.GM_deleteValue=function (key) {return delete localStorage[key];};} // Текущая рассылка var el, curClanTd; curClanTd=getClosestParentByTagName(getE('//*[contains(text(),"Рассылка клана")]'),'td'); var curClanNum=/#(\d+)/.exec(curClanTd.innerText)[1]; // Сохраненные данные var clanMailInfoOldS = GM_getValue('HWM_Mail_Manager_clanMailInfoS'); var clanMailInfoOld= clanMailInfoOldS ? JSON.parse(clanMailInfoOldS) : {}; // Текущие данные el=getE('//a[contains(@href, "sms_clans.php?clan_id=") and contains(text(),"#")]'); var clanList= getClosestParentByTagName(el, 'tbody'); var clanrows = getL('.//tr',clanList); var regex=/(\d+).+\D(\d+)/; var clanMailInfoNew={}; var clanMailDelta={}; for(var i=0; el=clanrows.snapshotItem(i); i++) { var res=regex.exec(el.innerText); var old=clanMailInfoOld[res[1]]; var cntcur=parseInt(res[2],10); clanMailInfoNew[res[1]]={cnt: cntcur, chk: (old ? old.chk : 1)}; clanMailDelta[res[1]]=cntcur-(old ? old.cnt : 0); if(clanMailDelta[res[1]]<0) clanMailDelta[res[1]]=0; if(clanMailDelta[res[1]]>0) { if (curClanNum!=res[1]) el.style.backgroundColor = "yellow"; else curClanTd.style.backgroundColor = "yellow"; } } if(isEmpty(clanMailInfoOld)) clanMailInfoOld = JSON.parse(JSON.stringify(clanMailInfoNew)); // клонирование массива if(window.location.search=='') { var lastClanMailTime = parseInt(GM_getValue('HWM_Mail_Manager_lastClanMailTime', '0'), 10); var curTime=(new Date()).getTime(); var deltaTime = curTime-lastClanMailTime; if(deltaTime > 15000) GM_setValue('HWM_Mail_Manager_lastClanMailTime', curTime); if (clanMailDelta[curClanNum]==0 && deltaTime > 60000) { const keys = Object.keys(clanMailDelta) for (const key of keys) { if(clanMailDelta[key]>0 && clanMailInfoOld[key] && clanMailInfoOld[key].chk==1) { window.location +='?clan_id='+key; } } } } // Обновляем данные текущей рассылки if(!clanMailInfoOld[curClanNum]) { clanMailInfoOld[curClanNum]=clanMailInfoNew[curClanNum];} else { clanMailInfoOld[curClanNum].cnt= clanMailInfoNew[curClanNum].cnt;} el=document.getElementsByName('sign')[0]; if (el) clanMailInfoOld[curClanNum].chk = el.checked ? 1 : 0; // Сохраняем актуальную инфу var clanMailInfoOldS2=JSON.stringify(clanMailInfoOld); if(clanMailInfoOldS2!=clanMailInfoOldS) { GM_setValue('HWM_Mail_Manager_clanMailInfoS', clanMailInfoOldS2); } // склеиваем разорванные ссылки в письме if(/read/.test(window.location.search)) { el = getE('//li[contains(text(),"Тема: ")]'); if(el){ el = el.parentNode.parentNode.nextSibling.nextSibling.firstChild.firstChild.firstChild.firstChild.firstChild; if(el){ el.innerHTML=el.innerHTML.replaceAll(/\b(https?\S{20,200})\s(\S{1,200})/g, '$1$2'); // удаляем пробел } } } function isEmpty(obj) {for (var x in obj) { return false;}return true;} function getE(xpath,el,docObj){return (docObj?docObj:document).evaluate(xpath,(el?el:(docObj?docObj.body:document.body)),null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;} function getL(xpath,el,docObj){return (docObj?docObj:document).evaluate(xpath,(el?el:(docObj?docObj.body:document.body)),null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);} function getClosestParentByTagName(el, tag){var p, e, fnd=false, tf=tag.toLowerCase();e=el;do{p=e.parentElement;if((p) && (p.tagName.toLowerCase()==tf)){fnd=true;break;} e=p;} while (e); return fnd?p:null;}