function process() { const params = new URLSearchParams(location.search); if ( params.get("screen") !== "ally" || (params.get("mode") !== "members_defense" && params.get("mode") !== "members_troops") ) { UI.ErrorMessage("Przejdz do Plemie -> Czlonkowie -> Wojska/Obrona", "2e3"); } else { const cacheTime = Data.cacheTime * 60 * 1000; let output = ""; let lackAccessPlayers = ""; let players = []; let scriptName; let firstLine; let showFirstLine; let showNicknames; let mode; if (params.get("mode") === "members_troops") { scriptName = "Zbiorka Wojska"; firstLine = Data.firstLineTroops; showFirstLine = Data.showFirstLineTroops; showNicknames = Data.showNicknamesTroops; mode = "troops"; } else { scriptName = "Zbiorka Deffa"; firstLine = Data.firstLineDeff; showFirstLine = Data.showFirstLineDeff; showNicknames = Data.showNicknamesDeff; mode = "defence"; } // Adds players from current html to get array with players nicknames and ids const AllPlayersList = () => { Array.from( document.querySelector("#ally_content .input-nicer").options ).forEach((option_element, index) => { if (index !== 0) { players.push({ id: option_element.value, nick: option_element.text.trim(), disabled: option_element.disabled, }); } }); }; // Uses some methods to get all stuff from table with units from current html player page const AddPlayerPageToOutput = (playerPageDocument, playerNick, useNick) => { const tableRows = playerPageDocument.querySelectorAll( ".table-responsive .vis tr" ); let noAccess = false; let playerOutputTroops = ""; let coord = ""; tableRows.forEach((oneVillageNode, rowIndex) => { if (rowIndex === 0) { return; } if (output !== "" || playerOutputTroops !== "") { playerOutputTroops += "\r\n"; } if (useNick) { playerOutputTroops += playerNick + ","; } let unitRow = oneVillageNode.querySelectorAll("td"); unitRow.forEach((col, colIndex) => { let value = String(col.innerHTML).trim(); if (value === "?") { noAccess = true; } if (colIndex === 0) { if (value.includes("|")) { value = value.split("").reverse().join(""); const coordIndex1 = value.search("[)]"); const coordIndex2 = value.search("[(]"); value = value.slice(coordIndex1 + 1, coordIndex2); value = value.split("").reverse().join(""); coord = value; } else { playerOutputTroops += coord + ","; } } playerOutputTroops += value + ","; }); }); if (noAccess) { lackAccessPlayers += `

${playerNick}

`; } else { output += playerOutputTroops; } }; // To add player_id to current path const GetURL = (id) => { const params = new URLSearchParams(window.location.search); params.set("player_id", id); return "" .concat(window.location.origin) .concat(window.location.pathname, "?") .concat(params.toString()); }; // Used to parse string from fetch func to html const ConvertToHTML = (pageText) => { const parser = new DOMParser(); const playerPageDocument = parser.parseFromString(pageText, "text/html"); return playerPageDocument.body; }; // 0. If cacheTime smaller than actual Time, use localStorage output. // 1. Use AllPlayersList to get Players. // 2. If no access to a player, his nick goes to lackAccess variable. // 3. ForLoop players with access. // 3.1 Fetch a player page. // 3.2 Add his troops to output -> AddPlayerPageToOutput. // 4. Add results to localStorage. // 5. Dialog with results. async function RenderPlayerTroops() { const removedPlayers = Data.removedPlayers.split(";"); const today = new Date().getTime(); const afterCacheTime = today + cacheTime; const storageDate = localStorage.getItem("troops-storageDate" + mode); let parseTime; if (today < storageDate && Data.cache) { output = localStorage.getItem("troops-output" + mode); lackAccessPlayers = localStorage.getItem( "troops-lackAccessPlayers" + mode ); parseTime = new Date( parseInt(localStorage.getItem("troops-parseTime" + mode)) ); parseTime = parseTime.toLocaleTimeString(); } else { parseTime = new Date(today); parseTime = parseTime.toLocaleTimeString(); AllPlayersList(); players .filter((player) => { return player.disabled === true; }) .map((player) => { let nick = player.nick; const index = nick.search("[(]"); nick = nick.slice(0, index).trim(); lackAccessPlayers += `

${nick}

`; }); await Promise.all( players .filter((player) => { return ( player.disabled === false && !removedPlayers.includes(player.nick) ); }) .map(async (player) => { const response = await fetch(GetURL(player.id)); const html = await response.text(); const playerPageDocument = ConvertToHTML(html); const useNick = showNicknames ? true : false; AddPlayerPageToOutput(playerPageDocument, player.nick, useNick); }) ); localStorage.setItem("troops-parseTime" + mode, String(today)); localStorage.setItem("troops-storageDate" + mode, afterCacheTime); localStorage.setItem("troops-output" + mode, output); localStorage.setItem( "troops-lackAccessPlayers" + mode, lackAccessPlayers ); } Dialog.show( "scriptFinalContent", `

${scriptName}:

${ Data.removedPlayers === "" ? "" : `

Nieuwzględnieni: ${Data.removedPlayers}

` }${ lackAccessPlayers === "" ? `` : `

Uwaga, czesciowy lub calkowity brak podgladu:

` + lackAccessPlayers }

Wygenerowano ${parseTime}.

` ); } RenderPlayerTroops(); } } process();