Jurekn LXXIX
Pomocna Stopa
- Wynik reakcji
- 2.576
Zadałem poprzez tikcet pytanie do supportu, czy legalne jest przerabianie istniejących legalnych skryptów i dostałem taką odpowiedź:

Skrypt powstał przez modyfikację legalnego, istniejącego skryptu Zbiorka_wojska_i_obrony, aby wyświetlał informacje o nadchodzących atakach na graczy. Po uruchomieniu skryptu z przeglądu wojsk dostajemy listę graczy oraz ich wiosek na które nadchodzą ataki (liczba). Przydatne na początkowym etapie, kiedy trzeba pilnować warzywka, żeby nie straciły wioski. Czekam na uwagi i ewentualnie komentarz @kmic .

Skrypt powstał przez modyfikację legalnego, istniejącego skryptu Zbiorka_wojska_i_obrony, aby wyświetlał informacje o nadchodzących atakach na graczy. Po uruchomieniu skryptu z przeglądu wojsk dostajemy listę graczy oraz ich wiosek na które nadchodzą ataki (liczba). Przydatne na początkowym etapie, kiedy trzeba pilnować warzywka, żeby nie straciły wioski. Czekam na uwagi i ewentualnie komentarz @kmic .
javascript: async function collectAttacks() {
const urlParams = new URLSearchParams(window.location.search);
const mode = urlParams.get("mode");
if (urlParams.get("screen") !== "ally" || mode !== "members_defense") {
UI.ErrorMessage("Błąd: Przejdź do Plemię -> Członkowie -> Obrona", "3000");
return;
}
const playerSelect = document.querySelector("#ally_content .input-nicer");
if (!playerSelect) {
UI.ErrorMessage("Błąd krytyczny: Brak selektora z listą graczy", "4000");
return;
}
const players = Array.from(playerSelect)
.filter(option => !option.hidden && !(option instanceof HTMLOptGroupElement))
.map(option => ({
id: option.value,
nick: option.text.trim(),
disabled: option.disabled
}));
if (players.length === 0) {
UI.ErrorMessage("Błąd: Brak graczy na obecnej stronie!", "4000");
return;
}
const fetchData = async (playerId) => {
const searchParams = new URLSearchParams(urlParams);
searchParams.set("player_id", playerId);
const response = await fetch(`${window.location.origin}${window.location.pathname}?${searchParams.toString()}`);
return new DOMParser().parseFromString(await response.text(), "text/html").body;
};
let result = "Nadchodzące ataki:\n\n";
let anyAttacks = false;
for (const player of players) {
if (player.disabled) continue;
const body = await fetchData(player.id);
const rows = body.querySelectorAll(".table-responsive .vis tr");
let playerResult = "";
for (let i = 1; i < rows.length; i++) {
const cells = rows.querySelectorAll("td");
if (cells.length > 1) {
const coords = cells[0].textContent.trim().match(/\d+\|\d+/);
const attacks = parseInt(cells[cells.length - 1].textContent.trim()) || 0;
if (coords && attacks > 0) {
playerResult += `[coords]${coords[0]}[/coords]: ${attacks}\n`;
}
}
}
if (playerResult) {
anyAttacks = true;
result += `[player]${player.nick}[/player]\n${playerResult}\n`;
}
}
if (!anyAttacks) {
result += "Brak nadchodzących ataków.";
}
Dialog.show("attackCounterResult", `<textarea rows='15' style='width:95%;margin-top:15px;'>${result.trim()}</textarea>`);
}
collectAttacks().catch(error => {
UI.ErrorMessage(`Błąd: ${error}`, "5000");
});