From 91977ded3d0dc351074c64c834f91a9e11910927 Mon Sep 17 00:00:00 2001 From: legonzaur Date: Fri, 28 Apr 2023 17:24:30 +0200 Subject: [PATCH] 'publish' --- dist/index.html | 2 +- dist/js/{app.9d1ad7db.js => app.4bb8e87d.js} | 4 ++-- dist/js/{app.9d1ad7db.js.map => app.4bb8e87d.js.map} | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) rename dist/js/{app.9d1ad7db.js => app.4bb8e87d.js} (99%) rename dist/js/{app.9d1ad7db.js.map => app.4bb8e87d.js.map} (99%) diff --git a/dist/index.html b/dist/index.html index 5581091..2684eec 100644 --- a/dist/index.html +++ b/dist/index.html @@ -1 +1 @@ -toneapi_webclient
\ No newline at end of file +toneapi_webclient
\ No newline at end of file diff --git a/dist/js/app.9d1ad7db.js b/dist/js/app.4bb8e87d.js similarity index 99% rename from dist/js/app.9d1ad7db.js rename to dist/js/app.4bb8e87d.js index 8e7895f..3fce4c1 100644 --- a/dist/js/app.9d1ad7db.js +++ b/dist/js/app.4bb8e87d.js @@ -1,2 +1,2 @@ -(function(){"use strict";var e={3529:function(e,t,a){var r=a(3862),s=a(3396);const l=(0,s.uE)('
',4);function i(e,t,a,r,i,n){const o=(0,s.up)("router-link"),p=(0,s.up)("router-view");return(0,s.wg)(),(0,s.iD)(s.HY,null,[(0,s._)("header",null,[(0,s._)("nav",null,[l,(0,s.Wm)(o,{to:"/",class:"navbar-element"},{default:(0,s.w5)((()=>[(0,s.Uk)("Players")])),_:1})])]),(0,s.Wm)(p)],64)}a(7658);var n=a(1020),o=a(5130),p=a(4870);function d(e){return Object.fromEntries(Object.entries(e).filter((e=>void 0!==e[1]&&null!==e[1])))}function h(e,t){try{return e=d(e),t=d(t),o.deepStrictEqual(e,t),!0}catch{return!1}}const c=(0,n.Q_)("kill",{state:()=>({servers:[],players:[],weapons:[],maps:[],gamemodes:[],hosts:{}}),getters:{getPlayerList:e=>t=>e.players.find((e=>h(e.value.filter,t))),getWeaponList:e=>t=>e.weapons.find((e=>h(e.value.filter,t))),getServerList:e=>t=>e.servers.find((e=>h(e.value.filter,t)))},actions:{fetchPlayers(e){e=d(e);let t=this.players.find((t=>h(t.value.filter,e)));return void 0===t&&(t=(0,p.iH)({filter:e,data:{}}),this.players.push(t)),fetch("https://tone.sleepycat.date/v2/client/players?"+new URLSearchParams(e)).then((async e=>{t.value.data=await e.json()})),t},fetchWeapons(e){e=d(e);let t=this.weapons.find((t=>h(t.value.filter,e)));return t||(t=(0,p.iH)({filter:e,data:{}}),this.weapons.push(t)),fetch("https://tone.sleepycat.date/v2/client/weapons?"+new URLSearchParams(e)).then((async e=>{t.value.data=await e.json()})),t},fetchServers(e){e=d(e);let t=this.servers.find((t=>h(t.value.filter,e)));return t||(t=(0,p.iH)({filter:e,data:{}}),this.servers.push(t)),fetch("https://tone.sleepycat.date/v2/client/servers?"+new URLSearchParams(e)).then((async e=>{t.value.data=await e.json()})),t}}});var u=(0,s.aZ)({setup(e,t){const a=c();a.fetchPlayers({}),a.fetchServers({}),a.fetchWeapons({})}}),g=a(89);const y=(0,g.Z)(u,[["render",i]]);var m=y,_=a(2483);const f={id:"filters"},v={id:"playerView"};function w(e,t,a,r,l,i){const n=(0,s.up)("VueMultiselect"),o=(0,s.up)("PlayerList"),p=(0,s.up)("PlayerChart"),d=(0,s.up)("WeaponChart");return(0,s.wg)(),(0,s.iD)(s.HY,null,[(0,s._)("div",f,[(0,s.Wm)(n,{selectLabel:"",deselectLabel:"remove",placeholder:"Select server",modelValue:e.model.server,"onUpdate:modelValue":t[0]||(t[0]=t=>e.model.server=t),options:e.groupedServers,"group-values":"servers",group_label:"id","group-select":!1,"allow-empty":!0,multiple:!1,"custom-label":e=>e.name,"track-by":"name",label:"name"},null,8,["modelValue","options","custom-label"]),(0,s.Wm)(n,{selectLabel:"",deselectLabel:"remove",placeholder:"Select weapon",modelValue:e.model.weapon,"onUpdate:modelValue":t[1]||(t[1]=t=>e.model.weapon=t),"custom-label":t=>e.weaponLocale[t]||t,options:e.sortedWeaponList,"allow-empty":!0},null,8,["modelValue","custom-label","options"]),(0,s.Wm)(n,{selectLabel:"",deselectLabel:"remove",placeholder:"Search player",modelValue:e.playerHighlighted,"onUpdate:modelValue":t[2]||(t[2]=t=>e.playerHighlighted=t),options:e.sortedPlayerList,"allow-empty":!0,"custom-label":t=>e.players[t]?.username},null,8,["modelValue","options","custom-label"])]),(0,s._)("div",v,[(0,s.Wm)(o,{filters:e.filters,onHighlightPlayer:t[3]||(t[3]=t=>e.playerHighlighted=t),playerHighlighted:e.playerHighlighted},null,8,["filters","playerHighlighted"]),(0,s.Wm)(p,{filters:e.filters,onHighlightPlayer:t[4]||(t[4]=t=>e.playerHighlighted=t),playerHighlighted:e.playerHighlighted},null,8,["filters","playerHighlighted"]),(0,s.Wm)(d,{filters:{player:e.playerHighlighted,...e.filters},playerHighlighted:e.playerHighlighted},null,8,["filters","playerHighlighted"])])],64)}var b=a(7139);const k=e=>((0,s.dD)("data-v-56c6f3e1"),e=e(),(0,s.Cn)(),e),L={class:"playerHeaders"},P=k((()=>(0,s._)("span",null,null,-1))),C=["onClick"];function H(e,t,a,r,l,i){return(0,s.wg)(),(0,s.iD)("div",{class:"playerTable",onKeydown:t[6]||(t[6]=(...t)=>e.selectNextPlayer&&e.selectNextPlayer(...t)),tabindex:"0"},[(0,s._)("div",L,[P,(0,s._)("span",{onClick:t[0]||(t[0]=t=>e.sortPlayerList("username")),class:(0,b.C_)("username"==e.sortingData.argument?"selected":"")},"Username",2),(0,s._)("span",{onClick:t[1]||(t[1]=t=>e.sortPlayerList("kills")),class:(0,b.C_)("kills"==e.sortingData.argument?"selected":"")},"K",2),(0,s._)("span",{onClick:t[2]||(t[2]=t=>e.sortPlayerList("deaths")),class:(0,b.C_)("deaths"==e.sortingData.argument?"selected":"")},"D",2),(0,s._)("span",{onClick:t[3]||(t[3]=t=>e.sortPlayerList("k/d")),class:(0,b.C_)("k/d"==e.sortingData.argument?"selected":"")},"K/D",2),(0,s._)("span",{onClick:t[4]||(t[4]=t=>e.sortPlayerList("max_distance")),class:(0,b.C_)("max_distance"==e.sortingData.argument?"selected":"")},"max distance",2),(0,s._)("span",{onClick:t[5]||(t[5]=t=>e.sortPlayerList("avg_distance")),class:(0,b.C_)("avg_distance"==e.sortingData.argument?"selected":"")},"average distance",2)]),((0,s.wg)(!0),(0,s.iD)(s.HY,null,(0,s.Ko)(e.playerIdList,((t,a)=>((0,s.wg)(),(0,s.iD)("div",{class:(0,b.C_)("playerRow "+(t===e.$props.playerHighlighted?"selected":"")),key:t,onClick:a=>e.$emit("highlightPlayer",t),ref_for:!0,ref:"player:"+t},[(0,s._)("div",null,[(0,s._)("span",null,(0,b.zw)(a+1),1)]),(0,s._)("div",null,[(0,s._)("span",null,(0,b.zw)(e.players[t].username),1)]),(0,s._)("div",null,[(0,s._)("span",null,(0,b.zw)(e.players[t].kills),1)]),(0,s._)("div",null,[(0,s._)("span",null,(0,b.zw)(e.players[t].deaths),1)]),(0,s._)("div",null,[(0,s._)("span",null,(0,b.zw)(Math.round(e.players[t].kills/Math.max(1,e.players[t].deaths)*100)/100),1)]),(0,s._)("div",null,[(0,s._)("span",null,(0,b.zw)(e.players[t].max_distance),1)]),(0,s._)("div",null,[(0,s._)("span",null,(0,b.zw)(Math.round(100*(e.players[t].total_distance/e.players[t].kills||0))/100),1)])],10,C)))),128))],32)}var x=(0,s.aZ)({props:{filters:{type:Object,default:()=>({})},playerHighlighted:String},emits:["highlightPlayer"],data(){return{sortingData:{direction:-1,argument:"kills"},playerIdList:[],store:c()}},computed:{players(){const{player:e,...t}=this.filters,a=this.store.getPlayerList(t)?.value.data;return a||this.store.fetchPlayers(t).value.data}},watch:{players:{handler(e){e&&(this.playerIdList=[],this.sortingData.direction*=-1,this.playerIdList=Object.keys(e),this.sortPlayerList(this.sortingData.argument),this.playerIdList=this.playerIdList.slice(0,500))},immediate:!0},playerHighlighted(e){const t=this.$refs["player:"+e];t&&t[0]&&t[0].scrollIntoView({behavior:"smooth",block:"center"})}},updated(){const e=this.$refs["player:"+this.$props.playerHighlighted];e&&e[0]&&e[0].scrollIntoView({behavior:"smooth",block:"center"})},methods:{sortPlayerList(e){e===this.sortingData.argument?this.sortingData.direction*=-1:"username"===e&&(this.sortingData.direction=1),this.sortingData.argument=e,this.playerIdList.sort(((t,a)=>{if(!this.players)return 0;let r,s;return"k/d"===e?(r=this.players[t].kills/Math.max(1,this.players[t].deaths),s=this.players[a].kills/Math.max(1,this.players[a].deaths)):"avg_distance"===e?(r=this.players[t].total_distance/this.players[t].kills||0,s=this.players[a].total_distance/this.players[a].kills||0):(r=this.players[t][e],s=this.players[a][e]),void 0===r||void 0===s?0:rs?1*this.sortingData.direction:0}))},selectNextPlayer(e){const t={Home:-1/0,End:1/0,PageDown:100,PageUp:-100,ArrowUp:-1,ArrowDown:1,ArrowRight:10,ArrowLeft:-10};if(!this.$props.playerHighlighted)return;if(!Object.keys(t).includes(e.key))return;e.preventDefault();const a=this.playerIdList.indexOf(this.$props.playerHighlighted);let r=a+t[e.key];r>=this.playerIdList.length&&(r=this.playerIdList.length-1),r<0&&(r=0),this.$emit("highlightPlayer",this.playerIdList[r])}}});const I=(0,g.Z)(x,[["render",H],["__scopeId","data-v-56c6f3e1"]]);var O=I;const S={class:"playerChart",ref:"container"};function W(e,t,a,r,l,i){const n=(0,s.up)("Scatter");return(0,s.wg)(),(0,s.iD)("div",S,[(0,s.Wm)(n,{data:e.chart,options:e.chartOptions},null,8,["data","options"])],512)}var D=a(3254),$=a(9152),V=a(1131),j=a(5866);D.kL.register(D.f$,D.od,D.jn,D.u,D.De,$.Z,V.Z);var M=(0,s.aZ)({name:"PlayerChart",props:{filters:Object,playerHighlighted:String},data:()=>({store:c(),refreshColors:0}),emits:["highlightPlayer"],components:{Scatter:j.bp},mounted(){this.refreshColors++},computed:{colors(){this.refreshColors;const e={};if(this.$refs.container){const t=getComputedStyle(this.$refs.container);e.fg=t.getPropertyValue("--foreground"),e.bg=t.getPropertyValue("--bg-color"),e.orange=t.getPropertyValue("--orange"),e.cyan=t.getPropertyValue("--cyan"),e.currentLine=t.getPropertyValue("--current-line")}else e.fg="#ffffff";return e},chart(){return{datasets:[{label:"Players",labels:this.playerIdList||[],borderColor:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerIdList[e.index]?this.colors.orange:this.colors.cyan,backgroundColor:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerIdList[e.index]?this.colors.orange:this.colors.cyan,pointRadius:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerIdList[e.index]?20:1,pointStyle:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerIdList[e.index]?"crossRot":"circle",hoverRadius:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerIdList[e.index]?30:4,data:this.playerIdList.map((e=>({y:this.players[e].kills,x:this.players[e].deaths})))}]}},chartOptions(){this.$props.playerHighlighted;let e=0,t=0;if(this.players){const a=Math.max(...Object.values(this.players).map((e=>e.deaths))),r=Math.max(...Object.values(this.players).map((e=>e.kills)));r>a?(e=a,t=a/r*r):(t=r,e=r/a*a)}return{responsive:!0,maintainAspectRatio:!1,animation:{duration:500},layout:{autoPadding:!1},scales:{y:{title:{text:"Kills",display:!0,color:this.colors.fg},ticks:{color:this.colors.fg}},x:{title:{text:"Deaths",display:!0,color:this.colors.fg},ticks:{color:this.colors.fg}}},plugins:{tooltip:{callbacks:{label:e=>{let t;return t=this.players?this.players[e.dataset.labels[e.dataIndex]].username:e.dataset.labels[e.dataIndex],t+=" ("+e.parsed.y+" kills "+e.parsed.x+" deaths)",t}}},annotation:{annotations:{line:{type:"line",yMin:0,xMin:0,yMax:t,xMax:e,borderWidth:2,borderColor:this.colors.orange,borderDash:[1,5]}}},legend:{display:!1},datalabels:{formatter:(e,t)=>this.players[this.playerIdList[t.dataIndex]].username,backgroundColor:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerIdList[e.dataIndex]?this.colors.orange:null,borderColor:this.colors.fg,borderWidth:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerIdList[e.dataIndex]?1:0,borderRadius:5,display:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerIdList[e.dataIndex]?"true":"auto",align:-45,anchor:"end",clamp:!0,color:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerIdList[e.dataIndex]?this.colors.bg:this.colors.fg}},onClick:(e,t)=>{this.$emit("highlightPlayer",t.length>0?this.playerIdList[t[0].index]:void 0)},onHover:(e,t)=>{e.native.target&&(e.native.target.style.cursor=t[0]?"pointer":"default")}}},players(){const e=this.store.getPlayerList(this.filters||{})?.value.data;if(!e)return this.store.fetchPlayers(this.filters||{}).value.data;const t=Object.entries(e).sort(((e,t)=>e[1].killst[1].kills?-1:0)).slice(0,200);return Object.fromEntries(t)},playerIdList(){return Object.keys(this.players)}}});const R=(0,g.Z)(M,[["render",W],["__scopeId","data-v-05bdcd1e"]]);var A=R;const E={class:"weaponChart",ref:"container"};function T(e,t,a,r,l,i){const n=(0,s.up)("Doughnut");return(0,s.wg)(),(0,s.iD)("div",E,[(0,s.Wm)(n,{data:e.chart,options:e.chartOptions},null,8,["data","options"])],512)}var Z=JSON.parse('{"rodeo_battery_removal":"Rodeo Battery Removal","human_execution":"Human Execution","melee_pilot_kunai":"Kunai Melee","execution":"Execution","mp_weapon_car":"Car","mp_weapon_defender":"Charge Rifle","mp_weapon_doubletake":"Double Take","mp_weapon_epg":"EPG-1","mp_weapon_hemlok_smg":"Volt","mp_weapon_lstar":"L-STAR","mp_weapon_r97":"R-97","mp_weapon_rspn101":"R-201","mp_weapon_smart_pistol":"Smart Pistol","mp_weapon_sniper":"Kraber","mp_weapon_vinson":"Flatline","mp_weapon_autopistol":"RE-45 auto","mp_weapon_alternator_smg":"Alternator","mp_weapon_frag_grenade":"Frag Grenade","mp_weapon_g2":"G2","mp_weapon_lmg":"Spitfire","mp_weapon_smr":"Sidewinder SMR","mp_weapon_softball":"Softball","mp_weapon_thermite_grenade":"Firestar","pilot_emptyhanded":"Melee","mp_weapon_mastiff":"Mastiff","mp_weapon_mgl":"MGL","mp_weapon_rspn101_og":"R-101","mp_weapon_wingman":"Wingman","invalid":"invalid","mp_weapon_arc_launcher":"Thunderbolt","mp_weapon_dmr":"DMR","mp_weapon_grenade_electric_smoke":"Electric Smoke","mp_weapon_pulse_lmg":"Cold War","mp_weapon_satchel":"Satchel","mp_weapon_shotgun":"EVA-8 Auto","mp_weapon_shotgun_pistol":"Mozambique","mp_weapon_wingman_n":"Wingman Elite","mp_weapon_grenade_gravity":"Gravity Star","mp_weapon_grenade_sonar":"Pulse Blade","mp_weapon_rocket_launcher":"Archer","outOfBounds":"OutOfBounds","mind_crime":"Mind Crime","mp_weapon_esaw":"Devotion","fall":"Fall","mp_weapon_semipistol":"P2016","mp_weapon_grenade_emp":"Arc Grenade","mp_weapon_hemlok":"Hemlok","melee_pilot_emptyhanded":"Melee","phase_shift":"Phase Shift","damagedef_suicide":"Suicide","damagedef_titan_hotdrop":"Crushed by Titanfall","mp_titanweapon_arc_cannon":"Arc Cannon","mp_weapon_peacekraber":"Peacekraber","damagedef_crush":"Crushed","mp_titanweapon_brute4_quad_rocket":"Quad Rocket Launcher","mp_weapon_turretplasma":"Antititan Turret","mp_titanweapon_xo16_vanguard":"XO-16","mp_titanweapon_sticky_40mm":"40mm Cannon","mp_titanweapon_predator_cannon":"Predator Cannon","mp_titanweapon_leadwall":"Leadwall","mp_titanweapon_sniper":"Plasma Railgun","titan_execution":"Titan Execution","titan_explosion":"Titan Explosion","auto_titan_melee":"Autotitan Melee","mp_titanweapon_vortex_shield_ion":"Vortex Shield","mp_titanweapon_heat_shield":"Heat shield","bubble_shield":"Bubble Shield","mp_titancore_salvo_core":"Salvo Core","mp_titancore_flame_wave":"Flame Wave","mp_titanweapon_flightcore_rockets":"Flight Core","mp_titancore_laser_cannon":"Laser Cannon","mp_titancore_flame_wave_secondary":"Scorched Earth","mp_titanweapon_flame_wall":"Flame Wall","mp_titanweapon_arc_wave":"Arc Wave"}');D.kL.register(D.qi,D.u,D.De,V.Z);var z=(0,s.aZ)({name:"PlayerChart",props:{filters:Object,playerHighlighted:String},emits:["highlightPlayer"],components:{Doughnut:j.$I},mounted(){this.refreshColors++},data:()=>({store:c(),refreshColors:0}),computed:{colors(){this.refreshColors;const e={};if(this.$refs.container){const t=getComputedStyle(this.$refs.container);e.fg=t.getPropertyValue("--foreground"),e.bg=t.getPropertyValue("--bg-color"),e.orange=t.getPropertyValue("--orange"),e.cyan=t.getPropertyValue("--cyan"),e.yellow=t.getPropertyValue("--yellow"),e.green=t.getPropertyValue("--green"),e.purple=t.getPropertyValue("--purple"),e.red=t.getPropertyValue("--red"),e.pink=t.getPropertyValue("--pink"),e.currentLine=t.getPropertyValue("--current-line")}else e.fg="#ffffff";return e},chart(){const e=["cyan","green","orange","pink","purple","red","yellow"],t={datasets:[{label:"Weapons",labels:this.sortedWeaponList||[],borderColor:()=>this.colors.fg,backgroundColor:t=>this.colors[e[3*t.dataIndex%e.length]],data:[]}]};return this.sortedWeaponList?(t.datasets[0].data=this.sortedWeaponList.map((e=>this.weapons?this.weapons[e].kills:0)),t):t},chartOptions(){this.$props.playerHighlighted;const e={responsive:!0,maintainAspectRatio:!0,animation:{duration:500},layout:{autoPadding:!1},plugins:{datalabels:{formatter:(e,t)=>{const a=this.sortedWeaponList[t.dataIndex];return Z[a]||console.log(a),Z[a]||a},backgroundColor:e=>e.dataset.backgroundColor(e),borderColor:this.colors.fg,borderRadius:25,borderWidth:2,color:this.colors.bg,display:e=>e.dataIndex===e.dataset.labels.length-1||"auto",padding:6},tooltip:{callbacks:{label:e=>{let t;return t=this.sortedWeaponList?this.sortedWeaponList[e.dataIndex]:e.dataset.labels[e.dataIndex],t+=" ("+this.weapons[t].kills+" kills)",t}}}}};return e},weapons(){const{weapon:e,...t}=this.filters||{},a=this.store.getWeaponList(t)?.value.data;return a||this.store.fetchWeapons(t).value.data},sortedWeaponList(){if(!this.weapons)return[];const e=Object.keys(this.weapons);return e.sort(((e,t)=>Number(this.weapons[e].kills)Number(this.weapons[t].kills)?1:0)),e}}});const N=(0,g.Z)(z,[["render",T],["__scopeId","data-v-1ad9360f"]]);var U=N,F=a(6368),G=(0,s.aZ)({name:"PlayerView",components:{VueMultiselect:F.ZP,PlayerList:O,PlayerChart:A,WeaponChart:U},data(){return{model:{server:void 0,weapon:void 0},filters:{},store:c(),playerHighlighted:void 0,weaponLocale:Z}},computed:{servers(){const{server:e,player:t,...a}=this.filters,r=this.store.getServerList(a)?.value.data;return r||this.store.fetchServers(a).value.data},groupedServers(){const e=[];return Object.entries(this.servers).forEach((t=>{e.find((e=>e.id===t[1].host+"sfdsdfsd"))||e.push({id:t[1].host+"sfdsdfsd",servers:[]}),e.find((e=>e.id===t[1].host+"sfdsdfsd"))?.servers.push({name:t[0],...t[1]})})),e},weapons(){const{weapon:e,player:t,...a}=this.filters,r=this.store.getWeaponList(a)?.value.data;return r||this.store.fetchWeapons(a).value.data},players(){const{player:e,...t}=this.filters,a=this.store.getPlayerList(t)?.value.data;return a||this.store.fetchPlayers(t).value.data},sortedWeaponList(){if(!this.weapons)return[];const e=Object.keys(this.weapons);return e.sort()},sortedServerList(){if(!this.servers)return[];const e=Object.keys(this.servers);return e.sort()},sortedPlayerList(){if(!this.players)return[];const e=Object.keys(this.players);return e.sort(((e,t)=>this.players?this.players[e].usernamethis.players[t].username?1:0:0))}},watch:{model:{handler(e){this.filters.server=e.server?.name,this.filters.weapon=e.weapon},deep:!0}}});const K=(0,g.Z)(G,[["render",w],["__scopeId","data-v-7c39888e"]]);var B=K;const q=[{path:"/",name:"home",component:B}],Y=(0,_.p7)({history:(0,_.PO)("/ToneAPI_webclient/"),routes:q});var Q=Y;const J=(0,n.WB)();(0,r.ri)(m).use(J).use(Q).mount("#app")}},t={};function a(r){var s=t[r];if(void 0!==s)return s.exports;var l=t[r]={exports:{}};return e[r](l,l.exports,a),l.exports}a.m=e,function(){var e=[];a.O=function(t,r,s,l){if(!r){var i=1/0;for(d=0;d=l)&&Object.keys(a.O).every((function(e){return a.O[e](r[o])}))?r.splice(o--,1):(n=!1,l0&&e[d-1][2]>l;d--)e[d]=e[d-1];e[d]=[r,s,l]}}(),function(){a.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return a.d(t,{a:t}),t}}(),function(){a.d=function(e,t){for(var r in t)a.o(t,r)&&!a.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})}}(),function(){a.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}}(),function(){var e={143:0};a.O.j=function(t){return 0===e[t]};var t=function(t,r){var s,l,i=r[0],n=r[1],o=r[2],p=0;if(i.some((function(t){return 0!==e[t]}))){for(s in n)a.o(n,s)&&(a.m[s]=n[s]);if(o)var d=o(a)}for(t&&t(r);pTONE API
',4);function i(e,t,a,r,i,n){const o=(0,s.up)("router-link"),p=(0,s.up)("router-view");return(0,s.wg)(),(0,s.iD)(s.HY,null,[(0,s._)("header",null,[(0,s._)("nav",null,[l,(0,s.Wm)(o,{to:"/",class:"navbar-element"},{default:(0,s.w5)((()=>[(0,s.Uk)("Players")])),_:1})])]),(0,s.Wm)(p)],64)}a(7658);var n=a(1020),o=a(5130),p=a(4870);function d(e){return Object.fromEntries(Object.entries(e).filter((e=>void 0!==e[1]&&null!==e[1])))}function h(e,t){try{return e=d(e),t=d(t),o.deepStrictEqual(e,t),!0}catch{return!1}}const c=(0,n.Q_)("kill",{state:()=>({servers:[],players:[],weapons:[],maps:[],gamemodes:[],hosts:{}}),getters:{getPlayerList:e=>t=>e.players.find((e=>h(e.value.filter,t))),getWeaponList:e=>t=>e.weapons.find((e=>h(e.value.filter,t))),getServerList:e=>t=>e.servers.find((e=>h(e.value.filter,t)))},actions:{fetchPlayers(e){e=d(e);let t=this.players.find((t=>h(t.value.filter,e)));return void 0===t&&(t=(0,p.iH)({filter:e,data:{}}),this.players.push(t)),fetch("https://tone.sleepycat.date/v2/client/players?"+new URLSearchParams(e)).then((async e=>{t.value.data=await e.json()})),t},fetchWeapons(e){e=d(e);let t=this.weapons.find((t=>h(t.value.filter,e)));return t||(t=(0,p.iH)({filter:e,data:{}}),this.weapons.push(t)),fetch("https://tone.sleepycat.date/v2/client/weapons?"+new URLSearchParams(e)).then((async e=>{t.value.data=await e.json()})),t},fetchServers(e){e=d(e);let t=this.servers.find((t=>h(t.value.filter,e)));return t||(t=(0,p.iH)({filter:e,data:{}}),this.servers.push(t)),fetch("https://tone.sleepycat.date/v2/client/servers?"+new URLSearchParams(e)).then((async e=>{t.value.data=await e.json()})),t}}});var u=(0,s.aZ)({setup(e,t){const a=c();a.fetchPlayers({}),a.fetchServers({}),a.fetchWeapons({})}}),g=a(89);const y=(0,g.Z)(u,[["render",i]]);var m=y,_=a(2483);const f={id:"filters"},v={id:"playerView"};function w(e,t,a,r,l,i){const n=(0,s.up)("VueMultiselect"),o=(0,s.up)("PlayerList"),p=(0,s.up)("PlayerChart"),d=(0,s.up)("WeaponChart");return(0,s.wg)(),(0,s.iD)(s.HY,null,[(0,s._)("div",f,[(0,s.Wm)(n,{selectLabel:"",deselectLabel:"remove",placeholder:"Select server",modelValue:e.model.server,"onUpdate:modelValue":t[0]||(t[0]=t=>e.model.server=t),options:e.groupedServers,"group-values":"servers",group_label:"id","group-select":!1,"allow-empty":!0,multiple:!1,"custom-label":e=>e.name,"track-by":"name",label:"name"},null,8,["modelValue","options","custom-label"]),(0,s.Wm)(n,{selectLabel:"",deselectLabel:"remove",placeholder:"Select weapon",modelValue:e.model.weapon,"onUpdate:modelValue":t[1]||(t[1]=t=>e.model.weapon=t),"custom-label":t=>e.weaponLocale[t]||t,options:e.sortedWeaponList,"allow-empty":!0},null,8,["modelValue","custom-label","options"]),(0,s.Wm)(n,{selectLabel:"",deselectLabel:"remove",placeholder:"Search player",modelValue:e.playerHighlighted,"onUpdate:modelValue":t[2]||(t[2]=t=>e.playerHighlighted=t),options:e.sortedPlayerList,"allow-empty":!0,"custom-label":t=>e.players[t]?.username},null,8,["modelValue","options","custom-label"])]),(0,s._)("div",v,[(0,s.Wm)(o,{filters:e.filters,onHighlightPlayer:t[3]||(t[3]=t=>e.playerHighlighted=t),playerHighlighted:e.playerHighlighted},null,8,["filters","playerHighlighted"]),(0,s.Wm)(p,{filters:e.filters,onHighlightPlayer:t[4]||(t[4]=t=>e.playerHighlighted=t),playerHighlighted:e.playerHighlighted},null,8,["filters","playerHighlighted"]),(0,s.Wm)(d,{filters:{player:e.playerHighlighted,...e.filters},playerHighlighted:e.playerHighlighted},null,8,["filters","playerHighlighted"])])],64)}var b=a(7139);const k=e=>((0,s.dD)("data-v-56c6f3e1"),e=e(),(0,s.Cn)(),e),L={class:"playerHeaders"},P=k((()=>(0,s._)("span",null,null,-1))),C=["onClick"];function H(e,t,a,r,l,i){return(0,s.wg)(),(0,s.iD)("div",{class:"playerTable",onKeydown:t[6]||(t[6]=(...t)=>e.selectNextPlayer&&e.selectNextPlayer(...t)),tabindex:"0"},[(0,s._)("div",L,[P,(0,s._)("span",{onClick:t[0]||(t[0]=t=>e.sortPlayerList("username")),class:(0,b.C_)("username"==e.sortingData.argument?"selected":"")},"Username",2),(0,s._)("span",{onClick:t[1]||(t[1]=t=>e.sortPlayerList("kills")),class:(0,b.C_)("kills"==e.sortingData.argument?"selected":"")},"K",2),(0,s._)("span",{onClick:t[2]||(t[2]=t=>e.sortPlayerList("deaths")),class:(0,b.C_)("deaths"==e.sortingData.argument?"selected":"")},"D",2),(0,s._)("span",{onClick:t[3]||(t[3]=t=>e.sortPlayerList("k/d")),class:(0,b.C_)("k/d"==e.sortingData.argument?"selected":"")},"K/D",2),(0,s._)("span",{onClick:t[4]||(t[4]=t=>e.sortPlayerList("max_distance")),class:(0,b.C_)("max_distance"==e.sortingData.argument?"selected":"")},"max distance",2),(0,s._)("span",{onClick:t[5]||(t[5]=t=>e.sortPlayerList("avg_distance")),class:(0,b.C_)("avg_distance"==e.sortingData.argument?"selected":"")},"average distance",2)]),((0,s.wg)(!0),(0,s.iD)(s.HY,null,(0,s.Ko)(e.playerIdList,((t,a)=>((0,s.wg)(),(0,s.iD)("div",{class:(0,b.C_)("playerRow "+(t===e.$props.playerHighlighted?"selected":"")),key:t,onClick:a=>e.$emit("highlightPlayer",t),ref_for:!0,ref:"player:"+t},[(0,s._)("div",null,[(0,s._)("span",null,(0,b.zw)(a+1),1)]),(0,s._)("div",null,[(0,s._)("span",null,(0,b.zw)(e.players[t].username),1)]),(0,s._)("div",null,[(0,s._)("span",null,(0,b.zw)(e.players[t].kills),1)]),(0,s._)("div",null,[(0,s._)("span",null,(0,b.zw)(e.players[t].deaths),1)]),(0,s._)("div",null,[(0,s._)("span",null,(0,b.zw)(Math.round(e.players[t].kills/Math.max(1,e.players[t].deaths)*100)/100),1)]),(0,s._)("div",null,[(0,s._)("span",null,(0,b.zw)(e.players[t].max_distance),1)]),(0,s._)("div",null,[(0,s._)("span",null,(0,b.zw)(Math.round(100*(e.players[t].total_distance/e.players[t].kills||0))/100),1)])],10,C)))),128))],32)}var x=(0,s.aZ)({props:{filters:{type:Object,default:()=>({})},playerHighlighted:String},emits:["highlightPlayer"],data(){return{sortingData:{direction:-1,argument:"kills"},playerIdList:[],store:c()}},computed:{players(){const{player:e,...t}=this.filters,a=this.store.getPlayerList(t)?.value.data;return a||this.store.fetchPlayers(t).value.data}},watch:{players:{handler(e){e&&(this.playerIdList=[],this.sortingData.direction*=-1,this.playerIdList=Object.keys(e),this.sortPlayerList(this.sortingData.argument),this.playerIdList=this.playerIdList.slice(0,500))},immediate:!0},playerHighlighted(e){const t=this.$refs["player:"+e];t&&t[0]&&t[0].scrollIntoView({behavior:"smooth",block:"center"})}},updated(){const e=this.$refs["player:"+this.$props.playerHighlighted];e&&e[0]&&e[0].scrollIntoView({behavior:"smooth",block:"center"})},methods:{sortPlayerList(e){e===this.sortingData.argument?this.sortingData.direction*=-1:"username"===e&&(this.sortingData.direction=1),this.sortingData.argument=e,this.playerIdList.sort(((t,a)=>{if(!this.players)return 0;let r,s;return"k/d"===e?(r=this.players[t].kills/Math.max(1,this.players[t].deaths),s=this.players[a].kills/Math.max(1,this.players[a].deaths)):"avg_distance"===e?(r=this.players[t].total_distance/this.players[t].kills||0,s=this.players[a].total_distance/this.players[a].kills||0):(r=this.players[t][e],s=this.players[a][e]),void 0===r||void 0===s?0:rs?1*this.sortingData.direction:0}))},selectNextPlayer(e){const t={Home:-1/0,End:1/0,PageDown:100,PageUp:-100,ArrowUp:-1,ArrowDown:1,ArrowRight:10,ArrowLeft:-10};if(!this.$props.playerHighlighted)return;if(!Object.keys(t).includes(e.key))return;e.preventDefault();const a=this.playerIdList.indexOf(this.$props.playerHighlighted);let r=a+t[e.key];r>=this.playerIdList.length&&(r=this.playerIdList.length-1),r<0&&(r=0),this.$emit("highlightPlayer",this.playerIdList[r])}}});const I=(0,g.Z)(x,[["render",H],["__scopeId","data-v-56c6f3e1"]]);var O=I;const S={class:"playerChart",ref:"container"};function W(e,t,a,r,l,i){const n=(0,s.up)("Scatter");return(0,s.wg)(),(0,s.iD)("div",S,[(0,s.Wm)(n,{data:e.chart,options:e.chartOptions},null,8,["data","options"])],512)}var D=a(3254),$=a(9152),V=a(1131),j=a(5866);D.kL.register(D.f$,D.od,D.jn,D.u,D.De,$.Z,V.Z);var M=(0,s.aZ)({name:"PlayerChart",props:{filters:Object,playerHighlighted:String},data:()=>({store:c(),refreshColors:0}),emits:["highlightPlayer"],components:{Scatter:j.bp},mounted(){this.refreshColors++},computed:{colors(){this.refreshColors;const e={};if(this.$refs.container){const t=getComputedStyle(this.$refs.container);e.fg=t.getPropertyValue("--foreground"),e.bg=t.getPropertyValue("--bg-color"),e.orange=t.getPropertyValue("--orange"),e.cyan=t.getPropertyValue("--cyan"),e.currentLine=t.getPropertyValue("--current-line")}else e.fg="#ffffff";return e},chart(){return{datasets:[{label:"Players",labels:this.playerIdList||[],borderColor:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerIdList[e.index]?this.colors.orange:this.colors.cyan,backgroundColor:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerIdList[e.index]?this.colors.orange:this.colors.cyan,pointRadius:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerIdList[e.index]?20:1,pointStyle:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerIdList[e.index]?"crossRot":"circle",hoverRadius:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerIdList[e.index]?30:4,data:this.playerIdList.map((e=>({y:this.players[e].kills,x:this.players[e].deaths})))}]}},chartOptions(){this.$props.playerHighlighted;let e=0,t=0;if(this.players){const a=Math.max(...Object.values(this.players).map((e=>e.deaths))),r=Math.max(...Object.values(this.players).map((e=>e.kills)));r>a?(e=a,t=a/r*r):(t=r,e=r/a*a)}return{responsive:!0,maintainAspectRatio:!1,animation:{duration:500},layout:{autoPadding:!1},scales:{y:{title:{text:"Kills",display:!0,color:this.colors.fg},ticks:{color:this.colors.fg}},x:{title:{text:"Deaths",display:!0,color:this.colors.fg},ticks:{color:this.colors.fg}}},plugins:{tooltip:{callbacks:{label:e=>{let t;return t=this.players?this.players[e.dataset.labels[e.dataIndex]].username:e.dataset.labels[e.dataIndex],t+=" ("+e.parsed.y+" kills "+e.parsed.x+" deaths)",t}}},annotation:{annotations:{line:{type:"line",yMin:0,xMin:0,yMax:t,xMax:e,borderWidth:2,borderColor:this.colors.orange,borderDash:[1,5]}}},legend:{display:!1},datalabels:{formatter:(e,t)=>this.players[this.playerIdList[t.dataIndex]].username,backgroundColor:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerIdList[e.dataIndex]?this.colors.orange:null,borderColor:this.colors.fg,borderWidth:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerIdList[e.dataIndex]?1:0,borderRadius:5,display:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerIdList[e.dataIndex]?"true":"auto",align:-45,anchor:"end",clamp:!0,color:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerIdList[e.dataIndex]?this.colors.bg:this.colors.fg}},onClick:(e,t)=>{this.$emit("highlightPlayer",t.length>0?this.playerIdList[t[0].index]:void 0)},onHover:(e,t)=>{e.native.target&&(e.native.target.style.cursor=t[0]?"pointer":"default")}}},players(){const e=this.store.getPlayerList(this.filters||{})?.value.data;if(!e)return this.store.fetchPlayers(this.filters||{}).value.data;const t=Object.entries(e).sort(((e,t)=>e[1].killst[1].kills?-1:0)).slice(0,200);return Object.fromEntries(t)},playerIdList(){return Object.keys(this.players)}}});const R=(0,g.Z)(M,[["render",W],["__scopeId","data-v-05bdcd1e"]]);var A=R;const E={class:"weaponChart",ref:"container"};function T(e,t,a,r,l,i){const n=(0,s.up)("Doughnut");return(0,s.wg)(),(0,s.iD)("div",E,[(0,s.Wm)(n,{data:e.chart,options:e.chartOptions},null,8,["data","options"])],512)}var Z=JSON.parse('{"rodeo_battery_removal":"Rodeo Battery Removal","human_execution":"Human Execution","melee_pilot_kunai":"Kunai Melee","execution":"Execution","mp_weapon_car":"CAR","mp_weapon_defender":"Charge Rifle","mp_weapon_doubletake":"Double Take","mp_weapon_epg":"EPG-1","mp_weapon_hemlok_smg":"Volt","mp_weapon_lstar":"L-STAR","mp_weapon_r97":"R-97","mp_weapon_rspn101":"R-201","mp_weapon_smart_pistol":"Smart Pistol","mp_weapon_sniper":"Kraber","mp_weapon_vinson":"Flatline","mp_weapon_autopistol":"RE-45 auto","mp_weapon_alternator_smg":"Alternator","mp_weapon_frag_grenade":"Frag Grenade","mp_weapon_g2":"G2","mp_weapon_lmg":"Spitfire","mp_weapon_smr":"Sidewinder SMR","mp_weapon_softball":"Softball","mp_weapon_thermite_grenade":"Firestar","pilot_emptyhanded":"Melee","mp_weapon_mastiff":"Mastiff","mp_weapon_mgl":"MGL","mp_weapon_rspn101_og":"R-101","mp_weapon_wingman":"Wingman","invalid":"invalid","mp_weapon_arc_launcher":"Thunderbolt","mp_weapon_dmr":"DMR","mp_weapon_grenade_electric_smoke":"Electric Smoke","mp_weapon_pulse_lmg":"Cold War","mp_weapon_satchel":"Satchel","mp_weapon_shotgun":"EVA-8 Auto","mp_weapon_shotgun_pistol":"Mozambique","mp_weapon_wingman_n":"Wingman Elite","mp_weapon_grenade_gravity":"Gravity Star","mp_weapon_grenade_sonar":"Pulse Blade","mp_weapon_rocket_launcher":"Archer","outOfBounds":"OutOfBounds","mind_crime":"Mind Crime","mp_weapon_esaw":"Devotion","fall":"Fall","mp_weapon_semipistol":"P2016","mp_weapon_grenade_emp":"Arc Grenade","mp_weapon_hemlok":"Hemlok","melee_pilot_emptyhanded":"Melee","phase_shift":"Phase Shift","damagedef_suicide":"Suicide","damagedef_titan_hotdrop":"Crushed by Titanfall","mp_titanweapon_arc_cannon":"Arc Cannon","mp_weapon_peacekraber":"Peacekraber","damagedef_crush":"Crushed","mp_titanweapon_brute4_quad_rocket":"Quad Rocket Launcher","mp_weapon_turretplasma":"Antititan Turret","mp_titanweapon_xo16_vanguard":"XO-16","mp_titanweapon_sticky_40mm":"40mm Cannon","mp_titanweapon_predator_cannon":"Predator Cannon","mp_titanweapon_leadwall":"Leadwall","mp_titanweapon_sniper":"Plasma Railgun","titan_execution":"Titan Execution","titan_explosion":"Titan Explosion","auto_titan_melee":"Autotitan Melee","mp_titanweapon_vortex_shield_ion":"Vortex Shield","mp_titanweapon_heat_shield":"Heat shield","bubble_shield":"Bubble Shield","mp_titancore_salvo_core":"Salvo Core","mp_titancore_flame_wave":"Flame Wave","mp_titanweapon_flightcore_rockets":"Flight Core","mp_titancore_laser_cannon":"Laser Cannon","mp_titancore_flame_wave_secondary":"Scorched Earth","mp_titanweapon_flame_wall":"Flame Wall","mp_titanweapon_arc_wave":"Arc Wave"}');D.kL.register(D.qi,D.u,D.De,V.Z);var z=(0,s.aZ)({name:"PlayerChart",props:{filters:Object,playerHighlighted:String},emits:["highlightPlayer"],components:{Doughnut:j.$I},mounted(){this.refreshColors++},data:()=>({store:c(),refreshColors:0}),computed:{colors(){this.refreshColors;const e={};if(this.$refs.container){const t=getComputedStyle(this.$refs.container);e.fg=t.getPropertyValue("--foreground"),e.bg=t.getPropertyValue("--bg-color"),e.orange=t.getPropertyValue("--orange"),e.cyan=t.getPropertyValue("--cyan"),e.yellow=t.getPropertyValue("--yellow"),e.green=t.getPropertyValue("--green"),e.purple=t.getPropertyValue("--purple"),e.red=t.getPropertyValue("--red"),e.pink=t.getPropertyValue("--pink"),e.currentLine=t.getPropertyValue("--current-line")}else e.fg="#ffffff";return e},chart(){const e=["cyan","green","orange","pink","purple","red","yellow"],t={datasets:[{label:"Weapons",labels:this.sortedWeaponList||[],borderColor:()=>this.colors.fg,backgroundColor:t=>this.colors[e[3*t.dataIndex%e.length]],data:[]}]};return this.sortedWeaponList?(t.datasets[0].data=this.sortedWeaponList.map((e=>this.weapons?this.weapons[e].kills:0)),t):t},chartOptions(){this.$props.playerHighlighted;const e={responsive:!0,maintainAspectRatio:!0,animation:{duration:500},layout:{autoPadding:!1},plugins:{datalabels:{formatter:(e,t)=>{const a=this.sortedWeaponList[t.dataIndex];return Z[a]||console.log(a),Z[a]||a},backgroundColor:e=>e.dataset.backgroundColor(e),borderColor:this.colors.fg,borderRadius:25,borderWidth:2,color:this.colors.bg,display:e=>e.dataIndex===e.dataset.labels.length-1||"auto",padding:6},tooltip:{callbacks:{label:e=>{let t;return t=this.sortedWeaponList?this.sortedWeaponList[e.dataIndex]:e.dataset.labels[e.dataIndex],t+=" ("+this.weapons[t].kills+" kills)",t}}}}};return e},weapons(){const{weapon:e,...t}=this.filters||{},a=this.store.getWeaponList(t)?.value.data;return a||this.store.fetchWeapons(t).value.data},sortedWeaponList(){if(!this.weapons)return[];const e=Object.keys(this.weapons);return e.sort(((e,t)=>Number(this.weapons[e].kills)Number(this.weapons[t].kills)?1:0)),e}}});const N=(0,g.Z)(z,[["render",T],["__scopeId","data-v-1ad9360f"]]);var U=N,F=a(6368),G=(0,s.aZ)({name:"PlayerView",components:{VueMultiselect:F.ZP,PlayerList:O,PlayerChart:A,WeaponChart:U},data(){return{model:{server:void 0,weapon:void 0},filters:{},store:c(),playerHighlighted:void 0,weaponLocale:Z}},computed:{servers(){const{server:e,player:t,...a}=this.filters,r=this.store.getServerList(a)?.value.data;return r||this.store.fetchServers(a).value.data},groupedServers(){const e=[];return Object.entries(this.servers).forEach((t=>{e.find((e=>e.id===t[1].host+"sfdsdfsd"))||e.push({id:t[1].host+"sfdsdfsd",servers:[]}),e.find((e=>e.id===t[1].host+"sfdsdfsd"))?.servers.push({name:t[0],...t[1]})})),e},weapons(){const{weapon:e,player:t,...a}=this.filters,r=this.store.getWeaponList(a)?.value.data;return r||this.store.fetchWeapons(a).value.data},players(){const{player:e,...t}=this.filters,a=this.store.getPlayerList(t)?.value.data;return a||this.store.fetchPlayers(t).value.data},sortedWeaponList(){if(!this.weapons)return[];const e=Object.keys(this.weapons);return e.sort()},sortedServerList(){if(!this.servers)return[];const e=Object.keys(this.servers);return e.sort()},sortedPlayerList(){if(!this.players)return[];const e=Object.keys(this.players);return e.sort(((e,t)=>this.players?this.players[e].usernamethis.players[t].username?1:0:0))}},watch:{model:{handler(e){this.filters.server=e.server?.name,this.filters.weapon=e.weapon},deep:!0}}});const K=(0,g.Z)(G,[["render",w],["__scopeId","data-v-7c39888e"]]);var B=K;const q=[{path:"/",name:"home",component:B}],Y=(0,_.p7)({history:(0,_.PO)("/ToneAPI_webclient/"),routes:q});var Q=Y;const J=(0,n.WB)();(0,r.ri)(m).use(J).use(Q).mount("#app")}},t={};function a(r){var s=t[r];if(void 0!==s)return s.exports;var l=t[r]={exports:{}};return e[r](l,l.exports,a),l.exports}a.m=e,function(){var e=[];a.O=function(t,r,s,l){if(!r){var i=1/0;for(d=0;d=l)&&Object.keys(a.O).every((function(e){return a.O[e](r[o])}))?r.splice(o--,1):(n=!1,l0&&e[d-1][2]>l;d--)e[d]=e[d-1];e[d]=[r,s,l]}}(),function(){a.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return a.d(t,{a:t}),t}}(),function(){a.d=function(e,t){for(var r in t)a.o(t,r)&&!a.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})}}(),function(){a.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}}(),function(){var e={143:0};a.O.j=function(t){return 0===e[t]};var t=function(t,r){var s,l,i=r[0],n=r[1],o=r[2],p=0;if(i.some((function(t){return 0!==e[t]}))){for(s in n)a.o(n,s)&&(a.m[s]=n[s]);if(o)var d=o(a)}for(t&&t(r);pTONE API
\", 4)\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_router_link = _resolveComponent(\"router-link\")!\n const _component_router_view = _resolveComponent(\"router-view\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createElementVNode(\"header\", null, [\n _createElementVNode(\"nav\", null, [\n _hoisted_1,\n _createVNode(_component_router_link, {\n to: \"/\",\n class: \"navbar-element\"\n }, {\n default: _withCtx(() => [\n _createTextVNode(\"Players\")\n ]),\n _: 1\n })\n ])\n ]),\n _createVNode(_component_router_view)\n ], 64))\n}","import { defineStore } from 'pinia'\r\nimport * as assert from 'assert'\r\nimport { Ref, ref } from 'vue'\r\n\r\nexport interface Filters {\r\n server?: string;\r\n player?: string;\r\n weapon?: string;\r\n host?: string;\r\n map?: string;\r\n gamemode?: string;\r\n}\r\n\r\nfunction removeNullEntries (a: Filters) {\r\n return Object.fromEntries(\r\n Object.entries(a).filter((e) => e[1] !== undefined && e[1] !== null)\r\n )\r\n}\r\nfunction objectEqual (a: Filters, b: Filters) {\r\n try {\r\n a = removeNullEntries(a)\r\n b = removeNullEntries(b)\r\n assert.deepStrictEqual(a, b)\r\n return true\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\nexport interface Kill {\r\n deaths: number;\r\n kills: number;\r\n // eslint-disable-next-line camelcase\r\n max_distance: number;\r\n // eslint-disable-next-line camelcase\r\n total_distance: number;\r\n}\r\nexport interface KillData {\r\n filter: Filters;\r\n data: { [key: string]: T };\r\n}\r\n\r\nexport interface Player extends Kill {\r\n username: string;\r\n // eslint-disable-next-line camelcase\r\n deaths_while_equipped?: number;\r\n}\r\n\r\nexport interface Weapon extends Kill {\r\n // eslint-disable-next-line camelcase\r\n deaths_while_equipped: number;\r\n}\r\n\r\nexport interface Server extends Kill {\r\n host: number;\r\n}\r\n\r\n// define your typings for the store state\r\nexport interface State {\r\n servers: Ref>[];\r\n players: Ref>[];\r\n weapons: Ref>[];\r\n maps: Ref>[];\r\n gamemodes: Ref>[];\r\n hosts: { [key: number]: string };\r\n}\r\n\r\nexport const useKillStore = defineStore('kill', {\r\n state: (): State => ({\r\n servers: [],\r\n players: [],\r\n weapons: [],\r\n maps: [],\r\n gamemodes: [],\r\n hosts: {}\r\n }),\r\n getters: {\r\n getPlayerList: (state) => (filters: Filters) => {\r\n return state.players.find((e) => objectEqual(e.value.filter, filters))\r\n },\r\n getWeaponList: (state) => (filters: Filters) =>\r\n state.weapons.find((e) => objectEqual(e.value.filter, filters)),\r\n getServerList: (state) => (filters: Filters) =>\r\n state.servers.find((e) => objectEqual(e.value.filter, filters))\r\n },\r\n actions: {\r\n fetchPlayers (filter: Filters) {\r\n filter = removeNullEntries(filter)\r\n let entry = this.players.find((e) => objectEqual(e.value.filter, filter))\r\n if (entry === undefined) {\r\n entry = ref({ filter, data: {} })\r\n this.players.push(entry)\r\n }\r\n fetch(\r\n 'https://tone.sleepycat.date/v2/client/players?' +\r\n new URLSearchParams(filter as Record)\r\n ).then(async response => {\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n entry!.value.data = await response.json()\r\n })\r\n return entry\r\n },\r\n fetchWeapons (filter: Filters) {\r\n filter = removeNullEntries(filter)\r\n let entry = this.weapons.find((e) => objectEqual(e.value.filter, filter))\r\n if (!entry) {\r\n entry = ref({ filter, data: {} })\r\n this.weapons.push(entry)\r\n }\r\n\r\n fetch(\r\n 'https://tone.sleepycat.date/v2/client/weapons?' +\r\n new URLSearchParams(filter as Record)\r\n ).then(async response => {\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n entry!.value.data = await response.json()\r\n })\r\n return entry\r\n },\r\n fetchServers (filter: Filters) {\r\n filter = removeNullEntries(filter)\r\n let entry = this.servers.find((e) => objectEqual(e.value.filter, filter))\r\n if (!entry) {\r\n entry = ref({ filter, data: {} })\r\n this.servers.push(entry)\r\n }\r\n fetch(\r\n 'https://tone.sleepycat.date/v2/client/servers?' +\r\n new URLSearchParams(filter as Record)\r\n ).then(async response => {\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n entry!.value.data = await response.json()\r\n })\r\n return entry\r\n }\r\n }\r\n})\r\n","\r\nimport { Player, Weapon, Server, useKillStore } from '@/stores/kill'\r\nimport { defineComponent } from 'vue'\r\n\r\nexport default defineComponent({\r\n setup (props, ctx) {\r\n const store = useKillStore()\r\n store.fetchPlayers({})\r\n store.fetchServers({})\r\n store.fetchWeapons({})\r\n }\r\n})\r\n","import { render } from \"./App.vue?vue&type=template&id=a4a5fcd4&ts=true\"\nimport script from \"./App.vue?vue&type=script&lang=ts\"\nexport * from \"./App.vue?vue&type=script&lang=ts\"\n\nimport \"./App.vue?vue&type=style&index=0&id=a4a5fcd4&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, createElementVNode as _createElementVNode, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-7c39888e\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { id: \"filters\" }\nconst _hoisted_2 = { id: \"playerView\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_VueMultiselect = _resolveComponent(\"VueMultiselect\")!\n const _component_PlayerList = _resolveComponent(\"PlayerList\")!\n const _component_PlayerChart = _resolveComponent(\"PlayerChart\")!\n const _component_WeaponChart = _resolveComponent(\"WeaponChart\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createElementVNode(\"div\", _hoisted_1, [\n _createVNode(_component_VueMultiselect, {\n selectLabel: \"\",\n deselectLabel: \"remove\",\n placeholder: \"Select server\",\n modelValue: _ctx.model.server,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((_ctx.model.server) = $event)),\n options: _ctx.groupedServers,\n \"group-values\": \"servers\",\n group_label: \"id\",\n \"group-select\": false,\n \"allow-empty\": true,\n multiple: false,\n \"custom-label\": ((e) => e.name),\n \"track-by\": \"name\",\n label: \"name\"\n }, null, 8, [\"modelValue\", \"options\", \"custom-label\"]),\n _createVNode(_component_VueMultiselect, {\n selectLabel: \"\",\n deselectLabel: \"remove\",\n placeholder: \"Select weapon\",\n modelValue: _ctx.model.weapon,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((_ctx.model.weapon) = $event)),\n \"custom-label\": ((e) => _ctx.weaponLocale[e] || e),\n options: _ctx.sortedWeaponList,\n \"allow-empty\": true\n }, null, 8, [\"modelValue\", \"custom-label\", \"options\"]),\n _createVNode(_component_VueMultiselect, {\n selectLabel: \"\",\n deselectLabel: \"remove\",\n placeholder: \"Search player\",\n modelValue: _ctx.playerHighlighted,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = ($event: any) => ((_ctx.playerHighlighted) = $event)),\n options: _ctx.sortedPlayerList,\n \"allow-empty\": true,\n \"custom-label\": ((e) => _ctx.players[e]?.username)\n }, null, 8, [\"modelValue\", \"options\", \"custom-label\"])\n ]),\n _createElementVNode(\"div\", _hoisted_2, [\n _createVNode(_component_PlayerList, {\n filters: _ctx.filters,\n onHighlightPlayer: _cache[3] || (_cache[3] = ($event: any) => (_ctx.playerHighlighted = $event)),\n playerHighlighted: _ctx.playerHighlighted\n }, null, 8, [\"filters\", \"playerHighlighted\"]),\n _createVNode(_component_PlayerChart, {\n filters: _ctx.filters,\n onHighlightPlayer: _cache[4] || (_cache[4] = ($event: any) => (_ctx.playerHighlighted = $event)),\n playerHighlighted: _ctx.playerHighlighted\n }, null, 8, [\"filters\", \"playerHighlighted\"]),\n _createVNode(_component_WeaponChart, {\n filters: {player: _ctx.playerHighlighted, ..._ctx.filters},\n playerHighlighted: _ctx.playerHighlighted\n }, null, 8, [\"filters\", \"playerHighlighted\"])\n ])\n ], 64))\n}","import { createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-56c6f3e1\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { class: \"playerHeaders\" }\nconst _hoisted_2 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/_createElementVNode(\"span\", null, null, -1))\nconst _hoisted_3 = [\"onClick\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"div\", {\n class: \"playerTable\",\n onKeydown: _cache[6] || (_cache[6] = \n//@ts-ignore\n(...args) => (_ctx.selectNextPlayer && _ctx.selectNextPlayer(...args))),\n tabindex: \"0\"\n }, [\n _createElementVNode(\"div\", _hoisted_1, [\n _hoisted_2,\n _createElementVNode(\"span\", {\n onClick: _cache[0] || (_cache[0] = ($event: any) => (_ctx.sortPlayerList('username'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'username' ? 'selected' : '')\n }, \"Username\", 2),\n _createElementVNode(\"span\", {\n onClick: _cache[1] || (_cache[1] = ($event: any) => (_ctx.sortPlayerList('kills'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'kills' ? 'selected' : '')\n }, \"K\", 2),\n _createElementVNode(\"span\", {\n onClick: _cache[2] || (_cache[2] = ($event: any) => (_ctx.sortPlayerList('deaths'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'deaths' ? 'selected' : '')\n }, \"D\", 2),\n _createElementVNode(\"span\", {\n onClick: _cache[3] || (_cache[3] = ($event: any) => (_ctx.sortPlayerList('k/d'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'k/d' ? 'selected' : '')\n }, \"K/D\", 2),\n _createElementVNode(\"span\", {\n onClick: _cache[4] || (_cache[4] = ($event: any) => (_ctx.sortPlayerList('max_distance'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'max_distance' ? 'selected' : '')\n }, \"max distance\", 2),\n _createElementVNode(\"span\", {\n onClick: _cache[5] || (_cache[5] = ($event: any) => (_ctx.sortPlayerList('avg_distance'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'avg_distance' ? 'selected' : '')\n }, \"average distance\", 2)\n ]),\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.playerIdList, (playerId, index) => {\n return (_openBlock(), _createElementBlock(\"div\", {\n class: _normalizeClass('playerRow ' + (playerId === _ctx.$props.playerHighlighted ? 'selected' : '')),\n key: playerId,\n onClick: ($event: any) => (_ctx.$emit('highlightPlayer', playerId)),\n ref_for: true,\n ref: `player:` + playerId\n }, [\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(index+1), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(_ctx.players[playerId].username), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(_ctx.players[playerId].kills), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(_ctx.players[playerId].deaths), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(Math.round(_ctx.players[playerId].kills / Math.max(1, _ctx.players[playerId].deaths) * 100) / 100), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(_ctx.players[playerId].max_distance), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(Math.round(((_ctx.players[playerId].total_distance / _ctx.players[playerId].kills) || 0) * 100) / 100), 1)\n ])\n ], 10, _hoisted_3))\n }), 128))\n ], 32))\n}","\r\nimport { defineComponent, PropType } from 'vue'\r\nimport { useKillStore, Player, Filters } from '@/stores/kill'\r\n\r\nexport default defineComponent({\r\n props: {\r\n filters: { type: Object as PropType, default: () => ({}) },\r\n playerHighlighted: String\r\n },\r\n emits: ['highlightPlayer'],\r\n data () {\r\n return {\r\n sortingData: { direction: -1, argument: 'kills' as keyof Player | 'k/d' | 'avg_distance' },\r\n playerIdList: [] as string[],\r\n store: useKillStore()\r\n }\r\n },\r\n computed: {\r\n players (): { [key: string]: Player } {\r\n const { player: _, ...withoutPlayer } = this.filters\r\n const data = this.store.getPlayerList(withoutPlayer)?.value.data\r\n if (!data) return this.store.fetchPlayers(withoutPlayer).value.data\r\n return data\r\n }\r\n },\r\n watch: {\r\n players: {\r\n handler (newval: { [key: string]: Player }): void {\r\n if (!newval) return\r\n this.playerIdList = []\r\n this.sortingData.direction *= -1\r\n this.playerIdList = Object.keys(newval)\r\n this.sortPlayerList(this.sortingData.argument)\r\n this.playerIdList = this.playerIdList.slice(0, 500)\r\n },\r\n immediate: true\r\n },\r\n playerHighlighted (newval) {\r\n const newElement = this.$refs['player:' + newval] as HTMLElement[]\r\n if (newElement && newElement[0]) { newElement[0].scrollIntoView({ behavior: 'smooth', block: 'center' }) }\r\n }\r\n },\r\n updated () {\r\n const element = this.$refs['player:' + this.$props.playerHighlighted] as HTMLElement[]\r\n if (!element || !element[0]) return\r\n element[0].scrollIntoView({ behavior: 'smooth', block: 'center' })\r\n },\r\n methods: {\r\n sortPlayerList (arg: ((keyof Player) | 'k/d' | 'avg_distance')) {\r\n if (arg === this.sortingData.argument) {\r\n this.sortingData.direction *= -1\r\n } else {\r\n if (arg === 'username') {\r\n this.sortingData.direction = 1\r\n }\r\n }\r\n this.sortingData.argument = arg\r\n\r\n this.playerIdList.sort((a: string, b: string) => {\r\n if (!this.players) {\r\n return 0\r\n }\r\n let varA, varB\r\n if (arg === 'k/d') {\r\n varA = this.players[a].kills / Math.max(1, this.players[a].deaths)\r\n varB = this.players[b].kills / Math.max(1, this.players[b].deaths)\r\n } else if (arg === 'avg_distance') {\r\n varA = (this.players[a].total_distance / this.players[a].kills) || 0\r\n varB = (this.players[b].total_distance / this.players[b].kills) || 0\r\n } else {\r\n varA = this.players[a][arg]\r\n varB = this.players[b][arg]\r\n }\r\n if (varA === undefined || varB === undefined) return 0\r\n if (varA < varB) {\r\n return -1 * this.sortingData.direction\r\n }\r\n if (varA > varB) {\r\n return 1 * this.sortingData.direction\r\n }\r\n return 0\r\n })\r\n },\r\n selectNextPlayer (e: KeyboardEvent) {\r\n const values = {\r\n Home: -Infinity,\r\n End: Infinity,\r\n PageDown: 100,\r\n PageUp: -100,\r\n ArrowUp: -1,\r\n ArrowDown: 1,\r\n ArrowRight: 10,\r\n ArrowLeft: -10\r\n } as { [key: string]: number }\r\n if (!this.$props.playerHighlighted) return\r\n if (!Object.keys(values).includes(e.key)) return\r\n e.preventDefault()\r\n const index = this.playerIdList.indexOf(this.$props.playerHighlighted)\r\n let nextIndex = (index + values[e.key])\r\n if (nextIndex >= this.playerIdList.length) nextIndex = this.playerIdList.length - 1\r\n if (nextIndex < 0) nextIndex = 0\r\n this.$emit('highlightPlayer', this.playerIdList[nextIndex])\r\n }\r\n }\r\n\r\n})\r\n","import { render } from \"./PlayerList.vue?vue&type=template&id=56c6f3e1&scoped=true&ts=true\"\nimport script from \"./PlayerList.vue?vue&type=script&lang=ts\"\nexport * from \"./PlayerList.vue?vue&type=script&lang=ts\"\n\nimport \"./PlayerList.vue?vue&type=style&index=0&id=56c6f3e1&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-56c6f3e1\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-05bdcd1e\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = {\n class: \"playerChart\",\n ref: \"container\"\n}\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_Scatter = _resolveComponent(\"Scatter\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createVNode(_component_Scatter, {\n data: _ctx.chart,\n options: _ctx.chartOptions\n }, null, 8, [\"data\", \"options\"])\n ], 512))\n}","\r\nimport {\r\n Chart as ChartJS,\r\n LinearScale,\r\n PointElement,\r\n LineElement,\r\n Tooltip,\r\n Legend,\r\n CoreChartOptions,\r\n PluginChartOptions,\r\n ScaleChartOptions\r\n} from 'chart.js'\r\nimport annotationPlugin from 'chartjs-plugin-annotation'\r\nimport dataLabel from 'chartjs-plugin-datalabels'\r\nimport { useKillStore, Player, Filters } from '@/stores/kill'\r\n\r\nimport { Scatter } from 'vue-chartjs'\r\nimport { defineComponent, PropType } from 'vue'\r\nimport { ChartEvent } from 'chart.js/dist/core/core.plugins'\r\nimport { _DeepPartialObject } from 'chart.js/dist/types/utils'\r\n\r\nChartJS.register(LinearScale, PointElement, LineElement, Tooltip, Legend, annotationPlugin, dataLabel)\r\n\r\nexport default defineComponent({\r\n name: 'PlayerChart',\r\n props: {\r\n filters: Object as PropType,\r\n playerHighlighted: String\r\n },\r\n data: () => {\r\n return {\r\n store: useKillStore(),\r\n refreshColors: 0\r\n }\r\n },\r\n emits: ['highlightPlayer'],\r\n components: {\r\n Scatter\r\n },\r\n mounted () {\r\n this.refreshColors++\r\n },\r\n computed: {\r\n colors () {\r\n // eslint-disable-next-line no-unused-expressions\r\n this.refreshColors\r\n const colors = {} as { [key: string]: string }\r\n if (this.$refs.container) {\r\n const style = getComputedStyle(this.$refs.container as Element)\r\n colors.fg = style.getPropertyValue('--foreground')\r\n colors.bg = style.getPropertyValue('--bg-color')\r\n colors.orange = style.getPropertyValue('--orange')\r\n colors.cyan = style.getPropertyValue('--cyan')\r\n colors.currentLine = style.getPropertyValue('--current-line')\r\n } else {\r\n colors.fg = '#ffffff'\r\n }\r\n return colors\r\n },\r\n chart () {\r\n return {\r\n datasets: [\r\n {\r\n label: 'Players',\r\n labels: this.playerIdList || [] as string[],\r\n borderColor: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.index]) ? this.colors.orange : this.colors.cyan,\r\n backgroundColor: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.index]) ? this.colors.orange : this.colors.cyan,\r\n pointRadius: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.index]) ? 20 : 1,\r\n pointStyle: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.index]) ? 'crossRot' : 'circle',\r\n hoverRadius: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.index]) ? 30 : 4,\r\n data: this.playerIdList.map((id) => ({ y: this.players[id].kills, x: this.players[id].deaths }))\r\n }\r\n ]\r\n }\r\n },\r\n chartOptions (): _DeepPartialObject & PluginChartOptions<'scatter'> & ScaleChartOptions<'scatter'>> {\r\n // eslint-disable-next-line no-unused-expressions\r\n this.$props.playerHighlighted\r\n let endX = 0\r\n let endY = 0\r\n if (this.players) {\r\n const maxX = Math.max(...Object.values(this.players).map(e => e.deaths))\r\n const maxY = Math.max(...Object.values(this.players).map(e => e.kills))\r\n\r\n if (maxY > maxX) {\r\n endX = maxX\r\n endY = (maxX / maxY) * maxY\r\n } else {\r\n endY = maxY\r\n endX = (maxY / maxX) * maxX\r\n }\r\n }\r\n return {\r\n responsive: true,\r\n maintainAspectRatio: false,\r\n animation: { duration: 500 },\r\n layout: { autoPadding: false },\r\n scales: {\r\n y: {\r\n title: {\r\n text: 'Kills',\r\n display: true,\r\n color: this.colors.fg\r\n },\r\n ticks: {\r\n color: this.colors.fg\r\n }\r\n },\r\n x: {\r\n title: {\r\n text: 'Deaths',\r\n display: true,\r\n color: this.colors.fg\r\n },\r\n ticks: {\r\n color: this.colors.fg\r\n }\r\n }\r\n },\r\n plugins: {\r\n tooltip: {\r\n callbacks: {\r\n label: (ctx: any) => {\r\n let label: string\r\n if (!this.players) {\r\n label = ctx.dataset.labels[ctx.dataIndex]\r\n } else {\r\n label = this.players[ctx.dataset.labels[ctx.dataIndex]].username\r\n }\r\n label += ' (' + ctx.parsed.y + ' kills ' + ctx.parsed.x + ' deaths)'\r\n return label\r\n }\r\n }\r\n },\r\n annotation: {\r\n annotations: {\r\n line: {\r\n type: 'line',\r\n yMin: 0,\r\n xMin: 0,\r\n yMax: endY,\r\n xMax: endX,\r\n borderWidth: 2,\r\n borderColor: this.colors.orange,\r\n borderDash: [1, 5]\r\n }\r\n }\r\n },\r\n legend: { display: false },\r\n datalabels: {\r\n formatter: (value: any, context: any) => {\r\n return this.players[this.playerIdList[context.dataIndex]].username\r\n },\r\n backgroundColor: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.dataIndex]) ? this.colors.orange : null,\r\n borderColor: this.colors.fg,\r\n borderWidth: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.dataIndex]) ? 1 : 0,\r\n borderRadius: 5,\r\n display: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.dataIndex]) ? 'true' : 'auto',\r\n align: -45,\r\n anchor: 'end',\r\n clamp: true,\r\n color: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.dataIndex]) ? this.colors.bg : this.colors.fg\r\n }\r\n },\r\n onClick: (e: ChartEvent, element: any) => {\r\n this.$emit('highlightPlayer', element.length > 0 ? this.playerIdList[element[0].index] : undefined)\r\n },\r\n onHover: (e: any, element: any) => {\r\n if (!e.native.target) return\r\n (e.native.target as HTMLElement).style.cursor = element[0] ? 'pointer' : 'default'\r\n }\r\n }\r\n },\r\n players (): { [key: string]: Player } {\r\n const data = this.store.getPlayerList(this.filters || {})?.value.data\r\n if (!data) return this.store.fetchPlayers(this.filters || {}).value.data\r\n const cut = Object.entries(data).sort((a, b) => {\r\n if (a[1].kills < b[1].kills) {\r\n return 1\r\n }\r\n if (a[1].kills > b[1].kills) {\r\n return -1\r\n }\r\n return 0\r\n }).slice(0, 200)\r\n return Object.fromEntries(cut)\r\n },\r\n playerIdList (): string[] { return Object.keys(this.players) }\r\n\r\n }\r\n})\r\n","import { render } from \"./PlayerChart.vue?vue&type=template&id=05bdcd1e&scoped=true&ts=true\"\nimport script from \"./PlayerChart.vue?vue&type=script&lang=ts\"\nexport * from \"./PlayerChart.vue?vue&type=script&lang=ts\"\n\nimport \"./PlayerChart.vue?vue&type=style&index=0&id=05bdcd1e&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-05bdcd1e\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-1ad9360f\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = {\n class: \"weaponChart\",\n ref: \"container\"\n}\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_Doughnut = _resolveComponent(\"Doughnut\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createVNode(_component_Doughnut, {\n data: _ctx.chart,\n options: _ctx.chartOptions\n }, null, 8, [\"data\", \"options\"])\n ], 512))\n}","\r\nimport { Chart as ChartJS, ArcElement, Tooltip, Legend } from 'chart.js'\r\nimport dataLabel from 'chartjs-plugin-datalabels'\r\nimport { Weapon, Filters, useKillStore } from '@/stores/kill'\r\nimport { Doughnut } from 'vue-chartjs'\r\nimport { defineComponent, PropType } from 'vue'\r\nimport weapons from '../stores/weapons.json'\r\n\r\nChartJS.register(ArcElement, Tooltip, Legend, dataLabel)\r\n\r\nexport default defineComponent({\r\n name: 'PlayerChart',\r\n props: {\r\n filters: Object as PropType,\r\n playerHighlighted: String\r\n },\r\n emits: ['highlightPlayer'],\r\n components: {\r\n Doughnut\r\n },\r\n mounted () {\r\n this.refreshColors++\r\n },\r\n data: () => {\r\n return {\r\n store: useKillStore(),\r\n refreshColors: 0\r\n }\r\n },\r\n computed: {\r\n colors () {\r\n // eslint-disable-next-line no-unused-expressions\r\n this.refreshColors\r\n const colors = {} as { [key: string]: string }\r\n if (this.$refs.container) {\r\n const style = getComputedStyle(this.$refs.container as Element)\r\n colors.fg = style.getPropertyValue('--foreground')\r\n colors.bg = style.getPropertyValue('--bg-color')\r\n colors.orange = style.getPropertyValue('--orange')\r\n colors.cyan = style.getPropertyValue('--cyan')\r\n colors.yellow = style.getPropertyValue('--yellow')\r\n colors.green = style.getPropertyValue('--green')\r\n colors.purple = style.getPropertyValue('--purple')\r\n colors.red = style.getPropertyValue('--red')\r\n colors.pink = style.getPropertyValue('--pink')\r\n colors.currentLine = style.getPropertyValue('--current-line')\r\n } else {\r\n colors.fg = '#ffffff'\r\n }\r\n return colors\r\n },\r\n chart () {\r\n const colors = [\r\n 'cyan',\r\n 'green',\r\n 'orange',\r\n 'pink',\r\n 'purple',\r\n 'red',\r\n 'yellow'\r\n ]\r\n const chartData = {\r\n datasets: [\r\n {\r\n label: 'Weapons',\r\n labels: this.sortedWeaponList || ([] as string[]),\r\n borderColor: () => this.colors.fg,\r\n backgroundColor: (context: any) => {\r\n return this.colors[\r\n colors[(context.dataIndex * 3) % colors.length]\r\n ]\r\n },\r\n data: [] as number[]\r\n }\r\n ]\r\n }\r\n if (!this.sortedWeaponList) {\r\n return chartData\r\n }\r\n chartData.datasets[0].data = this.sortedWeaponList.map((e) => {\r\n if (!this.weapons) {\r\n return 0\r\n }\r\n return this.weapons[e].kills\r\n })\r\n return chartData\r\n },\r\n chartOptions () {\r\n // eslint-disable-next-line no-unused-expressions\r\n this.$props.playerHighlighted\r\n const options = {\r\n responsive: true,\r\n maintainAspectRatio: true,\r\n animation: { duration: 500 },\r\n layout: { autoPadding: false },\r\n plugins: {\r\n datalabels: {\r\n formatter: (value: any, context: any) => {\r\n const weaponId = this.sortedWeaponList[context.dataIndex]\r\n if (!(weapons as {[key:string]:string})[weaponId]) console.log(weaponId)\r\n return (weapons as {[key:string]:string})[weaponId] || weaponId\r\n },\r\n backgroundColor: (context: any) => {\r\n return context.dataset.backgroundColor(context)\r\n },\r\n borderColor: this.colors.fg,\r\n borderRadius: 25,\r\n borderWidth: 2,\r\n color: this.colors.bg,\r\n display: (context: any) => {\r\n return context.dataIndex === context.dataset.labels.length - 1\r\n ? true\r\n : 'auto'\r\n },\r\n padding: 6\r\n },\r\n tooltip: {\r\n callbacks: {\r\n label: (ctx: any) => {\r\n let label: string\r\n if (!this.sortedWeaponList) {\r\n label = ctx.dataset.labels[ctx.dataIndex]\r\n } else {\r\n label = this.sortedWeaponList[ctx.dataIndex]\r\n }\r\n label += ' (' + this.weapons[label].kills + ' kills)'\r\n return label\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return options\r\n },\r\n weapons (): { [key: string]: Weapon } {\r\n const { weapon: _, ...withoutWeapon } = this.filters || {}\r\n const data = this.store.getWeaponList(withoutWeapon)?.value.data\r\n if (!data) return this.store.fetchWeapons(withoutWeapon).value.data\r\n return data\r\n },\r\n sortedWeaponList (): string[] {\r\n if (!this.weapons) return []\r\n const weapons = Object.keys(this.weapons)\r\n weapons.sort((a, b) => {\r\n if (Number(this.weapons[a].kills) < Number(this.weapons[b].kills)) {\r\n return -1\r\n }\r\n if (Number(this.weapons[a].kills) > Number(this.weapons[b].kills)) {\r\n return 1\r\n }\r\n return 0\r\n })\r\n return weapons\r\n }\r\n }\r\n})\r\n","import { render } from \"./WeaponChart.vue?vue&type=template&id=1ad9360f&scoped=true&ts=true\"\nimport script from \"./WeaponChart.vue?vue&type=script&lang=ts\"\nexport * from \"./WeaponChart.vue?vue&type=script&lang=ts\"\n\nimport \"./WeaponChart.vue?vue&type=style&index=0&id=1ad9360f&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-1ad9360f\"]])\n\nexport default __exports__","\r\nimport { Player, Weapon, Server, useKillStore, Filters } from '@/stores/kill'\r\nimport PlayerList from '@/components/PlayerList.vue'\r\nimport PlayerChart from '@/components/PlayerChart.vue'\r\nimport WeaponChart from '@/components/WeaponChart.vue'\r\nimport { defineComponent } from 'vue'\r\nimport VueMultiselect from 'vue-multiselect'\r\nimport 'vue-multiselect/dist/vue-multiselect.css'\r\nimport weapons from '../stores/weapons.json'\r\n\r\nexport default defineComponent({\r\n name: 'PlayerView',\r\n components: {\r\n VueMultiselect, PlayerList, PlayerChart, WeaponChart\r\n },\r\n\r\n data () {\r\n return {\r\n model: { server: undefined, weapon: undefined } as unknown as {weapon:Weapon | Weapon[], server: (Server& {name?:string}) | (Server& {name?:string})[]},\r\n filters: {} as Filters,\r\n store: useKillStore(),\r\n playerHighlighted: undefined,\r\n weaponLocale: weapons as {[key:string]:string}\r\n }\r\n },\r\n computed: {\r\n servers (): { [key: string]: Server } {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { server: _, player: _1, ...withoutServer } = this.filters\r\n const data = this.store.getServerList(withoutServer)?.value.data\r\n if (!data) return this.store.fetchServers(withoutServer).value.data\r\n return data\r\n },\r\n groupedServers () {\r\n const hosts = [] as {id:string, servers:(Server& {name?:string})[] }[]\r\n Object.entries(this.servers).forEach((e) => {\r\n if (!hosts.find(host => host.id === e[1].host + 'sfdsdfsd')) hosts.push({ id: e[1].host + 'sfdsdfsd', servers: [] as Server[] })\r\n hosts.find(host => host.id === e[1].host + 'sfdsdfsd')?.servers.push({ name: e[0], ...e[1] })\r\n })\r\n return hosts\r\n },\r\n weapons (): { [key: string]: Weapon } {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { weapon: _, player: _1, ...withoutWeapons } = this.filters\r\n const data = this.store.getWeaponList(withoutWeapons)?.value.data\r\n if (!data) return this.store.fetchWeapons(withoutWeapons).value.data\r\n return data\r\n },\r\n players (): { [key: string]: Player } {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { player: _, ...withoutPlayers } = this.filters\r\n const data = this.store.getPlayerList(withoutPlayers)?.value.data\r\n if (!data) return this.store.fetchPlayers(withoutPlayers).value.data\r\n return data\r\n },\r\n sortedWeaponList (): string[] {\r\n if (!this.weapons) return []\r\n const weapons = Object.keys(this.weapons)\r\n return weapons.sort()\r\n },\r\n sortedServerList ():string[] {\r\n if (!this.servers) return []\r\n const servers = Object.keys(this.servers)\r\n return servers.sort()\r\n },\r\n sortedPlayerList (): string[] {\r\n if (!this.players) return []\r\n const players = Object.keys(this.players)\r\n return players.sort((a: string, b: string) => {\r\n if (!this.players) {\r\n return 0\r\n }\r\n if (this.players[a].username < this.players[b].username) {\r\n return -1\r\n }\r\n if (this.players[a].username > this.players[b].username) {\r\n return 1\r\n }\r\n return 0\r\n })\r\n }\r\n },\r\n watch: {\r\n model: {\r\n handler (newModel) {\r\n this.filters.server = newModel.server?.name\r\n this.filters.weapon = newModel.weapon\r\n },\r\n deep: true\r\n }\r\n }\r\n})\r\n","import { render } from \"./PlayerView.vue?vue&type=template&id=7c39888e&scoped=true&ts=true\"\nimport script from \"./PlayerView.vue?vue&type=script&lang=ts\"\nexport * from \"./PlayerView.vue?vue&type=script&lang=ts\"\n\nimport \"./PlayerView.vue?vue&type=style&index=0&id=7c39888e&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-7c39888e\"]])\n\nexport default __exports__","import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'\r\nimport HomeView from '../views/HomeView.vue'\r\nimport PlayerView from '../views/PlayerView.vue'\r\n\r\nconst routes: Array = [\r\n {\r\n path: '/',\r\n name: 'home',\r\n component: PlayerView\r\n }\r\n // {\r\n // path: '/players',\r\n // name: 'players',\r\n // component: PlayerView\r\n // },\r\n // {\r\n // path: '/about',\r\n // name: 'about',\r\n // // route level code-splitting\r\n // // this generates a separate chunk (about.[hash].js) for this route\r\n // // which is lazy-loaded when the route is visited.\r\n // component: () => import(/* webpackChunkName: \"about\" */ '../views/AboutView.vue')\r\n // }\r\n]\r\n\r\nconst router = createRouter({\r\n history: createWebHistory(process.env.BASE_URL),\r\n routes\r\n})\r\n\r\nexport default router\r\n","import { createApp } from 'vue'\r\nimport App from './App.vue'\r\nimport router from './router'\r\nimport { createPinia } from 'pinia'\r\n\r\nconst pinia = createPinia()\r\n\r\ncreateApp(App).use(pinia).use(router).mount('#app')\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t143: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunktoneapi_webclient\"] = self[\"webpackChunktoneapi_webclient\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [998], function() { return __webpack_require__(3529); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["_hoisted_1","_createStaticVNode","render","_ctx","_cache","$props","$setup","$data","$options","_component_router_link","_resolveComponent","_component_router_view","_openBlock","_createElementBlock","_Fragment","_createElementVNode","_createVNode","to","class","default","_withCtx","_createTextVNode","_","removeNullEntries","a","Object","fromEntries","entries","filter","e","undefined","objectEqual","b","assert","deepStrictEqual","useKillStore","defineStore","state","servers","players","weapons","maps","gamemodes","hosts","getters","getPlayerList","filters","find","value","getWeaponList","getServerList","actions","fetchPlayers","entry","this","ref","data","push","fetch","URLSearchParams","then","async","response","json","fetchWeapons","fetchServers","defineComponent","setup","props","ctx","store","__exports__","id","_hoisted_2","_component_VueMultiselect","_component_PlayerList","_component_PlayerChart","_component_WeaponChart","selectLabel","deselectLabel","placeholder","modelValue","model","server","$event","options","groupedServers","group_label","multiple","name","label","weapon","weaponLocale","sortedWeaponList","playerHighlighted","sortedPlayerList","username","onHighlightPlayer","player","_withScopeId","n","_pushScopeId","_popScopeId","_hoisted_3","onKeydown","args","selectNextPlayer","tabindex","onClick","sortPlayerList","_normalizeClass","sortingData","argument","_renderList","playerIdList","playerId","index","key","$emit","ref_for","_toDisplayString","kills","deaths","Math","round","max","max_distance","total_distance","type","String","emits","direction","computed","withoutPlayer","watch","handler","newval","keys","slice","immediate","newElement","$refs","scrollIntoView","behavior","block","updated","element","methods","arg","sort","varA","varB","values","Home","Infinity","End","PageDown","PageUp","ArrowUp","ArrowDown","ArrowRight","ArrowLeft","includes","preventDefault","indexOf","nextIndex","length","_component_Scatter","chart","chartOptions","ChartJS","LinearScale","PointElement","LineElement","Tooltip","Legend","annotationPlugin","dataLabel","refreshColors","components","Scatter","mounted","colors","container","style","getComputedStyle","fg","getPropertyValue","bg","orange","cyan","currentLine","datasets","labels","borderColor","context","backgroundColor","pointRadius","pointStyle","hoverRadius","map","y","x","endX","endY","maxX","maxY","responsive","maintainAspectRatio","animation","duration","layout","autoPadding","scales","title","text","display","color","ticks","plugins","tooltip","callbacks","dataset","dataIndex","parsed","annotation","annotations","line","yMin","xMin","yMax","xMax","borderWidth","borderDash","legend","datalabels","formatter","borderRadius","align","anchor","clamp","onHover","native","target","cursor","cut","_component_Doughnut","ArcElement","Doughnut","yellow","green","purple","red","pink","chartData","weaponId","console","log","padding","withoutWeapon","Number","VueMultiselect","PlayerList","PlayerChart","WeaponChart","_1","withoutServer","forEach","host","withoutWeapons","withoutPlayers","sortedServerList","newModel","deep","routes","path","component","PlayerView","router","createRouter","history","createWebHistory","process","pinia","createPinia","createApp","App","use","mount","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","m","deferred","O","result","chunkIds","fn","priority","notFulfilled","i","fulfilled","j","every","splice","r","getter","__esModule","d","definition","o","defineProperty","enumerable","get","g","globalThis","Function","window","obj","prop","prototype","hasOwnProperty","call","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","self","bind","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"js/app.4bb8e87d.js","mappings":"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","sources":["webpack://toneapi_webclient/./src/App.vue?ae7c","webpack://toneapi_webclient/./src/stores/kill.ts","webpack://toneapi_webclient/./src/App.vue?847a","webpack://toneapi_webclient/./src/App.vue","webpack://toneapi_webclient/./src/views/PlayerView.vue?a316","webpack://toneapi_webclient/./src/components/PlayerList.vue?8773","webpack://toneapi_webclient/./src/components/PlayerList.vue?f30b","webpack://toneapi_webclient/./src/components/PlayerList.vue","webpack://toneapi_webclient/./src/components/PlayerChart.vue?8d24","webpack://toneapi_webclient/./src/components/PlayerChart.vue?ec59","webpack://toneapi_webclient/./src/components/PlayerChart.vue","webpack://toneapi_webclient/./src/components/WeaponChart.vue?b897","webpack://toneapi_webclient/./src/components/WeaponChart.vue?1a04","webpack://toneapi_webclient/./src/components/WeaponChart.vue","webpack://toneapi_webclient/./src/views/PlayerView.vue?6941","webpack://toneapi_webclient/./src/views/PlayerView.vue","webpack://toneapi_webclient/./src/router/index.ts","webpack://toneapi_webclient/./src/main.ts","webpack://toneapi_webclient/webpack/bootstrap","webpack://toneapi_webclient/webpack/runtime/chunk loaded","webpack://toneapi_webclient/webpack/runtime/compat get default export","webpack://toneapi_webclient/webpack/runtime/define property getters","webpack://toneapi_webclient/webpack/runtime/global","webpack://toneapi_webclient/webpack/runtime/hasOwnProperty shorthand","webpack://toneapi_webclient/webpack/runtime/jsonp chunk loading","webpack://toneapi_webclient/webpack/startup"],"sourcesContent":["import { createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, resolveComponent as _resolveComponent, withCtx as _withCtx, createVNode as _createVNode, createStaticVNode as _createStaticVNode, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = /*#__PURE__*/_createStaticVNode(\"
TONE API
\", 4)\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_router_link = _resolveComponent(\"router-link\")!\n const _component_router_view = _resolveComponent(\"router-view\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createElementVNode(\"header\", null, [\n _createElementVNode(\"nav\", null, [\n _hoisted_1,\n _createVNode(_component_router_link, {\n to: \"/\",\n class: \"navbar-element\"\n }, {\n default: _withCtx(() => [\n _createTextVNode(\"Players\")\n ]),\n _: 1\n })\n ])\n ]),\n _createVNode(_component_router_view)\n ], 64))\n}","import { defineStore } from 'pinia'\r\nimport * as assert from 'assert'\r\nimport { Ref, ref } from 'vue'\r\n\r\nexport interface Filters {\r\n server?: string;\r\n player?: string;\r\n weapon?: string;\r\n host?: string;\r\n map?: string;\r\n gamemode?: string;\r\n}\r\n\r\nfunction removeNullEntries (a: Filters) {\r\n return Object.fromEntries(\r\n Object.entries(a).filter((e) => e[1] !== undefined && e[1] !== null)\r\n )\r\n}\r\nfunction objectEqual (a: Filters, b: Filters) {\r\n try {\r\n a = removeNullEntries(a)\r\n b = removeNullEntries(b)\r\n assert.deepStrictEqual(a, b)\r\n return true\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\nexport interface Kill {\r\n deaths: number;\r\n kills: number;\r\n // eslint-disable-next-line camelcase\r\n max_distance: number;\r\n // eslint-disable-next-line camelcase\r\n total_distance: number;\r\n}\r\nexport interface KillData {\r\n filter: Filters;\r\n data: { [key: string]: T };\r\n}\r\n\r\nexport interface Player extends Kill {\r\n username: string;\r\n // eslint-disable-next-line camelcase\r\n deaths_while_equipped?: number;\r\n}\r\n\r\nexport interface Weapon extends Kill {\r\n // eslint-disable-next-line camelcase\r\n deaths_while_equipped: number;\r\n}\r\n\r\nexport interface Server extends Kill {\r\n host: number;\r\n}\r\n\r\n// define your typings for the store state\r\nexport interface State {\r\n servers: Ref>[];\r\n players: Ref>[];\r\n weapons: Ref>[];\r\n maps: Ref>[];\r\n gamemodes: Ref>[];\r\n hosts: { [key: number]: string };\r\n}\r\n\r\nexport const useKillStore = defineStore('kill', {\r\n state: (): State => ({\r\n servers: [],\r\n players: [],\r\n weapons: [],\r\n maps: [],\r\n gamemodes: [],\r\n hosts: {}\r\n }),\r\n getters: {\r\n getPlayerList: (state) => (filters: Filters) => {\r\n return state.players.find((e) => objectEqual(e.value.filter, filters))\r\n },\r\n getWeaponList: (state) => (filters: Filters) =>\r\n state.weapons.find((e) => objectEqual(e.value.filter, filters)),\r\n getServerList: (state) => (filters: Filters) =>\r\n state.servers.find((e) => objectEqual(e.value.filter, filters))\r\n },\r\n actions: {\r\n fetchPlayers (filter: Filters) {\r\n filter = removeNullEntries(filter)\r\n let entry = this.players.find((e) => objectEqual(e.value.filter, filter))\r\n if (entry === undefined) {\r\n entry = ref({ filter, data: {} })\r\n this.players.push(entry)\r\n }\r\n fetch(\r\n 'https://tone.sleepycat.date/v2/client/players?' +\r\n new URLSearchParams(filter as Record)\r\n ).then(async response => {\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n entry!.value.data = await response.json()\r\n })\r\n return entry\r\n },\r\n fetchWeapons (filter: Filters) {\r\n filter = removeNullEntries(filter)\r\n let entry = this.weapons.find((e) => objectEqual(e.value.filter, filter))\r\n if (!entry) {\r\n entry = ref({ filter, data: {} })\r\n this.weapons.push(entry)\r\n }\r\n\r\n fetch(\r\n 'https://tone.sleepycat.date/v2/client/weapons?' +\r\n new URLSearchParams(filter as Record)\r\n ).then(async response => {\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n entry!.value.data = await response.json()\r\n })\r\n return entry\r\n },\r\n fetchServers (filter: Filters) {\r\n filter = removeNullEntries(filter)\r\n let entry = this.servers.find((e) => objectEqual(e.value.filter, filter))\r\n if (!entry) {\r\n entry = ref({ filter, data: {} })\r\n this.servers.push(entry)\r\n }\r\n fetch(\r\n 'https://tone.sleepycat.date/v2/client/servers?' +\r\n new URLSearchParams(filter as Record)\r\n ).then(async response => {\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n entry!.value.data = await response.json()\r\n })\r\n return entry\r\n }\r\n }\r\n})\r\n","\r\nimport { Player, Weapon, Server, useKillStore } from '@/stores/kill'\r\nimport { defineComponent } from 'vue'\r\n\r\nexport default defineComponent({\r\n setup (props, ctx) {\r\n const store = useKillStore()\r\n store.fetchPlayers({})\r\n store.fetchServers({})\r\n store.fetchWeapons({})\r\n }\r\n})\r\n","import { render } from \"./App.vue?vue&type=template&id=a4a5fcd4&ts=true\"\nimport script from \"./App.vue?vue&type=script&lang=ts\"\nexport * from \"./App.vue?vue&type=script&lang=ts\"\n\nimport \"./App.vue?vue&type=style&index=0&id=a4a5fcd4&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, createElementVNode as _createElementVNode, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-7c39888e\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { id: \"filters\" }\nconst _hoisted_2 = { id: \"playerView\" }\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_VueMultiselect = _resolveComponent(\"VueMultiselect\")!\n const _component_PlayerList = _resolveComponent(\"PlayerList\")!\n const _component_PlayerChart = _resolveComponent(\"PlayerChart\")!\n const _component_WeaponChart = _resolveComponent(\"WeaponChart\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createElementVNode(\"div\", _hoisted_1, [\n _createVNode(_component_VueMultiselect, {\n selectLabel: \"\",\n deselectLabel: \"remove\",\n placeholder: \"Select server\",\n modelValue: _ctx.model.server,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((_ctx.model.server) = $event)),\n options: _ctx.groupedServers,\n \"group-values\": \"servers\",\n group_label: \"id\",\n \"group-select\": false,\n \"allow-empty\": true,\n multiple: false,\n \"custom-label\": ((e) => e.name),\n \"track-by\": \"name\",\n label: \"name\"\n }, null, 8, [\"modelValue\", \"options\", \"custom-label\"]),\n _createVNode(_component_VueMultiselect, {\n selectLabel: \"\",\n deselectLabel: \"remove\",\n placeholder: \"Select weapon\",\n modelValue: _ctx.model.weapon,\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = ($event: any) => ((_ctx.model.weapon) = $event)),\n \"custom-label\": ((e) => _ctx.weaponLocale[e] || e),\n options: _ctx.sortedWeaponList,\n \"allow-empty\": true\n }, null, 8, [\"modelValue\", \"custom-label\", \"options\"]),\n _createVNode(_component_VueMultiselect, {\n selectLabel: \"\",\n deselectLabel: \"remove\",\n placeholder: \"Search player\",\n modelValue: _ctx.playerHighlighted,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = ($event: any) => ((_ctx.playerHighlighted) = $event)),\n options: _ctx.sortedPlayerList,\n \"allow-empty\": true,\n \"custom-label\": ((e) => _ctx.players[e]?.username)\n }, null, 8, [\"modelValue\", \"options\", \"custom-label\"])\n ]),\n _createElementVNode(\"div\", _hoisted_2, [\n _createVNode(_component_PlayerList, {\n filters: _ctx.filters,\n onHighlightPlayer: _cache[3] || (_cache[3] = ($event: any) => (_ctx.playerHighlighted = $event)),\n playerHighlighted: _ctx.playerHighlighted\n }, null, 8, [\"filters\", \"playerHighlighted\"]),\n _createVNode(_component_PlayerChart, {\n filters: _ctx.filters,\n onHighlightPlayer: _cache[4] || (_cache[4] = ($event: any) => (_ctx.playerHighlighted = $event)),\n playerHighlighted: _ctx.playerHighlighted\n }, null, 8, [\"filters\", \"playerHighlighted\"]),\n _createVNode(_component_WeaponChart, {\n filters: {player: _ctx.playerHighlighted, ..._ctx.filters},\n playerHighlighted: _ctx.playerHighlighted\n }, null, 8, [\"filters\", \"playerHighlighted\"])\n ])\n ], 64))\n}","import { createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-56c6f3e1\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { class: \"playerHeaders\" }\nconst _hoisted_2 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/_createElementVNode(\"span\", null, null, -1))\nconst _hoisted_3 = [\"onClick\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"div\", {\n class: \"playerTable\",\n onKeydown: _cache[6] || (_cache[6] = \n//@ts-ignore\n(...args) => (_ctx.selectNextPlayer && _ctx.selectNextPlayer(...args))),\n tabindex: \"0\"\n }, [\n _createElementVNode(\"div\", _hoisted_1, [\n _hoisted_2,\n _createElementVNode(\"span\", {\n onClick: _cache[0] || (_cache[0] = ($event: any) => (_ctx.sortPlayerList('username'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'username' ? 'selected' : '')\n }, \"Username\", 2),\n _createElementVNode(\"span\", {\n onClick: _cache[1] || (_cache[1] = ($event: any) => (_ctx.sortPlayerList('kills'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'kills' ? 'selected' : '')\n }, \"K\", 2),\n _createElementVNode(\"span\", {\n onClick: _cache[2] || (_cache[2] = ($event: any) => (_ctx.sortPlayerList('deaths'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'deaths' ? 'selected' : '')\n }, \"D\", 2),\n _createElementVNode(\"span\", {\n onClick: _cache[3] || (_cache[3] = ($event: any) => (_ctx.sortPlayerList('k/d'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'k/d' ? 'selected' : '')\n }, \"K/D\", 2),\n _createElementVNode(\"span\", {\n onClick: _cache[4] || (_cache[4] = ($event: any) => (_ctx.sortPlayerList('max_distance'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'max_distance' ? 'selected' : '')\n }, \"max distance\", 2),\n _createElementVNode(\"span\", {\n onClick: _cache[5] || (_cache[5] = ($event: any) => (_ctx.sortPlayerList('avg_distance'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'avg_distance' ? 'selected' : '')\n }, \"average distance\", 2)\n ]),\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.playerIdList, (playerId, index) => {\n return (_openBlock(), _createElementBlock(\"div\", {\n class: _normalizeClass('playerRow ' + (playerId === _ctx.$props.playerHighlighted ? 'selected' : '')),\n key: playerId,\n onClick: ($event: any) => (_ctx.$emit('highlightPlayer', playerId)),\n ref_for: true,\n ref: `player:` + playerId\n }, [\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(index+1), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(_ctx.players[playerId].username), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(_ctx.players[playerId].kills), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(_ctx.players[playerId].deaths), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(Math.round(_ctx.players[playerId].kills / Math.max(1, _ctx.players[playerId].deaths) * 100) / 100), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(_ctx.players[playerId].max_distance), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(Math.round(((_ctx.players[playerId].total_distance / _ctx.players[playerId].kills) || 0) * 100) / 100), 1)\n ])\n ], 10, _hoisted_3))\n }), 128))\n ], 32))\n}","\r\nimport { defineComponent, PropType } from 'vue'\r\nimport { useKillStore, Player, Filters } from '@/stores/kill'\r\n\r\nexport default defineComponent({\r\n props: {\r\n filters: { type: Object as PropType, default: () => ({}) },\r\n playerHighlighted: String\r\n },\r\n emits: ['highlightPlayer'],\r\n data () {\r\n return {\r\n sortingData: { direction: -1, argument: 'kills' as keyof Player | 'k/d' | 'avg_distance' },\r\n playerIdList: [] as string[],\r\n store: useKillStore()\r\n }\r\n },\r\n computed: {\r\n players (): { [key: string]: Player } {\r\n const { player: _, ...withoutPlayer } = this.filters\r\n const data = this.store.getPlayerList(withoutPlayer)?.value.data\r\n if (!data) return this.store.fetchPlayers(withoutPlayer).value.data\r\n return data\r\n }\r\n },\r\n watch: {\r\n players: {\r\n handler (newval: { [key: string]: Player }): void {\r\n if (!newval) return\r\n this.playerIdList = []\r\n this.sortingData.direction *= -1\r\n this.playerIdList = Object.keys(newval)\r\n this.sortPlayerList(this.sortingData.argument)\r\n this.playerIdList = this.playerIdList.slice(0, 500)\r\n },\r\n immediate: true\r\n },\r\n playerHighlighted (newval) {\r\n const newElement = this.$refs['player:' + newval] as HTMLElement[]\r\n if (newElement && newElement[0]) { newElement[0].scrollIntoView({ behavior: 'smooth', block: 'center' }) }\r\n }\r\n },\r\n updated () {\r\n const element = this.$refs['player:' + this.$props.playerHighlighted] as HTMLElement[]\r\n if (!element || !element[0]) return\r\n element[0].scrollIntoView({ behavior: 'smooth', block: 'center' })\r\n },\r\n methods: {\r\n sortPlayerList (arg: ((keyof Player) | 'k/d' | 'avg_distance')) {\r\n if (arg === this.sortingData.argument) {\r\n this.sortingData.direction *= -1\r\n } else {\r\n if (arg === 'username') {\r\n this.sortingData.direction = 1\r\n }\r\n }\r\n this.sortingData.argument = arg\r\n\r\n this.playerIdList.sort((a: string, b: string) => {\r\n if (!this.players) {\r\n return 0\r\n }\r\n let varA, varB\r\n if (arg === 'k/d') {\r\n varA = this.players[a].kills / Math.max(1, this.players[a].deaths)\r\n varB = this.players[b].kills / Math.max(1, this.players[b].deaths)\r\n } else if (arg === 'avg_distance') {\r\n varA = (this.players[a].total_distance / this.players[a].kills) || 0\r\n varB = (this.players[b].total_distance / this.players[b].kills) || 0\r\n } else {\r\n varA = this.players[a][arg]\r\n varB = this.players[b][arg]\r\n }\r\n if (varA === undefined || varB === undefined) return 0\r\n if (varA < varB) {\r\n return -1 * this.sortingData.direction\r\n }\r\n if (varA > varB) {\r\n return 1 * this.sortingData.direction\r\n }\r\n return 0\r\n })\r\n },\r\n selectNextPlayer (e: KeyboardEvent) {\r\n const values = {\r\n Home: -Infinity,\r\n End: Infinity,\r\n PageDown: 100,\r\n PageUp: -100,\r\n ArrowUp: -1,\r\n ArrowDown: 1,\r\n ArrowRight: 10,\r\n ArrowLeft: -10\r\n } as { [key: string]: number }\r\n if (!this.$props.playerHighlighted) return\r\n if (!Object.keys(values).includes(e.key)) return\r\n e.preventDefault()\r\n const index = this.playerIdList.indexOf(this.$props.playerHighlighted)\r\n let nextIndex = (index + values[e.key])\r\n if (nextIndex >= this.playerIdList.length) nextIndex = this.playerIdList.length - 1\r\n if (nextIndex < 0) nextIndex = 0\r\n this.$emit('highlightPlayer', this.playerIdList[nextIndex])\r\n }\r\n }\r\n\r\n})\r\n","import { render } from \"./PlayerList.vue?vue&type=template&id=56c6f3e1&scoped=true&ts=true\"\nimport script from \"./PlayerList.vue?vue&type=script&lang=ts\"\nexport * from \"./PlayerList.vue?vue&type=script&lang=ts\"\n\nimport \"./PlayerList.vue?vue&type=style&index=0&id=56c6f3e1&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-56c6f3e1\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-05bdcd1e\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = {\n class: \"playerChart\",\n ref: \"container\"\n}\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_Scatter = _resolveComponent(\"Scatter\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createVNode(_component_Scatter, {\n data: _ctx.chart,\n options: _ctx.chartOptions\n }, null, 8, [\"data\", \"options\"])\n ], 512))\n}","\r\nimport {\r\n Chart as ChartJS,\r\n LinearScale,\r\n PointElement,\r\n LineElement,\r\n Tooltip,\r\n Legend,\r\n CoreChartOptions,\r\n PluginChartOptions,\r\n ScaleChartOptions\r\n} from 'chart.js'\r\nimport annotationPlugin from 'chartjs-plugin-annotation'\r\nimport dataLabel from 'chartjs-plugin-datalabels'\r\nimport { useKillStore, Player, Filters } from '@/stores/kill'\r\n\r\nimport { Scatter } from 'vue-chartjs'\r\nimport { defineComponent, PropType } from 'vue'\r\nimport { ChartEvent } from 'chart.js/dist/core/core.plugins'\r\nimport { _DeepPartialObject } from 'chart.js/dist/types/utils'\r\n\r\nChartJS.register(LinearScale, PointElement, LineElement, Tooltip, Legend, annotationPlugin, dataLabel)\r\n\r\nexport default defineComponent({\r\n name: 'PlayerChart',\r\n props: {\r\n filters: Object as PropType,\r\n playerHighlighted: String\r\n },\r\n data: () => {\r\n return {\r\n store: useKillStore(),\r\n refreshColors: 0\r\n }\r\n },\r\n emits: ['highlightPlayer'],\r\n components: {\r\n Scatter\r\n },\r\n mounted () {\r\n this.refreshColors++\r\n },\r\n computed: {\r\n colors () {\r\n // eslint-disable-next-line no-unused-expressions\r\n this.refreshColors\r\n const colors = {} as { [key: string]: string }\r\n if (this.$refs.container) {\r\n const style = getComputedStyle(this.$refs.container as Element)\r\n colors.fg = style.getPropertyValue('--foreground')\r\n colors.bg = style.getPropertyValue('--bg-color')\r\n colors.orange = style.getPropertyValue('--orange')\r\n colors.cyan = style.getPropertyValue('--cyan')\r\n colors.currentLine = style.getPropertyValue('--current-line')\r\n } else {\r\n colors.fg = '#ffffff'\r\n }\r\n return colors\r\n },\r\n chart () {\r\n return {\r\n datasets: [\r\n {\r\n label: 'Players',\r\n labels: this.playerIdList || [] as string[],\r\n borderColor: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.index]) ? this.colors.orange : this.colors.cyan,\r\n backgroundColor: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.index]) ? this.colors.orange : this.colors.cyan,\r\n pointRadius: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.index]) ? 20 : 1,\r\n pointStyle: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.index]) ? 'crossRot' : 'circle',\r\n hoverRadius: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.index]) ? 30 : 4,\r\n data: this.playerIdList.map((id) => ({ y: this.players[id].kills, x: this.players[id].deaths }))\r\n }\r\n ]\r\n }\r\n },\r\n chartOptions (): _DeepPartialObject & PluginChartOptions<'scatter'> & ScaleChartOptions<'scatter'>> {\r\n // eslint-disable-next-line no-unused-expressions\r\n this.$props.playerHighlighted\r\n let endX = 0\r\n let endY = 0\r\n if (this.players) {\r\n const maxX = Math.max(...Object.values(this.players).map(e => e.deaths))\r\n const maxY = Math.max(...Object.values(this.players).map(e => e.kills))\r\n\r\n if (maxY > maxX) {\r\n endX = maxX\r\n endY = (maxX / maxY) * maxY\r\n } else {\r\n endY = maxY\r\n endX = (maxY / maxX) * maxX\r\n }\r\n }\r\n return {\r\n responsive: true,\r\n maintainAspectRatio: false,\r\n animation: { duration: 500 },\r\n layout: { autoPadding: false },\r\n scales: {\r\n y: {\r\n title: {\r\n text: 'Kills',\r\n display: true,\r\n color: this.colors.fg\r\n },\r\n ticks: {\r\n color: this.colors.fg\r\n }\r\n },\r\n x: {\r\n title: {\r\n text: 'Deaths',\r\n display: true,\r\n color: this.colors.fg\r\n },\r\n ticks: {\r\n color: this.colors.fg\r\n }\r\n }\r\n },\r\n plugins: {\r\n tooltip: {\r\n callbacks: {\r\n label: (ctx: any) => {\r\n let label: string\r\n if (!this.players) {\r\n label = ctx.dataset.labels[ctx.dataIndex]\r\n } else {\r\n label = this.players[ctx.dataset.labels[ctx.dataIndex]].username\r\n }\r\n label += ' (' + ctx.parsed.y + ' kills ' + ctx.parsed.x + ' deaths)'\r\n return label\r\n }\r\n }\r\n },\r\n annotation: {\r\n annotations: {\r\n line: {\r\n type: 'line',\r\n yMin: 0,\r\n xMin: 0,\r\n yMax: endY,\r\n xMax: endX,\r\n borderWidth: 2,\r\n borderColor: this.colors.orange,\r\n borderDash: [1, 5]\r\n }\r\n }\r\n },\r\n legend: { display: false },\r\n datalabels: {\r\n formatter: (value: any, context: any) => {\r\n return this.players[this.playerIdList[context.dataIndex]].username\r\n },\r\n backgroundColor: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.dataIndex]) ? this.colors.orange : null,\r\n borderColor: this.colors.fg,\r\n borderWidth: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.dataIndex]) ? 1 : 0,\r\n borderRadius: 5,\r\n display: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.dataIndex]) ? 'true' : 'auto',\r\n align: -45,\r\n anchor: 'end',\r\n clamp: true,\r\n color: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.dataIndex]) ? this.colors.bg : this.colors.fg\r\n }\r\n },\r\n onClick: (e: ChartEvent, element: any) => {\r\n this.$emit('highlightPlayer', element.length > 0 ? this.playerIdList[element[0].index] : undefined)\r\n },\r\n onHover: (e: any, element: any) => {\r\n if (!e.native.target) return\r\n (e.native.target as HTMLElement).style.cursor = element[0] ? 'pointer' : 'default'\r\n }\r\n }\r\n },\r\n players (): { [key: string]: Player } {\r\n const data = this.store.getPlayerList(this.filters || {})?.value.data\r\n if (!data) return this.store.fetchPlayers(this.filters || {}).value.data\r\n const cut = Object.entries(data).sort((a, b) => {\r\n if (a[1].kills < b[1].kills) {\r\n return 1\r\n }\r\n if (a[1].kills > b[1].kills) {\r\n return -1\r\n }\r\n return 0\r\n }).slice(0, 200)\r\n return Object.fromEntries(cut)\r\n },\r\n playerIdList (): string[] { return Object.keys(this.players) }\r\n\r\n }\r\n})\r\n","import { render } from \"./PlayerChart.vue?vue&type=template&id=05bdcd1e&scoped=true&ts=true\"\nimport script from \"./PlayerChart.vue?vue&type=script&lang=ts\"\nexport * from \"./PlayerChart.vue?vue&type=script&lang=ts\"\n\nimport \"./PlayerChart.vue?vue&type=style&index=0&id=05bdcd1e&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-05bdcd1e\"]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-1ad9360f\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = {\n class: \"weaponChart\",\n ref: \"container\"\n}\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_Doughnut = _resolveComponent(\"Doughnut\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createVNode(_component_Doughnut, {\n data: _ctx.chart,\n options: _ctx.chartOptions\n }, null, 8, [\"data\", \"options\"])\n ], 512))\n}","\r\nimport { Chart as ChartJS, ArcElement, Tooltip, Legend } from 'chart.js'\r\nimport dataLabel from 'chartjs-plugin-datalabels'\r\nimport { Weapon, Filters, useKillStore } from '@/stores/kill'\r\nimport { Doughnut } from 'vue-chartjs'\r\nimport { defineComponent, PropType } from 'vue'\r\nimport weapons from '../stores/weapons.json'\r\n\r\nChartJS.register(ArcElement, Tooltip, Legend, dataLabel)\r\n\r\nexport default defineComponent({\r\n name: 'PlayerChart',\r\n props: {\r\n filters: Object as PropType,\r\n playerHighlighted: String\r\n },\r\n emits: ['highlightPlayer'],\r\n components: {\r\n Doughnut\r\n },\r\n mounted () {\r\n this.refreshColors++\r\n },\r\n data: () => {\r\n return {\r\n store: useKillStore(),\r\n refreshColors: 0\r\n }\r\n },\r\n computed: {\r\n colors () {\r\n // eslint-disable-next-line no-unused-expressions\r\n this.refreshColors\r\n const colors = {} as { [key: string]: string }\r\n if (this.$refs.container) {\r\n const style = getComputedStyle(this.$refs.container as Element)\r\n colors.fg = style.getPropertyValue('--foreground')\r\n colors.bg = style.getPropertyValue('--bg-color')\r\n colors.orange = style.getPropertyValue('--orange')\r\n colors.cyan = style.getPropertyValue('--cyan')\r\n colors.yellow = style.getPropertyValue('--yellow')\r\n colors.green = style.getPropertyValue('--green')\r\n colors.purple = style.getPropertyValue('--purple')\r\n colors.red = style.getPropertyValue('--red')\r\n colors.pink = style.getPropertyValue('--pink')\r\n colors.currentLine = style.getPropertyValue('--current-line')\r\n } else {\r\n colors.fg = '#ffffff'\r\n }\r\n return colors\r\n },\r\n chart () {\r\n const colors = [\r\n 'cyan',\r\n 'green',\r\n 'orange',\r\n 'pink',\r\n 'purple',\r\n 'red',\r\n 'yellow'\r\n ]\r\n const chartData = {\r\n datasets: [\r\n {\r\n label: 'Weapons',\r\n labels: this.sortedWeaponList || ([] as string[]),\r\n borderColor: () => this.colors.fg,\r\n backgroundColor: (context: any) => {\r\n return this.colors[\r\n colors[(context.dataIndex * 3) % colors.length]\r\n ]\r\n },\r\n data: [] as number[]\r\n }\r\n ]\r\n }\r\n if (!this.sortedWeaponList) {\r\n return chartData\r\n }\r\n chartData.datasets[0].data = this.sortedWeaponList.map((e) => {\r\n if (!this.weapons) {\r\n return 0\r\n }\r\n return this.weapons[e].kills\r\n })\r\n return chartData\r\n },\r\n chartOptions () {\r\n // eslint-disable-next-line no-unused-expressions\r\n this.$props.playerHighlighted\r\n const options = {\r\n responsive: true,\r\n maintainAspectRatio: true,\r\n animation: { duration: 500 },\r\n layout: { autoPadding: false },\r\n plugins: {\r\n datalabels: {\r\n formatter: (value: any, context: any) => {\r\n const weaponId = this.sortedWeaponList[context.dataIndex]\r\n if (!(weapons as {[key:string]:string})[weaponId]) console.log(weaponId)\r\n return (weapons as {[key:string]:string})[weaponId] || weaponId\r\n },\r\n backgroundColor: (context: any) => {\r\n return context.dataset.backgroundColor(context)\r\n },\r\n borderColor: this.colors.fg,\r\n borderRadius: 25,\r\n borderWidth: 2,\r\n color: this.colors.bg,\r\n display: (context: any) => {\r\n return context.dataIndex === context.dataset.labels.length - 1\r\n ? true\r\n : 'auto'\r\n },\r\n padding: 6\r\n },\r\n tooltip: {\r\n callbacks: {\r\n label: (ctx: any) => {\r\n let label: string\r\n if (!this.sortedWeaponList) {\r\n label = ctx.dataset.labels[ctx.dataIndex]\r\n } else {\r\n label = this.sortedWeaponList[ctx.dataIndex]\r\n }\r\n label += ' (' + this.weapons[label].kills + ' kills)'\r\n return label\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return options\r\n },\r\n weapons (): { [key: string]: Weapon } {\r\n const { weapon: _, ...withoutWeapon } = this.filters || {}\r\n const data = this.store.getWeaponList(withoutWeapon)?.value.data\r\n if (!data) return this.store.fetchWeapons(withoutWeapon).value.data\r\n return data\r\n },\r\n sortedWeaponList (): string[] {\r\n if (!this.weapons) return []\r\n const weapons = Object.keys(this.weapons)\r\n weapons.sort((a, b) => {\r\n if (Number(this.weapons[a].kills) < Number(this.weapons[b].kills)) {\r\n return -1\r\n }\r\n if (Number(this.weapons[a].kills) > Number(this.weapons[b].kills)) {\r\n return 1\r\n }\r\n return 0\r\n })\r\n return weapons\r\n }\r\n }\r\n})\r\n","import { render } from \"./WeaponChart.vue?vue&type=template&id=1ad9360f&scoped=true&ts=true\"\nimport script from \"./WeaponChart.vue?vue&type=script&lang=ts\"\nexport * from \"./WeaponChart.vue?vue&type=script&lang=ts\"\n\nimport \"./WeaponChart.vue?vue&type=style&index=0&id=1ad9360f&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-1ad9360f\"]])\n\nexport default __exports__","\r\nimport { Player, Weapon, Server, useKillStore, Filters } from '@/stores/kill'\r\nimport PlayerList from '@/components/PlayerList.vue'\r\nimport PlayerChart from '@/components/PlayerChart.vue'\r\nimport WeaponChart from '@/components/WeaponChart.vue'\r\nimport { defineComponent } from 'vue'\r\nimport VueMultiselect from 'vue-multiselect'\r\nimport 'vue-multiselect/dist/vue-multiselect.css'\r\nimport weapons from '../stores/weapons.json'\r\n\r\nexport default defineComponent({\r\n name: 'PlayerView',\r\n components: {\r\n VueMultiselect, PlayerList, PlayerChart, WeaponChart\r\n },\r\n\r\n data () {\r\n return {\r\n model: { server: undefined, weapon: undefined } as unknown as {weapon:Weapon | Weapon[], server: (Server& {name?:string}) | (Server& {name?:string})[]},\r\n filters: {} as Filters,\r\n store: useKillStore(),\r\n playerHighlighted: undefined,\r\n weaponLocale: weapons as {[key:string]:string}\r\n }\r\n },\r\n computed: {\r\n servers (): { [key: string]: Server } {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { server: _, player: _1, ...withoutServer } = this.filters\r\n const data = this.store.getServerList(withoutServer)?.value.data\r\n if (!data) return this.store.fetchServers(withoutServer).value.data\r\n return data\r\n },\r\n groupedServers () {\r\n const hosts = [] as {id:string, servers:(Server& {name?:string})[] }[]\r\n Object.entries(this.servers).forEach((e) => {\r\n if (!hosts.find(host => host.id === e[1].host + 'sfdsdfsd')) hosts.push({ id: e[1].host + 'sfdsdfsd', servers: [] as Server[] })\r\n hosts.find(host => host.id === e[1].host + 'sfdsdfsd')?.servers.push({ name: e[0], ...e[1] })\r\n })\r\n return hosts\r\n },\r\n weapons (): { [key: string]: Weapon } {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { weapon: _, player: _1, ...withoutWeapons } = this.filters\r\n const data = this.store.getWeaponList(withoutWeapons)?.value.data\r\n if (!data) return this.store.fetchWeapons(withoutWeapons).value.data\r\n return data\r\n },\r\n players (): { [key: string]: Player } {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { player: _, ...withoutPlayers } = this.filters\r\n const data = this.store.getPlayerList(withoutPlayers)?.value.data\r\n if (!data) return this.store.fetchPlayers(withoutPlayers).value.data\r\n return data\r\n },\r\n sortedWeaponList (): string[] {\r\n if (!this.weapons) return []\r\n const weapons = Object.keys(this.weapons)\r\n return weapons.sort()\r\n },\r\n sortedServerList ():string[] {\r\n if (!this.servers) return []\r\n const servers = Object.keys(this.servers)\r\n return servers.sort()\r\n },\r\n sortedPlayerList (): string[] {\r\n if (!this.players) return []\r\n const players = Object.keys(this.players)\r\n return players.sort((a: string, b: string) => {\r\n if (!this.players) {\r\n return 0\r\n }\r\n if (this.players[a].username < this.players[b].username) {\r\n return -1\r\n }\r\n if (this.players[a].username > this.players[b].username) {\r\n return 1\r\n }\r\n return 0\r\n })\r\n }\r\n },\r\n watch: {\r\n model: {\r\n handler (newModel) {\r\n this.filters.server = newModel.server?.name\r\n this.filters.weapon = newModel.weapon\r\n },\r\n deep: true\r\n }\r\n }\r\n})\r\n","import { render } from \"./PlayerView.vue?vue&type=template&id=7c39888e&scoped=true&ts=true\"\nimport script from \"./PlayerView.vue?vue&type=script&lang=ts\"\nexport * from \"./PlayerView.vue?vue&type=script&lang=ts\"\n\nimport \"./PlayerView.vue?vue&type=style&index=0&id=7c39888e&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-7c39888e\"]])\n\nexport default __exports__","import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'\r\nimport HomeView from '../views/HomeView.vue'\r\nimport PlayerView from '../views/PlayerView.vue'\r\n\r\nconst routes: Array = [\r\n {\r\n path: '/',\r\n name: 'home',\r\n component: PlayerView\r\n }\r\n // {\r\n // path: '/players',\r\n // name: 'players',\r\n // component: PlayerView\r\n // },\r\n // {\r\n // path: '/about',\r\n // name: 'about',\r\n // // route level code-splitting\r\n // // this generates a separate chunk (about.[hash].js) for this route\r\n // // which is lazy-loaded when the route is visited.\r\n // component: () => import(/* webpackChunkName: \"about\" */ '../views/AboutView.vue')\r\n // }\r\n]\r\n\r\nconst router = createRouter({\r\n history: createWebHistory(process.env.BASE_URL),\r\n routes\r\n})\r\n\r\nexport default router\r\n","import { createApp } from 'vue'\r\nimport App from './App.vue'\r\nimport router from './router'\r\nimport { createPinia } from 'pinia'\r\n\r\nconst pinia = createPinia()\r\n\r\ncreateApp(App).use(pinia).use(router).mount('#app')\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t143: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunktoneapi_webclient\"] = self[\"webpackChunktoneapi_webclient\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [998], function() { return __webpack_require__(3529); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["_hoisted_1","_createStaticVNode","render","_ctx","_cache","$props","$setup","$data","$options","_component_router_link","_resolveComponent","_component_router_view","_openBlock","_createElementBlock","_Fragment","_createElementVNode","_createVNode","to","class","default","_withCtx","_createTextVNode","_","removeNullEntries","a","Object","fromEntries","entries","filter","e","undefined","objectEqual","b","assert","deepStrictEqual","useKillStore","defineStore","state","servers","players","weapons","maps","gamemodes","hosts","getters","getPlayerList","filters","find","value","getWeaponList","getServerList","actions","fetchPlayers","entry","this","ref","data","push","fetch","URLSearchParams","then","async","response","json","fetchWeapons","fetchServers","defineComponent","setup","props","ctx","store","__exports__","id","_hoisted_2","_component_VueMultiselect","_component_PlayerList","_component_PlayerChart","_component_WeaponChart","selectLabel","deselectLabel","placeholder","modelValue","model","server","$event","options","groupedServers","group_label","multiple","name","label","weapon","weaponLocale","sortedWeaponList","playerHighlighted","sortedPlayerList","username","onHighlightPlayer","player","_withScopeId","n","_pushScopeId","_popScopeId","_hoisted_3","onKeydown","args","selectNextPlayer","tabindex","onClick","sortPlayerList","_normalizeClass","sortingData","argument","_renderList","playerIdList","playerId","index","key","$emit","ref_for","_toDisplayString","kills","deaths","Math","round","max","max_distance","total_distance","type","String","emits","direction","computed","withoutPlayer","watch","handler","newval","keys","slice","immediate","newElement","$refs","scrollIntoView","behavior","block","updated","element","methods","arg","sort","varA","varB","values","Home","Infinity","End","PageDown","PageUp","ArrowUp","ArrowDown","ArrowRight","ArrowLeft","includes","preventDefault","indexOf","nextIndex","length","_component_Scatter","chart","chartOptions","ChartJS","LinearScale","PointElement","LineElement","Tooltip","Legend","annotationPlugin","dataLabel","refreshColors","components","Scatter","mounted","colors","container","style","getComputedStyle","fg","getPropertyValue","bg","orange","cyan","currentLine","datasets","labels","borderColor","context","backgroundColor","pointRadius","pointStyle","hoverRadius","map","y","x","endX","endY","maxX","maxY","responsive","maintainAspectRatio","animation","duration","layout","autoPadding","scales","title","text","display","color","ticks","plugins","tooltip","callbacks","dataset","dataIndex","parsed","annotation","annotations","line","yMin","xMin","yMax","xMax","borderWidth","borderDash","legend","datalabels","formatter","borderRadius","align","anchor","clamp","onHover","native","target","cursor","cut","_component_Doughnut","ArcElement","Doughnut","yellow","green","purple","red","pink","chartData","weaponId","console","log","padding","withoutWeapon","Number","VueMultiselect","PlayerList","PlayerChart","WeaponChart","_1","withoutServer","forEach","host","withoutWeapons","withoutPlayers","sortedServerList","newModel","deep","routes","path","component","PlayerView","router","createRouter","history","createWebHistory","process","pinia","createPinia","createApp","App","use","mount","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","m","deferred","O","result","chunkIds","fn","priority","notFulfilled","i","fulfilled","j","every","splice","r","getter","__esModule","d","definition","o","defineProperty","enumerable","get","g","globalThis","Function","window","obj","prop","prototype","hasOwnProperty","call","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","self","bind","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file