您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Цветные протоколы боёв, передач, клана, склада, ларцов. Загрузка следующих страниц. Фильтрация. Листать форум и фильтровать форумы кузнецов и прочего. Черный список. Распознавание ссылок на форуме, в почте и в информации об игроке
当前为
// ==UserScript== // @name hwmProtocolsAndForums // @author Demin, Tags, Tamozhnya1 // @namespace Tamozhnya1 // @version 2.5 // @description Цветные протоколы боёв, передач, клана, склада, ларцов. Загрузка следующих страниц. Фильтрация. Листать форум и фильтровать форумы кузнецов и прочего. Черный список. Распознавание ссылок на форуме, в почте и в информации об игроке // @include /^https{0,1}:\/\/((www|my)\.(heroeswm|lordswm)\.(ru|com))\/(sklad_log|pl_transfers|pl_warlog|clan_log|gift_box_log|forum_thread|forum_messages|pl_info|sms)\.(php.*)/ // @grant GM_deleteValue // @grant GM_getValue // @grant GM_setValue // @grant GM.xmlHttpRequest // @require https://update.greasyfork.org/scripts/490927/1360667/Tamozhnya1Lib.js // @license MIT // ==/UserScript== // (c) Tags 2023.04 https://greasyfork.org/ru/users/924307-foxxelias, Tamozhnya1 2024.02.26 addStyle(` .battle_row { width: 100%; border-right: 1px solid black; border-bottom: 1px solid black; border-left: 1px solid black; } .battle_row img { width: 14px; height: 14px; vertical-align: bottom; } .battle_row > div { display: inline-block; vertical-align: bottom; } `); const types = [ { pattern: "[80/80]", icon: ``, color: "#FFF000" },{ pattern: "[100/100]", icon: ``, color: "#00F120" },{ pattern: "бриллиантов обменяно ", icon: ``, color: "#00F120" }, { pattern: "вернул c ремонта ", icon: ``, color: "#FFF000" }, { pattern: "возвращено автоматически c ремонта", icon: ``, color: "#0008DC" }, { pattern: "Золото о", icon: ``, color: "#FFF8DC" }, { pattern: "взял в ремонт", icon: ``, color: "#FFF8DC" }, { pattern: "Куплен", icon: ``, color: "#DEB887" }, { pattern: "Вернул ", icon: ``, color: "#FFDEAD" }, { pattern: "арендова", icon: ``, color: "#FFEBCD" }, { pattern: "Передан", icon: ``, color: "#E0FFFF" }, { pattern: ", доп. комиссия ", icon: ``, color: "#B0C4DE" }, { pattern: "Продан ", icon: ``, color: "#ADFF2F" }, { pattern: "вернул", icon: ``, color: "#00FA9A" }, { pattern: "возвращ", icon: ``, color: "#7FFF00" }, { pattern: "Возвращено автоматически ", icon: ``, color: "#3CB371" }, { pattern: "Взят в ремонт ", icon: ``, color: "#7CFC00" }, { pattern: "Вернул c ремонта ", icon: ``, color: "#FA8072" }, { pattern: "Получен элемент ", icon: ``, color: "#00FF00" }, { pattern: "Получен ", icon: ``, color: "#F08080" }, { pattern: "<!--0-->", icon: `<a href="hunter_guild.php" title="${isEn ? "Hunter's guild" : "Гильдия охотников"}" style="height: inherit;"><img src="https://dcdn.heroeswm.ru/i/btns/job_fl_btn_hunters.png" alt="hunt"></a>`, color: "#cceecc" }, { pattern: "<!--7-->", icon: `<a href="mercenary_guild.php" style="height: inherit;"><img src="https://dcdn.heroeswm.ru/i/rewards/gn/task4.png" style="height: inherit;" ></a>`, color: "#eeeecc" }, { pattern: "<!--8-->", icon: `<a href="mercenary_guild.php" style="height: inherit;"><img src="https://dcdn3.heroeswm.ru/i/rewards/gn/task5.png" alt="" style="height: inherit;" ></a>`, color: "#eeeecc" }, { pattern: "<!--12-->", icon: `<a href="mercenary_guild.php" style="height: inherit;"><img src="https://dcdn2.heroeswm.ru/i/rewards/gn/task9.png" alt="" style="height: inherit;" ></a>`, color: "#eeeecc" }, { pattern: "<!--95-->", icon: `<a href="task_guild.php" style="height: inherit;" title="${isEn ? "Watcher's guild" : "Гильдия стражей"}"><img src="https://dcdn3.heroeswm.ru/i/bselect/task_guild.png?v=3b" ></a>`, color: "#17d3bf" }, { pattern: "<!--29-->", icon: `<a href="mercenary_guild.php" style="height: inherit;"><img src="https://dcdn3.heroeswm.ru/i/rewards/gn/task3.png" alt="" style="height: inherit;"></a>`, color: "#eeeecc" }, { pattern: "<!--10-->", icon: `<a href="mercenary_guild.php" style="height: inherit;"><img src="https://dcdn3.heroeswm.ru/i/rewards/gn/task7.png" alt="" style="height: inherit;" ></a>`, color: "#eeeecc" }, { pattern: "<!--5-->", icon: `<a href="mercenary_guild.php" style="height: inherit;"><img src="https://dcdn3.heroeswm.ru/i/rewards/gn/task2.png" alt="" style="height: inherit;" ></a>`, color: "#eeeecc" }, { pattern: "<!--28-->", icon: `<a href="mercenary_guild.php" style="height: inherit;"><img src="https://dcdn1.heroeswm.ru/i/rewards/gn/task10.png" alt="" style="height: inherit;" ></a>`, color: "#eeeecc" }, { pattern: "<!--66-->", icon: `<a href="thief_guild.php" style="height: inherit;"><img title="Гильдия воров" src="https://dcdn.heroeswm.ru/i/btns/job_fl_btn_thiefs.png" ></a>`, color: "#ccccee" }, { pattern: "<!--68-->", icon: `<img src="https://dcdn.heroeswm.ru/i/top/line/2x2fast.gif" title="Турнир" alt="Турнир">`, color: "" }, { pattern: "<!--127-->", icon: `<a href="leader_guild.php" style="height: inherit;"><img src="https://dcdn1.heroeswm.ru/i/bselect/leaders.png?v=3b" title="${isEn ? "Leader's Guild" : "Гильдия Лидеров"}" style="height: inherit;"></a>`, color: "#cccccc" }, { pattern: "<!--89-->", icon: `<a href="leader_guild.php" style="height: inherit;"><img src="https://dcdn1.heroeswm.ru/i/bselect/leaders.png?v=3b" title="${isEn ? "Leader's Guild" : "Гильдия Лидеров"}" style="height: inherit;"></a>`, color: "#cccccc" }, { pattern: "<!--94-->", icon: `<a href="tj_single.php"><img src="//dcdn.heroeswm.ru/i/tj2ev200.jpg" alt="" width="15" height="15" border="0"></a>`, color: "#cccccc" }, { pattern: "<!--117-->", icon: `<a href="tj_single.php"><img src="//dcdn.heroeswm.ru/i/tj2ev200.jpg" alt="" width="15" height="15" border="0"></a>`, color: "#cccccc" }, { pattern: "<!--110-->", icon: `<a href="campaign_list.php" title="${isEn ? "Campaigns" : "Кампании"}"><img src="https://dcdn1.heroeswm.ru/i/bselect/campaigns.png?v=3b" width="15" height="15" border="0"></a>`, color: "#b5b5b5" }, { pattern: "<!--119-->", icon: `<a href="village_def.php"><img src="//dcdn.heroeswm.ru/i/vil_def_n.jpg" alt="" width="15" height="15" border="0"></a>`, color: "#9b5755" }, { pattern: "<!--120-->", icon: `<a href="recruit_event.php" title="${isEn ? "Dungeon Caves" : "Подземные пещеры"}"><img src="https://dcdn.heroeswm.ru/i/bselect/recruit_event.png?v=3b" alt="" width="15" height="15" border="0"></a>`, color: "#ffaec8" }, { pattern: "<!--126-->", icon: `<a href="village_def.php"><img src="//dcdn.heroeswm.ru/i/vil_def_n.jpg" alt="" width="15" height="15" border="0"></a>`, color: "#8FBC8F" }, { pattern: "<!--40-->", icon: `<a href="pvp_guild.php" title="${isEn ? "Commander's Guild" : "Гильдия Тактиков"}"><img src="https://dcdn3.heroeswm.ru/i/bselect/tactic.png?v=3b" width="15" height="15" border="0"></a>`, color: "#20B2A0" }, { pattern: "<!--44-->", icon: `<a href="village_def.php"><img src="//dcdn.heroeswm.ru/i/vil_def_n.jpg" alt="" width="15" height="15" border="0"></a>`, color: "#20B2AA" }, { pattern: "<!--111-->", icon: `<a href="village_def.php"><img src="//dcdn.heroeswm.ru/i/vil_def_n.jpg" alt="" width="15" height="15" border="0"></a>`, color: "#808000" }, { pattern: "<!--115-->", icon: `<a href="village_def.php"><img src="//dcdn.heroeswm.ru/i/vil_def_n.jpg" alt="" width="15" height="15" border="0"></a>`, color: "#9ACD32" }, { pattern: "<!--142-->", icon: `<a href="village_def.php"><img src="//dcdn.heroeswm.ru/i/vil_def_n.jpg" alt="" width="15" height="15" border="0"></a>`, color: "#008000" }, { pattern: "<!--138-->", icon: `<a href="map_hero_event.php"><img src="https://dcdn3.heroeswm.ru/i/portraits/cmajakanip33.png" alt="" width="15" height="15" border="0"></a>`, color: "#2E8B55" }, { pattern: "<!--139-->", icon: `<a href="village_def.php"><img src="//dcdn.heroeswm.ru/i/vil_def_n.jpg" alt="" width="15" height="15" border="0"></a>`, color: "#2E8B57" }, { pattern: "<!--26-->", icon: `<a href="village_def.php"><img src="//dcdn.heroeswm.ru/i/vil_def_n.jpg" alt="" width="15" height="15" border="0"></a>`, color: "#FFFF00" }, { pattern: "<!--143-->", icon: `<a href="village_def.php"><img src="//dcdn.heroeswm.ru/i/vil_def_n.jpg" alt="" width="15" height="15" border="0"></a>`, color: "#AFEEEE" }, { pattern: "<!--144-->", icon: `<a href="faction_event.php"><img src="https://dcdn2.heroeswm.ru/i/bselect/faction_event8.png" alt="" width="15" height="15" border="0"></a>`, color: "#AFEEEF" }, { pattern: "<!--80-->", icon: `<a href="mapwars.php" title="${isEn ? "Battles for facilities" : "Бои за территории"}"><img src="https://dcdn2.heroeswm.ru/i/bselect/mapwars.png?v=3b" alt="" width="15" height="15" border="0"></a>`, color: "#00FA9A" }, { pattern: "<!--140-->", icon: `<a href="hunting_event.php"><img src="//dcdn.lordswm.com/i/hunting_event2022_08.png" title="${isEn ? "Hunting Season" : "Сезон охоты"}" width="15" height="15" border="0"></a>`, color: "#7FFFD4" }, { pattern: "<!--133-->", icon: `<a href="village_def.php"><img src="//dcdn.heroeswm.ru/i/vil_def_n.jpg" alt="" width="15" height="15" border="0"></a>`, color: "#40E0D0" }, { pattern: "<!--131-->", icon: `<a href="village_def.php"><img src="//dcdn.heroeswm.ru/i/vil_def_n.jpg" alt="" width="15" height="15" border="0"></a>`, color: "#00CED1" }, { pattern: "<!--67-->", icon: `<a href="village_def.php"><img src="//dcdn.heroeswm.ru/i/vil_def_n.jpg" alt="" width="15" height="15" border="0"></a>`, color: "#5F9EA0" }, { pattern: "<!--99-->", icon: `<a href="treasure_event.php"><img src="https://dcdn.heroeswm.ru/i/klad_event.jpg" alt="" width="15" height="15" border="0"></a>`, color: "#D2B48C" }, { pattern: "<!--81-->", icon: `<a href="village_def.php"><img src="//dcdn.heroeswm.ru/i/vil_def_n.jpg" alt="" width="15" height="15" border="0"></a>`, color: "#A52A2A" }, ]; const logContainerSelector = doc => doc.querySelectorAll('div.global_a_hover')[1] || doc.querySelector('div.global_a_hover'); const pagingContainerSelector = doc => location.pathname == '/gift_box_log.php' ? doc.querySelectorAll('td.wbwhite > center')[2] : doc.querySelector("div.hwm_pagination").parentNode; const p_date = /(\d{2}-\d{2}-\d{2}) (\d{1,2}:\d{2}): /; // pattern const p_user = /(<a.*pl_info\.php\?id=\d+".*><b>.+<\/b><\/a>)/; // pattern let loading = false; let stop = false; const loadCaption = isEn ? "Load" : "Загрузить"; const stopLoadCaption = isEn ? "Stop" : "Остановить"; const forumThreadId = getUrlParamValue(location.href, "id"); const threadId = getUrlParamValue(location.href, "tid"); const smithsThread = isEn ? 121 : 22; const miscellaneousThread = isEn ? 122 : 23; main(); function main() { if(processProtocols()) { return; } if(location.pathname == "/sms.php") { Array.from(document.querySelectorAll("table.wbwhite > tbody > tr > td")).filter(x => x.innerHTML.indexOf("<td") == -1).forEach(exudeReferences); return; } if(location.pathname == "/pl_info.php") { const personalInfoTitleContainer = Array.from(document.querySelectorAll("td.wb > b")).find(x => x.innerText == (isEn ? "Personal info" : "Личная информация")); const personalInfoTable = personalInfoTitleContainer.closest("table"); const personalInfoCell = personalInfoTable.rows[1].cells[0]; exudeReferences(personalInfoCell); return; } const table3 = document.querySelector("table.table3"); if(location.pathname == "/forum_thread.php" && forumThreadId == smithsThread) { // Фильтры для форума услуг кузнецов и оружейников table3.insertAdjacentHTML("beforebegin", ` <tr> <td> <label for=hideCraftersCheckbox style="cursor:pointer;">${isEn ? "Hide crafters" : "Удалять оружейников"}</label> <input type=checkbox ${getPlayerBool("hideCrafters", true) ? 'checked' : ''} id=hideCraftersCheckbox> </td> <td> <label for=hideSmithsCheckbox style="cursor:pointer;">${isEn ? "Hide smiths except 90%" : "Удалять кузнецов, кроме 90%"}</label> <input type=checkbox ${getPlayerBool("hideSmiths") ? 'checked' : ''} id=hideSmithsCheckbox> </td> <td> <label for=hideSmiths90Checkbox style="cursor:pointer;">${isEn ? "Hide smiths 90%" : "Удалять кузнецов 90%"}</label> <input type=checkbox ${getPlayerBool("hideSmiths90") ? 'checked' : ''} id=hideSmiths90Checkbox> </td> </tr>`); document.getElementById("hideCraftersCheckbox").addEventListener("click", function() { setPlayerValue("hideCrafters", this.checked); filterMessages(); }); document.getElementById("hideSmithsCheckbox").addEventListener("click", function() { setPlayerValue("hideSmiths", this.checked); filterMessages(); }); document.getElementById("hideSmiths90Checkbox").addEventListener("click", function() { setPlayerValue("hideSmiths90", this.checked); filterMessages(); }); } if(location.pathname == "/forum_thread.php" && forumThreadId == miscellaneousThread) { // Фильтры для форума покупок, продаж, услуг table3.insertAdjacentHTML("beforebegin", ` <tr> <td> <label for=hideServicesCheckbox style="cursor:pointer;">${isEn ? "Hide services" : "Удалять услуги"}</label> <input type=checkbox ${getPlayerBool("hideServices", true) ? 'checked' : ''} id=hideServicesCheckbox> </td> <td> <label for=hideBuyCheckbox style="cursor:pointer;">${isEn ? "Hide buing" : "Удалять покупки"}</label> <input type=checkbox ${getPlayerBool("hideBuy") ? 'checked' : ''} id=hideBuyCheckbox> </td> <td> <label for=hideSellCheckbox style="cursor:pointer;">${isEn ? "Hide selling" : "Удалять продажи"}</label> <input type=checkbox ${getPlayerBool("hideSell") ? 'checked' : ''} id=hideSellCheckbox> </td> </tr>`); document.getElementById("hideServicesCheckbox").addEventListener("click", function() { setPlayerValue("hideServices", this.checked); filterMessages(); }); document.getElementById("hideBuyCheckbox").addEventListener("click", function() { setPlayerValue("hideBuy", this.checked); filterMessages(); }); document.getElementById("hideSellCheckbox").addEventListener("click", function() { setPlayerValue("hideSell", this.checked); filterMessages(); }); } if(location.pathname == "/forum_messages.php") { table3.insertAdjacentHTML("beforebegin", ` <tr> <td> <label for=hideBlackListMessagesCheckbox style="cursor: pointer;">${isEn ? "Hide marked" : "Скрыть помеченные"}</label> <input type=checkbox ${getPlayerBool("hideBlackListMessages") ? 'checked' : ''} id=hideBlackListMessagesCheckbox> <label for=markedOnlyCheckbox style="cursor: pointer;">${isEn ? "Marked only" : "Только помеченные"}</label> <input type=checkbox ${getPlayerBool("markedOnly") ? 'checked' : ''} id=markedOnlyCheckbox> </td> </tr>`); document.getElementById("hideBlackListMessagesCheckbox").addEventListener("click", function() { setPlayerValue("hideBlackListMessages", this.checked); filterMessages(); }); document.getElementById("markedOnlyCheckbox").addEventListener("click", function() { setPlayerValue("markedOnly", this.checked); filterMessages(); }); addBlackListCheckboxes(); Array.from(table3.querySelectorAll('tr:nth-child(odd) > td:first-child')).forEach(exudeReferences); } const currentPageIndex = getUrlParamValue(location.href, "page") || 0; if(currentPageIndex != "last") { // Кнопка загрузки следующей страницы table3.insertAdjacentHTML("afterend", `<center id=loadNextPageButton style="cursor: pointer;"><ins>${isEn ? "Load next page" : "Загрузить следующую страницу"}</ins><span style="display: none;" id=currentPageIndexHolder>${currentPageIndex}</span></center>`); document.getElementById("loadNextPageButton").addEventListener("click", loadNextPage); } filterMessages(); } function processProtocols() { if(!["/sklad_log.php", "/pl_transfers.php", "/pl_warlog.php", "/clan_log.php", "/gift_box_log.php"].includes(location.pathname)) { return; } const header = pagingContainerSelector(document); const protocolSearchInput = addElement("input", { id: "protocolSearchInput", type: "text", style: "width: 150px; vertical-align: top;", title: isEn ? "Protocol filter" : "Фильтр по протоколу", onfocus: "this.select();" }, header); protocolSearchInput.addEventListener("input", search); const toggleLoadingButton = addElement("div", { id: "toggleLoadingButton", class: "home_button2 btn_hover2", style: "display: inline-block; vertical-align: top; padding: 0px 4px; width: fit-content;", innerText: loadCaption }, header); toggleLoadingButton.addEventListener("click", toggleLoading); const pageCountInput = addElement("input", { id: "pageCountInput", type: "number", value: getPlayerValue("ProtocolPageAmount", 5), style: "width: 70px; vertical-align: top;", title: isEn ? "Page amount to loading" : "Количество страниц для загрузки", onfocus: "this.select();" }, header); pageCountInput.addEventListener("change", function() { setPlayerValue("ProtocolPageAmount", this.value); }); processLog(); return true; } async function toggleLoading() { const toggleLoadingButton = document.getElementById("toggleLoadingButton"); if(loading) { stop = true; return; } loading = true; //stop = false; const currentPageIndex = parseInt(getUrlParamValue(location.href, "page") || 0); const pageCount = Number(getPlayerValue("ProtocolPageAmount", 5)) || 5; for(let newPageIndex = currentPageIndex + 1; newPageIndex <= currentPageIndex + pageCount; newPageIndex++) { toggleLoadingButton.innerText = `${stopLoadCaption} ${newPageIndex + 1}`; const nextPageUrl = new URL(location.href); nextPageUrl.searchParams.set('page', newPageIndex); //console.log(nextPageUrl.toString()); const nextPage = await getRequest(nextPageUrl); processLog(nextPage); window.history.replaceState(null, nextPage.title, nextPageUrl); if(stop) { break; } } loading = false; stop = false; toggleLoadingButton.innerText = loadCaption; } function processLog(doc = document) { remap(doc); const logContainer = logContainerSelector(document); if(!logContainer) { return; } logContainer.style.fontSize = "9pt"; logContainer.style.borderTop = "1px solid black"; const nextPageLogContainer = logContainerSelector(doc); let rawBattles = nextPageLogContainer.innerHTML.split('<br>').filter(x => x && x != "\n" && (!x.startsWith("<center>") || doc == document)); //console.log(rawBattles) //rawBattles.pop(); //location.pathname == '/gift_box_log.php' if(doc == document) { logContainer.innerHTML = ""; } for(let rawBattle of rawBattles) { if(rawBattle.startsWith("<center>")) { logContainer.insertAdjacentHTML("beforeend", rawBattle); continue; } const type = types.find(x => rawBattle.includes(x.pattern)); // rawBattle = rawBattle.replace(p_date, "<div>$1</div><div>$2</div>"); // rawBattle = rawBattle.replace(p_user, "<div>$1</div>"); const rowHtml = (type?.icon || "") + rawBattle.replace("vs", " vs ").replace(" ", " "); const battleContainer = addElement('div', { innerHTML: rowHtml, class: "battle_row", style: `background-color: ${type?.color || "inherit"}` }, logContainer); } search(); } function remap(doc) { if(location.pathname == '/gift_box_log.php') { const logContainer = addElement("div", { class: "global_a_hover" }); const td = doc.querySelector('td.wbwhite'); let i = 0; const children = Array.from(td.childNodes); for(const child of children) { if(i == 3) { child.insertAdjacentElement("afterend", logContainer); //console.log(logContainer) } //console.log(child) if(i > 3) { if(child.nodeName.toLowerCase() == "center") { child.remove(); } else { logContainer.appendChild(child); } } i++; } } } function search() { const value = document.getElementById("protocolSearchInput").value; const regex = new RegExp(value, "gi"); const logContainer = logContainerSelector(document); Array.from(logContainer.querySelectorAll("div")).forEach(x => { x.innerHTML = x.innerHTML.replace(/<\/?mark[^>]*>/g, ""); const searched = regex.test(x.innerHTML); x.style.display = searched ? "" : "none"; if(searched && value.length > 0) { x.innerHTML = x.innerHTML.replace(regex, `<mark>$&</mark>`); } }); } function addBlackListCheckboxes() { if(location.pathname != "/forum_messages.php") { return; } const table3 = document.querySelector("table.table3"); const authorRefs = table3.querySelectorAll("tr > td a[href^='pl_info.php?id=']"); const forumBlackList = JSON.parse(getValue("forumBlackList", "[]")); for(authorRef of authorRefs) { const cell = authorRef.closest("td"); if(!cell.querySelector("input[name=blackListCheckbox]")) { const playerId = parseInt(getUrlParamValue(authorRef.href, "id")); const blackListCheckbox = addElement("input", { type: "checkbox", name: "blackListCheckbox", playerId: playerId, title: isEn ? "Mark" : "Пометить" }); blackListCheckbox.checked = forumBlackList.includes(playerId); blackListCheckbox.addEventListener("change", function() { addToBlackList(this.getAttribute("playerId"), this.checked); }); cell.insertAdjacentElement("afterbegin", blackListCheckbox); } } } function addToBlackList(playerId, adding) { const forumBlackList = JSON.parse(getValue("forumBlackList", "[]")); playerId = parseInt(playerId); if(adding) { if(!forumBlackList.includes(playerId)) { forumBlackList.push(playerId); Array.from(document.querySelectorAll(`table.table3 input[name=blackListCheckbox]`)).filter(x => x.getAttribute("playerId") == playerId).forEach(x => x.checked = true); } } else { const indexOfId = forumBlackList.indexOf(playerId); if(indexOfId > -1) { forumBlackList.splice(indexOfId, 1); Array.from(document.querySelectorAll(`table.table3 input[name=blackListCheckbox]`)).filter(x => x.getAttribute("playerId") == playerId).forEach(x => x.checked = false); } } setValue("forumBlackList", JSON.stringify(forumBlackList)); filterMessages(); } async function loadNextPage() { document.getElementById("loadNextPageButton").disabled = true; const currentPageIndexHolder = document.getElementById('currentPageIndexHolder'); const nextPageIndex = Number(currentPageIndexHolder.innerText) + 1; currentPageIndexHolder.innerText = nextPageIndex; const pageBottom = document.body.scrollHeight; const nextPageUrl = `${location.pathname}?${threadId ? `tid=${threadId}` : ""}${forumThreadId ? `id=${forumThreadId}` : ""}&page=${nextPageIndex}`; //console.log(nextPageUrl) const nextPage = await getRequest(nextPageUrl); const newTable3 = nextPage.querySelector("table.table3 > tbody"); if(location.pathname == "/forum_messages.php") { Array.from(newTable3.querySelectorAll('tr:nth-child(odd) > td:first-child')).forEach(exudeReferences); } const newRows = Array.from(newTable3.rows).slice(1); //console.log(newRows); //const newTable3exec = /(<tr.*><td><a href=.?forum_messages\.php\?tid=.+<\/a><\/td><\/tr>)/.exec(nextPage.querySelector("table.table3").innerHTML); const table3 = document.querySelector("table.table3 > tbody"); //table3.insertAdjacentHTML("beforeend", `<tr><td colspan=2><hr></td><td><a href='${nextPageUrl.slice(1)}'><b><font color=red>${nextPageIndex + 1}</font></b></a></td><td colspan=2><hr></td></tr>${newTable3exec[1]}`); table3.insertAdjacentHTML("beforeend", getBreakLine(nextPageIndex, nextPageUrl)); newRows.forEach(x => table3.insertAdjacentElement("beforeend", x)); addBlackListCheckboxes(); filterMessages(); Array.from(document.querySelectorAll(`center > a[href='${nextPageUrl.slice(1)}']`)).forEach(x => x.replaceWith(addElement("b", {innerHTML: `<font color="red">${nextPageIndex + 1}</font>`}))); // Ссылку на загруженную страницу заменяем красным номером страницы //window.scrollTo(0, pageBottom + 1); window.history.replaceState(null, nextPage.title, nextPageUrl); document.getElementById("loadNextPageButton").disabled = false; } function getBreakLine(nextPageIndex, nextPageUrl) { if(location.pathname == "/forum_thread.php") { return ` <tr> <td colspan=2> <hr> </td> <td> <a href='${nextPageUrl.slice(1)}'><b><font color=red>${nextPageIndex + 1}</font></b></a> </td> <td colspan=2> <hr> </td> </tr>`; } if(location.pathname == "/forum_messages.php") { return ` <tr> <td> <hr style="color: #9f9f9f; background-color: #9f9f9f; border: none; height: 2px;"> </td> <td> <div style="display: flex; flex-direction: row; align-items: center;"> <div style="flex-grow: 0;"> <a href='${nextPageUrl.slice(1)}'><b><font color=red>${nextPageIndex + 1}</font></b></a> </div> <div style="flex-grow: 1; height: 2px; background-color: #9f9f9f;"> </div> </div> </td> </tr>`; } } function filterMessages() { const userFilters = { hideCrafters: getPlayerBool("hideCrafters", true), hideSmiths: getPlayerBool("hideSmiths"), hideSmiths90: getPlayerBool("hideSmiths90"), hideServices: getPlayerBool("hideServices", true), hideBuy: getPlayerBool("hideBuy"), hideSell: getPlayerBool("hideSell"), hideBlackListMessages: getPlayerBool("hideBlackListMessages"), markedOnly: getPlayerBool("markedOnly") }; const forumBlackList = JSON.parse(getValue("forumBlackList", "[]")); let evenRow = false; let rows = Array.from(document.querySelectorAll("table.table3 > tbody > tr")).slice(1); if(location.pathname == "/forum_messages.php") { rows = rows.filter(x => x.cells[0].getAttribute("rowspan") == "2"); } //console.log(`rows.length: ${rows.length}`); for(const row of rows) { let isHideRow = evalHideRow(userFilters, row, forumBlackList); row.style.display = isHideRow ? 'none' : ''; if(location.pathname == "/forum_messages.php") { row.nextElementSibling.style.display = isHideRow ? 'none' : ''; } if(!isHideRow) { if(location.pathname == "/forum_thread.php") { row.className = evenRow ? "second" : ""; } evenRow = !evenRow; } } } function evalHideRow(userFilters, row, forumBlackList) { if(location.pathname == "/forum_messages.php") { if(userFilters.hideBlackListMessages) { const authorRef = row.cells[0].querySelector("a[href^='pl_info.php?id=']"); if(authorRef) { const playerId = parseInt(getUrlParamValue(authorRef.href, "id")); return forumBlackList.includes(playerId); } } if(userFilters.markedOnly) { const authorRef = row.cells[0].querySelector("a[href^='pl_info.php?id=']"); if(authorRef) { const playerId = parseInt(getUrlParamValue(authorRef.href, "id")); return !forumBlackList.includes(playerId); } } return false; } const messageRef = row.querySelector("td > a[href^='forum_messages.php?tid=']"); if(!messageRef) { return false; } const message = messageRef.innerHTML.toLowerCase(); return location.pathname == "/forum_thread.php" && forumThreadId == smithsThread && ( userFilters.hideCrafters && isCraft(message) && !isRepair(message) || userFilters.hideSmiths && isRepairExcept90(message) && !isCraft(message) || userFilters.hideSmiths90 && isRepair90(message) && !isCraft(message) ) || location.pathname == "/forum_thread.php" && forumThreadId == miscellaneousThread && ( userFilters.hideServices && (message.indexOf("услуги") != -1 || message.indexOf("service") != -1) || userFilters.hideBuy && (message.indexOf("куплю") != -1 || message.indexOf("kуплю") != -1 || message.indexOf("buy") != -1) || userFilters.hideSell && (message.indexOf("прода") != -1 || message.indexOf("sell") != -1) ); } function isCraft(message) { return message.indexOf("крафт") != -1 || message.indexOf("kрафт") != -1 || message.indexOf("armour") != -1 || message.indexOf("weapon") != -1 || message.indexOf("jewe") != -1; } function isRepair(message) { return message.indexOf("ремонт") != -1 || message.indexOf("repair") != -1; } function is90(message) { return (message.indexOf("90%") != -1 || message.indexOf("90 %") != -1 || message.indexOf("90 за") != -1); } function isRepair90(message) { return isRepair(message) && is90(message); } function isRepairExcept90(message) { return isRepair(message) && !is90(message); } function exudeReferences(element) { Array.from(element.childNodes).filter(x => x.nodeName == "#text").forEach(x => { addElement('span', { innerHTML: linkify(x.textContent) }, x, "beforebegin"); x.remove(); }) } function linkify(text) { //const Rexp = /(\b(https?|ftp|file):\/\/([-A-Z0-9+&@#%?=~_|!:,.;]*)([-A-Z0-9+&@#%?\/=~_|!:,.;]*)[-A-Z0-9+&@#\/%=~_|])/ig; // Put the URL to variable $1 and Domain name to $3 after visiting the URL const linkRexp = /((http|https|ftp):\/\/[\w?=&.\/-;#~%-]+(?![\w\s?&.\/;#~%"=-]*>))/g; return text.replace(linkRexp, "<a href='$1' target='_blank'>$1</a>"); }