|
|
|
|
@@ -1,3 +1,8 @@
|
|
|
|
|
let tomorrow = new Date(new Date().getTime() + 24*60*60*1000);
|
|
|
|
|
tomorrow.setHours(0, 0, 0, 0);
|
|
|
|
|
let afterTomorrow = new Date(tomorrow.getTime() + 24*60*60*1000);
|
|
|
|
|
let movingDuration = 0;
|
|
|
|
|
|
|
|
|
|
function num(s) {
|
|
|
|
|
return parseInt(s.replace(".", ""));
|
|
|
|
|
}
|
|
|
|
|
@@ -18,55 +23,88 @@ function str(n) {
|
|
|
|
|
return s.replace(/^0+/, "");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function createRow(key, value) {
|
|
|
|
|
let keyCell = document.createElement("td");
|
|
|
|
|
keyCell.textContent = key;
|
|
|
|
|
function createCustomElement(tag, attrs, text, style) {
|
|
|
|
|
let elt = document.createElement(tag);
|
|
|
|
|
if (attrs) {
|
|
|
|
|
for (let [key, value] of Object.entries(attrs)) {
|
|
|
|
|
if (value !== null) {
|
|
|
|
|
elt.setAttribute(key, value.toString());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (text) {
|
|
|
|
|
elt.textContent = text.toString();
|
|
|
|
|
}
|
|
|
|
|
if (style) {
|
|
|
|
|
for (let [key, value] of Object.entries(style)) {
|
|
|
|
|
elt.style[key] = value.toString();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return elt;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let valueCell = document.createElement("td");
|
|
|
|
|
valueCell.textContent = value;
|
|
|
|
|
function createCustomInput(type, name, value, attrs, style) {
|
|
|
|
|
let mergedAttrs = {};
|
|
|
|
|
if (attrs) {
|
|
|
|
|
mergedAttrs = attrs;
|
|
|
|
|
}
|
|
|
|
|
mergedAttrs["type"] = type;
|
|
|
|
|
if (name) {
|
|
|
|
|
mergedAttrs["name"] = name;
|
|
|
|
|
}
|
|
|
|
|
if (value) {
|
|
|
|
|
mergedAttrs["value"] = value;
|
|
|
|
|
}
|
|
|
|
|
return createCustomElement("input", mergedAttrs, null, style);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let row = document.createElement("tr");
|
|
|
|
|
function createKeyValueRow(key, value) {
|
|
|
|
|
let row = createCustomElement("tr");
|
|
|
|
|
let keyCell = createCustomElement("td", null, key);
|
|
|
|
|
let valueCell = createCustomElement("td", null, value);
|
|
|
|
|
row.appendChild(keyCell);
|
|
|
|
|
row.appendChild(valueCell);
|
|
|
|
|
return row;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function searchPoint(text) {
|
|
|
|
|
let index = text.search(/\d{3}\|\d{3}/);
|
|
|
|
|
let point = text.slice(index, index + 7).split("|");
|
|
|
|
|
return {x: point[0], y: point[1]}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function shortcutElementReplace(elt, img, text) {
|
|
|
|
|
// If more than one hyperlink element found,
|
|
|
|
|
// then keep the last one but with href of the first one.
|
|
|
|
|
let aElements = elt.getElementsByTagName("a");
|
|
|
|
|
if (aElements.length > 1) {
|
|
|
|
|
let imgElements = elt.getElementsByTagName("img");
|
|
|
|
|
if (aElements.length > 1 || imgElements.length > 0) {
|
|
|
|
|
aElements[aElements.length - 1].classList.add("has_notif");
|
|
|
|
|
aElements[aElements.length - 1].setAttribute("href", aElements[0].getAttribute("href"));
|
|
|
|
|
for (let i = aElements.length - 2; i >= 0; i --) {
|
|
|
|
|
for (let i = imgElements.length - 1; i >= 0; i--) {
|
|
|
|
|
imgElements[i].remove();
|
|
|
|
|
}
|
|
|
|
|
for (let i = aElements.length - 2; i >= 0; i--) {
|
|
|
|
|
aElements[i].remove();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let spanImageElement = document.createElement("span");
|
|
|
|
|
spanImageElement.classList.add("shortcut_element_image");
|
|
|
|
|
|
|
|
|
|
let imgElement = document.createElement("img");
|
|
|
|
|
imgElement.setAttribute("src", chrome.runtime.getURL("images/"+img+".svg"));
|
|
|
|
|
let spanImageElement = createCustomElement("span", {"class": "shortcut_element_image"});
|
|
|
|
|
let imgElement = createCustomElement("img", {"src": chrome.runtime.getURL("images/" + img + ".svg")});
|
|
|
|
|
spanImageElement.appendChild(imgElement);
|
|
|
|
|
|
|
|
|
|
aElements[0].textContent = "";
|
|
|
|
|
aElements[0].appendChild(spanImageElement);
|
|
|
|
|
|
|
|
|
|
if (text) {
|
|
|
|
|
let spanDescElement = document.createElement("span");
|
|
|
|
|
spanDescElement.classList.add("shortcut_element_desc");
|
|
|
|
|
spanDescElement.textContent = text;
|
|
|
|
|
let spanDescElement = createCustomElement("span", {"class": "shortcut_element_desc"}, text);
|
|
|
|
|
aElements[0].appendChild(spanDescElement);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Improve main menu display */
|
|
|
|
|
let layCastleTopElements = document.getElementsByClassName("lay_castle_top");
|
|
|
|
|
if (layCastleTopElements.length === 1) {
|
|
|
|
|
document.getElementById("banner_skyscraper").remove();
|
|
|
|
|
|
|
|
|
|
let shortcutElements = layCastleTopElements[0].getElementsByClassName("shortcut_element");
|
|
|
|
|
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", "");
|
|
|
|
|
@@ -75,17 +113,73 @@ if (layCastleTopElements.length === 1) {
|
|
|
|
|
shortcutElementReplace(shortcutElements[5], "tools", "");
|
|
|
|
|
shortcutElementReplace(shortcutElements[6], "favorites", "");
|
|
|
|
|
|
|
|
|
|
let shortcutContainers = layCastleTopElements[0].getElementsByClassName("shortcut_container");
|
|
|
|
|
/* Center navbar */
|
|
|
|
|
let shortcutContainers = layCastleElement.getElementsByClassName("shortcut_container");
|
|
|
|
|
shortcutContainers[0].classList.add("shortcut_container_left");
|
|
|
|
|
shortcutContainers[2].classList.add("shortcut_container_right");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Display unit-points on user profile */
|
|
|
|
|
if (document.body.id === "info_player") {
|
|
|
|
|
function countUpMs() {
|
|
|
|
|
let arrivalDate = new Date(new Date().getTime() + movingDuration * 1000);
|
|
|
|
|
let prefix = "";
|
|
|
|
|
if (arrivalDate >= afterTomorrow) {
|
|
|
|
|
prefix = "le " + arrivalDate.getDate() + "." + arrivalDate.getMonth() + " ";
|
|
|
|
|
} else if (arrivalDate > tomorrow) {
|
|
|
|
|
prefix = "demain ";
|
|
|
|
|
}
|
|
|
|
|
document.getElementById("countup-time-ms").textContent = prefix
|
|
|
|
|
+ "à "
|
|
|
|
|
+ arrivalDate.getHours().toString().padStart(2, "0")
|
|
|
|
|
+ ":"
|
|
|
|
|
+ arrivalDate.getMinutes().toString().padStart(2, "0")
|
|
|
|
|
+ ":"
|
|
|
|
|
+ arrivalDate.getSeconds().toString().padStart(2, "0")
|
|
|
|
|
+ ":"
|
|
|
|
|
+ Math.floor(arrivalDate.getMilliseconds() / 100);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
@@ -93,7 +187,7 @@ if (document.body.id === "info_player") {
|
|
|
|
|
let villagesTable = borderLists[1];
|
|
|
|
|
let villagesRows = villagesTable.getElementsByTagName("tr");
|
|
|
|
|
let villagesPoints = 0;
|
|
|
|
|
for (let i=1; i<villagesRows.length; i+=1) {
|
|
|
|
|
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);
|
|
|
|
|
@@ -104,16 +198,25 @@ if (document.body.id === "info_player") {
|
|
|
|
|
armyPercent = (Math.round(armyPoints / villagesCount) / 100).toString() + " %";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
playerPropertiesTable.appendChild(createRow("Points troupes:", str(armyPoints)));
|
|
|
|
|
playerPropertiesTable.appendChild(createRow("% points troupes:", armyPercent));
|
|
|
|
|
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]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Display unit-points on village overview */
|
|
|
|
|
if (document.body.id === "overview") {
|
|
|
|
|
let settlements = document.getElementById("settlement").textContent.split("|");
|
|
|
|
|
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++) {
|
|
|
|
|
for (let i = 0; i < noBorderRows.length; i++) {
|
|
|
|
|
if (noBorderRows[i].textContent.startsWith("Points:")) {
|
|
|
|
|
villagePointsRow = noBorderRows[i];
|
|
|
|
|
break;
|
|
|
|
|
@@ -125,4 +228,368 @@ if (document.body.id === "overview") {
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Set marker to prevent loading extension several times */
|
|
|
|
|
document.body.appendChild(createCustomElement("div", {"id": "kaplus-marker"}, null, {"display": "none"}));
|
|
|
|
|
|
|
|
|
|
/* Remove ads banner on dom content loaded */
|
|
|
|
|
window.addEventListener("DOMContentLoaded", removeAdsBanner);
|
|
|
|
|
|
|
|
|
|
/* 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");
|
|
|
|
|
|
|
|
|
|
/* Choose action according to section, module and sub */
|
|
|
|
|
switch (section) {
|
|
|
|
|
case "ranking":
|
|
|
|
|
switch (module) {
|
|
|
|
|
case "player": case null:
|
|
|
|
|
showPlayersId(); // test: OK
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case "ally":
|
|
|
|
|
switch (module) {
|
|
|
|
|
case "members":
|
|
|
|
|
showPlayersId(); // test: OK
|
|
|
|
|
break;
|
|
|
|
|
case "attacks":
|
|
|
|
|
showSecondsAndCalculator(); // test: OK
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case "overview":
|
|
|
|
|
showVillageUnitPoints(); // test: FAILED because settlement element has been removed
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case "build_market":
|
|
|
|
|
switch (module) {
|
|
|
|
|
case "send": case null:
|
|
|
|
|
fixSelectVillageBug(); // test: OK
|
|
|
|
|
showThousandInputs(); // test: OK
|
|
|
|
|
fixSendResourcesInputsTypes(); // test: OK
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case "info_player":
|
|
|
|
|
switch (module) {
|
|
|
|
|
case "profile": case null:
|
|
|
|
|
showPlayerUnitPointsAndId(); // test: OK
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case "info_member":
|
|
|
|
|
showPlayersId(); // test: OK
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
main();
|
|
|
|
|
|