//----------Constant Values and Objects--------- let targetIpAddress = ''; const lockoutMax = 4; let lockoutHits = 0; let ipAttempts = []; let time = 460000; let lose = false; let win = false; let timerElement = document.getElementById('timer'); let timeInterval = {}; const systemTypes = ["HIDDEN", "KALILINUX", "WINDOWSXP", "WINDOWS2000", "WINDOWS10", "REDHAT", "ANDROID4.4", "NETHUNTER"]; const Entry = function(){ return { value: createIP(), machineType: systemTypes[randomInRange(0, systemTypes.length - 1, 0)], status: "ACTIVE", hostName: createRandomName(), lastResponse: randomInRange(1000, 10000000, 0), systemLocation: { long: randomInRange(-180, 180, 3), lat: randomInRange(-180, 180, 3) } } } //-----------Helper Functions----------- function createIP() { let text = ""; let possible = "0123456789"; for (var i = 0; i < 10; i++) text += possible.charAt(Math.floor(Math.random() * possible.length)); return text; } function formatIP(ip){ let newIP = ip; newIP = newIP.slice(0, 2) + '.' + newIP.slice(2); newIP = newIP.slice(0, 6) + '.' + newIP.slice(6); newIP = newIP.slice(0, 9) + '.' + newIP.slice(9); return newIP; } function randomInRange(min, max, fixed){ return (Math.random() * (max - min) + min).toFixed(fixed) * 1; } function createEntryHTML(entry){ let {value, status, machineType, hostName, lastResponse, systemLocation} = entry; let ipAddress = formatIP(value); let htmlString = "\ \ \ "+ formatIP(value) +"\ "+ status +"\ "+ hostName +"\ "+ machineType +"\ "+ lastResponse +"MS\ "+ systemLocation.long + "-" + systemLocation.lat +"\ \ " return htmlString; } function createEntryHTMLArray(entries){ let htmlStrings = []; entries.forEach(function(e) { htmlStrings.push(createEntryHTML(e)); }, this); return htmlStrings; } function createRandomName(){ let text = ""; let possible = "0123456789QWERTYUIOP_-ASDFGHJKLZXCVBNM"; for (var i = 0; i < 10; i++) text += possible.charAt(Math.floor(Math.random() * possible.length)); return text; } function createEntryArray(){ let entries = []; for(i = 0; i < 27; i++){ entries.push(new Entry()); } return entries; } function concatEntryHTMLArray(entries){ let htmlString = ""; entries.forEach(function(e) { htmlString += e; }, this); return htmlString; } function renderEntries(htmlString){ document.getElementById('entry_table').innerHTML = htmlString; } function extractIpAddressFromElement(element){ ipAddress = element.getAttribute('data-ip-value'); return ipAddress; } function selectTargetIpAddress(entries){ let value = entries[randomInRange(0, entries.length - 1, 0)].value; return value; } function compareIpAddress(value){ let levDis = new Levenshtein(value, targetIpAddress); let similarCount = 10 - levDis.distance; return similarCount; } //----------Business Logic-------- function init(){ let entryArray = createEntryArray(); let htmlArray = createEntryHTMLArray(entryArray); let entryHTMLString = concatEntryHTMLArray(htmlArray); let entryElements = document.getElementsByClassName('entry'); targetIpAddress = selectTargetIpAddress(entryArray); renderEntries(entryHTMLString); assignClickEvent(entryElements); timeInterval = setInterval(countDown, 10); console.log(targetIpAddress); } function assignClickEvent(elements){ for(i = 0; i < elements.length; i++){ let entry = elements[i]; entry.onclick = function(){ clickedEntry(entry); } } } function clickedEntry(entry){ if(!lose && !win){ let ipDifference = compareIpAddress(extractIpAddressFromElement(entry)); if(ipDifference === 10){ targetIpAddressFound(entry); renderSuccessPrecentage(100) } else{ wrongEntrySelected(entry, ipDifference); renderLockout(); renderSuccessPrecentage(ipDifference * 10); checkStatus(); } } } function targetIpAddressFound(entry){ gameWin(); } function wrongEntrySelected(entry, similarity){ let value = extractIpAddressFromElement(entry); lockoutHits = lockoutHits + 1; saveAttempt(value); renderAttempts(); console.log(value + " was incorrect. Tries left: " + (lockoutMax - lockoutHits)); console.log(similarity + " characters were correct. Try Again!") } function renderSuccessPrecentage(percentage){ let successPercentage = document.getElementById('precentage'); successPercentage.innerHTML = percentage + "%"; } function renderLockout(){ let lockoutElement = document.getElementById('lockout'); lockoutElement.innerHTML = ''; for(i = 0; i < lockoutHits; i++){ lockoutElement.innerHTML = lockoutElement.innerHTML + " X "; } } function saveAttempt(value){ ipAttempts.push(value); } function renderAttempts(){ let attemptsTable = document.getElementById('attempts_table'); attemptsTable.innerHTML = ""; ipAttempts.forEach(function(e) { attemptsTable.innerHTML += "" + formatIP(e) + "\ " + compareIpAddress(e) + " similar chars" }, this); } function checkStatus(){ if(lockoutHits >= lockoutMax){ gameLose(); } } function gameLose(){ let entryElements = document.getElementsByClassName('entry'); let entryArray = []; lose = true; timerElement.innerHTML = 0; clearInterval(timeInterval); Array.prototype.forEach.call(entryElements, function(e) { e.className = "entry error" }, this); } function gameWin(){ let targetElement = document.querySelector('[data-ip-value="' + targetIpAddress + '"]') win = true; targetElement.className = "win"; clearInterval(timeInterval); timerElement.innerHTML = 0; } function countDown(){ if(time > 0 && !lose){ time -= 10; timerElement.innerHTML = time; } else{ gameLose(); } } init();