您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Royaleapi Extension by Odahviing
// ==UserScript== // @name RoyaleApi Extension // @namespace Odahviing // @version 3.7.1 // @description Royaleapi Extension by Odahviing // @author Odahviing // @include https://royaleapi.com/clan/* // @grant GM_getValue // @grant GM_setValue // ==/UserScript== // The New Version 3 !! // Version 3.7.1 - Last one before quitting // Configuration var CLAN_NAME = "9LPQRRVQ"; // For now var APIURL = `https://api-v3.royaleapi.com`; var AUTH_KEY = `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MjczNywiaWRlbiI6IjU5ODYxOTM5NjMzMTUzNjQxNCIsIm1kIjp7InVzZXJuYW1lIjoiT2RhaHZpaW5nIiwiZGlzY3JpbWluYXRvciI6IjIyMzYiLCJrZXlWZXJzaW9uIjozfSwidHMiOjE1NjYwMjUwNDY2MDl9.6v4MKSl5yxMtiYoA6nglaOjAbQ5hPyb01aCakzVQPrE`; var PROXY = true; var CORSProxy = `https://cors-anywhere.herokuapp.com/`; // Proxy server to bypass CORS on client Addon var DEBUG = 0; // Game Status var CARDS_AMOUNT = 95; // How many cards in game var MAX_CARDS_LEVEL = 12; // What is the max level for cards in war games var CLAN_LEVEL = 25; // This number represent the level of the clan and how strict promotions and demotions should be var MINIMUM_DAYS_ELDER = 7; // Days to become Elder var MAXIMUM_DAYS_MEMBER = 3; // Days to ignore inactive members // War Points var WAR_LEVEL = 15; // How much points should a winning get in clan-war, this settings setup all the penalties for losing var WAR_MAX_LOG = 10; // How many fights we have in the API var WAR_GOOD_AMOUNT = 50; // Blue marker var MAX_SCORE_FOR_WAR = WAR_MAX_LOG * WAR_LEVEL; // Deck Levels Points var DECK_GOOD_AMOUNT = 90; // Blue marker var MIN_RANK = 75; // Min deck level var MAX_RANK = 100; // Max deck level var RANK_CAP = 70; // Points cap for deck var RANK_CAP_MINIMUM = 60; // How much minus points can someone get for his crappy deck var MIN_CARD_LEVEL = 7; var MAX_CARD_LEVEL = 12;; // Donations Cap var DONATIONS_MINIMUM = 25; // Below that it is a fine var DONATIONS_GOOD_AMOUNT = 150; // Above this is blue marker and good number var DONATIONS_MAX_AMOUNT = 200; // Cap for donations, above it is not relevant var DONATIONS_SCORE_POINTS = 180; // How much score should donations get var CAP_DONATIONS = 100; // Soft cap for donations before the reduce start var CAP_DONATIONS_REDUCE = (DONATIONS_SCORE_POINTS + DONATIONS_MINIMUM - CAP_DONATIONS) / (DONATIONS_MAX_AMOUNT - CAP_DONATIONS); // Reduce % // Rank Levels Points var KICK_LIMIT = 0; var MEMBER_LIMIT = CLAN_LEVEL * 2; var ELDER_LIMIT = CLAN_LEVEL * 4; var CO_LEADER_LIMIT = CLAN_LEVEL * 9; // Clan War Points var WAR_WINNING = WAR_LEVEL; var WAR_LOSING = -WAR_WINNING / 4; var WAR_MISSING = -WAR_WINNING * 3; var WAR_CARD_MISSING = 1/3; // Missing 3 collection battles, is like missing one war battle // Player Special var IGNORE_PLAYERS = ['Idan Marko', 'La Sarah', 'Nana', 'P0ET', 'idomadar', 'Movsho', 'Odahviing']; // Players that can't be demoted or promoted var DUPLICATE_PLAYERS = []; // [{name: 'DHRC', keys: ['8GY200P08', '#9YY8LYUQJ'], count: 0}]; // If we have players with the same name, write their two keys, and when checking trohpies, go one by one. Can't think of a better solution // Security Control var MAX_POINTS = DONATIONS_SCORE_POINTS + RANK_CAP + MAX_SCORE_FOR_WAR; // Player Class class Player { constructor(id, name, role, cards, tower, wins, dons) { this.id = id; this.name = name; this.role = this.convertRole(role); this.deckPower = this.calcDeckPower(cards, tower); this.warDayWins = wins; this.overallDonations = dons; this.donations = 0; this.warWins = 0; this.warLosses = 0; this.warAvg = 0; this.warMissed = 0; this.overWeight = 0 ; this.donationsMulti = 1; this.activeInCurrentWar = false; this.playingDays = 0; this.isFullTime = false; } updateDonations(avg, count) { this.donations = isNaN(avg) == true ? 0 : avg; this.playingDays = count; if (this.donations > DONATIONS_MAX_AMOUNT) { this.overWeight = this.donations - DONATIONS_MAX_AMOUNT; this.donations = this.donations - this.overWeight; } if (this.playingDays >= ACTIVE_DAYS) this.isFullTime = true; } updateWar(count, avg, miss, fightMiss) { this.warWins = Math.round(count * avg); this.warLosses = count - this.warWins - miss; this.warMissed = parseFloat(parseInt(miss) + fightMiss * WAR_CARD_MISSING, 2); this.warAvg = avg ? avg : 0; } updateCurrent(status) { this.activeInCurrentWar = status; } convertRole(roleText) { if (roleText.indexOf('Co-') >= 0) return CO_LEADER_ROLE; if (roleText.indexOf('Member') >= 0) return MEMBER_ROLE; if (roleText.indexOf('Elder') >= 0) return ELDER_ROLE; return LEADER_ROLE; } iconPromotion(){ if (this.role == LEADER_ROLE || this.role == CO_LEADER_ROLE) return SAME; // Leader will always be leader if (IGNORE_PLAYERS.findIndex(x => x == this.name) >= 0) return SAME; let score = this.playerScore; switch (this.role) { case CO_LEADER_ROLE: // No downloads for Co-Leader since 18/8 return score < ELDER_LIMIT ? DOWN : SAME; case ELDER_ROLE: if (score < MEMBER_LIMIT) return DOWN; return this.isFullTime == true && score >= CO_LEADER_LIMIT && this.warWins >= 3 ? UP: SAME; case MEMBER_ROLE: if (score < KICK_LIMIT && this.playingDays > MAXIMUM_DAYS_MEMBER) return DOWN; return this.playingDays >= MINIMUM_DAYS_ELDER && score >= ELDER_LIMIT && this.warWins >= 1 ? UP: SAME; } } calcDeckPower(cards, towerLevel) { let maxRank = CARDS_AMOUNT * MAX_CARDS_LEVEL; let deckRank = cards.reduce((a, b) => +a + +this.getCalcLevel(b['displayLevel']), 0); deckRank = (100 * deckRank / maxRank).toFixed(2); return deckRank < RANK_CAP_MINIMUM ? RANK_CAP_MINIMUM : deckRank; } getCalcLevel(level) { if (level < MIN_CARD_LEVEL) return MIN_CARD_LEVEL; if (level > MAX_CARD_LEVEL) return MAX_CARD_LEVEL; return level; } setDonationsMultiplayer(multi) { if (multi > 1){ this.donationsMulti = multi; } } get warScore() { let warPoints = WAR_WINNING * this.warWins + WAR_LOSING * this.warLosses + WAR_MISSING * this.warMissed; return isNaN(warPoints) === true ? 0 : warPoints; } get donationScore() { let tmpDonations = this.donations * this.donationsMulti; if (tmpDonations < CAP_DONATIONS) return this.donations - DONATIONS_MINIMUM; if (tmpDonations > DONATIONS_MAX_AMOUNT) { this.overWeight = Math.max(tmpDonations - DONATIONS_MAX_AMOUNT, this.overWeight); tmpDonations = DONATIONS_MAX_AMOUNT; } tmpDonations = (tmpDonations - CAP_DONATIONS) * CAP_DONATIONS_REDUCE + CAP_DONATIONS - DONATIONS_MINIMUM; return tmpDonations; } get deckScore() { return (this.deckPower - MIN_RANK) / (MAX_RANK-MIN_RANK) * RANK_CAP; } get playerScore() { return this.donationScore + this.warScore + this.deckScore; } } class PlayerList { constructor() { this.list = []; this.donationsM = 1; } add(newPlayer) { if (this.find(newPlayer.id) == -1) this.list.push(newPlayer); } find(playerId) { return this.list.findIndex(x => x.id == playerId); } findByName(playerName) { return this.list.findIndex(x => x.name == playerName); } get(playerId) { return this.list[this.find(playerId)]; } calc() { let allDons = this.list.reduce((a, b) => +a + +b['donations'] , 0); let allWei = this.list.reduce((a, b) => +a + +b['overWeight'] , 0); this.donationsM = (allDons + allWei) / allDons; } updatePlayerDonations(playerName, avg, count) { let isDup = DUPLICATE_PLAYERS.findIndex(x => x.name == playerName); let indexHelper = -1; if (isDup >= 0){ let getKey = DUPLICATE_PLAYERS[isDup].keys[DUPLICATE_PLAYERS[isDup].count]; DUPLICATE_PLAYERS[isDup].count = DUPLICATE_PLAYERS[isDup].count + 1; indexHelper = this.find(getKey); } else indexHelper = this.findByName(playerName); if (indexHelper > -1) this.list[indexHelper].updateDonations(avg, count); } updatePlayerWar(playerId, count, avg, miss, fightMiss) { let pIn = this.find(playerId); if (pIn > -1) this.list[pIn].updateWar(count, avg, miss, fightMiss); } updateCurrentWarStatus(playerId) { let pIn = this.find(playerId); if (pIn > -1) this.list[pIn].updateCurrent(true); } resetAllCurrentWar() { this.list.forEach(function (value){value.updateCurrent(false);}); } get length() { return this.list.length; } } var playerList = new PlayerList(); // End Player Class // Main Clan Page Functions async function loadClanList() { getEstimatedDonations(); let roster = document.getElementById('roster'); roster.getElementsByClassName('sorted ascending')[0].innerHTML = `S<span class="mobile-hide">tats</span>`; roster.getElementsByClassName('mobile-hide')[4].innerHTML = 'Score'; roster.getElementsByClassName('mobile-hide')[5].innerHTML = `Donations (${parseInt(100 * DONATIONS_SCORE_POINTS / MAX_POINTS)}%)`; roster.getElementsByClassName('mobile-hide')[6].innerHTML = `Deck (${parseInt(100 * RANK_CAP / MAX_POINTS)}%)`; roster.getElementsByClassName('mobile-hide')[7].innerHTML = `War (${parseInt(100 * MAX_SCORE_FOR_WAR / MAX_POINTS)}%)`; roster.getElementsByClassName('mobile-hide')[2].innerHTML = `${KICK_LIMIT} | ${MEMBER_LIMIT} | ${ELDER_LIMIT} | ${CO_LEADER_LIMIT} | ${MAX_POINTS}`; roster.getElementsByClassName('mobile-hide')[2].style = `text-align: center!important;`; let trs = document.getElementById('roster').getElementsByTagName('tr'); for (let i = 1 ; i < trs.length; i++) { // Get Name let playerInnerName = trs[i].getElementsByTagName('td')[1].getElementsByTagName('a')[0].innerHTML; let playerName = playerInnerName.substring(0, playerInnerName.indexOf('<')).trim(); updateLoaderText(`${getP(i+1, trs.length - 1)}% - Loading ${playerName} Data`); let playerRole = trs[i].getElementsByTagName('td')[4].innerHTML; let playerId = trs[i].getElementsByTagName('td')[5].innerHTML.trim(); // Debug Flag Bypass if (DEBUG > 0 && i > DEBUG) continue; let result = await sendAPIRequest(API_PLAYER_DATA, playerId); var playerItem = new Player(playerId, playerName, playerRole, result.cards, parseInt(result.stats.level), parseInt(result.games.warDayWins), parseInt(result.stats.totalDonations)); playerList.add(playerItem); } } function displayScriptResults() { updateLoaderText(`${getP(-1, playerList.length)}% - Painting Script Results`); playerList.calc(); var roleAmount = [0,0,0,0]; let roster = document.getElementById('roster'); let trs = roster.getElementsByTagName('tr'); for (let i = 1 ; i < trs.length; i++) { let playerId = trs[i].getElementsByTagName('td')[5].innerHTML.trim(); let playerRank = trs[i].getElementsByClassName('right aligned mobile-hide')[0].innerHTML; var playerItem = playerList.get(playerId); if (playerItem == undefined) continue; roleAmount[playerItem.role-1]++; if (playerItem.isFullTime == true) trs[i].getElementsByClassName('mobile-hide')[0].style = `font-weight: bold`; else trs[i].getElementsByClassName('mobile-hide')[0].innerHTML += ` (${playerItem.playingDays})`; // Painting trs[i].getElementsByTagName('td')[0].innerHTML = `${playerRank} - ( ${playerItem.overallDonations.toLocaleString()} / ${playerItem.warDayWins} )`; trs[i].getElementsByTagName('td')[0].style = `background-color:#${getColorForStats(playerRank, playerItem.overallDonations, playerItem.warDayWins)}`; trs[i].getElementsByClassName('mobile-hide')[0].innerHTML += ` ${playerItem.iconPromotion()}`; playerItem.setDonationsMultiplayer(playerList.donationsM); trs[i].getElementsByClassName('right aligned mobile-hide')[0].innerHTML = parseInt(playerItem.playerScore); // Donations Column Data paintItem(trs[i], 'right aligned mobile-hide', 1, `${playerItem.donations}${(playerItem.overWeight > 0 ? ` + ${parseInt(playerItem.overWeight)}`: ``)}`, `text-align: center!important;background-color:#${getColorForTrophies(playerItem.donations)}` ); // Deck Column Data paintItem(trs[i], 'right aligned mobile-hide', 2, `${playerItem.deckPower}%`, `text-align: center!important;background-color:#${getColorForDeck(playerItem.deckPower)}` ); // War Column Data paintItem(trs[i], 'mobile-hide', 5, `${playerItem.warWins} of ${playerItem.warLosses + playerItem.warWins} (${Math.round(100 * playerItem.warAvg)}%)${playerItem.warMissed > 0 ? ` - ${paintX(playerItem.warMissed)}` : ''}`, `text-align: center!important;background-color:#${getColorForWar(playerItem.warScore)}; ${playerItem.activeInCurrentWar == true ? ';font-weight: bold' : ''}` ); // Score Bar Graph paintItem(trs[i], 'mobile-hide', 1, paintPlace(playerItem), `text-align: center!important;` ); } document.getElementById('table_th_name').innerHTML += ` (${roleAmount[3]} - ${roleAmount[2]} - ${roleAmount[1]} - ${roleAmount[0]})`; roster.getElementsByClassName('mobile-hide')[1].click(); updateLoaderText(`Script Finished!`); } // Paint Results function paintItem(elem, className, index, inHtml = undefined, inStyle = undefined) { if (inHtml) elem.getElementsByClassName(className)[index].innerHTML = inHtml; if (inStyle) elem.getElementsByClassName(className)[index].style = inStyle; } function paintX(num){ num = Math.round(num * 3, 0); let str = ''; for (let i = num; i > 0; i--) str += 'X'; return str; } function paintPlace(item) { let score = item.playerScore; let role = item.role var low = 0, high = 0; switch (role) { case LEADER_ROLE: case CO_LEADER_ROLE: high = MAX_POINTS; low = MEMBER_LIMIT; break; case ELDER_ROLE: high = CO_LEADER_LIMIT; low = MEMBER_LIMIT; break; case MEMBER_ROLE: high = ELDER_LIMIT; low = KICK_LIMIT; break; } let tRight = high - score; let tLeft = score - low; let tValue = tLeft / (tLeft + tRight); let fValue = Math.round(tValue * LINE_LENGTH); let fString = ''; for (let i = 0; i < fValue && i < LINE_LENGTH; i ++) fString += '_'; fString += '|'; for (let i = Math.max(0, fValue); i < LINE_LENGTH; i ++) fString += '_'; if (tRight < 0) fString = `<font color="MediumBlue">${fString}</font>`; else if (tLeft < 0) fString = `<font color="OrangeRed">${fString}</font>`; return ` ${fString} `; } function getColorForTrophies(value){ if (value >= DONATIONS_GOOD_AMOUNT) return GOOD; if (value >= DONATIONS_GOOD_AMOUNT / 2) return MID; if (value > 0) return LOW; return BAD; } function getColorForDeck(value){ if (value >= DECK_GOOD_AMOUNT) return GOOD; if (value >= (DECK_GOOD_AMOUNT + MIN_RANK) / 2) return MID; if (value >= MIN_RANK) return LOW; return BAD; } function getColorForStats(level, donations, warWins){ if (level < 10 || warWins < 10 || donations < 10000) return BAD; if (level == 10 || warWins < 20 || donations < 20000) return LOW; if (level == 11 || warWins < 40 || donations < 40000) return MID; return GOOD; } function getColorForWar(value){ if (value >= WAR_GOOD_AMOUNT) return GOOD; if (value >= WAR_GOOD_AMOUNT / 2) return MID; if (value > 0) return LOW; return BAD; } function getEstimatedDonations() { let playersInClan = document.getElementsByClassName('ui grid clan_stats')[0].getElementsByClassName('column')[6].getElementsByClassName('value')[0].innerHTML; playersInClan = playersInClan.substring(0, playersInClan.indexOf(' ')); var donationsEl = document.getElementsByClassName('ui grid clan_stats')[0].getElementsByClassName('column')[5].getElementsByClassName('value')[0]; let current = parseInt(donationsEl.innerHTML.replace(',','')); let cDate = new Date(); let cDay = cDate.getDay() == 0 ? 7: cDate.getDay(); let minutesSince = (cDay - 1) * 24 * 60 + cDate.getHours() * 60 + cDate.getMinutes(); let minutesWeek = 7 * 24 * 60; let result = parseInt((current / minutesSince) * minutesWeek); donationsEl.innerHTML += ` (${result.toLocaleString()}) `; } // End Paint Results // Load Data From Sources async function loadDonationsPage() { updateLoaderText(`${getP(-4, playerList.length)}% - Updating Donations Page Data`); await sendRequst(`https://royaleapi.com/clan/${CLAN_NAME}/history/v2?field=donations`).then(function(item){ let scriptText = item.getElementsByTagName('script')[37].innerHTML; scriptText = scriptText.substring(scriptText.indexOf('members:') + 8, scriptText.indexOf('container')).trim(); let parsedJson = scriptText.substring(0,scriptText.length-1); var charList = JSON.parse(scriptText.substring(0,scriptText.length-1)); let currentValue = 0; let preValue = 0; for (let i = 0; i < charList.length; i++) { let sum = 0; let count = 0; let preValue = null; let donations = charList[i].donation_series; for (let j = 0; j < donations.length; j++) { currentValue = donations[j].donation; if (currentValue == null) continue; if (currentValue == 0 && preValue == null) continue; let dailyDon = (preValue > currentValue) ? currentValue : currentValue - preValue; preValue = currentValue; sum = sum + dailyDon; count++; } playerList.updatePlayerDonations(charList[i].member['name'], (sum / count).toFixed(2), count); } }); } async function loadWarPage() { updateLoaderText(`${getP(-3, playerList.length)}% - Updating War Page Data`); await sendRequst(`https://royaleapi.com/clan/${CLAN_NAME}/war/analytics`).then(function(item){ var mainTable = item.getElementsByTagName('tbody')[0]; var trs = mainTable.getElementsByTagName('tr'); var secondTable = item.getElementsByTagName('tbody')[1]; var secondTrs = secondTable.getElementsByTagName('tr'); for (let i = 1; i < trs.length; i++) { let playerId = trs[i].getElementsByTagName('a')[0].href.substring(29,38); let clms = trs[i].getElementsByClassName('right aligned'); let avg = parseFloat(clms[0].innerHTML); let count = clms[1].innerHTML; let mia = clms[2].innerHTML; let fightMissCount = 2 * (secondTrs[i].innerHTML.match(/\(1\)/g) || []).length + (secondTrs[i].innerHTML.match(/\(2\)/g) || []).length playerList.updatePlayerWar(playerId, count, avg, mia, fightMissCount); } }); } async function loadCurrentWarPage() { updateLoaderText(`${getP(-2, playerList.length)}% - Updating Current War Data`); let results = await sendAPIRequest(API_CLAN_WAR_DATA, CLAN_NAME); let participants = results['participants']; playerList.resetAllCurrentWar(); if (!participants) return; for (const part of participants) { playerList.updateCurrentWarStatus(part.tag); } } // End Load Data From Sources // Donations Page Functions function donationsPage() { let objTbl = document.getElementById('hist_container'); let objRows = objTbl.getElementsByClassName('member_row_container'); let currentValue = 0; let preValue = 0; for (let i = 0; i < objRows.length; i++) { let starter = false; let sum = 0; let objCols = objRows[i].getElementsByClassName('member_cell'); for (let j = 0; j < objCols.length; j++) { objCols[j].align = "center"; currentValue = parseInt(objCols[j].outerHTML.split("\"")[7]); let dailyDon = (preValue > currentValue) ? currentValue : currentValue - preValue; objCols[j].innerHTML = dailyDon; sum = sum + dailyDon; if (currentValue > 0 && starter == false) starter = true; preValue = currentValue; let donationsAmount = parseInt(objCols[j].innerHTML); objCols[j].style = `background-color:#${getColorForDonations(donationsAmount, starter)}`; } objCols[0].remove(); // Remove First and Second Column objCols[1].remove(); let playerName = objRows[i].getElementsByClassName('member_name')[0].innerHTML.trim(); objRows[i].getElementsByClassName('member_name')[0].innerHTML += ` (${sum}) `; } } function getColorForDonations(value, starter){ if (value >= DONATIONS_GOOD_AMOUNT) return GOOD; if (value >= DONATIONS_GOOD_AMOUNT / 2) return MID; if (value == 0) return (starter == false) ? WHITE : BAD; return LOW; } function getColorForRole(value) { if (value.indexOf('Leader') >= 0) return GOOD; if (value.indexOf('Elder') >= 0) return MID; if (value.indexOf('Member') >= 0) return LOW; return BAD; } // End Donations Page Functions // Main function loaders() { return new Promise(async function (fulfill, reject){ updateLoaderText(`0% - Script is Starting`); await loadClanList(); await loadDonationsPage(); await loadWarPage(); await loadCurrentWarPage(); return fulfill(); }); } (function() { 'use strict'; let url = document.URL; if (url.indexOf(CLAN_NAME) < 0) return; if (url.indexOf('donations') >= 0) return donationsPage(); if (url.indexOf('war') >= 0) return; loaders().then(function() { displayScriptResults(); }); })(); // Consts var ACTIVE_DAYS = 28; // API Enum var API_PLAYER_DATA = 1; var API_CLAN_WAR_DATA = 2; var API_ENDPOINTS_DATA = 3; // Role Enum var MEMBER_ROLE = 1; var ELDER_ROLE = 2; var CO_LEADER_ROLE = 3; var LEADER_ROLE = 4; // Graphics var GOOD = "66CCFF"; var MID = "CCFFCC"; var LOW = "FFFFCC"; var BAD = "FF9999"; var WHITE = "FFFFFF" var LINE_LENGTH = 20; var UP = '▲'; var DOWN = '▼'; var SAME = ''; // Logs var loaderText; function updateLoaderText(text) { if (loaderText == undefined) loaderText = document.getElementById('page_content').getElementsByClassName('ui attached segment')[3]; loaderText.innerHTML = text; } function getP(index, length) { let loadPages = 5; if (index < 0) index = length + loadPages + index; return parseInt(index * 100 / (length + loadPages)); } // Network function sendAPIRequest(pageId, tagId) { return new Promise(function (fulfill) { var url = `${PROXY == true ? CORSProxy : ''}${APIURL}`; switch (pageId) { case API_PLAYER_DATA: url += `/player/${tagId}`; break; case API_CLAN_WAR_DATA: url += `/clan/${tagId}/war`; break; } var settings = { "async": true, "crossDomain": true, "url": url, "method": "GET", "headers": { "auth": AUTH_KEY, 'Content-Type': 'application/json', 'X-Requested-With': 'XMLHttpRequest' } } $.ajax(settings).done(function (response) { return fulfill(response); }).fail(function(xhr, status, error) { updateLoaderText(`Error Code: ${xhr.status} - ${error}`); }); }); } function sendRequst(url) { return new Promise(function (fulfill, reject){ var xhttp = new XMLHttpRequest(); xhttp.open("GET", url , true); xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhttp.send(); xhttp.onreadystatechange = function () { if(xhttp.readyState === 4 && xhttp.status === 200) { var div = document.createElement('div'); div.id = "req_id"; div.innerHTML = xhttp.responseText; return fulfill(div); } }; }); }