diff --git a/dist/extendedMapPopup.js b/dist/extendedMapPopup.js index bede477..8ad39ea 100644 --- a/dist/extendedMapPopup.js +++ b/dist/extendedMapPopup.js @@ -664,7 +664,7 @@ const LAST_VILLAGE_CONQUER_QUERY = "\n query ennoblements($server: String!, $ const SERVER_CONFIG_LOCAL_STORAGE_KEY = 'kiszkowaty_extended_map_popup_server_cfg'; const translations = (0, _extendedMapPopup.default)(); -const loadConfigsFromLocalStorage = () => { +const loadConfigFromLocalStorage = () => { return (0, _localStorage.getItem)(SERVER_CONFIG_LOCAL_STORAGE_KEY); }; @@ -674,11 +674,11 @@ const cacheServerConfig = function cacheServerConfig() { }; const isConfigExpired = date => { - return Math.abs((0, _differenceInMinutes.default)(date, new Date())) >= 60 * 24; + return Math.abs(date.getTime() - new Date().getTime()) > 1000 * 60 * 60 * 24; }; -const loadConfigs = async () => { - let data = loadConfigsFromLocalStorage(); +const loadConfig = async () => { + let data = loadConfigFromLocalStorage(); if (!data || !data.server || isConfigExpired(new Date(data.loadedAt)) || !data.server.config || !data.server.config.speed || !data.server.config.snob || !data.server.config.snob.maxDist || !data.server.config.unitSpeed || !data.server.unitConfig) { data = await (0, _requestCreator.default)({ @@ -828,7 +828,7 @@ const createDisplayForVillageHandler = cfg => async (e, a, t) => { (async function () { try { - const configs = await loadConfigs(); + const configs = await loadConfig(); TWMap.popup.extendedMapPopupCache = {}; TWMap.popup._loadVillage = TWMap.popup.loadVillage; TWMap.popup.loadVillage = createLoadVillageHandler(configs); diff --git a/dist/extendedVillageProfile.js b/dist/extendedVillageProfile.js index dd51035..0bc1508 100644 --- a/dist/extendedVillageProfile.js +++ b/dist/extendedVillageProfile.js @@ -167,13 +167,25 @@ Object.defineProperty(exports, "__esModule", { exports.default = void 0; const translations = { pl_PL: { + loaded: 'Załadowano', + pop: 'Populacja', + mySupport: 'Moje wsparcie', + allySupport: 'Wsparcie plemienia', + total: 'Łącznie', action: { - showEnnoblements: 'Pokaż przejęcia' + showEnnoblements: 'Pokaż przejęcia', + countIncomingSupport: 'Policz nadchodzące wsparcie' } }, en_DK: { + loaded: 'Loaded', + pop: 'Pop', + mySupport: 'My support', + allySupport: 'Ally support', + total: 'Total', action: { - showEnnoblements: 'Show ennoblements' + showEnnoblements: 'Show ennoblements', + countIncomingSupport: 'Count incoming support' } } }; @@ -282,6 +294,115 @@ exports.default = void 0; var _default = url => parseInt(new URLSearchParams(url).get('id')); exports.default = _default; +},{}],"fHHP":[function(require,module,exports) { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.buildImgURL = exports.calcAttackDuration = exports.formatVillageName = exports.formatVillageURL = exports.formatPlayerURL = exports.formatTribeURL = void 0; + +const formatTribeURL = id => { + return window.location.origin + TribalWars.buildURL('', { + screen: 'info_ally', + id + }); +}; + +exports.formatTribeURL = formatTribeURL; + +const formatPlayerURL = id => { + return window.location.origin + TribalWars.buildURL('', { + screen: 'info_player', + id + }); +}; + +exports.formatPlayerURL = formatPlayerURL; + +const formatVillageURL = id => { + return window.location.origin + TribalWars.buildURL('', { + screen: 'info_village', + id + }); +}; + +exports.formatVillageURL = formatVillageURL; + +const formatVillageName = function formatVillageName() { + let n = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; + let x = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 500; + let y = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 500; + const continent = 'K' + String(y)[0] + String(x)[0]; + return "".concat(n, " (").concat(x, "|").concat(y, ") ").concat(continent); +}; + +exports.formatVillageName = formatVillageName; + +const calcAttackDuration = (distance, unitSpeed, baseSpeed) => { + return Math.round(distance * baseSpeed / unitSpeed); +}; + +exports.calcAttackDuration = calcAttackDuration; + +const buildImgURL = img => { + return image_base + img; +}; + +exports.buildImgURL = buildImgURL; +},{}],"KX6P":[function(require,module,exports) { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _tribalwars = require("./tribalwars"); + +var _default = unit => { + return (0, _tribalwars.buildImgURL)("unit/unit_".concat(unit, ".png")); +}; + +exports.default = _default; +},{"./tribalwars":"fHHP"}],"oUdd":[function(require,module,exports) { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _default = t => new Promise(resolve => setTimeout(resolve, t)); + +exports.default = _default; +},{}],"KWxH":[function(require,module,exports) { +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.setItem = exports.getItem = void 0; + +const getItem = function getItem(key) { + let d = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + const json = localStorage.getItem(key); + let obj = d; + + if (json) { + obj = JSON.parse(json); + } + + return obj; +}; + +exports.getItem = getItem; + +const setItem = (key, payload) => { + localStorage.setItem(key, JSON.stringify(payload)); +}; + +exports.setItem = setItem; },{}],"tKRp":[function(require,module,exports) { "use strict"; @@ -373,62 +494,6 @@ var _default = (date, options) => { }; exports.default = _default; -},{}],"fHHP":[function(require,module,exports) { -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.buildImgURL = exports.calcAttackDuration = exports.formatVillageName = exports.formatVillageURL = exports.formatPlayerURL = exports.formatTribeURL = void 0; - -const formatTribeURL = id => { - return window.location.origin + TribalWars.buildURL('', { - screen: 'info_ally', - id - }); -}; - -exports.formatTribeURL = formatTribeURL; - -const formatPlayerURL = id => { - return window.location.origin + TribalWars.buildURL('', { - screen: 'info_player', - id - }); -}; - -exports.formatPlayerURL = formatPlayerURL; - -const formatVillageURL = id => { - return window.location.origin + TribalWars.buildURL('', { - screen: 'info_village', - id - }); -}; - -exports.formatVillageURL = formatVillageURL; - -const formatVillageName = function formatVillageName() { - let n = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; - let x = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 500; - let y = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 500; - const continent = 'K' + String(y)[0] + String(x)[0]; - return "".concat(n, " (").concat(x, "|").concat(y, ") ").concat(continent); -}; - -exports.formatVillageName = formatVillageName; - -const calcAttackDuration = (distance, unitSpeed, baseSpeed) => { - return Math.round(distance * baseSpeed / unitSpeed); -}; - -exports.calcAttackDuration = calcAttackDuration; - -const buildImgURL = img => { - return image_base + img; -}; - -exports.buildImgURL = buildImgURL; },{}],"vNT1":[function(require,module,exports) { "use strict"; @@ -509,16 +574,28 @@ var _getCurrentServer = _interopRequireDefault(require("./utils/getCurrentServer var _getIDFromURL = _interopRequireDefault(require("./utils/getIDFromURL")); +var _buildUnitImgURL = _interopRequireDefault(require("./utils/buildUnitImgURL")); + +var _wait = _interopRequireDefault(require("./utils/wait")); + +var _localStorage = require("./utils/localStorage"); + var _showEnnoblementsPopup = _interopRequireDefault(require("./common/showEnnoblementsPopup")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + // ==UserScript== // @name Extended Village Profile // @namespace https://github.com/tribalwarshelp/scripts // @updateURL https://raw.githubusercontent.com/tribalwarshelp/scripts/master/dist/extendedVillageProfile.js // @downloadURL https://raw.githubusercontent.com/tribalwarshelp/scripts/master/dist/extendedVillageProfile.js -// @version 0.5.6 +// @version 0.6.2 // @description Extended Village Profile // @author Kichiyaki http://dawid-wysokinski.pl/ // @match *://*/game.php*screen=info_village* @@ -529,9 +606,42 @@ const SERVER = (0, _getCurrentServer.default)(); const VILLAGE_ID = (0, _getIDFromURL.default)(window.location.search); const ENNOBLEMENTS_QUERY = "\n query ennoblements($server: String!, $filter: EnnoblementFilter!) {\n ennoblements(server: $server, filter: $filter) {\n total\n items {\n village {\n id\n name\n x\n y\n }\n oldOwner {\n id\n name\n }\n oldOwnerTribe {\n id\n tag\n }\n newOwner {\n id\n name\n }\n newOwnerTribe {\n id\n tag\n }\n ennobledAt\n }\n }\n }\n"; const ENNOBLEMENTS_PER_PAGE = 15; +const CURR_SERVER_CONFIG = "\n query server($key: String!) {\n server(key: $key) {\n unitConfig {\n spear {\n pop\n }\n sword {\n pop\n }\n axe {\n pop\n }\n archer {\n pop\n }\n spy {\n pop\n }\n light {\n pop\n }\n marcher {\n pop\n }\n heavy {\n pop\n }\n ram {\n pop\n }\n catapult {\n pop\n }\n knight {\n pop\n }\n snob {\n pop\n }\n }\n }\n }\n"; +const SERVER_CONFIG_LOCAL_STORAGE_KEY = 'kiszkowaty_extended_village_profile_server_cfg'; const actionsContainer = document.querySelector('#content_value > table > tbody > tr > td:nth-child(1) > table:nth-child(2) > tbody'); +let serverConfig = {}; const translations = (0, _extendedVillageProfile.default)(); +const loadConfigFromLocalStorage = () => { + return (0, _localStorage.getItem)(SERVER_CONFIG_LOCAL_STORAGE_KEY); +}; + +const cacheServerConfig = function cacheServerConfig() { + let data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + (0, _localStorage.setItem)(SERVER_CONFIG_LOCAL_STORAGE_KEY, data); +}; + +const isConfigExpired = date => { + return Math.abs(date.getTime() - new Date().getTime()) > 1000 * 60 * 60 * 24; +}; + +const loadConfig = async () => { + let data = loadConfigFromLocalStorage(); + + if (!data.server || isConfigExpired(new Date(data.loadedAt))) { + data = await (0, _requestCreator.default)({ + query: CURR_SERVER_CONFIG, + variables: { + key: SERVER + } + }); + data.loadedAt = new Date(); + cacheServerConfig(data); + } + + return data.server; +}; + const handleShowTribeEnnoblementsClick = async e => { e.preventDefault(); const page = (0, _pagination.getPage)(e.target); @@ -557,6 +667,107 @@ const handleShowTribeEnnoblementsClick = async e => { } }; +const buildCellsForIncSupport = units => { + const cells = []; + let pop = 0; + + for (let unit in units) { + pop += units[unit] * serverConfig.unitConfig[unit].pop; + cells.push("".concat(units[unit].toLocaleString(), "")); + } + + cells.push("".concat(pop.toLocaleString(), "")); + return cells; +}; + +const handleCountIncomingSupportClick = async e => { + e.preventDefault(); + const ids = []; + const allyCommand = {}; + document.querySelectorAll('span.command_hover_details[data-command-type="support"]').forEach(el => { + const id = parseInt(el.getAttribute('data-command-id')); + + if (el.classList.contains('commandicon-ally')) { + allyCommand[id] = true; + } else { + allyCommand[id] = false; + } + + ids.push(id); + }); + const mySupport = { + spear: 0, + sword: 0, + axe: 0, + archer: 0, + spy: 0, + light: 0, + marcher: 0, + heavy: 0, + ram: 0, + catapult: 0, + knight: 0, + snob: 0 + }; + + const allySupport = _objectSpread({}, mySupport); + + const total = _objectSpread({}, mySupport); + + for (let i = 0; i < ids.length; i++) { + Dialog.show('incomingSupport', "".concat(translations.loaded, ": ").concat(i, " / ").concat(ids.length, "")); + const id = ids[i]; + const url = TribalWars.buildURL('', { + screen: 'info_command', + ajax: 'details', + id + }); + + try { + const resp = await fetch(url); + const { + units + } = await resp.json(); + + if (units) { + for (let unit in mySupport) { + const count = parseInt(units[unit].count); + + if (allyCommand[id]) { + allySupport[unit] += count; + } else { + mySupport[unit] += count; + } + + total[unit] += count; + } + } + + await (0, _wait.default)(200); + } catch (error) { + console.log('count incoming support', error); + } + } + + const ths = ['']; + + for (let unit in mySupport) { + ths.push("")); + } + + ths.push("".concat(translations.pop, "")); + const mySupportCells = ["".concat(translations.mySupport, ""), ...buildCellsForIncSupport(mySupport)]; + const allySupportCells = ["".concat(translations.allySupport, ""), ...buildCellsForIncSupport(allySupport)]; + const totalCells = ["".concat(translations.total, ""), ...buildCellsForIncSupport(total)]; + Dialog.show('incomingSupport', "\n \n \n \n ".concat(ths.join(''), "\n \n \n ").concat(mySupportCells.join(''), "\n \n \n ").concat(allySupportCells.join(''), "\n \n \n ").concat(totalCells.join(''), "\n \n \n
\n ")); + const popup = document.querySelector('.popup_box'); + + if (popup) { + popup.style.width = 'auto'; + popup.style.maxWidth = '900px'; + } +}; + const wrapAction = action => { const actionWrapperTd = document.createElement('td'); actionWrapperTd.colSpan = '2'; @@ -573,9 +784,19 @@ const renderActions = () => { showEnnoblementsPopup.innerHTML = translations.action.showEnnoblements; showEnnoblementsPopup.addEventListener('click', handleShowTribeEnnoblementsClick); actionsContainer.appendChild(wrapAction(showEnnoblementsPopup)); + const countIncomingSupport = document.createElement('a'); + countIncomingSupport.href = '#'; + countIncomingSupport.innerHTML = translations.action.countIncomingSupport; + countIncomingSupport.addEventListener('click', handleCountIncomingSupportClick); + actionsContainer.appendChild(wrapAction(countIncomingSupport)); }; -(function () { - renderActions(); +(async function () { + try { + serverConfig = await loadConfig(); + renderActions(); + } catch (error) { + console.log('extended village profile', error); + } })(); -},{"./libs/requestCreator":"Ph2E","./i18n/extendedVillageProfile":"LNef","./utils/pagination":"fCHX","./utils/getCurrentServer":"DMkL","./utils/getIDFromURL":"tQUs","./common/showEnnoblementsPopup":"vNT1"}]},{},["UdfQ"], null) \ No newline at end of file +},{"./libs/requestCreator":"Ph2E","./i18n/extendedVillageProfile":"LNef","./utils/pagination":"fCHX","./utils/getCurrentServer":"DMkL","./utils/getIDFromURL":"tQUs","./utils/buildUnitImgURL":"KX6P","./utils/wait":"oUdd","./utils/localStorage":"KWxH","./common/showEnnoblementsPopup":"vNT1"}]},{},["UdfQ"], null) \ No newline at end of file diff --git a/dist/quickbar/extendedMapPopup.js b/dist/quickbar/extendedMapPopup.js index 13ff38c..f4aaa8f 100644 --- a/dist/quickbar/extendedMapPopup.js +++ b/dist/quickbar/extendedMapPopup.js @@ -29,5 +29,5 @@ parcelRequire=function(e,r,t,n){var i,o="function"==typeof parcelRequire&&parcel },{"./tribalwars":"fHHP"}],"KWxH":[function(require,module,exports) { "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.setItem=exports.getItem=void 0;const e=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const o=localStorage.getItem(e);let s=t;return o&&(s=JSON.parse(o)),s};exports.getItem=e;const t=(e,t)=>{localStorage.setItem(e,JSON.stringify(t))};exports.setItem=t; },{}],"HdqX":[function(require,module,exports) { -"use strict";var e=c(require("date-fns/differenceInMinutes")),n=c(require("date-fns/addMinutes")),t=c(require("./i18n/extendedMapPopup")),r=c(require("./libs/requestCreator")),a=c(require("./utils/formatDate")),o=c(require("./utils/getCurrentServer")),i=require("./utils/math"),l=c(require("./utils/buildUnitImgURL")),d=require("./utils/localStorage"),p=require("./utils/tribalwars");function c(e){return e&&e.__esModule?e:{default:e}}function s(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter(function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable})),t.push.apply(t,r)}return t}function u(e){for(var n=1;n(0,d.getItem)(m),w=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};(0,d.setItem)(m,e)},M=n=>Math.abs((0,e.default)(n,new Date))>=1440,T=async()=>{let e=h();return e&&e.server&&!M(new Date(e.loadedAt))&&e.server.config&&e.server.config.speed&&e.server.config.snob&&e.server.config.snob.maxDist&&e.server.config.unitSpeed&&e.server.unitConfig||((e=await(0,r.default)({query:b,variables:{key:f}})).loadedAt=new Date,w(e)),e&&e.server&&e.server.config?{config:e.server.config,unitConfig:e.server.unitConfig}:{}},q=async function(e){let{cacheOnly:n=!1}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(n||TWMap.popup.extendedMapPopupCache[e])return TWMap.popup.extendedMapPopupCache[e];try{const n=await(0,r.default)({query:y,variables:{server:f,filter:{villageID:[e],sort:"ennobledAt DESC"}}});return TWMap.popup.extendedMapPopupCache[e]=n,n}catch(t){console.log("loadVillageData",t)}},O=(n,t)=>{let r=25+Math.abs((0,e.default)(n,new Date))*(t/60);return r>100&&(r=100),Math.floor(r)},D=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const n=[];for(let t in e)0!==e[t].speed&&n.push(u(u({},e[t]),{},{name:t,img:(0,l.default)(t)}));return n},S=e=>e%2==0?"#f8f4e8":"#ded3b9;",C=(e,n)=>'\n \n \n \n '),x=(e,t)=>'\n \n ').concat((0,a.default)((0,n.default)(new Date(Timing.getCurrentServerTime()),e)),"\n \n "),P=(e,n,t)=>{let{config:r,unitConfig:o}=t;const l=TWMap.CoordByXY(TWMap.villageKey[e]),d=(0,i.calcDistanceBetweenTwoPoints)(l[0],l[1],window.game_data.village.x,window.game_data.village.y),c=n&&n.ennoblements&&n.ennoblements.items&&n.ennoblements.items.length>0?n.ennoblements.items[0]:void 0,s=document.querySelector("#map_popup #info_content tbody");let u=s.querySelector("#units");u||((u=document.createElement("tr")).id="units",s.appendChild(u));const g=D(o);u.innerHTML='\n \n \n \n \n '.concat(g.map(C).join(""),'\n \n \n ').concat(g.map((e,n)=>x((0,p.calcAttackDuration)(d,r.unitSpeed,e.speed),n)).join(""),"\n \n \n
\n \n ");let f=s.querySelector("#lastEnnobledAt");f||((f=document.createElement("tr")).id="lastEnnobledAt",s.appendChild(f)),f.innerHTML="\n \n ".concat(v.ennobledAt,":\n \n \n ").concat(c?(0,a.default)(c.ennobledAt):v.never,"\n \n ");let b=s.querySelector("#loyalty");b||((b=document.createElement("tr")).id="loyalty",s.appendChild(b)),b.innerHTML="\n \n ".concat(v.possibleLoyalty,":\n \n \n ").concat(c?O(new Date(c.ennobledAt),r.speed):100,"\n \n ");let y=s.querySelector("#canSendNoble");y||((y=document.createElement("tr")).id="canSendNoble",s.appendChild(y)),y.innerHTML="\n \n ".concat(v.canSendNoble,":\n \n \n ").concat(d\n ")},_=e=>async n=>{TWMap.popup._loadVillage(n);const t=await q(parseInt(n));P(parseInt(n),t,e)},j=e=>async(n,t,r)=>{TWMap.popup._displayForVillage(n,t,r);const a=await q(parseInt(n.id),{cacheOnly:window.game_data.features.Premium.active});P(parseInt(n.id),a,e)};!async function(){try{const n=await T();TWMap.popup.extendedMapPopupCache={},TWMap.popup._loadVillage=TWMap.popup.loadVillage,TWMap.popup.loadVillage=_(n),TWMap.popup._displayForVillage=TWMap.popup.displayForVillage,TWMap.popup.displayForVillage=j(n)}catch(e){console.log("extended map popup",e)}}(); +"use strict";var e=c(require("date-fns/differenceInMinutes")),n=c(require("date-fns/addMinutes")),t=c(require("./i18n/extendedMapPopup")),r=c(require("./libs/requestCreator")),a=c(require("./utils/formatDate")),o=c(require("./utils/getCurrentServer")),i=require("./utils/math"),l=c(require("./utils/buildUnitImgURL")),d=require("./utils/localStorage"),p=require("./utils/tribalwars");function c(e){return e&&e.__esModule?e:{default:e}}function s(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter(function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable})),t.push.apply(t,r)}return t}function u(e){for(var n=1;n(0,d.getItem)(m),w=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};(0,d.setItem)(m,e)},M=e=>Math.abs(e.getTime()-(new Date).getTime())>864e5,T=async()=>{let e=h();return e&&e.server&&!M(new Date(e.loadedAt))&&e.server.config&&e.server.config.speed&&e.server.config.snob&&e.server.config.snob.maxDist&&e.server.config.unitSpeed&&e.server.unitConfig||((e=await(0,r.default)({query:b,variables:{key:f}})).loadedAt=new Date,w(e)),e&&e.server&&e.server.config?{config:e.server.config,unitConfig:e.server.unitConfig}:{}},q=async function(e){let{cacheOnly:n=!1}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(n||TWMap.popup.extendedMapPopupCache[e])return TWMap.popup.extendedMapPopupCache[e];try{const n=await(0,r.default)({query:y,variables:{server:f,filter:{villageID:[e],sort:"ennobledAt DESC"}}});return TWMap.popup.extendedMapPopupCache[e]=n,n}catch(t){console.log("loadVillageData",t)}},O=(n,t)=>{let r=25+Math.abs((0,e.default)(n,new Date))*(t/60);return r>100&&(r=100),Math.floor(r)},D=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const n=[];for(let t in e)0!==e[t].speed&&n.push(u(u({},e[t]),{},{name:t,img:(0,l.default)(t)}));return n},S=e=>e%2==0?"#f8f4e8":"#ded3b9;",C=(e,n)=>'\n \n \n \n '),x=(e,t)=>'\n \n ').concat((0,a.default)((0,n.default)(new Date(Timing.getCurrentServerTime()),e)),"\n \n "),P=(e,n,t)=>{let{config:r,unitConfig:o}=t;const l=TWMap.CoordByXY(TWMap.villageKey[e]),d=(0,i.calcDistanceBetweenTwoPoints)(l[0],l[1],window.game_data.village.x,window.game_data.village.y),c=n&&n.ennoblements&&n.ennoblements.items&&n.ennoblements.items.length>0?n.ennoblements.items[0]:void 0,s=document.querySelector("#map_popup #info_content tbody");let u=s.querySelector("#units");u||((u=document.createElement("tr")).id="units",s.appendChild(u));const g=D(o);u.innerHTML='\n \n \n \n \n '.concat(g.map(C).join(""),'\n \n \n ').concat(g.map((e,n)=>x((0,p.calcAttackDuration)(d,r.unitSpeed,e.speed),n)).join(""),"\n \n \n
\n \n ");let f=s.querySelector("#lastEnnobledAt");f||((f=document.createElement("tr")).id="lastEnnobledAt",s.appendChild(f)),f.innerHTML="\n \n ".concat(v.ennobledAt,":\n \n \n ").concat(c?(0,a.default)(c.ennobledAt):v.never,"\n \n ");let b=s.querySelector("#loyalty");b||((b=document.createElement("tr")).id="loyalty",s.appendChild(b)),b.innerHTML="\n \n ".concat(v.possibleLoyalty,":\n \n \n ").concat(c?O(new Date(c.ennobledAt),r.speed):100,"\n \n ");let y=s.querySelector("#canSendNoble");y||((y=document.createElement("tr")).id="canSendNoble",s.appendChild(y)),y.innerHTML="\n \n ".concat(v.canSendNoble,":\n \n \n ").concat(d\n ")},_=e=>async n=>{TWMap.popup._loadVillage(n);const t=await q(parseInt(n));P(parseInt(n),t,e)},j=e=>async(n,t,r)=>{TWMap.popup._displayForVillage(n,t,r);const a=await q(parseInt(n.id),{cacheOnly:window.game_data.features.Premium.active});P(parseInt(n.id),a,e)};!async function(){try{const n=await T();TWMap.popup.extendedMapPopupCache={},TWMap.popup._loadVillage=TWMap.popup.loadVillage,TWMap.popup.loadVillage=_(n),TWMap.popup._displayForVillage=TWMap.popup.displayForVillage,TWMap.popup.displayForVillage=j(n)}catch(e){console.log("extended map popup",e)}}(); },{"date-fns/differenceInMinutes":"oGJj","date-fns/addMinutes":"pfh4","./i18n/extendedMapPopup":"ddIN","./libs/requestCreator":"Ph2E","./utils/formatDate":"V6Mf","./utils/getCurrentServer":"DMkL","./utils/math":"XOOL","./utils/buildUnitImgURL":"KX6P","./utils/localStorage":"KWxH","./utils/tribalwars":"fHHP"}]},{},["HdqX"], null) \ No newline at end of file diff --git a/dist/quickbar/extendedVillageProfile.js b/dist/quickbar/extendedVillageProfile.js index 13d47a9..bf0b641 100644 --- a/dist/quickbar/extendedVillageProfile.js +++ b/dist/quickbar/extendedVillageProfile.js @@ -1,23 +1,29 @@ parcelRequire=function(e,r,t,n){var i,o="function"==typeof parcelRequire&&parcelRequire,u="function"==typeof require&&require;function f(t,n){if(!r[t]){if(!e[t]){var i="function"==typeof parcelRequire&&parcelRequire;if(!n&&i)return i(t,!0);if(o)return o(t,!0);if(u&&"string"==typeof t)return u(t);var c=new Error("Cannot find module '"+t+"'");throw c.code="MODULE_NOT_FOUND",c}p.resolve=function(r){return e[t][1][r]||r},p.cache={};var l=r[t]=new f.Module(t);e[t][0].call(l.exports,p,l,l.exports,this)}return r[t].exports;function p(e){return f(p.resolve(e))}}f.isParcelRequire=!0,f.Module=function(e){this.id=e,this.bundle=f,this.exports={}},f.modules=e,f.cache=r,f.parent=o,f.register=function(r,t){e[r]=[function(e,r){r.exports=t},{}]};for(var c=0;c0&&void 0!==arguments[0]?arguments[0]:{};return fetch(e,{method:"POST",body:JSON.stringify({query:r,variables:t}),headers:{"Content-Type":"application/json"}}).then(e=>e.json()).then(e=>{let{data:r,errors:t}=e;if(t&&Array.isArray(t)&&t.length>0)throw new Error(t[0].message);return new Promise(e=>e(r))})};exports.default=r; },{}],"LNef":[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;const e={pl_PL:{action:{showEnnoblements:"Pokaż przejęcia"}},en_DK:{action:{showEnnoblements:"Show ennoblements"}}};var o=()=>e[window.game_data.locale]||e.en_DK;exports.default=o; +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;const o={pl_PL:{loaded:"Załadowano",pop:"Populacja",mySupport:"Moje wsparcie",allySupport:"Wsparcie plemienia",total:"Łącznie",action:{showEnnoblements:"Pokaż przejęcia",countIncomingSupport:"Policz nadchodzące wsparcie"}},en_DK:{loaded:"Loaded",pop:"Pop",mySupport:"My support",allySupport:"Ally support",total:"Total",action:{showEnnoblements:"Show ennoblements",countIncomingSupport:"Count incoming support"}}};var e=()=>o[window.game_data.locale]||o.en_DK;exports.default=e; },{}],"fCHX":[function(require,module,exports) { "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.generatePaginationItems=exports.calcNumberOfPages=exports.getPage=exports.setPage=exports.getContainerStyles=void 0;const e="data-page",t=()=>"display: flex; flex-direction: row; flex-wrap: wrap;";exports.getContainerStyles=t;const r=function(t){let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;if(!t instanceof HTMLElement)throw new Error("Expected HTMLElement as the first argument");if("number"!=typeof(r=parseInt(r))||isNaN(r))throw new Error("Expected number or string as the second argument");t.setAttribute(e,r+"")};exports.setPage=r;const n=t=>!t instanceof HTMLElement?0:parseInt(t.getAttribute(e));exports.getPage=n;const o=(e,t)=>{if("number"!=typeof e)throw new Error("Expected number as the first argument");if("number"!=typeof t)throw new Error("Expected number as the second argument");return e>0?Math.ceil(e/t):1};exports.calcNumberOfPages=o;const a=function(){let{total:t,limit:r,marginRight:n=3,currentPage:a=0}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const s=o(t,r),c=[];for(let o=1;o<=s;o++)o===a?c.push('>').concat(o,"<")):c.push('').concat(o,""));return c};exports.generatePaginationItems=a; },{}],"DMkL":[function(require,module,exports) { "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=()=>window.location.host.split(".")[0];exports.default=e; },{}],"tQUs":[function(require,module,exports) { "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=e=>parseInt(new URLSearchParams(e).get("id"));exports.default=e; +},{}],"fHHP":[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.buildImgURL=exports.calcAttackDuration=exports.formatVillageName=exports.formatVillageURL=exports.formatPlayerURL=exports.formatTribeURL=void 0;const o=o=>window.location.origin+TribalWars.buildURL("",{screen:"info_ally",id:o});exports.formatTribeURL=o;const t=o=>window.location.origin+TribalWars.buildURL("",{screen:"info_player",id:o});exports.formatPlayerURL=t;const r=o=>window.location.origin+TribalWars.buildURL("",{screen:"info_village",id:o});exports.formatVillageURL=r;const e=function(){let o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:500,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:500;const e="K"+String(r)[0]+String(t)[0];return"".concat(o," (").concat(t,"|").concat(r,") ").concat(e)};exports.formatVillageName=e;const i=(o,t,r)=>Math.round(o*r/t);exports.calcAttackDuration=i;const a=o=>image_base+o;exports.buildImgURL=a; +},{}],"KX6P":[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=require("./tribalwars"),t=t=>(0,e.buildImgURL)("unit/unit_".concat(t,".png"));exports.default=t; +},{"./tribalwars":"fHHP"}],"oUdd":[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=e=>new Promise(t=>setTimeout(t,e));exports.default=e; +},{}],"KWxH":[function(require,module,exports) { +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.setItem=exports.getItem=void 0;const e=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const o=localStorage.getItem(e);let s=t;return o&&(s=JSON.parse(o)),s};exports.getItem=e;const t=(e,t)=>{localStorage.setItem(e,JSON.stringify(t))};exports.setItem=t; },{}],"tKRp":[function(require,module,exports) { "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;const e={pl_PL:{date:"Data",newOwner:"Nowy właściciel",oldOwner:"Stary właściciel",village:"Wioska",title:"Przejęcia"},en_DK:{date:"Date",newOwner:"New owner",oldOwner:"Old owner",village:"Village",title:"Ennoblements"}};var a=()=>e[window.game_data.locale]||e.en_DK;exports.default=a; },{}],"chDM":[function(require,module,exports) { "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;const e=".popup_helper",t="#inline_popup";var o=function(){let{e:e,title:o,html:n,id:l}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const i=document.querySelector(t);i&&(i.style.width="auto",i.style.maxWidth="1000px"),i.classList.contains("show")?(i.querySelector("#inline_popup_title").innerHTML=o,i.querySelector("#inline_popup_content").innerHTML=n):inlinePopup(e,l,null,{offset_x:0,offset_y:0},n,o);const p=document.querySelector(".popup_helper");p&&(p.style.width="auto",p.style.position="fixed",p.style.zIndex="50001")};exports.default=o; },{}],"V6Mf":[function(require,module,exports) { "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=(e,t)=>new Date(e).toLocaleDateString(window.game_data.locale.replace("_","-"),t||{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"});exports.default=e; -},{}],"fHHP":[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.buildImgURL=exports.calcAttackDuration=exports.formatVillageName=exports.formatVillageURL=exports.formatPlayerURL=exports.formatTribeURL=void 0;const o=o=>window.location.origin+TribalWars.buildURL("",{screen:"info_ally",id:o});exports.formatTribeURL=o;const t=o=>window.location.origin+TribalWars.buildURL("",{screen:"info_player",id:o});exports.formatPlayerURL=t;const r=o=>window.location.origin+TribalWars.buildURL("",{screen:"info_village",id:o});exports.formatVillageURL=r;const e=function(){let o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:500,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:500;const e="K"+String(r)[0]+String(t)[0];return"".concat(o," (").concat(t,"|").concat(r,") ").concat(e)};exports.formatVillageName=e;const i=(o,t,r)=>Math.round(o*r/t);exports.calcAttackDuration=i;const a=o=>image_base+o;exports.buildImgURL=a; },{}],"vNT1":[function(require,module,exports) { "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var t=l(require("../i18n/showEnnoblementsPopup")),e=require("../utils/pagination"),n=l(require("../utils/showPopup")),a=l(require("../utils/formatDate")),o=require("../utils/tribalwars");function l(t){return t&&t.__esModule?t:{default:t}}const r="ennoblementsPagination",i=(0,t.default)(),c=(t,e)=>t?'').concat(t.name," (").concat(e?'').concat(e.tag,""):"-",")"):"-";var d=function(t,l){let{limit:d=0,currentPage:s=1,onPageChange:u=(()=>{})}=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const g=(0,e.generatePaginationItems)({total:l.total,limit:d,currentPage:s}),m='\n
\n ').concat(g.join(""),'\n
\n \n \n \n \n \n \n \n \n ").concat(l.items.map(t=>{let e=""+"");return t.village?e+='"):e+="",e+=c(t.newOwner,t.newOwnerTribe),(e+=c(t.oldOwner,t.oldOwnerTribe))+""}).join(""),"\n \n
\n ').concat(i.date,"\n \n ").concat(i.village,"\n \n ").concat(i.newOwner,"\n \n ").concat(i.oldOwner,"\n
".concat((0,a.default)(t.ennobledAt),"').concat((0,o.formatVillageName)(t.village.name,t.village.x,t.village.y),"-
\n ");(0,n.default)({e:t,title:i.title,id:"ennoblements",html:m}),document.querySelectorAll("#ennoblementsPagination a").forEach(t=>{t.addEventListener("click",u)})};exports.default=d; },{"../i18n/showEnnoblementsPopup":"tKRp","../utils/pagination":"fCHX","../utils/showPopup":"chDM","../utils/formatDate":"V6Mf","../utils/tribalwars":"fHHP"}],"UdfQ":[function(require,module,exports) { -"use strict";var e=a(require("./libs/requestCreator")),n=a(require("./i18n/extendedVillageProfile")),t=require("./utils/pagination"),r=a(require("./utils/getCurrentServer")),l=a(require("./utils/getIDFromURL")),i=a(require("./common/showEnnoblementsPopup"));function a(e){return e&&e.__esModule?e:{default:e}}const o=(0,r.default)(),d=(0,l.default)(window.location.search),s="\n query ennoblements($server: String!, $filter: EnnoblementFilter!) {\n ennoblements(server: $server, filter: $filter) {\n total\n items {\n village {\n id\n name\n x\n y\n }\n oldOwner {\n id\n name\n }\n oldOwnerTribe {\n id\n tag\n }\n newOwner {\n id\n name\n }\n newOwnerTribe {\n id\n tag\n }\n ennobledAt\n }\n }\n }\n",u=15,c=document.querySelector("#content_value > table > tbody > tr > td:nth-child(1) > table:nth-child(2) > tbody"),m=(0,n.default)(),f=async n=>{n.preventDefault();const r=(0,t.getPage)(n.target);if(!isNaN(r)){const t=await(0,e.default)({query:s,variables:{filter:{villageID:[d],offset:15*(r-1),limit:15,sort:"ennobledAt DESC"},server:o}});(0,i.default)(n,t.ennoblements,{currentPage:r,limit:15,onPageChange:f})}},b=e=>{const n=document.createElement("td");n.colSpan="2",n.append(e);const t=document.createElement("tr");return t.appendChild(n),t},g=()=>{const e=document.createElement("a");e.href="#",(0,t.setPage)(e,"1"),e.innerHTML=m.action.showEnnoblements,e.addEventListener("click",f),c.appendChild(b(e))};g(); -},{"./libs/requestCreator":"Ph2E","./i18n/extendedVillageProfile":"LNef","./utils/pagination":"fCHX","./utils/getCurrentServer":"DMkL","./utils/getIDFromURL":"tQUs","./common/showEnnoblementsPopup":"vNT1"}]},{},["UdfQ"], null) \ No newline at end of file +"use strict";var e=s(require("./libs/requestCreator")),n=s(require("./i18n/extendedVillageProfile")),t=require("./utils/pagination"),r=s(require("./utils/getCurrentServer")),o=s(require("./utils/getIDFromURL")),a=s(require("./utils/buildUnitImgURL")),i=s(require("./utils/wait")),c=require("./utils/localStorage"),l=s(require("./common/showEnnoblementsPopup"));function s(e){return e&&e.__esModule?e:{default:e}}function u(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter(function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable})),t.push.apply(t,r)}return t}function p(e){for(var n=1;n table > tbody > tr > td:nth-child(1) > table:nth-child(2) > tbody");let v={};const O=(0,n.default)(),j=()=>(0,c.getItem)(y),S=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};(0,c.setItem)(y,e)},q=e=>Math.abs(e.getTime()-(new Date).getTime())>864e5,P=async()=>{let n=j();return n.server&&!q(new Date(n.loadedAt))||((n=await(0,e.default)({query:b,variables:{key:g}})).loadedAt=new Date,S(n)),n.server},D=async n=>{n.preventDefault();const r=(0,t.getPage)(n.target);if(!isNaN(r)){const t=await(0,e.default)({query:m,variables:{filter:{villageID:[h],offset:15*(r-1),limit:15,sort:"ennobledAt DESC"},server:g}});(0,l.default)(n,t.ennoblements,{currentPage:r,limit:15,onPageChange:D})}},E=e=>{const n=[];let t=0;for(let r in e)t+=e[r]*v.unitConfig[r].pop,n.push("".concat(e[r].toLocaleString(),""));return n.push("".concat(t.toLocaleString(),"")),n},_=async e=>{e.preventDefault();const n=[],t={};document.querySelectorAll('span.command_hover_details[data-command-type="support"]').forEach(e=>{const r=parseInt(e.getAttribute("data-command-id"));e.classList.contains("commandicon-ally")?t[r]=!0:t[r]=!1,n.push(r)});const r={spear:0,sword:0,axe:0,archer:0,spy:0,light:0,marcher:0,heavy:0,ram:0,catapult:0,knight:0,snob:0},o=p({},r),c=p({},r);for(let a=0;a").concat(a," / ").concat(n.length,""));const e=n[a],l=TribalWars.buildURL("",{screen:"info_command",ajax:"details",id:e});try{const n=await fetch(l),{units:a}=await n.json();if(a)for(let i in r){const n=parseInt(a[i].count);t[e]?o[i]+=n:r[i]+=n,c[i]+=n}await(0,i.default)(200)}catch(h){console.log("count incoming support",h)}}const l=[""];for(let i in r)l.push(''));l.push("".concat(O.pop,""));const s=["".concat(O.mySupport,""),...E(r)],u=["".concat(O.allySupport,""),...E(o)],d=["".concat(O.total,""),...E(c)];Dialog.show("incomingSupport",'\n \n \n \n '.concat(l.join(""),"\n \n \n ").concat(s.join(""),"\n \n \n ").concat(u.join(""),"\n \n \n ").concat(d.join(""),"\n \n \n
\n "));const g=document.querySelector(".popup_box");g&&(g.style.width="auto",g.style.maxWidth="900px")},k=e=>{const n=document.createElement("td");n.colSpan="2",n.append(e);const t=document.createElement("tr");return t.appendChild(n),t},x=()=>{const e=document.createElement("a");e.href="#",(0,t.setPage)(e,"1"),e.innerHTML=O.action.showEnnoblements,e.addEventListener("click",D),w.appendChild(k(e));const n=document.createElement("a");n.href="#",n.innerHTML=O.action.countIncomingSupport,n.addEventListener("click",_),w.appendChild(k(n))};!async function(){try{v=await P(),x()}catch(e){console.log("extended village profile",e)}}(); +},{"./libs/requestCreator":"Ph2E","./i18n/extendedVillageProfile":"LNef","./utils/pagination":"fCHX","./utils/getCurrentServer":"DMkL","./utils/getIDFromURL":"tQUs","./utils/buildUnitImgURL":"KX6P","./utils/wait":"oUdd","./utils/localStorage":"KWxH","./common/showEnnoblementsPopup":"vNT1"}]},{},["UdfQ"], null) \ No newline at end of file diff --git a/src/extendedMapPopup.js b/src/extendedMapPopup.js index 7471ed6..c89a3d9 100644 --- a/src/extendedMapPopup.js +++ b/src/extendedMapPopup.js @@ -89,7 +89,7 @@ const SERVER_CONFIG_LOCAL_STORAGE_KEY = 'kiszkowaty_extended_map_popup_server_cfg'; const translations = getTranslations(); -const loadConfigsFromLocalStorage = () => { +const loadConfigFromLocalStorage = () => { return getItem(SERVER_CONFIG_LOCAL_STORAGE_KEY); }; @@ -98,11 +98,11 @@ const cacheServerConfig = (data = {}) => { }; const isConfigExpired = (date) => { - return Math.abs(differenceInMinutes(date, new Date())) >= 60 * 24; + return Math.abs(date.getTime() - new Date().getTime()) > 1000 * 60 * 60 * 24; }; -const loadConfigs = async () => { - let data = loadConfigsFromLocalStorage(); +const loadConfig = async () => { + let data = loadConfigFromLocalStorage(); if ( !data || !data.server || @@ -323,7 +323,7 @@ const createDisplayForVillageHandler = (cfg) => async (e, a, t) => { (async function () { try { - const configs = await loadConfigs(); + const configs = await loadConfig(); TWMap.popup.extendedMapPopupCache = {}; TWMap.popup._loadVillage = TWMap.popup.loadVillage; diff --git a/src/extendedVillageProfile.js b/src/extendedVillageProfile.js index 30af3e1..64b45b4 100644 --- a/src/extendedVillageProfile.js +++ b/src/extendedVillageProfile.js @@ -3,6 +3,9 @@ import getTranslations from './i18n/extendedVillageProfile'; import { setPage, getPage } from './utils/pagination'; import getCurrentServer from './utils/getCurrentServer'; import getIDFromURL from './utils/getIDFromURL'; +import buildUnitImgURL from './utils/buildUnitImgURL'; +import wait from './utils/wait'; +import { setItem, getItem } from './utils/localStorage'; import showEnnoblementsPopup from './common/showEnnoblementsPopup'; // ==UserScript== @@ -10,7 +13,7 @@ import showEnnoblementsPopup from './common/showEnnoblementsPopup'; // @namespace https://github.com/tribalwarshelp/scripts // @updateURL https://raw.githubusercontent.com/tribalwarshelp/scripts/master/dist/extendedVillageProfile.js // @downloadURL https://raw.githubusercontent.com/tribalwarshelp/scripts/master/dist/extendedVillageProfile.js -// @version 0.5.6 +// @version 0.6.2 // @description Extended Village Profile // @author Kichiyaki http://dawid-wysokinski.pl/ // @match *://*/game.php*screen=info_village* @@ -53,11 +56,85 @@ const ENNOBLEMENTS_QUERY = ` } `; const ENNOBLEMENTS_PER_PAGE = 15; +const CURR_SERVER_CONFIG = ` + query server($key: String!) { + server(key: $key) { + unitConfig { + spear { + pop + } + sword { + pop + } + axe { + pop + } + archer { + pop + } + spy { + pop + } + light { + pop + } + marcher { + pop + } + heavy { + pop + } + ram { + pop + } + catapult { + pop + } + knight { + pop + } + snob { + pop + } + } + } + } +`; +const SERVER_CONFIG_LOCAL_STORAGE_KEY = + 'kiszkowaty_extended_village_profile_server_cfg'; const actionsContainer = document.querySelector( '#content_value > table > tbody > tr > td:nth-child(1) > table:nth-child(2) > tbody' ); +let serverConfig = {}; const translations = getTranslations(); +const loadConfigFromLocalStorage = () => { + return getItem(SERVER_CONFIG_LOCAL_STORAGE_KEY); +}; + +const cacheServerConfig = (data = {}) => { + setItem(SERVER_CONFIG_LOCAL_STORAGE_KEY, data); +}; + +const isConfigExpired = (date) => { + return Math.abs(date.getTime() - new Date().getTime()) > 1000 * 60 * 60 * 24; +}; + +const loadConfig = async () => { + let data = loadConfigFromLocalStorage(); + if (!data.server || isConfigExpired(new Date(data.loadedAt))) { + data = await requestCreator({ + query: CURR_SERVER_CONFIG, + variables: { + key: SERVER, + }, + }); + data.loadedAt = new Date(); + cacheServerConfig(data); + } + return data.server; +}; + const handleShowTribeEnnoblementsClick = async (e) => { e.preventDefault(); const page = getPage(e.target); @@ -82,6 +159,133 @@ const handleShowTribeEnnoblementsClick = async (e) => { } }; +const buildCellsForIncSupport = (units) => { + const cells = []; + let pop = 0; + for (let unit in units) { + pop += units[unit] * serverConfig.unitConfig[unit].pop; + cells.push(`${units[unit].toLocaleString()}`); + } + cells.push(`${pop.toLocaleString()}`); + return cells; +}; + +const handleCountIncomingSupportClick = async (e) => { + e.preventDefault(); + + const ids = []; + const allyCommand = {}; + document + .querySelectorAll('span.command_hover_details[data-command-type="support"]') + .forEach((el) => { + const id = parseInt(el.getAttribute('data-command-id')); + if (el.classList.contains('commandicon-ally')) { + allyCommand[id] = true; + } else { + allyCommand[id] = false; + } + ids.push(id); + }); + + const mySupport = { + spear: 0, + sword: 0, + axe: 0, + archer: 0, + spy: 0, + light: 0, + marcher: 0, + heavy: 0, + ram: 0, + catapult: 0, + knight: 0, + snob: 0, + }; + const allySupport = { + ...mySupport, + }; + const total = { + ...mySupport, + }; + + for (let i = 0; i < ids.length; i++) { + Dialog.show( + 'incomingSupport', + `${translations.loaded}: ${i} / ${ids.length}` + ); + const id = ids[i]; + const url = TribalWars.buildURL('', { + screen: 'info_command', + ajax: 'details', + id, + }); + try { + const resp = await fetch(url); + const { units } = await resp.json(); + if (units) { + for (let unit in mySupport) { + const count = parseInt(units[unit].count); + if (allyCommand[id]) { + allySupport[unit] += count; + } else { + mySupport[unit] += count; + } + total[unit] += count; + } + } + await wait(200); + } catch (error) { + console.log('count incoming support', error); + } + } + + const ths = ['']; + for (let unit in mySupport) { + ths.push(``); + } + ths.push(`${translations.pop}`); + const mySupportCells = [ + `${translations.mySupport}`, + ...buildCellsForIncSupport(mySupport), + ]; + const allySupportCells = [ + `${translations.allySupport}`, + ...buildCellsForIncSupport(allySupport), + ]; + const totalCells = [ + `${translations.total}`, + ...buildCellsForIncSupport(total), + ]; + + Dialog.show( + 'incomingSupport', + ` + + + + ${ths.join('')} + + + ${mySupportCells.join('')} + + + ${allySupportCells.join('')} + + + ${totalCells.join('')} + + +
+ ` + ); + + const popup = document.querySelector('.popup_box'); + if (popup) { + popup.style.width = 'auto'; + popup.style.maxWidth = '900px'; + } +}; + const wrapAction = (action) => { const actionWrapperTd = document.createElement('td'); actionWrapperTd.colSpan = '2'; @@ -101,8 +305,22 @@ const renderActions = () => { handleShowTribeEnnoblementsClick ); actionsContainer.appendChild(wrapAction(showEnnoblementsPopup)); + + const countIncomingSupport = document.createElement('a'); + countIncomingSupport.href = '#'; + countIncomingSupport.innerHTML = translations.action.countIncomingSupport; + countIncomingSupport.addEventListener( + 'click', + handleCountIncomingSupportClick + ); + actionsContainer.appendChild(wrapAction(countIncomingSupport)); }; -(function () { - renderActions(); +(async function () { + try { + serverConfig = await loadConfig(); + renderActions(); + } catch (error) { + console.log('extended village profile', error); + } })(); diff --git a/src/i18n/extendedVillageProfile.js b/src/i18n/extendedVillageProfile.js index 1418dfc..cdd1547 100644 --- a/src/i18n/extendedVillageProfile.js +++ b/src/i18n/extendedVillageProfile.js @@ -1,12 +1,24 @@ const translations = { pl_PL: { + loaded: 'Załadowano', + pop: 'Populacja', + mySupport: 'Moje wsparcie', + allySupport: 'Wsparcie plemienia', + total: 'Łącznie', action: { showEnnoblements: 'Pokaż przejęcia', + countIncomingSupport: 'Policz nadchodzące wsparcie', }, }, en_DK: { + loaded: 'Loaded', + pop: 'Pop', + mySupport: 'My support', + allySupport: 'Ally support', + total: 'Total', action: { showEnnoblements: 'Show ennoblements', + countIncomingSupport: 'Count incoming support', }, }, };