diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e96518..a9e4998 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 1.11.2 (2026-11-28) + +- correction du bug sur les multiples attaques avec comte +- correction du bug sur le bouton pour sélectionner toutes les troupes +- correction du bug sur l'envoi de ressources vers un village cible +- ajout des ids dans la liste des joueurs d'une alliance +- ajout de l'id sur le profil d'un joueur + ## 1.11.1 (2026-11-24) - ajout de l'id des joueurs dans le classement général et la liste des membres de l'alliance diff --git a/manifest.json b/manifest.json index e494cec..8d3ec58 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 3, "name": "KAplus", - "version": "1.11.1", + "version": "1.11.2", "developer": { "name": "Samuel Campos", diff --git a/metadata.json b/metadata.json index 2a306d0..88c99f8 100644 --- a/metadata.json +++ b/metadata.json @@ -5,8 +5,8 @@ "firefox" ], "release_notes": { - "fr": "- ajout de l'id des joueurs dans le classement général et la liste des membres de l'alliance", - "en-US": "- add players id in ranking and ally members pages" + "fr": "- correction du bug sur les multiples attaques avec comte\n- correction du bug sur le bouton pour sélectionner toutes les troupes\n- correction du bug sur l'envoi de ressources vers un village cible\n- ajout des ids dans la liste des joueurs d'une alliance\n- ajout de l'id sur le profil d'un joueur", + "en-US": "- fix bug on multiple attacks with snob\n- fix bug on button for selecting all units\n- fix bug on sending resources to a target village\n- add player id in other ally member list\n- add id on player profile" } } } \ No newline at end of file diff --git a/src/kaplus.js b/src/kaplus.js index 1812b2e..302d015 100644 --- a/src/kaplus.js +++ b/src/kaplus.js @@ -102,6 +102,23 @@ function shortcutElementReplace(elt, img, text) { } } +function customizeNavbar(layCastleElement) { + /* Improve navbar icons */ + let shortcutElements = layCastleElement.getElementsByClassName("shortcut_element"); + shortcutElementReplace(shortcutElements[0], "ranking", shortcutElements[0].textContent.replace(/[^0-9]/g, "")); + shortcutElementReplace(shortcutElements[1], "ally", ""); + shortcutElementReplace(shortcutElements[2], "profile", ""); + shortcutElementReplace(shortcutElements[3], "premium", ""); + shortcutElementReplace(shortcutElements[4], "messages", ""); + shortcutElementReplace(shortcutElements[5], "tools", ""); + shortcutElementReplace(shortcutElements[6], "favorites", ""); + + /* Center navbar */ + let shortcutContainers = layCastleElement.getElementsByClassName("shortcut_container"); + shortcutContainers[0].classList.add("shortcut_container_left"); + shortcutContainers[2].classList.add("shortcut_container_right"); +} + function countUpMs() { let arrivalDate = new Date(new Date().getTime() + movingDuration * 1000); let prefix = ""; @@ -121,341 +138,457 @@ function countUpMs() { + Math.floor(arrivalDate.getMilliseconds() / 100); } -function handleDomContentLoaded() { +function removeAdsBanner() { /* Remove iframe banner */ document.getElementById("banner_skyscraper").remove(); } +function showPlayersId() { + /* Add a column with player id */ + let mainContentPane = document.getElementsByClassName("contentpane")[1]; + let borderListTable = mainContentPane.getElementsByClassName("borderlist")[0]; + let playerRows = borderListTable.getElementsByTagName("tr"); + + let headerCells = playerRows[0].getElementsByTagName("th"); + let nameCellIndex = -1; + for (let i = 0; i < headerCells.length; i ++) { + if (headerCells[i].textContent === "Nom") { + nameCellIndex = i; + break; + } + } + if (nameCellIndex === -1) { + /* Name column not found, so return */ + console.log("Column 'Nom' not found, cannot show player ids :("); + return; + } + + let idHeaderCell = createCustomElement("th", {"class": headerCells[0].getAttribute("class")}, "Id"); + for (let i = 1; i < playerRows.length; i ++) { + let playerCells = playerRows[i].getElementsByTagName("td"); + let playerProfileLink = playerCells[nameCellIndex].getElementsByTagName("a")[0].getAttribute("href"); + let idValue = playerProfileLink.replace(/^.*id=(\d+)$/, "$1"); + let idCell = createCustomElement("td", {"class": playerCells[0].getAttribute("class")}, idValue); + playerRows[i].insertBefore(idCell, playerCells[nameCellIndex]); + } + playerRows[0].insertBefore(idHeaderCell, headerCells[nameCellIndex]); +} + +function showPlayerUnitPointsAndId() { + let mainContentPane = document.getElementsByClassName("contentpane")[1]; + let borderLists = mainContentPane.getElementsByClassName("borderlist"); + + let playerPropertiesTable = borderLists[0]; + let playerPropertiesTbody = playerPropertiesTable.getElementsByTagName("tbody")[0]; + let playerPropertiesRows = playerPropertiesTable.getElementsByTagName("tr"); + let totalPoints = num(playerPropertiesRows[2].getElementsByTagName("td")[1].textContent); + let villagesCount = num(playerPropertiesRows[4].getElementsByTagName("td")[1].textContent); + + let villagesTable = borderLists[1]; + let villagesRows = villagesTable.getElementsByTagName("tr"); + let villagesPoints = 0; + for (let i = 1; i < villagesRows.length; i += 1) { + villagesPoints += num(villagesRows[i].getElementsByTagName("td")[2].textContent); + } + let villagesBonus = 2250 * Math.max(0, villagesCount - 1); + + let armyPoints = totalPoints - villagesPoints - villagesBonus; + let armyPercent = "-"; + if (villagesCount > 0) { + armyPercent = (Math.round(armyPoints / villagesCount) / 100).toString() + " %"; + } + + let moduleMenu = mainContentPane.getElementsByTagName("table")[0]; + let moduleHyperlink = moduleMenu.getElementsByTagName("a")[0]; + let playerId = moduleHyperlink.getAttribute("href").replace(/^.*[?&]id=(\d+).*$/, "$1"); + + playerPropertiesTbody.appendChild(createKeyValueRow("Points troupes:", str(armyPoints))); + playerPropertiesTbody.appendChild(createKeyValueRow("% points troupes:", armyPercent)); + playerPropertiesTbody.insertBefore(createKeyValueRow("Id:", playerId), playerPropertiesRows[2]); +} + +function showVillageUnitPoints() { + let settlementElt = document.getElementById("settlement"); + if (settlementElt === null) { + console.log("Settlement element not found => cannot show village points :("); + return; + } + let settlements = settlementElt.textContent.split("|"); + let noBorderRows = document.getElementsByClassName("noborder"); + let villagePointsRow = noBorderRows[0]; + for (let i = 0; i < noBorderRows.length; i++) { + if (noBorderRows[i].textContent.startsWith("Points:")) { + villagePointsRow = noBorderRows[i]; + break; + } + } + let unitPointsRow = villagePointsRow.cloneNode(true); + villagePointsRow.getElementsByTagName("td")[1].textContent = "Points village: " + settlements[3]; + unitPointsRow.getElementsByTagName("td")[1].textContent = "Points troupes: " + settlements[4]; + villagePointsRow.after(unitPointsRow); +} + +function showBarrackSelectAllUnits() { + let sendCommandForm = document.getElementById("sendCommandForm"); + let barracksCommands = sendCommandForm.getElementsByClassName("barracksCommand"); + let borderListTables = sendCommandForm.getElementsByClassName("borderlist"); + + let unitCountBoxes = []; + if (barracksCommands.length === 1) { + unitCountBoxes = barracksCommands[0].getElementsByClassName("box"); + } else if (borderListTables.length === 1) { + unitCountBoxes = borderListTables[0].getElementsByTagName("td"); + } + for (let i = 0; i < unitCountBoxes.length; i ++) { + let unitCountInputs = unitCountBoxes[i].getElementsByTagName("input"); + if (unitCountInputs.length === 0) { + continue; + } + let unitCountInput = unitCountInputs[0]; + if (unitCountInput.getAttribute("type") === null) { + unitCountInput.setAttribute("type", "number"); + unitCountInput.style.width = "65px"; + } + } + + let sendXInput = document.getElementById("send_x"); + sendXInput.setAttribute("type", "number"); + if (sendXInput.value === "0") { + sendXInput.value = ""; + } + + let sendYInput = document.getElementById("send_y"); + sendYInput.setAttribute("type", "number"); + if (sendYInput.value === "0") { + sendYInput.value = ""; + } + + let selectAllLabel = createCustomElement("label"); + let selectAllInput = createCustomElement("input", {"type": "checkbox"}); + selectAllInput.addEventListener("change", function () { + for (let i = 0; i < unitCountBoxes.length; i ++) { + let unitCountBox = unitCountBoxes[i]; + let unitCountClicks = unitCountBox.getElementsByClassName("click"); + if (unitCountClicks.length === 0) { + continue; + } + + let unitCountClick = unitCountClicks[0]; + if (unitCountClick.classList.contains("all")) { + continue; + } + + let unitCountInput = unitCountBox.getElementsByTagName("input")[0]; + if (this.checked && unitCountClick.textContent !== "(0)") { + unitCountInput.value = unitCountClick.textContent.replace(/^\(([^.]*)(\.([^.]*))?\)$/, "$1$3"); + } else { + unitCountInput.value = ""; + } + } + }) + selectAllLabel.appendChild(selectAllInput); + let selectAllSpan = createCustomElement("span", {"class": "click all"}, "(Tout sélectionner)"); + selectAllLabel.appendChild(selectAllSpan); + + /* Modern style */ + if (barracksCommands.length === 1) { + let boxCell = createCustomElement("div", {"class": "box"}); + + let backgroundCell = createCustomElement("div", {"class": "background"}); + let backgroundImg = createCustomElement( + "img", {"src": "//s58-fr.kingsage.gameforge.com/img/modern/card_sendunit.png"} + ); + backgroundCell.appendChild(backgroundImg); + boxCell.appendChild(backgroundCell); + + let imageCell = createCustomElement("div", {"class": "image"}); + let imageImg = createCustomElement( + "img", {"src": "//s58-fr.kingsage.gameforge.com/img/shortcut/barracks.png"}, null, {"width": "28px"} + ); + imageCell.appendChild(imageImg); + boxCell.appendChild(imageCell); + + let nameCell = createCustomElement("div", {"class": "name"}); + let nameA = createCustomElement("a", {"href": "help.php?m=units", "target": "_help"}); + let nameB = createCustomElement("b", null, "Tout"); + nameA.appendChild(nameB); + nameCell.appendChild(nameA); + boxCell.appendChild(nameCell); + + let selectAllCell = createCustomElement("div", {"class": "quantity"}); + selectAllCell.appendChild(selectAllLabel); + boxCell.appendChild(selectAllCell); + + let brTag = barracksCommands[0].getElementsByTagName("br")[1]; + barracksCommands[0].insertBefore(boxCell, brTag); + + /* Classic style */ + } else if (borderListTables.length === 1) { + let borderListRows = borderListTables[0].getElementsByTagName("tr"); + let selectAllCell = borderListRows[4].getElementsByTagName("td")[3]; + + let imageA = createCustomElement("a", {"href": "help.php?m=units", "target": "_help"}); + let imageImg = createCustomElement( + "img", {"src": "//s58-fr.kingsage.gameforge.com/img/shortcut/barracks.png", "title": "Tout"} + ); + imageA.appendChild(imageImg); + selectAllCell.appendChild(imageA); + + selectAllCell.appendChild(selectAllLabel); + } +} + +function showCountupTimeDecimals() { + let oldCell = document.getElementById("countup-time"); + let hms = oldCell.parentElement.previousElementSibling.getElementsByTagName("td")[1].textContent.split(":"); + movingDuration = parseInt(hms[0]) * 3600 + parseInt(hms[1]) * 60 + parseInt(hms[2]) ; + let newRow = createCustomElement("tr"); + let newLeftCell = createCustomElement("td", null, "Arrivée:"); + newRow.appendChild(newLeftCell); + let newRightCell = createCustomElement("td", {"id": "countup-time-ms"}); + newRow.appendChild(newRightCell); + oldCell.parentElement.parentElement.insertBefore(newRow, oldCell.parentElement); + oldCell.parentElement.style.display = "none"; + setInterval(countUpMs, 100); +} + +function showOccurrencesInput() { + let table = createCustomElement("table", {"class": "borderlist"}); + let tbody = createCustomElement("tbody"); + let tr = createCustomElement("tr"); + let th = createCustomElement("th", null, "Nombre d'occurrences:"); + tr.appendChild(th) + let td = createCustomElement("td"); + let input = createCustomElement("input", {"type": "number", "name": "occurrences", "value": "1"}); + td.appendChild(input); + tr.appendChild(td); + tbody.appendChild(tr); + table.appendChild(tbody); + let form = document.getElementsByTagName("form")[0]; + let firstInput = form.getElementsByTagName("input")[0]; + form.insertBefore(table, firstInput); + form.addEventListener("submit", function (event) { + event.preventDefault(); + let formData = new FormData(this); + let attackCount = parseInt(formData.get("occurrences").toString()); + formData.delete("occurrences"); + let sent = 0; + for (let i = 0; i < attackCount; i ++) { + let xhr = new XMLHttpRequest(); + xhr.addEventListener("readystatechange", function () { + if (this.readyState === this.DONE) { + sent ++; + } + if (sent === attackCount) { + window.location.replace(xhr.responseURL); + } + }) + xhr.open(this.method, this.action, true); + xhr.send(formData); + } + }); +} + +function fixSelectVillageBug() { + let select = document.getElementsByName("village_name")[0]; + select.removeAttribute("onchange"); + select.addEventListener("change", function () { + let sendX = document.getElementById("send_x"); + let sendY = document.getElementById("send_y"); + if (this.selectedIndex === 0) { + sendX.value = ""; + sendY.value = ""; + } else { + let xy = this.value.split("|"); + sendX.value = xy[0]; + sendY.value = xy[1]; + } + }); +} + +function showThousandInputs() { + let sendForm = document.getElementsByTagName("form")[0] + sendForm.addEventListener("submit", function () { + let inputs = this.getElementsByTagName("input"); + for (let i = 0; i < inputs.length; i ++) { + if (inputs[i].getAttribute("name").endsWith("_k")) { + inputs[i].setAttribute("name", ""); + } + } + }); + let sendFormTables = sendForm.getElementsByTagName("table"); + let newTable = sendFormTables[0].cloneNode(true); + newTable.getElementsByTagName("th")[0].textContent = "Ressources par milliers"; + let resCells = newTable.getElementsByTagName("td"); + for (let i = 0; i < resCells.length; i ++) { + let resInput = resCells[i].getElementsByTagName("input")[0]; + let resName = resInput.getAttribute("name"); + let resNameK = resInput.getAttribute("name") + "_k"; + resInput.setAttribute("name", resNameK); + resInput.addEventListener("change", function () { + document.getElementsByName(resName)[0].value = 1000 * parseInt(this.value); + }); + let spanInput = resCells[i].getElementsByTagName("span")[0]; + let resMax = spanInput.textContent.replace(/\(/, "").replace("\)", "").replace(/\./, ""); + let rMax = Math.floor(parseInt(resMax) / 1000); + spanInput.setAttribute( + "onclick", + "insertNum('kingsage', '" + resNameK + "', '" + rMax.toString() + "'); " + + "insertNum('kingsage', '" + resName + "', '" + (1000 * rMax).toString() + "');" + ) + spanInput.textContent = "(" + rMax.toString() + "K)"; + } + sendForm.insertBefore(newTable, sendFormTables[0]); + sendForm.insertBefore(createCustomElement("br"), sendFormTables[1]); +} + +function fixSendResourcesInputsTypes() { + let contentPane = document.getElementsByClassName("contentpane")[1] + let sendCommandForm = contentPane.getElementsByTagName("form")[0]; + let sendInputs = sendCommandForm.getElementsByTagName("input"); + for (let i = 0; i < sendInputs.length; i ++) { + if (sendInputs[i].name.startsWith("send_")) { + sendInputs[i].setAttribute("type", "number"); + if (sendInputs[i].value === "0") { + sendInputs[i].value = ""; + } + sendInputs[i].style.width = "65px"; + } + } +} + +function showSecondsAndCalculator() { + let serverTime = parseInt(document.getElementById("servertime").getAttribute("time")); + let contentPane = document.getElementsByClassName("contentpane")[1] + let table = contentPane.getElementsByClassName("borderlist")[0]; + let rows = table.getElementsByTagName("tr"); + + let headCell = createCustomElement("th"); + rows[0].appendChild(headCell); + + for (let i = 1; i < rows.length; i ++) { + let cells = rows[i].getElementsByTagName("td"); + let arrivalDateCell = cells[3] + let arrivalTimeCell = cells[4]; + + let seconds = parseInt(arrivalTimeCell.getElementsByTagName("span")[0].getAttribute("time")); + let arrival = new Date((serverTime + seconds) * 1000); + let hour = arrival.toLocaleTimeString("fr-FR"); + arrivalDateCell.textContent = arrivalDateCell.textContent.replace(/(.*)\d\d:\d\d(.*)/, "$1" + hour + "$2"); + + let startPoint = searchPoint(cells[2].textContent); + let targetPoint = searchPoint(cells[1].textContent); + let calculatorCell = createCustomElement("td"); + let calculatorForm = createCustomElement( + "form", {"method": "post", "action": "/?s=tools&m=runtime_calculator&inta=calculate"} + ); + calculatorForm.appendChild(createCustomInput("hidden", "start_x", startPoint.x)); + calculatorForm.appendChild(createCustomInput("hidden", "start_y", startPoint.y)); + calculatorForm.appendChild(createCustomInput("hidden", "target_x", targetPoint.x)); + calculatorForm.appendChild(createCustomInput("hidden", "target_y", targetPoint.y)); + let calculatorImg = createCustomInput( + "image", + null, + null, + {"src": chrome.runtime.getURL("images/calculator.svg")}, + {"width": "20px", "height": "20px", "border": "none"} + ); + calculatorForm.appendChild(calculatorImg); + calculatorCell.appendChild(calculatorForm); + rows[i].appendChild(calculatorCell); + } +} + function main() { + /* Exit immediately if not on game page */ + let layCastleTopElements = document.getElementsByClassName("lay_castle_top"); + if (layCastleTopElements.length === 0) { + return; + } + /* Exit immediately if extension has already been loaded */ let kaplus = document.getElementById("kaplus-marker"); if (kaplus) { return; } - /* Exit immediately if not on game page */ - let layCastleTopElements = document.getElementsByClassName("lay_castle_top"); - if (layCastleTopElements.length === 0) { - return; - } - window.addEventListener("DOMContentLoaded", handleDomContentLoaded); - - /* Add extension marker */ + /* Set marker to prevent loading extension several times */ document.body.appendChild(createCustomElement("div", {"id": "kaplus-marker"}, null, {"display": "none"})); - /* Improve navbar icons */ - let shortcutElements = layCastleTopElements[0].getElementsByClassName("shortcut_element"); - shortcutElementReplace(shortcutElements[0], "ranking", shortcutElements[0].textContent.replace(/[^0-9]/g, "")); - shortcutElementReplace(shortcutElements[1], "ally", ""); - shortcutElementReplace(shortcutElements[2], "profile", ""); - shortcutElementReplace(shortcutElements[3], "premium", ""); - shortcutElementReplace(shortcutElements[4], "messages", ""); - shortcutElementReplace(shortcutElements[5], "tools", ""); - shortcutElementReplace(shortcutElements[6], "favorites", ""); + /* Remove ads banner on dom content loaded */ + window.addEventListener("DOMContentLoaded", removeAdsBanner); - /* Center navbar */ - let shortcutContainers = layCastleTopElements[0].getElementsByClassName("shortcut_container"); - shortcutContainers[0].classList.add("shortcut_container_left"); - shortcutContainers[2].classList.add("shortcut_container_right"); + /* Customize navbar */ + customizeNavbar(layCastleTopElements[0]); // test: OK /* Parse url params and switch case */ let urlParams = new URLSearchParams(window.location.search); let section = urlParams.get("s"); let module = urlParams.get("m"); let sub = urlParams.get("sub"); - let sendCommandForm = document.getElementById("sendCommandForm"); - /* Add player id on ranking */ - if (section === "ranking" || (section === "ally" && module === "members")) { - let mainContentPane = document.getElementsByClassName("contentpane")[1]; - let borderListTable = mainContentPane.getElementsByClassName("borderlist")[0]; - let playerRows = borderListTable.getElementsByTagName("tr"); - - let headerCells = playerRows[0].getElementsByTagName("th"); - let idHeaderCell = createCustomElement("th", {"class": headerCells[0].getAttribute("class")}, "Id"); - playerRows[0].insertBefore(idHeaderCell, headerCells[1]); - - for (let i = 1; i < playerRows.length; i ++) { - let playerCells = playerRows[i].getElementsByTagName("td"); - let playerProfileLink = playerCells[1].getElementsByTagName("a")[0].getAttribute("href"); - let idValue = playerProfileLink.replace(/^.*id=(\d+)$/, "$1"); - let idCell = createCustomElement("td", {"class": playerCells[0].getAttribute("class")}, idValue); - playerRows[i].insertBefore(idCell, playerCells[1]); - } - } - - /* Display unit-points on user profile */ - if (section === "info_player" && (module === "profile" || module === null)) { - let mainContentPane = document.getElementsByClassName("contentpane")[1]; - let borderLists = mainContentPane.getElementsByClassName("borderlist"); - - let playerPropertiesTable = borderLists[0]; - let playerPropertiesRows = playerPropertiesTable.getElementsByTagName("tr"); - let totalPoints = num(playerPropertiesRows[2].getElementsByTagName("td")[1].textContent); - let villagesCount = num(playerPropertiesRows[4].getElementsByTagName("td")[1].textContent); - - let villagesTable = borderLists[1]; - let villagesRows = villagesTable.getElementsByTagName("tr"); - let villagesPoints = 0; - for (let i = 1; i < villagesRows.length; i += 1) { - villagesPoints += num(villagesRows[i].getElementsByTagName("td")[2].textContent); - } - let villagesBonus = 2250 * Math.max(0, villagesCount - 1); - - let armyPoints = totalPoints - villagesPoints - villagesBonus; - let armyPercent = "-"; - if (villagesCount > 0) { - armyPercent = (Math.round(armyPoints / villagesCount) / 100).toString() + " %"; - } - - playerPropertiesTable.appendChild(createKeyValueRow("Points troupes:", str(armyPoints))); - playerPropertiesTable.appendChild(createKeyValueRow("% points troupes:", armyPercent)); - } - - /* Display unit-points on village overview */ - if (section === "overview") { - let settlements = document.getElementById("settlement").textContent.split("|"); - let noBorderRows = document.getElementsByClassName("noborder"); - let villagePointsRow = noBorderRows[0]; - for (let i = 0; i < noBorderRows.length; i++) { - if (noBorderRows[i].textContent.startsWith("Points:")) { - villagePointsRow = noBorderRows[i]; - break; + /* Choose action according to section, module and sub */ + switch (section) { + case "ranking": + switch (module) { + case "player": case null: + showPlayersId(); // test: OK + break; } - } - let unitPointsRow = villagePointsRow.cloneNode(true); - villagePointsRow.getElementsByTagName("td")[1].textContent = "Points village: " + settlements[3]; - unitPointsRow.getElementsByTagName("td")[1].textContent = "Points troupes: " + settlements[4]; - villagePointsRow.after(unitPointsRow); - } + break; - /* Units order page */ - if (section === "build_barracks" && (module === null || module === "command") && sendCommandForm !== null) { - let barracksCommands = sendCommandForm.getElementsByClassName("barracksCommand"); - let borderListTables = sendCommandForm.getElementsByClassName("borderlist"); - - let quantityLabel = createCustomElement("label"); - let quantityInput = createCustomElement("input", {"type": "checkbox"}); - quantityInput.addEventListener("change", function () { - let clickSpans = []; - if (barracksCommands.length === 1) { - clickSpans = barracksCommands[0].getElementsByClassName("click"); - } else if (borderListTables.length === 1) { - clickSpans = borderListTables[0].getElementsByClassName("click"); + case "ally": + switch (module) { + case "members": + showPlayersId(); // test: OK + break; + case "attacks": + showSecondsAndCalculator(); // test: OK + break; } - for (let i = 0; i < 12; i++) { - if (clickSpans[i].classList.contains("all")) { - continue; - } - clickSpans[i].click(); - } - }) - quantityLabel.appendChild(quantityInput); - let quantitySpan = createCustomElement("span", {"class": "click all"}, "(Tout sélectionner)"); - quantityLabel.appendChild(quantitySpan); + break; - if (barracksCommands.length === 1) { - let boxCell = createCustomElement("div", {"class": "box"}); + case "overview": + showVillageUnitPoints(); // test: FAILED because settlement element has been removed + break; - let backgroundCell = createCustomElement("div", {"class": "background"}); - let backgroundImg = createCustomElement( - "img", {"src": "//s58-fr.kingsage.gameforge.com/img/modern/card_sendunit.png"} - ); - backgroundCell.appendChild(backgroundImg); - boxCell.appendChild(backgroundCell); - - let imageCell = createCustomElement("div", {"class": "image"}); - let imageImg = createCustomElement( - "img", {"src": "//s58-fr.kingsage.gameforge.com/img/shortcut/barracks.png"}, null, {"width": "28px"} - ); - imageCell.appendChild(imageImg); - boxCell.appendChild(imageCell); - - let nameCell = createCustomElement("div", {"class": "name"}); - let nameA = createCustomElement("a", {"href": "help.php?m=units", "target": "_help"}); - let nameB = createCustomElement("b", null, "Tout"); - nameA.appendChild(nameB); - nameCell.appendChild(nameA); - boxCell.appendChild(nameCell); - - let quantityCell = createCustomElement("div", {"class": "quantity"}); - quantityCell.appendChild(quantityLabel); - boxCell.appendChild(quantityCell); - - let brTag = barracksCommands[0].getElementsByTagName("br")[1]; - barracksCommands[0].insertBefore(boxCell, brTag); - - } else if (borderListTables.length === 1) { - let borderListRows = borderListTables[0].getElementsByTagName("tr"); - let selectAllCell = borderListRows[1].getElementsByTagName("td")[3]; - - let imageA = createCustomElement("a", {"href": "help.php?m=units", "target": "_help"}); - let imageImg = createCustomElement( - "img", {"src": "//s58-fr.kingsage.gameforge.com/img/shortcut/barracks.png", "title": "Tout"} - ); - imageA.appendChild(imageImg); - selectAllCell.appendChild(imageA); - - selectAllCell.appendChild(quantityLabel); - } - } - - /* Units sending page */ - if (section === "build_barracks" && module === "command" && sub === "send" && sendCommandForm === null) { - /* Improve countup time cell */ - let oldCell = document.getElementById("countup-time"); - let hms = oldCell.parentElement.previousElementSibling.getElementsByTagName("td")[1].textContent.split(":"); - movingDuration = parseInt(hms[0]) * 3600 + parseInt(hms[1]) * 60 + parseInt(hms[2]) ; - let newRow = createCustomElement("tr"); - let newLeftCell = createCustomElement("td", null, "Arrivée:"); - newRow.appendChild(newLeftCell); - let newRightCell = createCustomElement("td", {"id": "countup-time-ms"}); - newRow.appendChild(newRightCell); - oldCell.parentElement.parentElement.insertBefore(newRow, oldCell.parentElement); - oldCell.parentElement.style.display = "none"; - setInterval(countUpMs, 100); - - /* Allow multiple occurrences of send */ - let table = createCustomElement("table", {"class": "borderlist"}); - let tbody = createCustomElement("tbody"); - let tr = createCustomElement("tr"); - let th = createCustomElement("th", null, "Nombre d'occurrences:"); - tr.appendChild(th) - let td = createCustomElement("td"); - let input = createCustomElement("input", {"type": "number", "name": "occurrences", "value": "1"}); - td.appendChild(input); - tr.appendChild(td); - tbody.appendChild(tr); - table.appendChild(tbody); - let form = document.getElementsByTagName("form")[0]; - let firstInput = form.getElementsByTagName("input")[0]; - form.insertBefore(table, firstInput); - form.addEventListener("submit", function (event) { - let formData = new FormData(this); - let attackCount = parseInt(formData.get("occurrences").toString()); - formData.delete("occurrences"); - let sent = 0; - for (let i = 0; i < attackCount; i++) { - let xhr = new XMLHttpRequest(); - xhr.onload = function () { - sent++; - if (sent === attackCount) { - window.location.replace(xhr.responseURL); + case "build_barracks": + switch (module) { + case "command": case null: + switch (sub) { + case null: + showBarrackSelectAllUnits(); // test: OK + break; + case "send": + showCountupTimeDecimals(); // test: OK + showOccurrencesInput(); // test: OK + break; } - } - xhr.open(this.method, this.action, true); - xhr.send(formData); + break; } - }); - } + break; - /* Market sending page */ - if (section === "build_market" && (module === "send" || module === null)) { - /* Fix select bug in target village select */ - let select = document.getElementsByName("village_name")[0]; - select.removeAttribute("onchange"); - select.addEventListener("change", function () { - let sendX = document.getElementById("send_x"); - let sendY = document.getElementById("send_y"); - if (this.selectedIndex === 0) { - sendX.value = ""; - sendY.value = ""; - } else { - let xy = this.value.split("|"); - sendX.value = xy[0]; - sendY.value = xy[1]; + case "build_market": + switch (module) { + case "send": case null: + fixSelectVillageBug(); // test: OK + showThousandInputs(); // test: OK + fixSendResourcesInputsTypes(); // test: OK + break; } - }); + break; - /* Add form to send resources by thousands */ - let sendForm = document.getElementsByTagName("form")[0] - sendForm.addEventListener("submit", function () { - let inputs = this.getElementsByTagName("input"); - for (let i = 0; i < inputs.length; i ++) { - if (inputs[i].getAttribute("name").endsWith("_k")) { - inputs[i].setAttribute("name", ""); - } + case "info_player": + switch (module) { + case "profile": case null: + showPlayerUnitPointsAndId(); // test: OK + break; } - }); - let sendFormTables = sendForm.getElementsByTagName("table"); - let newTable = sendFormTables[0].cloneNode(true); - newTable.getElementsByTagName("th")[0].textContent = "Ressources par milliers"; - let resCells = newTable.getElementsByTagName("td"); - for (let i = 0; i < resCells.length; i ++) { - let resInput = resCells[i].getElementsByTagName("input")[0]; - let resName = resInput.getAttribute("name"); - let resNameK = resInput.getAttribute("name") + "_k"; - resInput.setAttribute("name", resNameK); - resInput.addEventListener("change", function () { - document.getElementsByName(resName)[0].value = 1000 * parseInt(this.value); - }); - let spanInput = resCells[i].getElementsByTagName("span")[0]; - let resMax = spanInput.textContent.replace(/\(/, "").replace("\)", "").replace(/\./, ""); - let rMax = Math.floor(parseInt(resMax) / 1000); - spanInput.setAttribute( - "onclick", - "insertNum('kingsage', '" + resNameK + "', '" + rMax.toString() + "'); " + - "insertNum('kingsage', '" + resName + "', '" + (1000 * rMax).toString() + "');" - ) - spanInput.textContent = "(" + rMax.toString() + "K)"; - } - sendForm.insertBefore(newTable, sendFormTables[0]); - sendForm.insertBefore(createCustomElement("br"), sendFormTables[1]); + break; - /* Set inputs type=number */ - let sendInputs = sendForm.getElementsByTagName("input"); - for (let i = 0; i < sendInputs.length; i ++) { - if (sendInputs[i].name.startsWith("send_")) { - sendInputs[i].setAttribute("type", "number"); - if (sendInputs[i].value === "0") { - sendInputs[i].value = ""; - } - sendInputs[i].style.width = "65px"; - } - } - } - - /* Improve attacks display */ - if (section === "ally" && module === "attacks") { - let serverTime = parseInt(document.getElementById("servertime").getAttribute("time")); - let contentPane = document.getElementsByClassName("contentpane")[1] - let table = contentPane.getElementsByClassName("borderlist")[0]; - let rows = table.getElementsByTagName("tr"); - - let headCell = createCustomElement("th"); - rows[0].appendChild(headCell); - - for (let i = 1; i < rows.length; i ++) { - let cells = rows[i].getElementsByTagName("td"); - let arrivalDateCell = cells[3] - let arrivalTimeCell = cells[4]; - - let seconds = parseInt(arrivalTimeCell.getElementsByTagName("span")[0].getAttribute("time")); - let arrival = new Date((serverTime + seconds) * 1000); - let hour = arrival.toLocaleTimeString("fr-FR"); - arrivalDateCell.textContent = arrivalDateCell.textContent.replace(/(.*)\d\d:\d\d(.*)/, "$1" + hour + "$2"); - - let startPoint = searchPoint(cells[2].textContent); - let targetPoint = searchPoint(cells[1].textContent); - let calculatorCell = createCustomElement("td"); - let calculatorForm = createCustomElement( - "form", {"method": "post", "action": "/?s=tools&m=runtime_calculator&inta=calculate"} - ); - calculatorForm.appendChild(createCustomInput("hidden", "start_x", startPoint.x)); - calculatorForm.appendChild(createCustomInput("hidden", "start_y", startPoint.y)); - calculatorForm.appendChild(createCustomInput("hidden", "target_x", targetPoint.x)); - calculatorForm.appendChild(createCustomInput("hidden", "target_y", targetPoint.y)); - let calculatorImg = createCustomInput( - "image", - null, - null, - {"src": chrome.runtime.getURL("images/calculator.svg")}, - {"width": "20px", "height": "20px", "border": "none"} - ); - calculatorForm.appendChild(calculatorImg); - calculatorCell.appendChild(calculatorForm); - rows[i].appendChild(calculatorCell); - } + case "info_member": + showPlayersId(); // test: OK + break; } }