Share your scripts! - Chase - 12-07-2024
Here is a 2 click fake script that is supported and approved!
Code: javascript:var index = localStorage.getItem('currentIndex') ? parseInt(localStorage.getItem('currentIndex')) : 0;
var doc = document;
function attackWithNextCoords() {
var currentCoords = coords[index];
index = (index + 1) % coords.length;
$('#place_target').find('input').val(currentCoords.x + '|' + currentCoords.y);
doc.forms[0].x.value = currentCoords.x;
doc.forms[0].y.value = currentCoords.y;
doc.forms[0].unit_input_ram.value = 1;
$('#target_attack').click();
localStorage.setItem('currentIndex', index);
var url = doc.URL;
if (url.indexOf('screen=place') == -1) {
alert('Use the script in the rally point page!');
return;
}
}
if (window.frames.length > 0 && window.main != null) {
doc = window.main.document;
}
var url = doc.URL;
if (url.indexOf('try=confirm') > 0) {
document.getElementsByName("submit")[0].click();
}
if (url.indexOf('screen=place') == -1) {
alert('Use the script in the rally point page!');
} else {
var coordsString = 'ENTER COORDS HERE IN xxx|yyy format';
var coordsPairs = coordsString.split(' ');
function parseCoordinates(coordString) {
var parts = coordString.split('|');
if (parts.length === 2 && !isNaN(parts[0]) && !isNaN(parts[1])) {
return { x: parseInt(parts[0]), y: parseInt(parts[1]) };
}
return null;
}
var coords = coordsPairs.map(parseCoordinates).filter(function(coord) {
return coord !== null;
});
attackWithNextCoords();
}
RE: Share your scripts! - Chase - 14-07-2024
here is a script that will capture all player coordinates from the users profile.
![[Image: coords-capture.png]](https://i.ibb.co/qkk9cCR/coords-capture.png)
Code: javascript:async function fetchAllUserVillageCoordinates() {
try {
const playerId = extractPlayerIdFromUrl();
if (!playerId) {
throw new Error('Player ID not found in URL');
}
const initialUrl = `https://w1.infernal-wars.com/game.php?village=3&screen=info_player&id=${playerId}&page=1`;
let nextPageUrl = initialUrl;
let allCoordinates = [];
let visitedPages = new Set();
while (nextPageUrl && !visitedPages.has(nextPageUrl)) {
visitedPages.add(nextPageUrl);
const response = await fetch(nextPageUrl);
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
const html = await response.text();
const coordinates = parsePlayerCoordinates(html);
allCoordinates = allCoordinates.concat(coordinates);
nextPageUrl = getNextPageUrl(html, nextPageUrl);
}
const uniqueCoordinates = Array.from(new Set(allCoordinates));
const coordinatesToDisplay = uniqueCoordinates.slice(1);
const coordinatesText = coordinatesToDisplay.join('\n');
displayCoordinatesPopup(coordinatesText, coordinatesToDisplay.length);
} catch (error) {
console.error('Error fetching user villages:', error.message);
displayDebuggingPopup(error.message);
}
}
function parsePlayerCoordinates(html) {
const regex = /\((\d+)\|(\d+)\)/g;
let match;
const coordinates = [];
while ((match = regex.exec(html)) !== null) {
const x = match[1];
const y = match[2];
coordinates.push(`${x}|${y}`);
}
return coordinates;
}
function getNextPageUrl(html, currentPageUrl) {
const tempElement = document.createElement('div');
tempElement.innerHTML = html;
const currentPageMatch = currentPageUrl.match(/page=(\d+)/);
const currentPage = currentPageMatch ? parseInt(currentPageMatch[1]) : 1;
const nextPageElement = tempElement.querySelector(`a[href*="page=${currentPage + 1}"]`);
return nextPageElement ? nextPageElement.href : null;
}
function extractPlayerIdFromUrl() {
const urlParams = new URLSearchParams(window.location.search);
return urlParams.get('id');
}
function displayCoordinatesPopup(coordinatesText, totalCoordinates) {
const coordinatesBox = createPopupBox(coordinatesText, totalCoordinates);
document.body.appendChild(coordinatesBox);
}
function displayDebuggingPopup(debugInfo) {
const debugBox = createDebugPopupBox(debugInfo);
document.body.appendChild(debugBox);
}
function createPopupBox(coordinatesText, totalCoordinates) {
const coordinatesBox = document.createElement('div');
coordinatesBox.className = 'coordinates-popup';
coordinatesBox.style.position = 'fixed';
coordinatesBox.style.top = '20px';
coordinatesBox.style.left = '20px';
coordinatesBox.style.width = '400px';
coordinatesBox.style.height = '300px';
coordinatesBox.style.border = '2px solid #333';
coordinatesBox.style.backgroundColor = '#f2f2f2';
coordinatesBox.style.zIndex = '9999';
coordinatesBox.style.padding = '10px';
coordinatesBox.style.resize = 'both';
coordinatesBox.style.overflow = 'auto';
coordinatesBox.style.cursor = 'move';
let offsetX = 0;
let offsetY = 0;
let isDragging = false;
coordinatesBox.addEventListener('mousedown', startDrag);
function startDrag(e) {
isDragging = true;
offsetX = e.clientX - coordinatesBox.getBoundingClientRect().left;
offsetY = e.clientY - coordinatesBox.getBoundingClientRect().top;
document.addEventListener('mousemove', drag);
document.addEventListener('mouseup', stopDrag);
}
function drag(e) {
if (isDragging) {
coordinatesBox.style.left = `${e.clientX - offsetX}px`;
coordinatesBox.style.top = `${e.clientY - offsetY}px`;
}
}
function stopDrag() {
isDragging = false;
document.removeEventListener('mousemove', drag);
document.removeEventListener('mouseup', stopDrag);
}
const closeButton = document.createElement('button');
closeButton.textContent = 'Close';
closeButton.style.position = 'absolute';
closeButton.style.top = '10px';
closeButton.style.right = '10px';
closeButton.style.padding = '5px';
closeButton.style.cursor = 'pointer';
closeButton.addEventListener('click', () => {
coordinatesBox.style.display = 'none';
});
coordinatesBox.appendChild(closeButton);
const minimizeButton = document.createElement('button');
minimizeButton.textContent = 'Minimize';
minimizeButton.style.position = 'absolute';
minimizeButton.style.top = '10px';
minimizeButton.style.right = '70px';
minimizeButton.style.padding = '5px';
minimizeButton.style.cursor = 'pointer';
minimizeButton.addEventListener('click', () => {
coordinatesBox.style.height = '30px';
minimizeButton.style.display = 'none';
maximizeButton.style.display = 'block';
});
coordinatesBox.appendChild(minimizeButton);
const maximizeButton = document.createElement('button');
maximizeButton.textContent = 'Maximize';
maximizeButton.style.display = 'none';
maximizeButton.style.position = 'absolute';
maximizeButton.style.top = '10px';
maximizeButton.style.right = '70px';
maximizeButton.style.padding = '5px';
maximizeButton.style.cursor = 'pointer';
maximizeButton.addEventListener('click', () => {
coordinatesBox.style.height = '300px';
maximizeButton.style.display = 'none';
minimizeButton.style.display = 'block';
});
coordinatesBox.appendChild(maximizeButton);
const totalCoordinatesInfo = document.createElement('p');
totalCoordinatesInfo.textContent = 'Total Coordinates Captured';
totalCoordinatesInfo.style.fontWeight = 'bold';
totalCoordinatesInfo.style.fontSize = '16px';
totalCoordinatesInfo.style.marginTop = '20px';
coordinatesBox.appendChild(totalCoordinatesInfo);
const totalCoordinatesNumber = document.createElement('p');
totalCoordinatesNumber.textContent = totalCoordinates.toString();
totalCoordinatesNumber.style.fontSize = '24px';
totalCoordinatesNumber.style.fontWeight = 'bold';
coordinatesBox.appendChild(totalCoordinatesNumber);
const coordinatesTextArea = document.createElement('textarea');
coordinatesTextArea.value = coordinatesText;
coordinatesTextArea.setAttribute('readonly', '');
coordinatesTextArea.style.width = '100%';
coordinatesTextArea.style.height = 'calc(100% - 100px)';
coordinatesTextArea.style.border = 'none';
coordinatesTextArea.style.backgroundColor = '#f2f2f2';
coordinatesBox.appendChild(coordinatesTextArea);
const copyButton = document.createElement('button');
copyButton.textContent = 'Copy All';
copyButton.style.position = 'absolute';
copyButton.style.bottom = '10px';
copyButton.style.left = '10px';
copyButton.style.padding = '5px';
copyButton.style.cursor = 'pointer';
copyButton.addEventListener('click', () => {
copyToClipboard(coordinatesText);
});
coordinatesBox.appendChild(copyButton);
return coordinatesBox;
}
function createDebugPopupBox(debugInfo) {
const debugBox = document.createElement('div');
debugBox.className = 'debug-popup';
debugBox.style.position = 'fixed';
debugBox.style.top = '50px';
debugBox.style.left = '50px';
debugBox.style.width = '400px';
debugBox.style.height = '300px';
debugBox.style.border = '2px solid #333';
debugBox.style.backgroundColor = '#fff';
debugBox.style.zIndex = '9999';
debugBox.style.padding = '10px';
debugBox.style.resize = 'both';
debugBox.style.overflow = 'auto';
debugBox.style.cursor = 'move';
let offsetX = 0;
let offsetY = 0;
let isDragging = false;
debugBox.addEventListener('mousedown', startDrag);
function startDrag(e) {
isDragging = true;
offsetX = e.clientX - debugBox.getBoundingClientRect().left;
offsetY = e.clientY - debugBox.getBoundingClientRect().top;
document.addEventListener('mousemove', drag);
document.addEventListener('mouseup', stopDrag);
}
function drag(e) {
if (isDragging) {
debugBox.style.left = `${e.clientX - offsetX}px`;
debugBox.style.top = `${e.clientY - offsetY}px`;
}
}
function stopDrag() {
isDragging = false;
document.removeEventListener('mousemove', drag);
document.removeEventListener('mouseup', stopDrag);
}
const closeButton = document.createElement('button');
closeButton.textContent = 'Close';
closeButton.style.position = 'absolute';
closeButton.style.top = '10px';
closeButton.style.right = '10px';
closeButton.style.padding = '5px';
closeButton.style.cursor = 'pointer';
closeButton.addEventListener('click', () => {
debugBox.style.display = 'none';
});
debugBox.appendChild(closeButton);
const debugInfoTextArea = document.createElement('textarea');
debugInfoTextArea.value = debugInfo;
debugInfoTextArea.setAttribute('readonly', '');
debugInfoTextArea.style.width = '100%';
debugInfoTextArea.style.height = 'calc(100% - 40px)';
debugInfoTextArea.style.border = 'none';
debugInfoTextArea.style.backgroundColor = '#fff';
debugBox.appendChild(debugInfoTextArea);
const copyButton = document.createElement('button');
copyButton.textContent = 'Copy Debug Info';
copyButton.style.position = 'absolute';
copyButton.style.bottom = '10px';
copyButton.style.left = '10px';
copyButton.style.padding = '5px';
copyButton.style.cursor = 'pointer';
copyButton.addEventListener('click', () => {
copyToClipboard(debugInfo);
});
debugBox.appendChild(copyButton);
return debugBox;
}
function copyToClipboard(text) {
const textarea = document.createElement('textarea');
textarea.value = text;
textarea.setAttribute('readonly', '');
textarea.style.position = 'absolute';
textarea.style.left = '-9999px';
document.body.appendChild(textarea);
textarea.select();
document.execCommand('copy');
document.body.removeChild(textarea);
}
fetchAllUserVillageCoordinates();
RE: Share your scripts! - Chase - 14-07-2024
This script automates both! Run using this script loaded in the quick bar on the targets user page. Choose which script you want and copy it - then add it to the quickbar. The fake or spy script can be used in the rally point, click once to load the attack, click again to send the attack.
![[Image: final-script-generator.png]](https://i.ibb.co/HgxrxCr/final-script-generator.png)
Code: javascript:async function fetchAllUserVillageCoordinates() {
try {
const playerId = extractPlayerIdFromUrl();
if (!playerId) {
throw new Error('Player ID not found in URL');
}
const initialUrl = `https://w1.infernal-wars.com/game.php?village=3&screen=info_player&id=${playerId}&page=1`;
let nextPageUrl = initialUrl;
let allCoordinates = [];
let visitedPages = new Set();
while (nextPageUrl && !visitedPages.has(nextPageUrl)) {
visitedPages.add(nextPageUrl);
const response = await fetchWithRetry(nextPageUrl);
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
const html = await response.text();
const coordinates = parsePlayerCoordinates(html);
allCoordinates = allCoordinates.concat(coordinates);
nextPageUrl = getNextPageUrl(html, nextPageUrl);
}
const uniqueCoordinates = Array.from(new Set(allCoordinates));
const coordinatesToDisplay = uniqueCoordinates.slice(1);
const coordinatesText = coordinatesToDisplay.join(' ');
displayFinalScriptPopup(coordinatesText, coordinatesToDisplay.length);
} catch (error) {
console.error('Error fetching user villages:', error.message);
displayDebuggingPopup(error.message);
}
}
async function fetchWithRetry(url, retries = 3) {
for (let attempt = 1; attempt <= retries; attempt++) {
try {
const response = await fetch(url);
if (!response.ok && attempt < retries) {
console.warn(`Retry attempt ${attempt} for URL: ${url}`);
continue;
}
return response;
} catch (error) {
if (attempt === retries) throw error;
}
}
}
function parsePlayerCoordinates(html) {
const regex = /\((\d+)\|(\d+)\)/g;
let match;
const coordinates = [];
while ((match = regex.exec(html)) !== null) {
const x = match[1];
const y = match[2];
coordinates.push(`${x}|${y}`);
}
return coordinates;
}
function getNextPageUrl(html, currentPageUrl) {
const tempElement = document.createElement('div');
tempElement.innerHTML = html;
const currentPageMatch = currentPageUrl.match(/page=(\d+)/);
const currentPage = currentPageMatch ? parseInt(currentPageMatch[1]) : 1;
const nextPageElement = tempElement.querySelector(`a[href*="page=${currentPage + 1}"]`);
return nextPageElement ? nextPageElement.href : null;
}
function extractPlayerIdFromUrl() {
const urlParams = new URLSearchParams(window.location.search);
return urlParams.get('id');
}
function generateAttackScript(coordinatesText, unitCounts, isSupport = false) {
const scriptType = isSupport ? 'support' : 'attack';
return `javascript:
var index = localStorage.getItem('currentIndex') ? parseInt(localStorage.getItem('currentIndex')) : 0;
var doc = document;
function sendNextCommand() {
var currentCoords = coords[index];
index = (index + 1) % coords.length;
$('#place_target').find('input').val(currentCoords.x + '|' + currentCoords.y);
doc.forms[0].x.value = currentCoords.x;
doc.forms[0].y.value = currentCoords.y;
${Object.keys(unitCounts).map(unit => `doc.forms[0].unit_input_${unit}.value = ${unitCounts[unit]};`).join('\n')}
$('#target_${scriptType}').click();
localStorage.setItem('currentIndex', index);
var url = doc.URL;
if (url.indexOf('screen=place') == -1) {
alert('Use the script in the rally point page!');
return;
}
}
if (window.frames.length > 0 && window.main != null) {
doc = window.main.document;
}
var url = doc.URL;
if (url.indexOf('try=confirm') > 0) {
document.getElementsByName("submit")[0].click();
}
if (url.indexOf('screen=place') == -1) {
alert('Use the script in the rally point page!');
} else {
var coordsString = '${coordinatesText}';
var coordsPairs = coordsString.split(' ');
function parseCoordinates(coordString) {
var parts = coordString.split('|');
if (parts.length === 2 && !isNaN(parts[0]) && !isNaN(parts[1])) {
return { x: parseInt(parts[0]), y: parseInt(parts[1]) };
}
return null;
}
var coords = coordsPairs.map(parseCoordinates).filter(function(coord) {
return coord !== null;
});
sendNextCommand();
}`;
}
function displayFinalScriptPopup(coordinatesText, coordinateCount) {
const units = [
{ name: 'spear', label: 'Spear', icon: 'https://cdn.infernal-wars.com/graphic/unit/unit_spear.png?1' },
{ name: 'sword', label: 'Sword', icon: 'https://cdn.infernal-wars.com/graphic/unit/unit_sword.png?1' },
{ name: 'axe', label: 'Axe', icon: 'https://cdn.infernal-wars.com/graphic/unit/unit_axe.png?1' },
{ name: 'spy', label: 'Spy', icon: 'https://cdn.infernal-wars.com/graphic/unit/unit_spy.png?1' },
{ name: 'light', label: 'Light', icon: 'https://cdn.infernal-wars.com/graphic/unit/unit_light.png?1' },
{ name: 'heavy', label: 'Heavy', icon: 'https://cdn.infernal-wars.com/graphic/unit/unit_heavy.png?1' },
{ name: 'ram', label: 'Ram', icon: 'https://cdn.infernal-wars.com/graphic/unit/unit_ram.png?1' },
{ name: 'catapult', label: 'Catapult', icon: 'https://cdn.infernal-wars.com/graphic/unit/unit_catapult.png?1' },
{ name: 'snob', label: 'Snob', icon: 'https://cdn.infernal-wars.com/graphic/unit/unit_snob.png' }
];
const popup = document.createElement('div');
popup.className = 'final-script-popup';
popup.style.position = 'fixed';
popup.style.top = '50%';
popup.style.left = '50%';
popup.style.transform = 'translate(-50%, -50%)';
popup.style.width = '700px';
popup.style.height = '650px';
popup.style.border = '2px solid #DED3B9';
popup.style.backgroundColor = '#F4E4BC';
popup.style.boxShadow = '0 4px 20px rgba(0,0,0,0.2)';
popup.style.zIndex = '10000';
popup.style.padding = '20px';
popup.style.borderRadius = '10px';
popup.style.display = 'flex';
popup.style.flexDirection = 'column';
popup.style.fontFamily = 'Arial, sans-serif';
let offsetX = 0;
let offsetY = 0;
let isDragging = false;
popup.addEventListener('mousedown', startDrag);
function startDrag(e) {
if (e.target === popup) {
isDragging = true;
offsetX = e.clientX - popup.getBoundingClientRect().left;
offsetY = e.clientY - popup.getBoundingClientRect().top;
document.addEventListener('mousemove', drag);
document.addEventListener('mouseup', stopDrag);
}
}
function drag(e) {
if (isDragging) {
popup.style.left = `${e.clientX - offsetX}px`;
popup.style.top = `${e.clientY - offsetY}px`;
}
}
function stopDrag() {
isDragging = false;
document.removeEventListener('mousemove', drag);
document.removeEventListener('mouseup', stopDrag);
}
const header = document.createElement('div');
header.style.display = 'flex';
header.style.justifyContent = 'space-between';
header.style.alignItems = 'center';
header.style.marginBottom = '10px';
header.style.borderBottom = '1px solid #DED3B9';
header.style.paddingBottom = '10px';
const title = document.createElement('h3');
title.textContent = 'Generate Attack/Support Script';
title.style.margin = '0';
title.style.color = '#5D4037';
header.appendChild(title);
const closeButton = document.createElement('button');
closeButton.textContent = '×';
closeButton.style.border = 'none';
closeButton.style.background = 'none';
closeButton.style.fontSize = '24px';
closeButton.style.cursor = 'pointer';
closeButton.addEventListener('click', () => {
popup.style.display = 'none';
});
header.appendChild(closeButton);
popup.appendChild(header);
const coordinatesInfo = document.createElement('p');
coordinatesInfo.textContent = `Number of coordinates generated: ${coordinateCount}`;
coordinatesInfo.style.marginBottom = '10px';
coordinatesInfo.style.color = '#333';
popup.appendChild(coordinatesInfo);
const scriptTypeSelect = document.createElement('select');
scriptTypeSelect.style.marginBottom = '10px';
scriptTypeSelect.style.border = '1px solid #DED3B9';
scriptTypeSelect.style.padding = '5px';
const scriptTypes = [
{ name: 'Attack Script', value: 'attack' },
{ name: 'Support Script', value: 'support' },
];
scriptTypes.forEach(type => {
const option = document.createElement('option');
option.value = type.value;
option.textContent = type.name;
scriptTypeSelect.appendChild(option);
});
popup.appendChild(scriptTypeSelect);
const unitInputsContainer = document.createElement('div');
unitInputsContainer.style.display = 'grid';
unitInputsContainer.style.gridTemplateColumns = 'repeat(3, 1fr)';
unitInputsContainer.style.gap = '10px';
unitInputsContainer.style.marginBottom = '10px';
units.forEach(unit => {
const unitContainer = document.createElement('div');
unitContainer.style.display = 'flex';
unitContainer.style.flexDirection = 'column';
unitContainer.style.alignItems = 'center';
const unitLabel = document.createElement('label');
unitLabel.textContent = unit.label;
unitLabel.style.marginBottom = '5px';
unitLabel.style.color = '#5D4037';
unitContainer.appendChild(unitLabel);
const unitImage = document.createElement('img');
unitImage.src = unit.icon;
unitImage.alt = unit.label;
unitImage.style.width = '30px';
unitImage.style.height = '30px';
unitImage.style.marginBottom = '5px';
unitContainer.appendChild(unitImage);
const unitInput = document.createElement('input');
unitInput.type = 'number';
unitInput.min = '0';
unitInput.value = '0';
unitInput.style.border = '1px solid #DED3B9';
unitInput.style.padding = '5px';
unitInput.style.width = '100%';
unitInput.id = `unit_${unit.name}`;
unitContainer.appendChild(unitInput);
unitInputsContainer.appendChild(unitContainer);
});
popup.appendChild(unitInputsContainer);
const scriptArea = document.createElement('textarea');
scriptArea.setAttribute('readonly', '');
scriptArea.style.width = '100%';
scriptArea.style.height = 'calc(100% - 370px)';
scriptArea.style.border = '1px solid #DED3B9';
scriptArea.style.borderRadius = '4px';
scriptArea.style.padding = '10px';
scriptArea.style.boxSizing = 'border-box';
scriptArea.style.marginBottom = '10px';
scriptArea.style.fontFamily = 'Courier New, monospace';
scriptArea.style.backgroundColor = '#FAF3E0';
popup.appendChild(scriptArea);
const buttonContainer = document.createElement('div');
buttonContainer.style.display = 'flex';
buttonContainer.style.justifyContent = 'space-between';
const generateButton = document.createElement('button');
generateButton.textContent = 'Generate Script';
generateButton.style.flex = '1';
generateButton.style.marginRight = '10px';
generateButton.style.padding = '10px';
generateButton.style.border = '1px solid #DED3B9';
generateButton.style.backgroundColor = '#8D6E63';
generateButton.style.color = '#fff';
generateButton.style.borderRadius = '4px';
generateButton.style.cursor = 'pointer';
generateButton.addEventListener('click', () => {
const scriptType = scriptTypeSelect.value;
let isSupport = scriptType === 'support';
let unitCounts = {};
units.forEach(unit => {
const unitInput = document.getElementById(`unit_${unit.name}`);
const unitCount = parseInt(unitInput.value, 10);
if (unitCount > 0) {
unitCounts[unit.name] = unitCount;
}
});
const finalScript = generateAttackScript(coordinatesText, unitCounts, isSupport);
scriptArea.value = finalScript;
});
buttonContainer.appendChild(generateButton);
const copyButton = document.createElement('button');
copyButton.textContent = 'Copy Script';
copyButton.style.flex = '1';
copyButton.style.padding = '10px';
copyButton.style.border = '1px solid #DED3B9';
copyButton.style.backgroundColor = '#8D6E63';
copyButton.style.color = '#fff';
copyButton.style.borderRadius = '4px';
copyButton.style.cursor = 'pointer';
copyButton.addEventListener('click', () => {
scriptArea.select();
document.execCommand('copy');
alert('Script copied to clipboard!');
});
buttonContainer.appendChild(copyButton);
popup.appendChild(buttonContainer);
document.body.appendChild(popup);
}
function displayDebuggingPopup(errorMessage) {
const popup = document.createElement('div');
popup.className = 'debugging-popup';
popup.style.position = 'fixed';
popup.style.top = '50%';
popup.style.left = '50%';
popup.style.transform = 'translate(-50%, -50%)';
popup.style.width = '400px';
popup.style.height = '200px';
popup.style.border = '1px solid #8D6E63';
popup.style.backgroundColor = '#F4E4BC';
popup.style.boxShadow = '0 4px 20px rgba(0,0,0,0.2)';
popup.style.zIndex = '10000';
popup.style.padding = '20px';
popup.style.borderRadius = '10px';
popup.style.display = 'flex';
popup.style.flexDirection = 'column';
popup.style.justifyContent = 'center';
popup.style.alignItems = 'center';
popup.style.fontFamily = 'Arial, sans-serif';
const errorText = document.createElement('p');
errorText.textContent = `Error: ${errorMessage}`;
errorText.style.color = '#8D6E63';
errorText.style.marginBottom = '20px';
popup.appendChild(errorText);
const closeButton = document.createElement('button');
closeButton.textContent = 'Close';
closeButton.style.border = '1px solid #8D6E63';
closeButton.style.background = '#8D6E63';
closeButton.style.color = '#fff';
closeButton.style.padding = '10px 20px';
closeButton.style.borderRadius = '4px';
closeButton.style.cursor = 'pointer';
closeButton.addEventListener('click', () => {
popup.style.display = 'none';
});
popup.appendChild(closeButton);
document.body.appendChild(popup);
}
fetchAllUserVillageCoordinates();
RE: Share your scripts! - Chase - 17-07-2024
Automated Report Sorting
![[Image: report-1.png]](https://i.ibb.co/DGg5j3j/report-1.png)
![[Image: report-2.png]](https://i.ibb.co/KKpQbGj/report-2.png)
![[Image: report3.png]](https://i.ibb.co/xDpbbQW/report3.png)
Code: javascript:const DEBUG = false;
const scriptConfig = {
scriptData: {
prefix: 'automateReports',
name: 'Automate Reports',
version: 'v1.0.0',
author: 'Chase',
authorUrl: '',
helpLink: '',
},
allowedMarkets: [],
allowedScreens: ['report'],
allowedModes: ['all'],
isDebug: DEBUG,
enableCountApi: true,
};
let playerDatabase = {};
const extractUnitData = (doc, tableId) => {
const table = doc.getElementById(tableId);
if (!table) return null;
const rows = table.querySelectorAll('tr');
const unitTypes = Array.from(rows[0].querySelectorAll('td img')).map(img => img.title.toLowerCase().replace(/ /g, '_'));
const quantities = Array.from(rows[1].querySelectorAll('td')).slice(1).map(td => parseInt(td.textContent, 10) || 0);
const unitsData = {};
unitTypes.forEach((unitType, index) => {
unitsData[unitType] = quantities[index];
});
return unitsData;
};
const extractUnitsOutsideVillage = (doc) => {
const thElements = doc.querySelectorAll('th');
for (let th of thElements) {
if (th.textContent.trim() === 'Units outside village:') {
const table = th.parentElement.nextElementSibling.querySelector('table');
if (!table) return null;
const rows = table.querySelectorAll('tr');
const unitTypes = Array.from(rows[0].querySelectorAll('th img')).map(img => img.title.toLowerCase().replace(/ /g, '_'));
const quantities = Array.from(rows[1].querySelectorAll('td')).map(td => parseInt(td.textContent, 10) || 0);
const unitsData = {};
unitTypes.forEach((unitType, index) => {
unitsData[unitType] = quantities[index];
});
return unitsData;
}
}
return null;
};
const fetchReportData = async (url, retryCount = 3) => {
if (!url.startsWith('http')) {
console.error(`Invalid URL: ${url}`);
return null;
}
try {
const response = await fetch(url);
if (!response.ok) {
if (response.status === 520 && retryCount > 0) {
console.warn(`Encountered 520 error, retrying... (${3 - retryCount + 1})`);
await new Promise(res => setTimeout(res, 2000));
return fetchReportData(url, retryCount - 1);
}
throw new Error(`HTTP error! Status: ${response.status}`);
}
const text = await response.text();
const parser = new DOMParser();
const doc = parser.parseFromString(text, 'text/html');
const findPlayerData = (label) => {
const thElements = doc.querySelectorAll('th');
for (let th of thElements) {
if (th.textContent.trim() === label) {
const playerLink = th.nextElementSibling.querySelector('a[href*="screen=info_player"]');
const villageLink = th.closest('table').querySelector('a[href*="screen=info_village"]');
const playerName = playerLink ? playerLink.textContent.trim() : 'Unknown';
const villageCoords = villageLink ? villageLink.textContent.trim().match(/\d+\|\d+/)[0] : 'Unknown';
return { playerName, villageCoords };
}
}
return null;
};
const attacker = findPlayerData('Attacker:');
const defender = findPlayerData('Defender:');
const attackerUnits = extractUnitData(doc, 'attack_info_att_units');
const defenderUnits = extractUnitData(doc, 'attack_info_def_units');
const unitsOutside = extractUnitsOutsideVillage(doc);
return {
attacker: { ...attacker, units: attackerUnits },
defender: { ...defender, units: defenderUnits },
unitsOutside,
reportPageLink: url,
};
} catch (error) {
console.error('Error fetching report data:', error);
return null;
}
};
const classifyUnits = (units, unitsOutside) => {
const offensiveUnits = ['axe', 'light_cavalry'];
const defensiveUnits = ['spear', 'sword', 'heavy_cavalry'];
let offensiveCount = 0;
let defensiveCount = 0;
const countUnits = (units) => {
if (!units) return;
for (const [unitType, count] of Object.entries(units)) {
if (offensiveUnits.includes(unitType)) {
offensiveCount += count;
} else if (defensiveUnits.includes(unitType)) {
defensiveCount += count;
}
}
};
countUnits(units);
countUnits(unitsOutside);
if (offensiveCount > defensiveCount) {
return 'offensive';
} else if (defensiveCount > offensiveCount) {
return 'defensive';
} else {
return 'unknown';
}
};
const countVillages = () => {
for (const playerName in playerDatabase) {
const playerData = playerDatabase[playerName];
let offensiveCount = 0;
let defensiveCount = 0;
for (const villageCoords in playerData.villages) {
const villageData = playerData.villages[villageCoords];
if (villageData.classification === 'offensive') {
offensiveCount++;
} else if (villageData.classification === 'defensive') {
defensiveCount++;
}
}
playerData.offensiveCount = offensiveCount;
playerData.defensiveCount = defensiveCount;
}
};
const processReports = async () => {
const reportLinks = document.querySelectorAll('a[href*="view="]');
const validReportLinks = Array.from(reportLinks).filter(link => link.href.startsWith('http'));
const reportPromises = validReportLinks.map(async (link) => {
const reportPageLink = link.href;
const reportData = await fetchReportData(reportPageLink);
if (reportData) {
const { attacker, defender, unitsOutside } = reportData;
if (attacker && attacker.units) {
const classification = classifyUnits(attacker.units, unitsOutside);
if (!playerDatabase[attacker.playerName]) {
playerDatabase[attacker.playerName] = { villages: {} };
}
playerDatabase[attacker.playerName].villages[attacker.villageCoords] = {
classification,
reportLink: reportPageLink,
units: attacker.units,
unitsOutside,
};
}
if (defender && defender.units) {
const classification = classifyUnits(defender.units, unitsOutside);
if (!playerDatabase[defender.playerName]) {
playerDatabase[defender.playerName] = { villages: {} };
}
playerDatabase[defender.playerName].villages[defender.villageCoords] = {
classification,
reportLink: reportPageLink,
units: defender.units,
unitsOutside,
};
}
}
});
await Promise.all(reportPromises);
countVillages();
updatePlayerList();
};
const generateNotebookEntry = () => {
let notebookEntry = '';
Object.keys(playerDatabase).forEach(playerName => {
const playerData = playerDatabase[playerName];
notebookEntry += `[player]${playerName}[/player]\n`;
const villages = [];
Object.keys(playerData.villages).forEach(villageCoords => {
const villageData = playerData.villages[villageCoords];
const classification = villageData.classification === 'offensive' ? '[color=#ae0e0e]OFFENSIVE[/color]' : '[color=#0e0eae]DEFENSE[/color]';
villages.push(`[village]${villageCoords}[/village] - ${classification}`);
});
notebookEntry += villages.join('\n') + '\n\n';
});
return notebookEntry;
};
const copyNotebookEntryToClipboard = () => {
const notebookEntry = generateNotebookEntry();
const tempTextArea = document.createElement('textarea');
tempTextArea.value = notebookEntry;
document.body.appendChild(tempTextArea);
tempTextArea.select();
document.execCommand('copy');
document.body.removeChild(tempTextArea);
alert('Notebook entry copied to clipboard!');
};
const updatePlayerList = () => {
const playerListContainer = document.querySelector('#playerListContainer');
playerListContainer.innerHTML = '';
for (const playerName in playerDatabase) {
const playerData = playerDatabase[playerName];
const playerButton = document.createElement('button');
playerButton.textContent = `${playerName} (O: ${playerData.offensiveCount}, D: ${playerData.defensiveCount})`;
playerButton.onclick = () => showPlayerData(playerName);
playerListContainer.appendChild(playerButton);
}
};
const showPlayerData = (playerName) => {
const playerData = playerDatabase[playerName];
const offensiveVillages = [];
const defensiveVillages = [];
for (const villageCoords in playerData.villages) {
const villageData = playerData.villages[villageCoords];
if (villageData.classification === 'offensive') {
offensiveVillages.push(villageCoords);
} else if (villageData.classification === 'defensive') {
defensiveVillages.push(villageCoords);
}
}
const offensiveCount = playerData.offensiveCount || 0;
const defensiveCount = playerData.defensiveCount || 0;
const popupContent = `
<div>
<h3>${playerName}</h3>
<p>Total Offensive Villages: ${offensiveCount}</p>
<p>Total Defensive Villages: ${defensiveCount}</p>
<textarea id="offensiveCoords" rows="10" cols="60">${offensiveVillages.join('\n')}</textarea>
<button onclick="copyToClipboard('offensiveCoords')">Copy Offensive Coordinates</button>
<textarea id="defensiveCoords" rows="10" cols="60">${defensiveVillages.join('\n')} </textarea>
<button onclick="copyToClipboard('defensiveCoords')">Copy Defensive Coordinates</button>
</div>
`;
const popup = window.open('', 'Player Data', 'width=800,height=600,scrollbars=yes');
popup.document.write(popupContent);
popup.document.close();
};
const copyToClipboard = (elementId) => {
const textarea = document.getElementById(elementId);
textarea.select();
document.execCommand('copy');
alert('Coordinates copied to clipboard!');
};
const exportData = () => {
const dataStr = JSON.stringify(playerDatabase, null, 2);
const dataBlob = new Blob([dataStr], { type: 'application/json' });
const url = URL.createObjectURL(dataBlob);
const a = document.createElement('a');
a.href = url;
a.download = 'playerDatabase.json';
a.click();
URL.revokeObjectURL(url);
};
const viewData = () => {
const popup = window.open('', 'Player Data', 'width=800,height=600,scrollbars=yes');
const dataStr = JSON.stringify(playerDatabase, null, 2);
popup.document.write('<pre>' + dataStr + '</pre>');
popup.document.close();
};
const isValidScreen = location.search.includes('screen=report');
const isValidMode = location.search.includes('mode=all');
if (isValidScreen && isValidMode) {
const content = `
<div class="ra-mb15">
<a href="javascript:void(0);" id="raProcessReportsBtn" class="btn">Automate Reports</a>
<a href="javascript:void(0);" id="raCopyNotebookEntryBtn" class="btn">Copy to Clipboard</a>
<a href="javascript:void(0);" id="raExportDataBtn" class="btn">Export Data</a>
<a href="javascript:void(0);" id="raViewDataBtn" class="btn">View Data</a>
</div>
<div id="playerListContainer" class="ra-mb15"></div>
`;
const widget = document.createElement('div');
widget.innerHTML = content;
const contentValue = document.getElementById('content_value');
contentValue.insertBefore(widget, contentValue.firstChild);
document.querySelector('#raProcessReportsBtn').addEventListener('click', processReports);
document.querySelector('#raCopyNotebookEntryBtn').addEventListener('click', copyNotebookEntryToClipboard);
document.querySelector('#raExportDataBtn').addEventListener('click', exportData);
document.querySelector('#raViewDataBtn').addEventListener('click', viewData);
} else {
console.log('Redirecting...');
location.href = 'https://w1.infernal-wars.com/game.php?village=21&screen=report&mode=all';
}
|