This repository has been archived on 2023-01-26. You can view files and clone it, but cannot push or open issues or pull requests.
scripts-old/dist/quickbar/extendedTribeProfile.js

1 line
30 KiB
JavaScript

!function(){function e(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function t(t){for(var n=1;n<arguments.length;n++){var r=null!=arguments[n]?arguments[n]:{},a=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(a=a.concat(Object.getOwnPropertySymbols(r).filter((function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable})))),a.forEach((function(n){e(t,n,r[n])}))}return t}function n(e,t){if(t.length<e)throw new TypeError(e+" argument"+(e>1?"s":"")+" required, but only "+t.length+" present")}function r(e){n(1,arguments);var t=Object.prototype.toString.call(e);return e instanceof Date||"object"==typeof e&&"[object Date]"===t?new Date(e.getTime()):"number"==typeof e||"[object Number]"===t?new Date(e):("string"!=typeof e&&"[object String]"!==t||"undefined"==typeof console||(console.warn("Starting with v2.0.0-beta.1 date-fns doesn't accept strings as date arguments. Please use `parseISO` to parse strings. See: https://git.io/fjule"),console.warn((new Error).stack)),new Date(NaN))}function a(e){var t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate(),e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds()));return t.setUTCFullYear(e.getFullYear()),e.getTime()-t.getTime()}function i(e){n(1,arguments);var t=r(e);return t.setHours(0,0,0,0),t}var o=864e5;function s(e,t){n(2,arguments);var r=i(e),s=i(t),l=r.getTime()-a(r),d=s.getTime()-a(s);return Math.round((l-d)/o)}function l(e,t){var n=e.getFullYear()-t.getFullYear()||e.getMonth()-t.getMonth()||e.getDate()-t.getDate()||e.getHours()-t.getHours()||e.getMinutes()-t.getMinutes()||e.getSeconds()-t.getSeconds()||e.getMilliseconds()-t.getMilliseconds();return n<0?-1:n>0?1:n}const d={pl_PL:{date:"Data",createdAt:"Data założenia",dominance:"Dominacja",bestRank:"Najlepszy ranking",mostPoints:"Najwięcej punktów",mostVillages:"Najwięcej wiosek",player:"Gracz",points:"Punkty",villages:"Wioski",opponentsDefeated:"Pokonani przeciwnicy",opponentsDefeatedAsAttacker:"Pokonani przeciwnicy jako agresor",opponentsDefeatedAsDefender:"Pokonani przeciwnicy jako obrońca",opponentsDefeatedAsSupporter:"Pokonani przeciwnicy jako wspierający",change:"Zmień",left:"Opuścił",joined:"Dołączył",tribeChanges:"Zmiany plemion",membersGrowth:"Rozwój graczy",act:"Akcja",total:"Razem",oda:"RA",odd:"RO",ods:"RW",od:"Pokonani ogólnie",dailyGrowth:"Dzienny przyrost",playerLinks:"Linki",action:{linkToTWHelp:"Akta plemienia (TWHelp)",showTribeChanges:"Pokaż zmiany plemion",showEnnoblements:"Pokaż przejęcia",showMembersGrowth:"Pokaż rozwój graczy",showHistory:"Pokaż historię",generateMailingList:"Wygeneruj listę mailingową",exportVillages:"Wyeksportuj wioski"}},en_DK:{date:"Date",createdAt:"Created at",dominance:"Dominance",bestRank:"Best rank",mostPoints:"Most points",mostVillages:"Most villages",player:"Player",points:"Points",villages:"Villages",opponentsDefeated:"Opponents defeated",opponentsDefeatedAsAttacker:"Opponents defeated as attacker",opponentsDefeatedAsDefender:"Opponents defeated as defender",opponentsDefeatedAsSupporter:"Opponents defeated as supporter",change:"Change",membersGrowth:"Members growth",tribeChanges:"Tribe changes",left:"Left",joined:"Joined",act:"Action",total:"Total",oda:"ODA",odd:"ODD",ods:"ODS",od:"OD",dailyGrowth:"Daily growth",playerLinks:"Player links",action:{linkToTWHelp:"Tribal file (TWHelp)",showTribeChanges:"Show tribe changes",showEnnoblements:"Show ennoblements",showMembersGrowth:"Show members growth",showHistory:"Show history",generateMailingList:"Generate mailing list",exportVillages:"Export villages"}},de_DE:{date:"Datum",createdAt:"Erstellt am",dominance:"Dominanz",bestRank:"Bester Rang",mostPoints:"Meiste Punkte",mostVillages:"Meiste Dörfer",player:"Spieler",points:"Punkte",villages:"Dörfer",opponentsDefeated:"Besiegte Gegner",opponentsDefeatedAsAttacker:"Besiegte Gegner als Angreifer",opponentsDefeatedAsDefender:"Besiegte Gegner als Verteidiger",opponentsDefeatedAsSupporter:"Besiegte Gegner als Unterstützer",change:"Änderungen",membersGrowth:"Mitglieder Wachstum",tribeChanges:"Stammeswechsel",left:"Verlassen",joined:"Beigetreten",act:"Aktion",total:"Total",oda:"BGA",odd:"BGV",ods:"BGS",od:"BP",dailyGrowth:"Tägl. Wachstum",playerLinks:"Spieler Links",action:{linkToTWHelp:"Stammesakte (TWHelp)",showTribeChanges:"Zeige Stammeswechsel",showEnnoblements:"Zeige Adelungen",showMembersGrowth:"Zeige Mitglieder-Wachstum",showHistory:"Zeige Verlauf",generateMailingList:"Maillisten-Generator",exportVillages:"Dörfer exportieren"}}};var c=({query:e,variables:t={}}={})=>fetch("https://api.tribalwarshelp.com/graphql",{method:"POST",body:JSON.stringify({query:e,variables:t}),headers:{"Content-Type":"application/json"}}).then((e=>e.json())).then((({data:e,errors:t})=>{if(t&&Array.isArray(t)&&t.length>0)throw new Error(t[0].message);return new Promise((t=>t(e)))}));const g="data-page",m=(e,t=1)=>{if(!e instanceof HTMLElement)throw new Error("Expected HTMLElement as the first argument");if("number"!=typeof(t=parseInt(t))||isNaN(t))throw new Error("Expected number or string as the second argument");e.setAttribute(g,t+"")},p=e=>!e instanceof HTMLElement?0:parseInt(e.getAttribute(g)),u=({total:e,limit:t,marginRight:n=3,currentPage:r=0}={})=>{const a=((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})(e,t),i=[];for(let e=1;e<=a;e++)e===r?i.push(`<strong style="margin-right: ${n}px">>${e}<</strong>`):i.push(`<a style="margin-right: ${n}px" href="#" data-page="${e}">${e}</a>`);return i},b={pl_PL:{title:"Dzisiejsze zmiany w statystykach",points:"Punkty",rank:"Ranking",villages:"Liczba wiosek",members:"Liczba członków",oda:"Pokonani przeciwnicy jako agresor",odaRank:"RA",odd:"Pokonani przeciwnicy jako obrońca",oddRank:"RO",ods:"Pokonani przeciwnicy jako wspierający",odsRank:"RW",od:"Pokonani przeciwnicy",odRank:"Pokonani przeciwnicy razem ranking"},en_DK:{title:"Today's stat changes",points:"Points",rank:"Rank",villages:"Villages",members:"Members",oda:"ODA",odaRank:"ODA Rank",odd:"ODD",oddRank:"ODD Rank",ods:"ODS",odsRank:"ODS Rank",od:"OD",odRank:"OD Rank"},de_DE:{title:"Heutige Werte Änderungen",points:"Punkte",rank:"Rang",villages:"Dörfer",members:"Mitglieder",oda:"BGA",odaRank:"BGA Rang",odd:"BGD",oddRank:"BGD Rang",ods:"BGS",odsRank:"BGS Rang",od:"BP",odRank:"BP Rang"}};const h=b[window.game_data.locale]||b.en_DK,y=e=>e>0?"color: #000; background-color: #0f0":e<0?"color: #000; background-color: #f00":"color: #000; background-color: #808080";const f={pl_PL:{date:"Data",newOwner:"Nowy właściciel",oldOwner:"Poprzedni właściciel",village:"Wioska",title:"Przejęcia"},en_DK:{date:"Date",newOwner:"New owner",oldOwner:"Old owner",village:"Village",title:"Ennoblements"},de_DE:{date:"Datum",newOwner:"Neuer Besitzer",oldOwner:"Alter Besitzer",village:"Dorf",title:"Adelungen"}};var $=({html:e,id:t,title:n}={})=>{Dialog.show(t,`<h3>${n}</h3>`+e);const r=document.querySelector(".popup_box");r&&(r.style.width="auto",r.style.maxWidth="1000px")};const w=(e,t)=>new Date(e).toLocaleDateString(void 0,t||{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}),D=e=>window.location.origin+TribalWars.buildURL("",{screen:"info_ally",id:e}),v=e=>window.location.origin+TribalWars.buildURL("",{screen:"info_player",id:e}),k=f[window.game_data.locale]||f.en_DK,S=(e,t)=>e?`<td><a href="${v(e.id)}">${e.name} (${t?`<a href="${D(t.id)}">${t.tag}</a>`:"-"})</a></td>`:"<td>-</td>";var T=(e,t,{limit:n=0,currentPage:r=1,onPageChange:a=(()=>{})}={})=>{const i=`\n <div style="display: flex; flex-direction: row; flex-wrap: wrap;" id="ennoblementsPagination">\n ${u({total:t.total,limit:n,currentPage:r}).join("")}\n </div>\n <table class="vis" style="border-collapse: separate; border-spacing: 2px; width: 100%;">\n <tbody>\n <tr>\n <th>\n ${k.date}\n </th>\n <th>\n ${k.village}\n </th>\n <th>\n ${k.newOwner}\n </th>\n <th>\n ${k.oldOwner}\n </th>\n </tr>\n ${t.items.map((e=>{let t=`<tr><td>${w(e.ennobledAt)}</td>`;var n;return e.village?t+=`<td><a href="${n=e.village.id,window.location.origin+TribalWars.buildURL("",{screen:"info_village",id:n})}">${((e="",t=500,n=500)=>`${e} (${t}|${n}) ${"K"+String(n)[0]+String(t)[0]}`)(e.village.name,e.village.x,e.village.y)}</a></td>`:t+="<td>-</td>",t+=S(e.newOwner,e.newOwnerTribe),t+=S(e.oldOwner,e.oldOwnerTribe),t+"</tr>"})).join("")}\n </tbody>\n </table>\n `;$({e:e,title:k.title,id:"ennoblements",html:i}),document.querySelectorAll("#ennoblementsPagination a").forEach((e=>{e.addEventListener("click",a)}))};function A(e){if(null===e||!0===e||!1===e)return NaN;var t=Number(e);return isNaN(t)?t:t<0?Math.ceil(t):Math.floor(t)}function L(e,t){n(2,arguments);var a=r(e),i=A(t);return isNaN(i)?new Date(NaN):i?(a.setDate(a.getDate()+i),a):a}const E={pl_PL:{title:"Historia",date:"Data",tribe:"Plemię",points:"Punkty",rank:"Ranking",villages:"Liczba wiosek",members:"Liczba członków",oda:"Pokonani przeciwnicy jako agresor",odd:"Pokonani przeciwnicy jako obrońca",ods:"Pokonani przeciwnicy jako wspierający",od:"Pokonani przeciwnicy"},en_DK:{title:"History",date:"Date",tribe:"Tribe",points:"Points",villages:"Villages",members:"Members",oda:"ODA",odd:"ODD",ods:"ODS",od:"OD"},de_DE:{title:"Verlauf",date:"Datum",tribe:"Stamm",points:"Punkte",villages:"Dörfer",members:"Mitglieder",oda:"BGA",odd:"BGV",ods:"BGS",od:"BP"}};const P=E[window.game_data.locale]||E.en_DK,M=e=>e>0?"+"+e:e;var j=(e,t,r,{currentPage:a=1,limit:i=0,onPageChange:o=(()=>{}),tribe:s=!1}={})=>{const l=`\n <div style="display: flex; flex-direction: row; flex-wrap: wrap;" id="historyPagination">\n ${u({total:t.total,limit:i,currentPage:a}).join("")}\n </div>\n <table class="vis" style="border-collapse: separate; border-spacing: 2px; width: 100%;">\n <tbody>\n <tr>\n <th>\n ${P.date}\n </th>\n ${s?"":`<th>${P.tribe}</th>`}\n <th>\n ${P.points}\n </th>\n <th>\n ${P.villages}\n </th>\n ${s?`<th>${P.members}</th>`:""}\n <th>\n ${P.od}\n </th>\n <th>\n ${P.oda}\n </th>\n <th>\n ${P.odd}\n </th>\n ${s?"":`<th>${P.ods}</th>`}\n </tr>\n ${t.items.map((e=>{const t=function(e,t){n(2,arguments);var r=A(t);return L(e,-r)}(new Date(e.createDate),1).toISOString().split(".")[0]+"Z",a=r.items.find((e=>e.createDate===t));let i=`<tr><td>${w(e.createDate,{year:"numeric",month:"2-digit",day:"2-digit"})}</td>`;return!s&&e.tribe?i+=`<td><a href="${D(e.tribe.id)}">${e.tribe.tag}</a></td>`:s||(i+="<td>-</td>"),i+=`\n <td title="${a?M(a.points):""}">\n ${e.points.toLocaleString()} (<strong>${e.rank}</strong>)\n </td>\n <td title="${a?M(a.villages):""}">\n ${e.totalVillages.toLocaleString()}\n </td>\n ${s?`\n <td title="${a?M(a.members):""}">\n ${e.totalMembers}\n </td>\n `:""}\n <td title="${a?M(a.scoreTotal):""}">\n ${e.scoreTotal.toLocaleString()} (<strong>${e.rankTotal}</strong>)\n </td>\n <td title="${a?M(a.scoreAtt):""}">\n ${e.scoreAtt.toLocaleString()} (<strong>${e.rankAtt}</strong>)\n </td>\n <td title="${a?M(a.scoreDef):""}">\n ${e.scoreDef.toLocaleString()} (<strong>${e.rankDef}</strong>)\n </td>\n ${s?"":`\n <td title="${a?M(a.scoreSup):""}">\n ${e.scoreSup.toLocaleString()} (<strong>${e.rankSup}</strong>)\n </td>\n `}\n </tr>`,i})).join("")}\n </tbody>\n </table>\n `;$({e:e,title:P.title,id:"history",html:l}),document.querySelectorAll("#historyPagination a").forEach((e=>{e.addEventListener("click",o)}))},O=e=>parseInt(new URLSearchParams(e).get("id"));const R=(e="",t=0)=>`http://www.twstats.com/in/${e}/player/${t}`,x=(e="",t="",n=0,r="")=>`${((e="",t="")=>`https://${e}.tribalwarshelp.com/server/${t}`)(e,t)}/${r}/${n}`,H=(e="",t="",n=0)=>x(e,t,n,"player"),C=window.location.host.split(".")[0],z=((e="")=>e.substr(0,2))(C),G=O(window.location.search),q="kichiyaki_extended_tribe_profile"+G;let _="points";const N=document.querySelector("#content_value"),I=document.querySelector("#content_value > table:nth-child(3) > tbody > tr > td:nth-child(1) > table > tbody"),F=I,V=document.querySelector("#content_value > table:nth-child(3) > tbody > tr > td:nth-child(2)"),B=N.querySelector("h3").nextElementSibling.querySelector("tbody"),W=d[window.game_data.locale]||d.en_DK,K=()=>((e,t={})=>{const n=localStorage.getItem(e);let r=t;return n&&(r=JSON.parse(n)),r})(q),U=(e={})=>{var t,n;t=q,n=e,localStorage.setItem(t,JSON.stringify(n))},Y=()=>{const e=[];return B.querySelectorAll("a").forEach((t=>{const n=t.getAttribute("href");n.includes("info_player")&&e.push(O(n))})),e},Z=({tribe:e,dailyTribeStats:t,players:n})=>{[{title:W.createdAt+":",data:w(e.createdAt),id:"created_at"},{title:W.dominance+":",data:e.dominance.toFixed(2)+"%",id:"dominance"},{title:W.bestRank+":",data:e.bestRank+" "+`(${w(e.bestRankAt)})`,id:"best_rank"},{title:W.mostPoints+":",data:e.mostPoints.toLocaleString()+" "+`(${w(e.mostPointsAt)})`,id:"most_points"},{title:W.mostVillages+":",data:e.mostVillages+" "+`(${w(e.mostVillagesAt)})`,id:"most_villages"}].forEach((e=>{(({title:e,data:t,id:n})=>{let r=document.querySelector("#"+n);r||(r=document.createElement("tr"),r.id=n,r.appendChild(document.createElement("td")),r.appendChild(document.createElement("td")),I.append(r)),r.children[0].innerHTML=e,r.children[1].innerHTML=t})(e)})),t&&t.items.length>0&&((e,t)=>{let n=e.querySelector("#todaysStats");n||(n=document.createElement("div"),n.id="todaysStats",n.width="100%",e.prepend(n));const r=!(null==t.rankSup);n.innerHTML=`\n <table width="100%" class="vis">\n <tbody>\n <tr>\n <th colspan="2">\n ${h.title}\n </th>\n </tr>\n <tr>\n <td>\n ${h.points}:\n </td>\n <td style="${y(t.points)}">\n ${Math.abs(t.points).toLocaleString()}\n </td>\n </tr>\n <tr>\n <td>\n ${h.rank}:\n </td>\n <td style="${y(t.rank)}">\n ${Math.abs(t.rank)}\n </td>\n </tr>\n <tr>\n <td>\n ${h.villages}:\n </td>\n <td style="${y(t.villages)}">\n ${Math.abs(t.villages).toLocaleString()}\n </td>\n </tr>\n ${r?"":`<tr>\n <td>\n ${h.members}:\n </td>\n <td style="${y(t.members)}">\n ${Math.abs(t.members)}\n </td>\n </tr>`}\n <tr>\n <td>\n ${h.oda}:\n </td>\n <td style="${y(t.scoreAtt)}">\n ${Math.abs(t.scoreAtt).toLocaleString()}\n </td>\n </tr>\n <tr>\n <td>\n ${h.odaRank}:\n </td>\n <td style="${y(t.rankAtt)}">\n ${Math.abs(t.rankAtt)}\n </td>\n </tr>\n <tr>\n <td>\n ${h.odd}:\n </td>\n <td style="${y(t.scoreDef)}">\n ${Math.abs(t.scoreDef).toLocaleString()}\n </td>\n </tr>\n <tr>\n <td>\n ${h.oddRank}:\n </td>\n <td style="${y(t.rankDef)}">\n ${Math.abs(t.rankDef)}\n </td>\n </tr>\n ${r?`<tr>\n <td>\n ${h.ods}:\n </td>\n <td style="${y(t.scoreSup)}">\n ${Math.abs(t.scoreSup).toLocaleString()}\n </td>\n </tr>\n <tr>\n <td>\n ${h.odsRank}:\n </td>\n <td style="${y(t.rankSup)}">\n ${Math.abs(t.rankSup)}\n </td>\n </tr>`:""}\n <tr>\n <td>\n ${h.od}:\n </td>\n <td style="${y(t.scoreTotal)}">\n ${Math.abs(t.scoreTotal).toLocaleString()}\n </td>\n </tr>\n <tr>\n <td>\n ${h.odRank}:\n </td>\n <td style="${y(t.rankTotal)}">\n ${Math.abs(t.rankTotal)}\n </td>\n </tr>\n </tbody>\n </table>\n `})(V,t.items[0]),n&&n.items.length>0&&(e=>{B.parentElement.style.width="100%",N.append(B.parentElement);const t=B.querySelector("tr:first-child");11!==t.children.length&&[W.oda,W.odd,W.ods,W.od,W.dailyGrowth,W.playerLinks].forEach((e=>{const n=document.createElement("th");n.innerHTML=e,t.appendChild(n)})),B.querySelectorAll("tr").forEach((t=>{const n=t.querySelector("a");if(!n)return;const r=O(n.getAttribute("href")),a=e.items.find((e=>e.id===r));a&&[[a.scoreAtt,a.rankAtt],[a.scoreDef,a.rankDef],[a.scoreSup,a.rankSup],[a.scoreTotal,a.rankTotal],a.dailyGrowth,[{link:H(z,C,a.id),label:"TWHelp"},{link:R(C,a.id),label:"TWStats"}]].forEach(((e,n)=>{let r=t.children[5+n];r||(r=document.createElement("td"),t.appendChild(r)),Array.isArray(e)?"number"==typeof e[0]?r.innerHTML=`${e[0].toLocaleString()} (<strong>${e[1]}</strong>)`:e[0].link&&(r.innerHTML=e.map((({link:e,label:t})=>`<a target="_blank" href="${e}">${t}</a>`)).join("<br>")):"number"==typeof e&&(r.innerHTML=e.toLocaleString())}))}))})(n)},J=async e=>{e.preventDefault();const t=p(e.target);if(!isNaN(t)){const n=await c({query:"\n query ennoblements($server: String!, $limit: Int, $offset: Int, $sort: [String!], $filter: EnnoblementFilter!) {\n ennoblements(server: $server, limit: $limit, offset: $offset, sort: $sort, 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",variables:{filter:{or:{oldOwnerTribeID:[G],newOwnerTribeID:[G]}},offset:15*(t-1),limit:15,sort:["ennobledAt DESC"],server:C}});T(e,n.ennoblements,{currentPage:t,limit:15,onPageChange:J})}},X=async e=>{e.preventDefault();const t=p(e.target);if(!isNaN(t))try{const n={tribeID:[G]},{tribeHistory:r,dailyTribeStats:a}=await c({query:"\nquery tribeHistoryAndTribeDailyStats($server: String!,\n $tribeHistoryFilter: TribeHistoryFilter!,\n $dailyTribeStatsFilter: DailyTribeStatsFilter!,\n $sort: [String!],\n $offset: Int,\n $limit: Int) {\n tribeHistory(server: $server, sort: $sort, limit: $limit, offset: $offset, filter: $tribeHistoryFilter) {\n total\n items {\n totalVillages\n points\n rank\n scoreAtt\n rankAtt\n scoreDef\n rankDef\n scoreTotal\n rankTotal\n createDate\n totalMembers\n }\n }\n dailyTribeStats(server: $server, sort: $sort, limit: $limit, offset: $offset, filter: $dailyTribeStatsFilter) {\n items {\n points\n scoreAtt\n scoreDef\n scoreTotal\n villages\n createDate\n members\n }\n }\n}\n",variables:{server:C,offset:15*(t-1),limit:15,sort:["createDate DESC"],tribeHistoryFilter:n,dailyTribeStatsFilter:n}});j(e,r,a,{currentPage:t,limit:15,tribe:!0,onPageChange:X})}catch(e){console.log("couldnt load tribe history",e)}},Q=e=>e>0?"color: #000; background-color: #0f0":e<0?"color: #000; background-color: #f00":"color: #000; background-color: #808080",ee=e=>{switch(_){case"points":return e.points;case"villages":return e.villages;case"od":return e.scoreTotal;case"oda":return e.scoreAtt;case"odd":return e.scoreDef;case"ods":return e.scoreSup;default:return 0}},te=e=>{const t=[...new Set(e.items.map((e=>e.createDate)))].reverse();return`\n <tbody>\n <tr>\n <th>${W.player}</th>\n ${t.map((e=>`<th>${w(e,{year:"numeric",month:"2-digit",day:"2-digit"})}</th>`)).join("")}\n <th>${W.total}</th>\n </tr>\n ${Y().map((n=>{const r=e.items.filter((e=>e.player&&e.player.id===n)).reverse();let a;r.length>0&&(a=r[0].player);const i=[];let o=0;for(let e of t){const t=r.find((t=>t.createDate===e));let n=0;t&&(n=ee(t)),o+=n,i.push(`<td style="${Q(n)}">${n.toLocaleString()}</td>`)}return`<tr>\n <td>\n ${a?`<a href="${v(n)}">${a.name}</a>`:"-"}\n </td>\n ${i.join("")}\n <td style="${Q(o)}"><strong>${o.toLocaleString()}</strong></td>\n </tr>`})).join("")}\n </tbody>\n `},ne=(e,t)=>{const n=`\n <form id="membersGrowthForm">\n <select>\n ${[["points",W.points],["villages",W.villages],["od",W.opponentsDefeated],["oda",W.opponentsDefeatedAsAttacker],["odd",W.opponentsDefeatedAsDefender],["ods",W.opponentsDefeatedAsSupporter]].map((e=>`<option ${_===e[0]?'selected="selected"':""} value="${e[0]}">${e[1]}</option>`)).join("")}\n </select>\n <button type="submit">${W.change}</button>\n </form>\n <table id="membersGrowth" class="vis" style="border-collapse: separate; border-spacing: 2px; width: 100%;">\n ${te(t)}\n </table>\n `;$({e:e,title:W.membersGrowth,id:"mg",html:n}),document.querySelector("#membersGrowthForm").addEventListener("submit",(e=>t=>{t.preventDefault(),_=t.target[0].value,document.querySelector("#membersGrowth").innerHTML=te(e)})(t))},re=async({createDateLTE:e,createDateGT:t}={})=>{const a=Y(),i=a.length*function(e,t){n(2,arguments);var a=r(e),i=r(t),o=l(a,i),d=Math.abs(s(a,i));a.setDate(a.getDate()-o*d);var c=Number(l(a,i)===-o),g=o*(d-c);return 0===g?0:g}(e,t),o={playerID:a,createDateLTE:e,createDateGT:t};return await c({query:"\nquery tribeMembersDailyStats($server: String!,\n $filter: DailyPlayerStatsFilter!,\n $limit: Int,\n $sort: [String!]) {\n dailyPlayerStats(server: $server, limit: $limit, sort: $sort, filter: $filter) {\n items {\n player {\n id\n name\n }\n points\n scoreAtt\n scoreDef\n scoreSup\n scoreTotal\n villages\n createDate\n }\n }\n}\n",variables:{filter:o,limit:i,sort:["createDate DESC"],server:C}})},ae=async e=>{e.preventDefault();const t=new Date;t.setDate(t.getDate()-7);const n=await re({createDateLTE:new Date,createDateGT:t});ne(e,n.dailyPlayerStats)},ie=async e=>{e.preventDefault();const t=p(e.target);if(!isNaN(t)){((e,t,n)=>{const r=`\n <div style="display: flex; flex-direction: row; flex-wrap: wrap;" id="tribeChangesPagination">\n ${u({total:n.total,limit:15,currentPage:t}).join("")}\n </div>\n <table class="vis" style="border-collapse: separate; border-spacing: 2px; width: 100%;">\n <tbody>\n <tr>\n <th>\n ${W.date}\n </th>\n <th>\n ${W.player}\n </th>\n <th>\n ${W.act}\n </th>\n </tr>\n ${n.items.map((e=>{let t=`<tr><td>${w(e.createdAt)}</td>`;return e.player?t+=`<td><a href="${v(e.player.id)}">${e.player.name}</a></td>`:t+="<td>-</td>",t+=`<td><strong>${e.newTribe&&e.newTribe.id===G?W.joined:W.left}</strong></td>`,t+"</tr>"})).join("")}\n </tbody>\n </table>\n `;$({e:e,title:W.tribeChanges,id:"tribeChanges",html:r}),document.querySelectorAll("#tribeChangesPagination a").forEach((e=>{e.addEventListener("click",ie)}))})(e,t,(await c({query:"\n query tribeChanges($server: String!, $limit: Int, $offset: Int, $sort: [String!], $filter: TribeChangeFilter!) {\n tribeChanges(server: $server, offset: $offset, limit: $limit, sort: $sort, filter: $filter) {\n total\n items {\n player {\n id\n name\n }\n newTribe {\n id\n tag\n }\n createdAt\n }\n }\n }\n",variables:{filter:{or:{oldTribeID:[G],newTribeID:[G]}},offset:15*(t-1),limit:15,sort:["createdAt DESC"],server:C}})).tribeChanges)}},oe=e=>{e.preventDefault();const t=(()=>{const e=[];return B.querySelectorAll("a").forEach((t=>{t.getAttribute("href").includes("info_player")&&e.push(t.innerText.trim())})),e})(),n=[];for(let e=0;e<t.length;e+=50)n.push(t.slice(e,e+50));let r="";n.forEach(((e,t)=>{r+=`<h3 style="margin-bottom: 5px;">${t+1}.</h3>\n <textarea cols=30 rows=8 readonly style="margin-bottom: 15px;">${e.join(";")}</textarea>`})),Dialog.show("mailinglist",r)},se=async(e,t=!1)=>{try{const n=await c({variables:e,query:`\n query villages($server: String!, $sort: [String!], $limit: Int, $offset: Int, $filter: VillageFilter!) {\n villages(server: $server, sort: $sort, limit: $limit, offset: $offset, filter: $filter) {\n ${t?"total":""}\n items {\n id\n x\n y\n }\n }\n }\n `});if(n&&n.villages&&Array.isArray(n.villages.items))return n.villages}catch(e){console.log("load villages",e)}return{total:0,items:[]}},le=(e=0,t=0)=>e&&t?Dialog.show("loading",`Loaded: <strong>${e}</strong>/<strong>${t}</strong>`):Dialog.show("loading","<strong>Loading...</strong>"),de=async e=>{e.preventDefault();let n=parseInt(e.target[4].value);const r={filter:{xLTE:parseInt(e.target[0].value),xGTE:parseInt(e.target[1].value),yLTE:parseInt(e.target[2].value),yGTE:parseInt(e.target[3].value),playerID:Y()},limit:isNaN(n)||!n?0:n,sort:["id ASC"],server:C};le();let{total:a,items:i}=await se(r,!0);const o=i.length;if(0!==n&&n<a&&(a=n),isNaN(n)||!n||n>o)for(let e=o;e<a;e+=o){le(e,a);const n=await se(t({},r,{filter:t({},r.filter),offset:e}));i=[...i,...n.items]}Dialog.show("exportTribeVillages",`\n <textarea cols=60 rows=8 readonly>${i.map((e=>`${e.x}|${e.y}`)).join(" ")}</textarea>\n `)},ce=e=>{e.preventDefault();Dialog.show("exportTribeVillages",'\n <div style="display: flex; align-items: center; justify-content: center;">\n <form id="etvForm">\n <div>\n <label>X <= </label>\n <input type="number" min="0" value="1000" required />\n </div>\n <div>\n <label>X >= </label>\n <input type="number" min="0" value="0" required />\n </div>\n <div>\n <label>Y <= </label>\n <input type="number" min="0" value="1000" required />\n </div>\n <div>\n <label>Y >= </label>\n <input type="number" min="0" value="0" required />\n </div>\n <div>\n <label>Limit: </label>\n <input type="number" min="0" value="0" required />\n </div>\n <button type="submit">Export</button>\n </form>\n </div>\n '),document.querySelector("#etvForm").addEventListener("submit",de)},ge=e=>{const t=document.createElement("td");t.colSpan="2",t.append(e);const n=document.createElement("tr");return n.appendChild(t),n},me=()=>{const e=document.createElement("a");e.href=((e="",t="",n=0)=>x(e,t,n,"tribe"))(z,C,G),e.innerHTML=W.action.linkToTWHelp,F.appendChild(ge(e));const t=document.createElement("a");t.href="#",m(t,"1"),t.innerHTML=W.action.showEnnoblements,t.addEventListener("click",J),F.appendChild(ge(t));const n=document.createElement("a");n.href="#",m(n,"1"),n.innerHTML=W.action.showHistory,n.addEventListener("click",X),F.appendChild(ge(n));const r=document.createElement("a");r.href="#",m(r,"1"),r.innerHTML=W.action.showTribeChanges,r.addEventListener("click",ie),F.appendChild(ge(r));const a=document.createElement("a");a.href="#",a.innerHTML=W.action.showMembersGrowth,a.addEventListener("click",ae),F.appendChild(ge(a));const i=document.createElement("a");i.href="#",i.innerHTML=W.action.generateMailingList,i.addEventListener("click",oe),F.appendChild(ge(i));const o=document.createElement("a");o.href="#",o.innerHTML=W.action.exportVillages,o.addEventListener("click",ce),F.appendChild(ge(o))};!async function(){try{me();const e=K();e&&e.tribe&&Z(e);const t=await(async()=>{const e=Y(),t=await c({query:"\n query tribe(\n $server: String!\n $id: Int!\n $dailyTribeStatsSort: [String!]\n $dailyTribeStatsLimit: Int\n $playersLimit: Int\n $playersSort: [String!]\n $playerFilter: PlayerFilter!\n $dailyTribeStatsFilter: DailyTribeStatsFilter!\n ) {\n tribe(server: $server, id: $id) {\n id\n bestRank\n bestRankAt\n mostPoints\n mostPointsAt\n mostVillages\n mostVillagesAt\n createdAt\n dominance\n }\n dailyTribeStats(\n server: $server\n limit: $dailyTribeStatsLimit\n sort: $dailyTribeStatsSort\n filter: $dailyTribeStatsFilter\n ) {\n items {\n rank\n rankAtt\n rankDef\n rankTotal\n points\n scoreAtt\n scoreAtt\n scoreDef\n scoreTotal\n villages\n members\n }\n }\n players(server: $server, sort: $playersSort, filter: $playerFilter, limit: $playersLimit) {\n items {\n id\n rankAtt\n rankDef\n rankSup\n rankTotal\n scoreAtt\n scoreAtt\n scoreDef\n scoreSup\n scoreTotal\n dailyGrowth\n }\n }\n }\n",variables:{server:C,id:G,dailyTribeStatsSort:["createDate DESC"],dailyTribeStatsLimit:1,dailyTribeStatsFilter:{tribeID:[G]},playersSort:["rank ASC"],playersLimit:e.length,playerFilter:{id:e}}});return U(t),t})();t&&Z(t)}catch(e){console.log("extended tribe profile",e)}}()}();