From 3670900efdacd88f0fcf2aeaa4bc0ec4fcaf3fae Mon Sep 17 00:00:00 2001 From: legonzaur Date: Thu, 30 Mar 2023 14:21:48 +0200 Subject: [PATCH] 'publish' --- dist/index.html | 2 +- dist/js/{app.84e159ea.js => app.1dead6bc.js} | 4 ++-- dist/js/{app.84e159ea.js.map => app.1dead6bc.js.map} | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) rename dist/js/{app.84e159ea.js => app.1dead6bc.js} (79%) rename dist/js/{app.84e159ea.js.map => app.1dead6bc.js.map} (99%) diff --git a/dist/index.html b/dist/index.html index 8bc1e70..104218f 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.84e159ea.js b/dist/js/app.1dead6bc.js similarity index 79% rename from dist/js/app.84e159ea.js rename to dist/js/app.1dead6bc.js index c05fda2..940709c 100644 --- a/dist/js/app.84e159ea.js +++ b/dist/js/app.1dead6bc.js @@ -1,2 +1,2 @@ -(function(){"use strict";var e={5442:function(e,t,r){var s=r(9242),a=r(3396);const i=(0,a.uE)('
',4);function l(e,t){const r=(0,a.up)("router-link"),s=(0,a.up)("router-view");return(0,a.wg)(),(0,a.iD)(a.HY,null,[(0,a._)("header",null,[(0,a._)("nav",null,[i,(0,a.Wm)(r,{to:"/",class:"navbar-element"},{default:(0,a.w5)((()=>[(0,a.Uk)("Players")])),_:1})])]),(0,a.Wm)(s)],64)}var o=r(89);const n={},p=(0,o.Z)(n,[["render",l]]);var h=p,d=r(2483);const c={id:"filters"},g={id:"playerView"};function u(e,t,r,s,i,l){const o=(0,a.up)("VueMultiselect"),n=(0,a.up)("PlayerList"),p=(0,a.up)("PlayerChart"),h=(0,a.up)("WeaponChart");return(0,a.wg)(),(0,a.iD)(a.HY,null,[(0,a._)("div",c,[(0,a.Wm)(o,{selectLabel:"",deselectLabel:"remove",placeholder:"Select server",modelValue:e.models.server,"onUpdate:modelValue":t[0]||(t[0]=t=>e.models.server=t),options:e.servers,"allow-empty":!0,"custom-label":e=>e.name,onSelect:t[1]||(t[1]=t=>e.changeFilter({server:t.id})),onRemove:t[2]||(t[2]=t=>e.changeFilter({server:""}))},null,8,["modelValue","options","custom-label"]),(0,a.Wm)(o,{selectLabel:"",deselectLabel:"remove",placeholder:"Select weapon",modelValue:e.models.weapon,"onUpdate:modelValue":t[3]||(t[3]=t=>e.models.weapon=t),options:e.sortedWeaponList,"allow-empty":!0,onSelect:t[4]||(t[4]=t=>e.changeFilter({weapon:t})),onRemove:t[5]||(t[5]=t=>e.changeFilter({weapon:""}))},null,8,["modelValue","options"]),(0,a.Wm)(o,{selectLabel:"",deselectLabel:"remove",placeholder:"Search player",modelValue:e.playerHighlighted,"onUpdate:modelValue":t[6]||(t[6]=t=>e.playerHighlighted=t),options:e.sortedPlayerList,"allow-empty":!0,"custom-label":t=>e.players[t]?.username},null,8,["modelValue","options","custom-label"])]),(0,a._)("div",g,[(0,a.Wm)(n,{filters:e.filters,onHighlightPlayer:t[7]||(t[7]=t=>e.playerHighlighted=t),playerHighlighted:e.playerHighlighted},null,8,["filters","playerHighlighted"]),(0,a.Wm)(p,{filters:e.filters,onHighlightPlayer:t[8]||(t[8]=t=>e.playerHighlighted=t),playerHighlighted:e.playerHighlighted},null,8,["filters","playerHighlighted"]),(0,a.Wm)(h,{filters:{player:e.playerHighlighted,...e.filters},playerHighlighted:e.playerHighlighted},null,8,["filters","playerHighlighted"])])],64)}r(7658);var y=r(65),f=r(7139);const m=e=>((0,a.dD)("data-v-24acbb0c"),e=e(),(0,a.Cn)(),e),v={class:"playerHeaders"},b=m((()=>(0,a._)("span",null,null,-1))),w=["onClick"];function k(e,t,r,s,i,l){return(0,a.wg)(),(0,a.iD)("div",{class:"playerTable",onKeydown:t[6]||(t[6]=(...t)=>e.selectNextPlayer&&e.selectNextPlayer(...t)),tabindex:"0"},[(0,a._)("div",v,[b,(0,a._)("span",{onClick:t[0]||(t[0]=t=>e.sortPlayerList("username")),class:(0,f.C_)("username"==e.sortingData.argument?"selected":"")},"Username",2),(0,a._)("span",{onClick:t[1]||(t[1]=t=>e.sortPlayerList("kills")),class:(0,f.C_)("kills"==e.sortingData.argument?"selected":"")},"K",2),(0,a._)("span",{onClick:t[2]||(t[2]=t=>e.sortPlayerList("deaths")),class:(0,f.C_)("deaths"==e.sortingData.argument?"selected":"")},"D",2),(0,a._)("span",{onClick:t[3]||(t[3]=t=>e.sortPlayerList("k/d")),class:(0,f.C_)("k/d"==e.sortingData.argument?"selected":"")},"K/D",2),(0,a._)("span",{onClick:t[4]||(t[4]=t=>e.sortPlayerList("max_kill_distance")),class:(0,f.C_)("max_kill_distance"==e.sortingData.argument?"selected":"")},"max distance",2),(0,a._)("span",{onClick:t[5]||(t[5]=t=>e.sortPlayerList("avg_kill_distance")),class:(0,f.C_)("avg_kill_distance"==e.sortingData.argument?"selected":"")},"average distance",2)]),((0,a.wg)(!0),(0,a.iD)(a.HY,null,(0,a.Ko)(e.playerIdList,((t,r)=>((0,a.wg)(),(0,a.iD)("div",{class:(0,f.C_)("playerRow "+(t===e.$props.playerHighlighted?"selected":"")),key:t,onClick:r=>e.$emit("highlightPlayer",t),ref_for:!0,ref:"player:"+t},[(0,a._)("div",null,[(0,a._)("span",null,(0,f.zw)(r),1)]),(0,a._)("div",null,[(0,a._)("span",null,(0,f.zw)(e.players[t].username),1)]),(0,a._)("div",null,[(0,a._)("span",null,(0,f.zw)(e.players[t].kills),1)]),(0,a._)("div",null,[(0,a._)("span",null,(0,f.zw)(e.players[t].deaths),1)]),(0,a._)("div",null,[(0,a._)("span",null,(0,f.zw)(Math.round(e.players[t].kills/e.players[t].deaths*100)/100),1)]),(0,a._)("div",null,[(0,a._)("span",null,(0,f.zw)(e.players[t].max_kill_distance),1)]),(0,a._)("div",null,[(0,a._)("span",null,(0,f.zw)(Math.round(100*e.players[t].avg_kill_distance)/100),1)])],10,w)))),128))],32)}var P=(0,a.aZ)({props:{filters:Object,playerHighlighted:String},emits:["highlightPlayer"],data(){return{sortingData:{direction:-1,argument:"kills"},playerIdList:[],store:(0,y.oR)()}},computed:{players(){return this.store.getters.getPlayerList(this.filters)}},watch:{players:{handler(e){e&&(this.playerIdList=[],this.sortingData.direction*=-1,this.playerIdList=Object.keys(e),this.sortPlayerList(this.sortingData.argument))},immediate:!0},playerHighlighted(e){const t=this.$refs["player:"+e];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,r)=>{if(!this.players)return 0;let s,a;return"k/d"===e?(s=this.players[t].kills/this.players[t].deaths,a=this.players[r].kills/this.players[r].deaths):(s=this.players[t][e],a=this.players[r][e]),sa?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 r=this.playerIdList.indexOf(this.$props.playerHighlighted);let s=r+t[e.key];s>=this.playerIdList.length&&(s=this.playerIdList.length-1),s<0&&(s=0),this.$emit("highlightPlayer",this.playerIdList[s])}}});const _=(0,o.Z)(P,[["render",k],["__scopeId","data-v-24acbb0c"]]);var L=_;const H={class:"playerChart",ref:"container"};function C(e,t,r,s,i,l){const o=(0,a.up)("Scatter");return(0,a.wg)(),(0,a.iD)("div",H,[(0,a.Wm)(o,{data:e.chart,options:e.chartOptions},null,8,["data","options"])],512)}var x=r(3254),I=r(9152),D=r(3013),W=r(5866);x.kL.register(x.f$,x.od,x.jn,x.u,x.De,I.Z,D.Z);var O=(0,a.aZ)({name:"PlayerChart",props:{filters:Object,playerHighlighted:String},emits:["highlightPlayer"],components:{Scatter:W.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(){const e={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":"dot",hoverRadius:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerIdList[e.index]?30:4,data:[]}]};return this.players?(e.datasets[0].data=this.playerIdList.map((e=>this.players?{x:this.players[e].deaths,y:this.players[e].kills}:{x:0,y:0})),e):e},chartOptions(){this.$props.playerHighlighted;const e={responsive:!0,maintainAspectRatio:!0,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:{},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")}};if(!this.players)return e;const t=Math.max(...Object.values(this.players).map((e=>e.deaths))),r=Math.max(...Object.values(this.players).map((e=>e.kills)));let s,a;return r>t?(s=t,a=t/r*r):(a=r,s=r/t*t),e.plugins.annotation={annotations:{line:{type:"line",yMin:0,xMin:0,yMax:a,xMax:s,borderWidth:2,borderColor:this.colors.orange,borderDash:[1,5]}}},e},players(){return this.store.getters.getPlayerList(this.filters)||{}},playerIdList(){return Object.keys(this.players)}},data(){return{store:(0,y.oR)(),refreshColors:0}}});const $=(0,o.Z)(O,[["render",C],["__scopeId","data-v-4e740fcc"]]);var V=$;const S={class:"weaponChart",ref:"container"};function j(e,t,r,s,i,l){const o=(0,a.up)("Doughnut");return(0,a.wg)(),(0,a.iD)("div",S,[(0,a.Wm)(o,{data:e.chart,options:e.chartOptions},null,8,["data","options"])],512)}x.kL.register(x.qi,x.u,x.De,D.Z);var R=(0,a.aZ)({name:"PlayerChart",props:{filters:Object,playerHighlighted:String},emits:["highlightPlayer"],components:{Doughnut:W.$I},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.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:e=>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)=>this.sortedWeaponList[t.dataIndex],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",font:{weight:"bold"},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(){return this.store.getters.getWeaponList(this.filters)},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}},data(){return{store:(0,y.oR)(),refreshColors:0}}});const N=(0,o.Z)(R,[["render",j],["__scopeId","data-v-c9167984"]]);var M=N,Z=r(6368),z=(0,a.aZ)({name:"PlayerView",components:{PlayerList:L,PlayerChart:V,VueMultiselect:Z.ZP,WeaponChart:M},data(){return{models:{},filters:{minKills:100,minDeaths:100},store:(0,y.oR)(),playerHighlighted:void 0}},computed:{servers(){return this.store.state.servers},weapons(){return this.store.getters.getWeaponList(this.filters)},sortedWeaponList(){if(!this.weapons)return[];const e=Object.keys(this.weapons);return e.sort()},players(){return this.store.getters.getPlayerList(this.filters)},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:{playerHighlighted:function(e){this.fetchPlayerData({player:e,...this.filters})}},methods:{async fetchPlayerData({player:e,server:t}){if(!this.store.getters.getWeaponList({player:e,server:t}))return await this.store.dispatch("fetchWeapons",{player:e,server:t})},async changeFilter({weapon:e,server:t}){const r=JSON.parse(JSON.stringify(this.filters));void 0!==e&&(r.weapon=e),void 0!==t&&(r.server=t),""===e&&delete r.weapon,""===t&&delete r.server;const s=[];this.store.getters.getPlayerList(r)||s.push(this.store.dispatch("fetchPlayers",r)),this.store.getters.getWeaponList(r)||s.push(this.store.dispatch("fetchWeapons",r)),s.push(this.fetchPlayerData({player:this.playerHighlighted,...r})),await Promise.all(s),this.filters=r}}});const U=(0,o.Z)(z,[["render",u],["__scopeId","data-v-ac04060e"]]);var A=U;const T=[{path:"/",name:"home",component:A}],K=(0,d.p7)({history:(0,d.PO)("/Tone_WebClient/"),routes:T});var E=K;Symbol();var F=(0,y.MT)({state:{servers:[],players:{},weapons:{}},getters:{getPlayerList:e=>({server:t,weapon:r,minKills:s,minDeaths:a})=>{let i=[];return e.players[""]&&(i=Object.entries(e.players[""]).filter((([,e])=>e.kills>=s||e.deaths>=a)).map((e=>e[0]))),i.length>0&&e.players[(t||"")+(r||"")]?Object.fromEntries(Object.entries(e.players[(t||"")+(r||"")]).filter((([e])=>i.includes(e)))):e.players[(t||"")+(r||"")]},getWeaponList:e=>({server:t,player:r})=>e.weapons[(t||"")+(r||"")]},mutations:{setPlayers(e,t){e.players[(t.filters.server||"")+(t.filters.weapon||"")]=t.data},setWeapons(e,t){e.weapons[(t.filters.server||"")+(t.filters.player||"")]=t.data},setServers(e,t){e.servers=t}},actions:{async fetchPlayers(e,{weapon:t,server:r}){const s={};t?.toString()&&(s.weapon=t),r?.toString()&&(s.server=r);const a=await fetch("https://tone.sleepycat.date/v1/client/players?"+new URLSearchParams(s)),i=await a.json();Object.keys(i).forEach((e=>{i[e].kills=Number(i[e].kills),i[e].deaths=Number(i[e].deaths),i[e].max_kill_distance=Number(i[e].max_kill_distance),i[e].avg_kill_distance=Number(i[e].avg_kill_distance)})),e.commit("setPlayers",{data:i,filters:{weapon:t,server:r}})},async fetchWeapons(e,{player:t,server:r}){const s={};t?.toString()&&(s.player=t),r?.toString()&&(s.server=r);const a=await fetch("https://tone.sleepycat.date/v1/client/weapons?"+new URLSearchParams(s)),i=await a.json();e.commit("setWeapons",{data:i,filters:{player:t,server:r}})},async fetchServers(e){const t=await fetch("https://tone.sleepycat.date/v1/client/servers"),r=await t.json();e.commit("setServers",r)}},modules:{}});(0,s.ri)(h).use(F).use(E).mount("#app"),F.dispatch("fetchServers",{}),F.dispatch("fetchPlayers",{}),F.dispatch("fetchWeapons",{})}},t={};function r(s){var a=t[s];if(void 0!==a)return a.exports;var i=t[s]={exports:{}};return e[s](i,i.exports,r),i.exports}r.m=e,function(){var e=[];r.O=function(t,s,a,i){if(!s){var l=1/0;for(h=0;h=i)&&Object.keys(r.O).every((function(e){return r.O[e](s[n])}))?s.splice(n--,1):(o=!1,i0&&e[h-1][2]>i;h--)e[h]=e[h-1];e[h]=[s,a,i]}}(),function(){r.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return r.d(t,{a:t}),t}}(),function(){r.d=function(e,t){for(var s in t)r.o(t,s)&&!r.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:t[s]})}}(),function(){r.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}}(),function(){var e={143:0};r.O.j=function(t){return 0===e[t]};var t=function(t,s){var a,i,l=s[0],o=s[1],n=s[2],p=0;if(l.some((function(t){return 0!==e[t]}))){for(a in o)r.o(o,a)&&(r.m[a]=o[a]);if(n)var h=n(r)}for(t&&t(s);pTONE API
',4);function l(e,t){const r=(0,a.up)("router-link"),s=(0,a.up)("router-view");return(0,a.wg)(),(0,a.iD)(a.HY,null,[(0,a._)("header",null,[(0,a._)("nav",null,[i,(0,a.Wm)(r,{to:"/",class:"navbar-element"},{default:(0,a.w5)((()=>[(0,a.Uk)("Players")])),_:1})])]),(0,a.Wm)(s)],64)}var o=r(89);const n={},p=(0,o.Z)(n,[["render",l]]);var h=p,d=r(2483);const c={id:"filters"},g={id:"playerView"};function u(e,t,r,s,i,l){const o=(0,a.up)("VueMultiselect"),n=(0,a.up)("PlayerList"),p=(0,a.up)("PlayerChart"),h=(0,a.up)("WeaponChart");return(0,a.wg)(),(0,a.iD)(a.HY,null,[(0,a._)("div",c,[(0,a.Wm)(o,{selectLabel:"",deselectLabel:"remove",placeholder:"Select server",modelValue:e.models.server,"onUpdate:modelValue":t[0]||(t[0]=t=>e.models.server=t),options:e.servers,"allow-empty":!0,"custom-label":e=>e.name,onSelect:t[1]||(t[1]=t=>e.changeFilter({server:t.id})),onRemove:t[2]||(t[2]=t=>e.changeFilter({server:""}))},null,8,["modelValue","options","custom-label"]),(0,a.Wm)(o,{selectLabel:"",deselectLabel:"remove",placeholder:"Select weapon",modelValue:e.models.weapon,"onUpdate:modelValue":t[3]||(t[3]=t=>e.models.weapon=t),options:e.sortedWeaponList,"allow-empty":!0,onSelect:t[4]||(t[4]=t=>e.changeFilter({weapon:t})),onRemove:t[5]||(t[5]=t=>e.changeFilter({weapon:""}))},null,8,["modelValue","options"]),(0,a.Wm)(o,{selectLabel:"",deselectLabel:"remove",placeholder:"Search player",modelValue:e.playerHighlighted,"onUpdate:modelValue":t[6]||(t[6]=t=>e.playerHighlighted=t),options:e.sortedPlayerList,"allow-empty":!0,"custom-label":t=>e.players[t]?.username},null,8,["modelValue","options","custom-label"])]),(0,a._)("div",g,[(0,a.Wm)(n,{filters:e.filters,onHighlightPlayer:t[7]||(t[7]=t=>e.playerHighlighted=t),playerHighlighted:e.playerHighlighted},null,8,["filters","playerHighlighted"]),(0,a.Wm)(p,{filters:e.filters,onHighlightPlayer:t[8]||(t[8]=t=>e.playerHighlighted=t),playerHighlighted:e.playerHighlighted},null,8,["filters","playerHighlighted"]),(0,a.Wm)(h,{filters:{player:e.playerHighlighted,...e.filters},playerHighlighted:e.playerHighlighted},null,8,["filters","playerHighlighted"])])],64)}r(7658);var y=r(65),f=r(7139);const m=e=>((0,a.dD)("data-v-24acbb0c"),e=e(),(0,a.Cn)(),e),v={class:"playerHeaders"},b=m((()=>(0,a._)("span",null,null,-1))),w=["onClick"];function k(e,t,r,s,i,l){return(0,a.wg)(),(0,a.iD)("div",{class:"playerTable",onKeydown:t[6]||(t[6]=(...t)=>e.selectNextPlayer&&e.selectNextPlayer(...t)),tabindex:"0"},[(0,a._)("div",v,[b,(0,a._)("span",{onClick:t[0]||(t[0]=t=>e.sortPlayerList("username")),class:(0,f.C_)("username"==e.sortingData.argument?"selected":"")},"Username",2),(0,a._)("span",{onClick:t[1]||(t[1]=t=>e.sortPlayerList("kills")),class:(0,f.C_)("kills"==e.sortingData.argument?"selected":"")},"K",2),(0,a._)("span",{onClick:t[2]||(t[2]=t=>e.sortPlayerList("deaths")),class:(0,f.C_)("deaths"==e.sortingData.argument?"selected":"")},"D",2),(0,a._)("span",{onClick:t[3]||(t[3]=t=>e.sortPlayerList("k/d")),class:(0,f.C_)("k/d"==e.sortingData.argument?"selected":"")},"K/D",2),(0,a._)("span",{onClick:t[4]||(t[4]=t=>e.sortPlayerList("max_kill_distance")),class:(0,f.C_)("max_kill_distance"==e.sortingData.argument?"selected":"")},"max distance",2),(0,a._)("span",{onClick:t[5]||(t[5]=t=>e.sortPlayerList("avg_kill_distance")),class:(0,f.C_)("avg_kill_distance"==e.sortingData.argument?"selected":"")},"average distance",2)]),((0,a.wg)(!0),(0,a.iD)(a.HY,null,(0,a.Ko)(e.playerIdList,((t,r)=>((0,a.wg)(),(0,a.iD)("div",{class:(0,f.C_)("playerRow "+(t===e.$props.playerHighlighted?"selected":"")),key:t,onClick:r=>e.$emit("highlightPlayer",t),ref_for:!0,ref:"player:"+t},[(0,a._)("div",null,[(0,a._)("span",null,(0,f.zw)(r),1)]),(0,a._)("div",null,[(0,a._)("span",null,(0,f.zw)(e.players[t].username),1)]),(0,a._)("div",null,[(0,a._)("span",null,(0,f.zw)(e.players[t].kills),1)]),(0,a._)("div",null,[(0,a._)("span",null,(0,f.zw)(e.players[t].deaths),1)]),(0,a._)("div",null,[(0,a._)("span",null,(0,f.zw)(Math.round(e.players[t].kills/e.players[t].deaths*100)/100),1)]),(0,a._)("div",null,[(0,a._)("span",null,(0,f.zw)(e.players[t].max_kill_distance),1)]),(0,a._)("div",null,[(0,a._)("span",null,(0,f.zw)(Math.round(100*e.players[t].avg_kill_distance)/100),1)])],10,w)))),128))],32)}var P=(0,a.aZ)({props:{filters:Object,playerHighlighted:String},emits:["highlightPlayer"],data(){return{sortingData:{direction:-1,argument:"kills"},playerIdList:[],store:(0,y.oR)()}},computed:{players(){return this.store.getters.getPlayerList(this.filters)}},watch:{players:{handler(e){e&&(this.playerIdList=[],this.sortingData.direction*=-1,this.playerIdList=Object.keys(e),this.sortPlayerList(this.sortingData.argument))},immediate:!0},playerHighlighted(e){const t=this.$refs["player:"+e];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,r)=>{if(!this.players)return 0;let s,a;return"k/d"===e?(s=this.players[t].kills/this.players[t].deaths,a=this.players[r].kills/this.players[r].deaths):(s=this.players[t][e],a=this.players[r][e]),sa?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 r=this.playerIdList.indexOf(this.$props.playerHighlighted);let s=r+t[e.key];s>=this.playerIdList.length&&(s=this.playerIdList.length-1),s<0&&(s=0),this.$emit("highlightPlayer",this.playerIdList[s])}}});const _=(0,o.Z)(P,[["render",k],["__scopeId","data-v-24acbb0c"]]);var L=_;const H={class:"playerChart",ref:"container"};function C(e,t,r,s,i,l){const o=(0,a.up)("Scatter");return(0,a.wg)(),(0,a.iD)("div",H,[(0,a.Wm)(o,{data:e.chart,options:e.chartOptions},null,8,["data","options"])],512)}var x=r(3254),I=r(9152),D=r(3013),W=r(5866);x.kL.register(x.f$,x.od,x.jn,x.u,x.De,I.Z,D.Z);var O=(0,a.aZ)({name:"PlayerChart",props:{filters:Object,playerHighlighted:String},emits:["highlightPlayer"],components:{Scatter:W.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(){const e={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":"dot",hoverRadius:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerIdList[e.index]?30:4,data:[]}]};return this.players?(e.datasets[0].data=this.playerIdList.map((e=>this.players?{x:this.players[e].deaths,y:this.players[e].kills}:{x:0,y:0})),e):e},chartOptions(){this.$props.playerHighlighted;const e={responsive:!0,maintainAspectRatio:!0,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:{},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")}};if(!this.players)return e;const t=Math.max(...Object.values(this.players).map((e=>e.deaths))),r=Math.max(...Object.values(this.players).map((e=>e.kills)));let s,a;return r>t?(s=t,a=t/r*r):(a=r,s=r/t*t),e.plugins.annotation={annotations:{line:{type:"line",yMin:0,xMin:0,yMax:a,xMax:s,borderWidth:2,borderColor:this.colors.orange,borderDash:[1,5]}}},e},players(){return this.store.getters.getPlayerList(this.filters)||{}},playerIdList(){return Object.keys(this.players)}},data(){return{store:(0,y.oR)(),refreshColors:0}}});const $=(0,o.Z)(O,[["render",C],["__scopeId","data-v-4e740fcc"]]);var V=$;const S={class:"weaponChart",ref:"container"};function j(e,t,r,s,i,l){const o=(0,a.up)("Doughnut");return(0,a.wg)(),(0,a.iD)("div",S,[(0,a.Wm)(o,{data:e.chart,options:e.chartOptions},null,8,["data","options"])],512)}x.kL.register(x.qi,x.u,x.De,D.Z);var R=(0,a.aZ)({name:"PlayerChart",props:{filters:Object,playerHighlighted:String},emits:["highlightPlayer"],components:{Doughnut:W.$I},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.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:e=>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)=>this.sortedWeaponList[t.dataIndex],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",font:{weight:"bold"},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(){return this.store.getters.getWeaponList(this.filters)},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}},data(){return{store:(0,y.oR)(),refreshColors:0}}});const N=(0,o.Z)(R,[["render",j],["__scopeId","data-v-c9167984"]]);var M=N,Z=r(6368),z=(0,a.aZ)({name:"PlayerView",components:{PlayerList:L,PlayerChart:V,VueMultiselect:Z.ZP,WeaponChart:M},data(){return{models:{},filters:{minKills:100,minDeaths:100},store:(0,y.oR)(),playerHighlighted:void 0}},computed:{servers(){return this.store.state.servers},weapons(){return this.store.getters.getWeaponList(this.filters)},sortedWeaponList(){if(!this.weapons)return[];const e=Object.keys(this.weapons);return e.sort()},players(){return this.store.getters.getPlayerList(this.filters)},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:{playerHighlighted:function(e){this.fetchPlayerData({player:e,...this.filters})}},methods:{async fetchPlayerData({player:e,server:t}){if(!this.store.getters.getWeaponList({player:e,server:t}))return await this.store.dispatch("fetchWeapons",{player:e,server:t})},async changeFilter({weapon:e,server:t}){const r=JSON.parse(JSON.stringify(this.filters));void 0!==e&&(r.weapon=e),void 0!==t&&(r.server=t),""===e&&delete r.weapon,""===t&&delete r.server;const s=[];this.store.getters.getPlayerList(r)||s.push(this.store.dispatch("fetchPlayers",r)),this.store.getters.getWeaponList(r)||s.push(this.store.dispatch("fetchWeapons",r)),s.push(this.fetchPlayerData({player:this.playerHighlighted,...r})),await Promise.all(s),this.filters=r}}});const A=(0,o.Z)(z,[["render",u],["__scopeId","data-v-ac04060e"]]);var U=A;const T=[{path:"/",name:"home",component:U}],K=(0,d.p7)({history:(0,d.PO)("/ToneAPI_webclient/"),routes:T});var E=K;Symbol();var F=(0,y.MT)({state:{servers:[],players:{},weapons:{}},getters:{getPlayerList:e=>({server:t,weapon:r,minKills:s,minDeaths:a})=>{let i=[];return e.players[""]&&(i=Object.entries(e.players[""]).filter((([,e])=>e.kills>=s||e.deaths>=a)).map((e=>e[0]))),i.length>0&&e.players[(t||"")+(r||"")]?Object.fromEntries(Object.entries(e.players[(t||"")+(r||"")]).filter((([e])=>i.includes(e)))):e.players[(t||"")+(r||"")]},getWeaponList:e=>({server:t,player:r})=>e.weapons[(t||"")+(r||"")]},mutations:{setPlayers(e,t){e.players[(t.filters.server||"")+(t.filters.weapon||"")]=t.data},setWeapons(e,t){e.weapons[(t.filters.server||"")+(t.filters.player||"")]=t.data},setServers(e,t){e.servers=t}},actions:{async fetchPlayers(e,{weapon:t,server:r}){const s={};t?.toString()&&(s.weapon=t),r?.toString()&&(s.server=r);const a=await fetch("https://tone.sleepycat.date/v1/client/players?"+new URLSearchParams(s)),i=await a.json();Object.keys(i).forEach((e=>{i[e].kills=Number(i[e].kills),i[e].deaths=Number(i[e].deaths),i[e].max_kill_distance=Number(i[e].max_kill_distance),i[e].avg_kill_distance=Number(i[e].avg_kill_distance)})),e.commit("setPlayers",{data:i,filters:{weapon:t,server:r}})},async fetchWeapons(e,{player:t,server:r}){const s={};t?.toString()&&(s.player=t),r?.toString()&&(s.server=r);const a=await fetch("https://tone.sleepycat.date/v1/client/weapons?"+new URLSearchParams(s)),i=await a.json();e.commit("setWeapons",{data:i,filters:{player:t,server:r}})},async fetchServers(e){const t=await fetch("https://tone.sleepycat.date/v1/client/servers"),r=await t.json();e.commit("setServers",r)}},modules:{}});(0,s.ri)(h).use(F).use(E).mount("#app"),F.dispatch("fetchServers",{}),F.dispatch("fetchPlayers",{}),F.dispatch("fetchWeapons",{})}},t={};function r(s){var a=t[s];if(void 0!==a)return a.exports;var i=t[s]={exports:{}};return e[s](i,i.exports,r),i.exports}r.m=e,function(){var e=[];r.O=function(t,s,a,i){if(!s){var l=1/0;for(h=0;h=i)&&Object.keys(r.O).every((function(e){return r.O[e](s[n])}))?s.splice(n--,1):(o=!1,i0&&e[h-1][2]>i;h--)e[h]=e[h-1];e[h]=[s,a,i]}}(),function(){r.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return r.d(t,{a:t}),t}}(),function(){r.d=function(e,t){for(var s in t)r.o(t,s)&&!r.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:t[s]})}}(),function(){r.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}}(),function(){var e={143:0};r.O.j=function(t){return 0===e[t]};var t=function(t,s){var a,i,l=s[0],o=s[1],n=s[2],p=0;if(l.some((function(t){return 0!==e[t]}))){for(a in o)r.o(o,a)&&(r.m[a]=o[a]);if(n)var h=n(r)}for(t&&t(s);p\n
\n \n
\n \n\n\n\n","import { render } from \"./App.vue?vue&type=template&id=5eedbd3a\"\nconst script = {}\n\nimport \"./App.vue?vue&type=style&index=0&id=5eedbd3a&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\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-ac04060e\"),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.models.server,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((_ctx.models.server) = $event)),\n options: _ctx.servers,\n \"allow-empty\": true,\n \"custom-label\": ((e) => e.name),\n onSelect: _cache[1] || (_cache[1] = ($event: any) => (_ctx.changeFilter({ server: $event.id }))),\n onRemove: _cache[2] || (_cache[2] = ($event: any) => (_ctx.changeFilter({ server: '' })))\n }, null, 8, [\"modelValue\", \"options\", \"custom-label\"]),\n _createVNode(_component_VueMultiselect, {\n selectLabel: \"\",\n deselectLabel: \"remove\",\n placeholder: \"Select weapon\",\n modelValue: _ctx.models.weapon,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = ($event: any) => ((_ctx.models.weapon) = $event)),\n options: _ctx.sortedWeaponList,\n \"allow-empty\": true,\n onSelect: _cache[4] || (_cache[4] = ($event: any) => (_ctx.changeFilter({ weapon: $event }))),\n onRemove: _cache[5] || (_cache[5] = ($event: any) => (_ctx.changeFilter({ weapon: '' })))\n }, null, 8, [\"modelValue\", \"options\"]),\n _createVNode(_component_VueMultiselect, {\n selectLabel: \"\",\n deselectLabel: \"remove\",\n placeholder: \"Search player\",\n modelValue: _ctx.playerHighlighted,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = ($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[7] || (_cache[7] = ($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[8] || (_cache[8] = ($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-24acbb0c\"),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_kill_distance'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'max_kill_distance' ? 'selected' : '')\n }, \"max distance\", 2),\n _createElementVNode(\"span\", {\n onClick: _cache[5] || (_cache[5] = ($event: any) => (_ctx.sortPlayerList('avg_kill_distance'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'avg_kill_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)\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 / _ctx.players[playerId].deaths * 100) / 100), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(_ctx.players[playerId].max_kill_distance), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(Math.round(_ctx.players[playerId].avg_kill_distance * 100) / 100), 1)\n ])\n ], 10, _hoisted_3))\n }), 128))\n ], 32))\n}","\nimport { defineComponent } from 'vue'\nimport { Player } from '@/store/index'\nimport { useStore } from 'vuex'\n\nexport default defineComponent({\n props: {\n filters: Object,\n playerHighlighted: String\n },\n emits: ['highlightPlayer'],\n data () {\n return {\n sortingData: { direction: -1, argument: 'kills' as keyof Player | 'k/d' },\n playerIdList: [] as string[],\n store: useStore()\n }\n },\n computed: {\n players (): { [key: string]: Player } { return this.store.getters.getPlayerList(this.filters) }\n },\n watch: {\n players: {\n handler (newval: { [key: string]: Player }): void {\n if (!newval) return\n this.playerIdList = []\n this.sortingData.direction *= -1\n this.playerIdList = Object.keys(newval)\n this.sortPlayerList(this.sortingData.argument)\n },\n immediate: true\n },\n playerHighlighted (newval) {\n const newElement = this.$refs['player:' + newval] as HTMLElement[]\n newElement[0].scrollIntoView({ behavior: 'smooth', block: 'center' })\n }\n },\n updated () {\n const element = this.$refs['player:' + this.$props.playerHighlighted] as HTMLElement[]\n if (!element || !element[0]) return\n element[0].scrollIntoView({ behavior: 'smooth', block: 'center' })\n },\n methods: {\n sortPlayerList (arg: ((keyof Player) | 'k/d')) {\n if (arg === this.sortingData.argument) {\n this.sortingData.direction *= -1\n } else {\n if (arg === 'username') {\n this.sortingData.direction = 1\n }\n }\n this.sortingData.argument = arg\n\n this.playerIdList.sort((a: string, b: string) => {\n if (!this.players) {\n return 0\n }\n let varA, varB\n if (arg === 'k/d') {\n varA = this.players[a].kills / this.players[a].deaths\n varB = this.players[b].kills / this.players[b].deaths\n } else {\n varA = this.players[a][arg]\n varB = this.players[b][arg]\n }\n\n if (varA < varB) {\n return -1 * this.sortingData.direction\n }\n if (varA > varB) {\n return 1 * this.sortingData.direction\n }\n return 0\n })\n },\n selectNextPlayer (e: KeyboardEvent) {\n const values = {\n Home: -Infinity,\n End: Infinity,\n PageDown: 100,\n PageUp: -100,\n ArrowUp: -1,\n ArrowDown: 1,\n ArrowRight: 10,\n ArrowLeft: -10\n } as { [key: string]: number }\n if (!this.$props.playerHighlighted) return\n if (!Object.keys(values).includes(e.key)) return\n e.preventDefault()\n const index = this.playerIdList.indexOf(this.$props.playerHighlighted)\n let nextIndex = (index + values[e.key])\n if (nextIndex >= this.playerIdList.length) nextIndex = this.playerIdList.length - 1\n if (nextIndex < 0) nextIndex = 0\n this.$emit('highlightPlayer', this.playerIdList[nextIndex])\n }\n }\n\n})\n","import { render } from \"./PlayerList.vue?vue&type=template&id=24acbb0c&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=24acbb0c&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\toneapi_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-24acbb0c\"]])\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-4e740fcc\"),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}","\nimport {\n Chart as ChartJS,\n LinearScale,\n PointElement,\n LineElement,\n Tooltip,\n Legend\n} from 'chart.js'\nimport annotationPlugin from 'chartjs-plugin-annotation'\nimport dataLabel from 'chartjs-plugin-datalabels'\nimport { Store, useStore } from 'vuex'\nimport { Player, Weapon } from '@/store/index'\n\nimport { Scatter } from 'vue-chartjs'\nimport { defineComponent } from 'vue'\n\nChartJS.register(LinearScale, PointElement, LineElement, Tooltip, Legend, annotationPlugin, dataLabel)\n\nexport default defineComponent({\n name: 'PlayerChart',\n props: {\n filters: Object,\n playerHighlighted: String\n },\n emits: ['highlightPlayer'],\n components: {\n Scatter\n },\n mounted () {\n this.refreshColors++\n },\n computed: {\n colors () {\n // eslint-disable-next-line no-unused-expressions\n this.refreshColors\n const colors = {} as { [key: string]: string }\n if (this.$refs.container) {\n const style = getComputedStyle(this.$refs.container as Element)\n colors.fg = style.getPropertyValue('--foreground')\n colors.bg = style.getPropertyValue('--bg-color')\n colors.orange = style.getPropertyValue('--orange')\n colors.cyan = style.getPropertyValue('--cyan')\n colors.currentLine = style.getPropertyValue('--current-line')\n } else {\n colors.fg = '#ffffff'\n }\n return colors\n },\n chart () {\n const chartData = {\n datasets: [\n {\n label: 'Players',\n labels: this.playerIdList || [] as string[],\n borderColor: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.index]) ? this.colors.orange : this.colors.cyan,\n backgroundColor: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.index]) ? this.colors.orange : this.colors.cyan,\n pointRadius: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.index]) ? 20 : 1,\n pointStyle: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.index]) ? 'crossRot' : 'dot',\n hoverRadius: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.index]) ? 30 : 4,\n data: [] as { x: number, y: number }[]\n }\n ]\n }\n if (!this.players) {\n return chartData\n }\n chartData.datasets[0].data = this.playerIdList.map(e => {\n if (!this.players) {\n return { x: 0, y: 0 }\n }\n return { x: this.players[e].deaths, y: this.players[e].kills }\n })\n return chartData\n },\n chartOptions () {\n // eslint-disable-next-line no-unused-expressions\n this.$props.playerHighlighted\n const options = {\n responsive: true,\n maintainAspectRatio: true,\n animation: { duration: 500 },\n layout: { autoPadding: false },\n scales: {\n y: {\n title: {\n text: 'Kills',\n display: true,\n color: this.colors.fg\n },\n ticks: {\n color: this.colors.fg\n }\n },\n x: {\n title: {\n text: 'Deaths',\n display: true,\n color: this.colors.fg\n },\n ticks: {\n color: this.colors.fg\n }\n }\n },\n plugins: {\n tooltip: {\n callbacks: {\n label: (ctx: any) => {\n let label: string\n if (!this.players) {\n label = ctx.dataset.labels[ctx.dataIndex]\n } else {\n label = this.players[ctx.dataset.labels[ctx.dataIndex]].username\n }\n label += ' (' + ctx.parsed.y + ' kills ' + ctx.parsed.x + ' deaths)'\n return label\n }\n }\n },\n annotation: {},\n legend: { display: false },\n datalabels: {\n formatter: (value: any, context: any) => {\n return this.players[this.playerIdList[context.dataIndex]].username\n },\n backgroundColor: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.dataIndex]) ? this.colors.orange : null,\n borderColor: this.colors.fg,\n borderWidth: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.dataIndex]) ? 1 : 0,\n borderRadius: 5,\n display: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.dataIndex]) ? 'true' : 'auto',\n align: '-45',\n anchor: 'end',\n clamp: true,\n color: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.dataIndex]) ? this.colors.bg : this.colors.fg\n }\n },\n onClick: (e: Event, element: any) => {\n this.$emit('highlightPlayer', element.length > 0 ? this.playerIdList[element[0].index] : undefined)\n },\n onHover: (e: any, element: any) => {\n if (!e.native.target) return\n (e.native.target as HTMLElement).style.cursor = element[0] ? 'pointer' : 'default'\n }\n }\n if (!this.players) {\n return options\n }\n const maxX = Math.max(...Object.values(this.players).map(e => e.deaths))\n const maxY = Math.max(...Object.values(this.players).map(e => e.kills))\n let endX, endY\n if (maxY > maxX) {\n endX = maxX\n endY = (maxX / maxY) * maxY\n } else {\n endY = maxY\n endX = (maxY / maxX) * maxX\n }\n options.plugins.annotation = {\n annotations: {\n line: {\n type: 'line',\n yMin: 0,\n xMin: 0,\n yMax: endY,\n xMax: endX,\n borderWidth: 2,\n borderColor: this.colors.orange,\n borderDash: [1, 5]\n }\n }\n }\n return options\n },\n players (): { [key: string]: Player } { return this.store.getters.getPlayerList(this.filters) || {} },\n playerIdList (): string[] { return Object.keys(this.players) }\n\n },\n data () {\n return {\n store: useStore(),\n refreshColors: 0\n }\n }\n})\n","import { render } from \"./PlayerChart.vue?vue&type=template&id=4e740fcc&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=4e740fcc&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\toneapi_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-4e740fcc\"]])\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-c9167984\"),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}","\nimport {\n Chart as ChartJS,\n ArcElement,\n PointElement,\n LineElement,\n Tooltip,\n Legend\n} from 'chart.js'\nimport annotationPlugin from 'chartjs-plugin-annotation'\nimport dataLabel from 'chartjs-plugin-datalabels'\nimport { Store, useStore } from 'vuex'\nimport { Player, Weapon } from '@/store/index'\nimport { Doughnut } from 'vue-chartjs'\nimport { defineComponent } from 'vue'\nimport { functionExpression } from '@babel/types'\n\nChartJS.register(ArcElement, Tooltip, Legend, dataLabel)\n\nexport default defineComponent({\n name: 'PlayerChart',\n props: {\n filters: Object,\n playerHighlighted: String\n },\n emits: ['highlightPlayer'],\n components: {\n Doughnut\n },\n mounted () {\n this.refreshColors++\n },\n computed: {\n colors () {\n // eslint-disable-next-line no-unused-expressions\n this.refreshColors\n const colors = {} as { [key: string]: string }\n if (this.$refs.container) {\n const style = getComputedStyle(this.$refs.container as Element)\n colors.fg = style.getPropertyValue('--foreground')\n colors.bg = style.getPropertyValue('--bg-color')\n colors.orange = style.getPropertyValue('--orange')\n colors.cyan = style.getPropertyValue('--cyan')\n colors.yellow = style.getPropertyValue('--yellow')\n colors.green = style.getPropertyValue('--green')\n colors.purple = style.getPropertyValue('--purple')\n colors.red = style.getPropertyValue('--red')\n colors.pink = style.getPropertyValue('--pink')\n colors.currentLine = style.getPropertyValue('--current-line')\n } else {\n colors.fg = '#ffffff'\n }\n return colors\n },\n chart () {\n const colors = ['cyan', 'green', 'orange', 'pink', 'purple', 'red', 'yellow']\n const chartData = {\n datasets: [\n {\n label: 'Weapons',\n labels: this.sortedWeaponList || [] as string[],\n borderColor: (context: any) => this.colors.fg,\n backgroundColor: (context: any) => { return this.colors[colors[(context.dataIndex * 3) % colors.length]] },\n data: [] as number[]\n }\n ]\n }\n if (!this.sortedWeaponList) {\n return chartData\n }\n chartData.datasets[0].data = this.sortedWeaponList.map(e => {\n if (!this.weapons) {\n return 0\n }\n return this.weapons[e].kills\n })\n return chartData\n },\n chartOptions () {\n // eslint-disable-next-line no-unused-expressions\n this.$props.playerHighlighted\n const options = {\n responsive: true,\n maintainAspectRatio: true,\n animation: { duration: 500 },\n layout: { autoPadding: false },\n plugins: {\n datalabels: {\n formatter: (value: any, context: any) => {\n return this.sortedWeaponList[context.dataIndex]\n },\n backgroundColor: (context: any) => {\n return context.dataset.backgroundColor(context)\n },\n borderColor: this.colors.fg,\n borderRadius: 25,\n borderWidth: 2,\n color: this.colors.bg,\n display: (context: any) => {\n return context.dataIndex === context.dataset.labels.length - 1 ? true : 'auto'\n },\n font: {\n weight: 'bold'\n },\n padding: 6\n },\n tooltip: {\n callbacks: {\n label: (ctx: any) => {\n let label: string\n if (!this.sortedWeaponList) {\n label = ctx.dataset.labels[ctx.dataIndex]\n } else {\n label = this.sortedWeaponList[ctx.dataIndex]\n }\n label += ' (' + this.weapons[label].kills + ' kills)'\n return label\n }\n }\n }\n\n }\n }\n return options\n },\n weapons (): { [key: string]: Weapon } {\n return this.store.getters.getWeaponList(this.filters)\n },\n sortedWeaponList (): string[] {\n if (!this.weapons) return []\n const weapons = Object.keys(this.weapons)\n weapons.sort((a, b) => {\n if (Number(this.weapons[a].kills) < Number(this.weapons[b].kills)) {\n return -1\n }\n if (Number(this.weapons[a].kills) > Number(this.weapons[b].kills)) {\n return 1\n }\n return 0\n })\n return weapons\n }\n\n },\n data () {\n return {\n store: useStore(),\n refreshColors: 0\n }\n }\n})\n","import { render } from \"./WeaponChart.vue?vue&type=template&id=c9167984&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=c9167984&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\toneapi_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-c9167984\"]])\n\nexport default __exports__","\r\nimport { Store, useStore } from 'vuex'\r\nimport { Player, Weapon, Server } from '@/store/index'\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\n\r\nexport default defineComponent({\r\n name: 'PlayerView',\r\n components: {\r\n PlayerList, PlayerChart, VueMultiselect, WeaponChart\r\n },\r\n\r\n data () {\r\n return {\r\n models: {},\r\n filters: { minKills: 100, minDeaths: 100 },\r\n store: useStore(),\r\n playerHighlighted: undefined\r\n } as { filters: { weapon?: string, server?: string }, store: Store, playerHighlighted?: string }\r\n },\r\n computed: {\r\n servers (): Server[] { return this.store.state.servers },\r\n weapons (): { [key: string]: Weapon } { return this.store.getters.getWeaponList(this.filters) },\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 players (): { [key: string]: Player } { return this.store.getters.getPlayerList(this.filters) },\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\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 playerHighlighted: function (newval:string) {\r\n this.fetchPlayerData({ player: newval, ...this.filters })\r\n }\r\n },\r\n methods: {\r\n async fetchPlayerData ({ player, server }: { player?: string, server?:string }) {\r\n if (!this.store.getters.getWeaponList({ player, server })) return await this.store.dispatch('fetchWeapons', { player, server })\r\n },\r\n async changeFilter ({ weapon, server }: { weapon?: string, server?: string }) {\r\n const filters = JSON.parse(JSON.stringify(this.filters))\r\n if (weapon !== undefined) filters.weapon = weapon\r\n if (server !== undefined) filters.server = server\r\n if (weapon === '') delete filters.weapon\r\n if (server === '') delete filters.server\r\n const promises = []\r\n if (!this.store.getters.getPlayerList(filters)) promises.push(this.store.dispatch('fetchPlayers', filters))\r\n if (!this.store.getters.getWeaponList(filters)) promises.push(this.store.dispatch('fetchWeapons', filters))\r\n promises.push(this.fetchPlayerData({ player: this.playerHighlighted, ...filters }))\r\n await Promise.all(promises)\r\n // Delay the update of filters propery after we fetch the data to the API as changing it will cause subcomponents to reload before data is fetched\r\n this.filters = filters\r\n }\r\n }\r\n})\r\n","import { render } from \"./PlayerView.vue?vue&type=template&id=ac04060e&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=ac04060e&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\toneapi_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-ac04060e\"]])\n\nexport default __exports__","import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'\nimport HomeView from '../views/HomeView.vue'\nimport PlayerView from '../views/PlayerView.vue'\n\nconst routes: Array = [\n {\n path: '/',\n name: 'home',\n component: PlayerView\n }\n // {\n // path: '/players',\n // name: 'players',\n // component: PlayerView\n // },\n // {\n // path: '/about',\n // name: 'about',\n // // route level code-splitting\n // // this generates a separate chunk (about.[hash].js) for this route\n // // which is lazy-loaded when the route is visited.\n // component: () => import(/* webpackChunkName: \"about\" */ '../views/AboutView.vue')\n // }\n]\n\nconst router = createRouter({\n history: createWebHistory(process.env.BASE_URL),\n routes\n})\n\nexport default router\n","// store.ts\nimport { InjectionKey } from 'vue'\nimport { createStore, Store } from 'vuex'\n\nexport interface Player {\n deaths: number;\n username: string;\n // eslint-disable-next-line camelcase\n max_kill_distance: number;\n // eslint-disable-next-line camelcase\n avg_kill_distance: number;\n kills: number;\n}\n\nexport interface Weapon {\n id?:string,\n // eslint-disable-next-line camelcase\n max_kill_distance: number;\n // eslint-disable-next-line camelcase\n avg_kill_distance: number;\n kills: number;\n}\n\nexport interface Server{\n name:string;\n id:number;\n description:string\n}\n// define your typings for the store state\nexport interface State {\n servers: Server[]\n players: { [key: string]: { [key: string]: Player } };\n weapons: { [key: string]:{ [key: string]: Weapon }};\n}\n\n// define injection key\n// eslint-disable-next-line symbol-description\nexport const key: InjectionKey> = Symbol()\n\nexport default createStore({\n state: {\n servers: [],\n players: {},\n weapons: {}\n },\n getters: {\n getPlayerList: (state) => ({ server, weapon, minKills, minDeaths }: { server?: number, weapon?: string, minKills:number, minDeaths:number }) => {\n let playerFilter: string[] = []\n if (state.players['']) {\n playerFilter = Object.entries(state.players['']).filter(([, value]:any) => { return (value.kills >= minKills) || (value.deaths >= minDeaths) }).map(e => e[0])\n }\n if (playerFilter.length > 0 && state.players[(server || '') + (weapon || '')]) {\n return Object.fromEntries(Object.entries(state.players[(server || '') + (weapon || '')]).filter(([key]) => playerFilter.includes(key)))\n }\n\n return state.players[(server || '') + (weapon || '')]\n },\n getWeaponList: (state) => ({ server, player }: { server?: number, player?: string }) => {\n return state.weapons[(server || '') + (player || '')]\n }\n },\n mutations: {\n setPlayers (state, data: { data: { [key: string]: Player }, filters: { weapon: string, server: number } }) {\n state.players[(data.filters.server || '') + (data.filters.weapon || '')] = data.data\n },\n setWeapons (state, data:{data: {[key:string]:Weapon}, filters:{server:string, player:string}}) {\n state.weapons[(data.filters.server || '') + (data.filters.player || '')] = data.data\n },\n setServers (state, data) {\n state.servers = data\n }\n },\n actions: {\n async fetchPlayers (context, { weapon, server }) {\n const searchParams: Record = {}\n if (weapon?.toString()) { searchParams.weapon = weapon }\n if (server?.toString()) { searchParams.server = server }\n const response = await fetch(\n 'https://tone.sleepycat.date/v1/client/players?' + new URLSearchParams(searchParams)\n )\n const data = await response.json()\n Object.keys(data).forEach(e => {\n data[e].kills = Number(data[e].kills)\n data[e].deaths = Number(data[e].deaths)\n data[e].max_kill_distance = Number(data[e].max_kill_distance)\n data[e].avg_kill_distance = Number(data[e].avg_kill_distance)\n })\n\n context.commit('setPlayers', { data, filters: { weapon, server } })\n },\n async fetchWeapons (context, { player, server }) {\n const searchParams: Record = {}\n if (player?.toString()) { searchParams.player = player }\n if (server?.toString()) { searchParams.server = server }\n const response = await fetch(\n 'https://tone.sleepycat.date/v1/client/weapons?' + new URLSearchParams(searchParams)\n )\n const data = await response.json()\n context.commit('setWeapons', { data, filters: { player, server } })\n },\n async fetchServers (context) {\n const response = await fetch(\n 'https://tone.sleepycat.date/v1/client/servers'\n )\n const data = await response.json()\n context.commit('setServers', data)\n }\n },\n modules: {}\n})\n","import { createApp } from 'vue'\r\nimport App from './App.vue'\r\nimport router from './router'\r\nimport store from './store'\r\n\r\ncreateApp(App).use(store).use(router).mount('#app')\r\n\r\nstore.dispatch('fetchServers', {})\r\nstore.dispatch('fetchPlayers', {})\r\nstore.dispatch('fetchWeapons', {})\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__(5442); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["_createElementVNode","_hoisted_1","_createVNode","_component_router_link","to","class","_component_router_view","script","__exports__","render","id","_hoisted_2","_ctx","_cache","$props","$setup","$data","$options","_component_VueMultiselect","_resolveComponent","_component_PlayerList","_component_PlayerChart","_component_WeaponChart","_openBlock","_createElementBlock","_Fragment","selectLabel","deselectLabel","placeholder","modelValue","models","server","$event","options","servers","e","name","onSelect","changeFilter","onRemove","weapon","sortedWeaponList","playerHighlighted","sortedPlayerList","players","username","filters","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","ref","_toDisplayString","kills","deaths","Math","round","max_kill_distance","avg_kill_distance","defineComponent","props","Object","String","emits","data","direction","store","useStore","computed","this","getters","getPlayerList","watch","handler","newval","keys","immediate","newElement","$refs","scrollIntoView","behavior","block","updated","element","methods","arg","sort","a","b","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","components","Scatter","mounted","refreshColors","colors","container","style","getComputedStyle","fg","getPropertyValue","bg","orange","cyan","currentLine","chartData","datasets","label","labels","borderColor","context","backgroundColor","pointRadius","pointStyle","hoverRadius","map","x","y","responsive","maintainAspectRatio","animation","duration","layout","autoPadding","scales","title","text","display","color","ticks","plugins","tooltip","callbacks","ctx","dataset","dataIndex","parsed","annotation","legend","datalabels","formatter","value","borderWidth","borderRadius","align","anchor","clamp","undefined","onHover","native","target","cursor","maxX","max","maxY","endX","endY","annotations","line","type","yMin","xMin","yMax","xMax","borderDash","_component_Doughnut","ArcElement","Doughnut","yellow","green","purple","red","pink","weapons","font","weight","padding","getWeaponList","Number","PlayerList","PlayerChart","VueMultiselect","WeaponChart","minKills","minDeaths","state","fetchPlayerData","async","dispatch","JSON","parse","stringify","promises","push","Promise","all","routes","path","component","PlayerView","router","createRouter","history","createWebHistory","process","Symbol","createStore","playerFilter","entries","filter","fromEntries","mutations","setPlayers","setWeapons","setServers","actions","searchParams","toString","response","fetch","URLSearchParams","json","forEach","commit","modules","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.1dead6bc.js","mappings":"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","sources":["webpack://toneapi_webclient/./src/App.vue","webpack://toneapi_webclient/./src/App.vue?7ccd","webpack://toneapi_webclient/./src/views/PlayerView.vue?3e5c","webpack://toneapi_webclient/./src/components/PlayerList.vue?1b3a","webpack://toneapi_webclient/./src/components/PlayerList.vue?f30b","webpack://toneapi_webclient/./src/components/PlayerList.vue","webpack://toneapi_webclient/./src/components/PlayerChart.vue?b8b5","webpack://toneapi_webclient/./src/components/PlayerChart.vue?ec59","webpack://toneapi_webclient/./src/components/PlayerChart.vue","webpack://toneapi_webclient/./src/components/WeaponChart.vue?6a1d","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/store/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":["\n\n\n","import { render } from \"./App.vue?vue&type=template&id=5eedbd3a\"\nconst script = {}\n\nimport \"./App.vue?vue&type=style&index=0&id=5eedbd3a&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\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-ac04060e\"),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.models.server,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((_ctx.models.server) = $event)),\n options: _ctx.servers,\n \"allow-empty\": true,\n \"custom-label\": ((e) => e.name),\n onSelect: _cache[1] || (_cache[1] = ($event: any) => (_ctx.changeFilter({ server: $event.id }))),\n onRemove: _cache[2] || (_cache[2] = ($event: any) => (_ctx.changeFilter({ server: '' })))\n }, null, 8, [\"modelValue\", \"options\", \"custom-label\"]),\n _createVNode(_component_VueMultiselect, {\n selectLabel: \"\",\n deselectLabel: \"remove\",\n placeholder: \"Select weapon\",\n modelValue: _ctx.models.weapon,\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = ($event: any) => ((_ctx.models.weapon) = $event)),\n options: _ctx.sortedWeaponList,\n \"allow-empty\": true,\n onSelect: _cache[4] || (_cache[4] = ($event: any) => (_ctx.changeFilter({ weapon: $event }))),\n onRemove: _cache[5] || (_cache[5] = ($event: any) => (_ctx.changeFilter({ weapon: '' })))\n }, null, 8, [\"modelValue\", \"options\"]),\n _createVNode(_component_VueMultiselect, {\n selectLabel: \"\",\n deselectLabel: \"remove\",\n placeholder: \"Search player\",\n modelValue: _ctx.playerHighlighted,\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = ($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[7] || (_cache[7] = ($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[8] || (_cache[8] = ($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-24acbb0c\"),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_kill_distance'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'max_kill_distance' ? 'selected' : '')\n }, \"max distance\", 2),\n _createElementVNode(\"span\", {\n onClick: _cache[5] || (_cache[5] = ($event: any) => (_ctx.sortPlayerList('avg_kill_distance'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'avg_kill_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)\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 / _ctx.players[playerId].deaths * 100) / 100), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(_ctx.players[playerId].max_kill_distance), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(Math.round(_ctx.players[playerId].avg_kill_distance * 100) / 100), 1)\n ])\n ], 10, _hoisted_3))\n }), 128))\n ], 32))\n}","\nimport { defineComponent } from 'vue'\nimport { Player } from '@/store/index'\nimport { useStore } from 'vuex'\n\nexport default defineComponent({\n props: {\n filters: Object,\n playerHighlighted: String\n },\n emits: ['highlightPlayer'],\n data () {\n return {\n sortingData: { direction: -1, argument: 'kills' as keyof Player | 'k/d' },\n playerIdList: [] as string[],\n store: useStore()\n }\n },\n computed: {\n players (): { [key: string]: Player } { return this.store.getters.getPlayerList(this.filters) }\n },\n watch: {\n players: {\n handler (newval: { [key: string]: Player }): void {\n if (!newval) return\n this.playerIdList = []\n this.sortingData.direction *= -1\n this.playerIdList = Object.keys(newval)\n this.sortPlayerList(this.sortingData.argument)\n },\n immediate: true\n },\n playerHighlighted (newval) {\n const newElement = this.$refs['player:' + newval] as HTMLElement[]\n newElement[0].scrollIntoView({ behavior: 'smooth', block: 'center' })\n }\n },\n updated () {\n const element = this.$refs['player:' + this.$props.playerHighlighted] as HTMLElement[]\n if (!element || !element[0]) return\n element[0].scrollIntoView({ behavior: 'smooth', block: 'center' })\n },\n methods: {\n sortPlayerList (arg: ((keyof Player) | 'k/d')) {\n if (arg === this.sortingData.argument) {\n this.sortingData.direction *= -1\n } else {\n if (arg === 'username') {\n this.sortingData.direction = 1\n }\n }\n this.sortingData.argument = arg\n\n this.playerIdList.sort((a: string, b: string) => {\n if (!this.players) {\n return 0\n }\n let varA, varB\n if (arg === 'k/d') {\n varA = this.players[a].kills / this.players[a].deaths\n varB = this.players[b].kills / this.players[b].deaths\n } else {\n varA = this.players[a][arg]\n varB = this.players[b][arg]\n }\n\n if (varA < varB) {\n return -1 * this.sortingData.direction\n }\n if (varA > varB) {\n return 1 * this.sortingData.direction\n }\n return 0\n })\n },\n selectNextPlayer (e: KeyboardEvent) {\n const values = {\n Home: -Infinity,\n End: Infinity,\n PageDown: 100,\n PageUp: -100,\n ArrowUp: -1,\n ArrowDown: 1,\n ArrowRight: 10,\n ArrowLeft: -10\n } as { [key: string]: number }\n if (!this.$props.playerHighlighted) return\n if (!Object.keys(values).includes(e.key)) return\n e.preventDefault()\n const index = this.playerIdList.indexOf(this.$props.playerHighlighted)\n let nextIndex = (index + values[e.key])\n if (nextIndex >= this.playerIdList.length) nextIndex = this.playerIdList.length - 1\n if (nextIndex < 0) nextIndex = 0\n this.$emit('highlightPlayer', this.playerIdList[nextIndex])\n }\n }\n\n})\n","import { render } from \"./PlayerList.vue?vue&type=template&id=24acbb0c&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=24acbb0c&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\toneapi_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-24acbb0c\"]])\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-4e740fcc\"),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}","\nimport {\n Chart as ChartJS,\n LinearScale,\n PointElement,\n LineElement,\n Tooltip,\n Legend\n} from 'chart.js'\nimport annotationPlugin from 'chartjs-plugin-annotation'\nimport dataLabel from 'chartjs-plugin-datalabels'\nimport { Store, useStore } from 'vuex'\nimport { Player, Weapon } from '@/store/index'\n\nimport { Scatter } from 'vue-chartjs'\nimport { defineComponent } from 'vue'\n\nChartJS.register(LinearScale, PointElement, LineElement, Tooltip, Legend, annotationPlugin, dataLabel)\n\nexport default defineComponent({\n name: 'PlayerChart',\n props: {\n filters: Object,\n playerHighlighted: String\n },\n emits: ['highlightPlayer'],\n components: {\n Scatter\n },\n mounted () {\n this.refreshColors++\n },\n computed: {\n colors () {\n // eslint-disable-next-line no-unused-expressions\n this.refreshColors\n const colors = {} as { [key: string]: string }\n if (this.$refs.container) {\n const style = getComputedStyle(this.$refs.container as Element)\n colors.fg = style.getPropertyValue('--foreground')\n colors.bg = style.getPropertyValue('--bg-color')\n colors.orange = style.getPropertyValue('--orange')\n colors.cyan = style.getPropertyValue('--cyan')\n colors.currentLine = style.getPropertyValue('--current-line')\n } else {\n colors.fg = '#ffffff'\n }\n return colors\n },\n chart () {\n const chartData = {\n datasets: [\n {\n label: 'Players',\n labels: this.playerIdList || [] as string[],\n borderColor: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.index]) ? this.colors.orange : this.colors.cyan,\n backgroundColor: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.index]) ? this.colors.orange : this.colors.cyan,\n pointRadius: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.index]) ? 20 : 1,\n pointStyle: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.index]) ? 'crossRot' : 'dot',\n hoverRadius: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.index]) ? 30 : 4,\n data: [] as { x: number, y: number }[]\n }\n ]\n }\n if (!this.players) {\n return chartData\n }\n chartData.datasets[0].data = this.playerIdList.map(e => {\n if (!this.players) {\n return { x: 0, y: 0 }\n }\n return { x: this.players[e].deaths, y: this.players[e].kills }\n })\n return chartData\n },\n chartOptions () {\n // eslint-disable-next-line no-unused-expressions\n this.$props.playerHighlighted\n const options = {\n responsive: true,\n maintainAspectRatio: true,\n animation: { duration: 500 },\n layout: { autoPadding: false },\n scales: {\n y: {\n title: {\n text: 'Kills',\n display: true,\n color: this.colors.fg\n },\n ticks: {\n color: this.colors.fg\n }\n },\n x: {\n title: {\n text: 'Deaths',\n display: true,\n color: this.colors.fg\n },\n ticks: {\n color: this.colors.fg\n }\n }\n },\n plugins: {\n tooltip: {\n callbacks: {\n label: (ctx: any) => {\n let label: string\n if (!this.players) {\n label = ctx.dataset.labels[ctx.dataIndex]\n } else {\n label = this.players[ctx.dataset.labels[ctx.dataIndex]].username\n }\n label += ' (' + ctx.parsed.y + ' kills ' + ctx.parsed.x + ' deaths)'\n return label\n }\n }\n },\n annotation: {},\n legend: { display: false },\n datalabels: {\n formatter: (value: any, context: any) => {\n return this.players[this.playerIdList[context.dataIndex]].username\n },\n backgroundColor: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.dataIndex]) ? this.colors.orange : null,\n borderColor: this.colors.fg,\n borderWidth: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.dataIndex]) ? 1 : 0,\n borderRadius: 5,\n display: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.dataIndex]) ? 'true' : 'auto',\n align: '-45',\n anchor: 'end',\n clamp: true,\n color: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerIdList[context.dataIndex]) ? this.colors.bg : this.colors.fg\n }\n },\n onClick: (e: Event, element: any) => {\n this.$emit('highlightPlayer', element.length > 0 ? this.playerIdList[element[0].index] : undefined)\n },\n onHover: (e: any, element: any) => {\n if (!e.native.target) return\n (e.native.target as HTMLElement).style.cursor = element[0] ? 'pointer' : 'default'\n }\n }\n if (!this.players) {\n return options\n }\n const maxX = Math.max(...Object.values(this.players).map(e => e.deaths))\n const maxY = Math.max(...Object.values(this.players).map(e => e.kills))\n let endX, endY\n if (maxY > maxX) {\n endX = maxX\n endY = (maxX / maxY) * maxY\n } else {\n endY = maxY\n endX = (maxY / maxX) * maxX\n }\n options.plugins.annotation = {\n annotations: {\n line: {\n type: 'line',\n yMin: 0,\n xMin: 0,\n yMax: endY,\n xMax: endX,\n borderWidth: 2,\n borderColor: this.colors.orange,\n borderDash: [1, 5]\n }\n }\n }\n return options\n },\n players (): { [key: string]: Player } { return this.store.getters.getPlayerList(this.filters) || {} },\n playerIdList (): string[] { return Object.keys(this.players) }\n\n },\n data () {\n return {\n store: useStore(),\n refreshColors: 0\n }\n }\n})\n","import { render } from \"./PlayerChart.vue?vue&type=template&id=4e740fcc&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=4e740fcc&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\toneapi_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-4e740fcc\"]])\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-c9167984\"),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}","\nimport {\n Chart as ChartJS,\n ArcElement,\n PointElement,\n LineElement,\n Tooltip,\n Legend\n} from 'chart.js'\nimport annotationPlugin from 'chartjs-plugin-annotation'\nimport dataLabel from 'chartjs-plugin-datalabels'\nimport { Store, useStore } from 'vuex'\nimport { Player, Weapon } from '@/store/index'\nimport { Doughnut } from 'vue-chartjs'\nimport { defineComponent } from 'vue'\nimport { functionExpression } from '@babel/types'\n\nChartJS.register(ArcElement, Tooltip, Legend, dataLabel)\n\nexport default defineComponent({\n name: 'PlayerChart',\n props: {\n filters: Object,\n playerHighlighted: String\n },\n emits: ['highlightPlayer'],\n components: {\n Doughnut\n },\n mounted () {\n this.refreshColors++\n },\n computed: {\n colors () {\n // eslint-disable-next-line no-unused-expressions\n this.refreshColors\n const colors = {} as { [key: string]: string }\n if (this.$refs.container) {\n const style = getComputedStyle(this.$refs.container as Element)\n colors.fg = style.getPropertyValue('--foreground')\n colors.bg = style.getPropertyValue('--bg-color')\n colors.orange = style.getPropertyValue('--orange')\n colors.cyan = style.getPropertyValue('--cyan')\n colors.yellow = style.getPropertyValue('--yellow')\n colors.green = style.getPropertyValue('--green')\n colors.purple = style.getPropertyValue('--purple')\n colors.red = style.getPropertyValue('--red')\n colors.pink = style.getPropertyValue('--pink')\n colors.currentLine = style.getPropertyValue('--current-line')\n } else {\n colors.fg = '#ffffff'\n }\n return colors\n },\n chart () {\n const colors = ['cyan', 'green', 'orange', 'pink', 'purple', 'red', 'yellow']\n const chartData = {\n datasets: [\n {\n label: 'Weapons',\n labels: this.sortedWeaponList || [] as string[],\n borderColor: (context: any) => this.colors.fg,\n backgroundColor: (context: any) => { return this.colors[colors[(context.dataIndex * 3) % colors.length]] },\n data: [] as number[]\n }\n ]\n }\n if (!this.sortedWeaponList) {\n return chartData\n }\n chartData.datasets[0].data = this.sortedWeaponList.map(e => {\n if (!this.weapons) {\n return 0\n }\n return this.weapons[e].kills\n })\n return chartData\n },\n chartOptions () {\n // eslint-disable-next-line no-unused-expressions\n this.$props.playerHighlighted\n const options = {\n responsive: true,\n maintainAspectRatio: true,\n animation: { duration: 500 },\n layout: { autoPadding: false },\n plugins: {\n datalabels: {\n formatter: (value: any, context: any) => {\n return this.sortedWeaponList[context.dataIndex]\n },\n backgroundColor: (context: any) => {\n return context.dataset.backgroundColor(context)\n },\n borderColor: this.colors.fg,\n borderRadius: 25,\n borderWidth: 2,\n color: this.colors.bg,\n display: (context: any) => {\n return context.dataIndex === context.dataset.labels.length - 1 ? true : 'auto'\n },\n font: {\n weight: 'bold'\n },\n padding: 6\n },\n tooltip: {\n callbacks: {\n label: (ctx: any) => {\n let label: string\n if (!this.sortedWeaponList) {\n label = ctx.dataset.labels[ctx.dataIndex]\n } else {\n label = this.sortedWeaponList[ctx.dataIndex]\n }\n label += ' (' + this.weapons[label].kills + ' kills)'\n return label\n }\n }\n }\n\n }\n }\n return options\n },\n weapons (): { [key: string]: Weapon } {\n return this.store.getters.getWeaponList(this.filters)\n },\n sortedWeaponList (): string[] {\n if (!this.weapons) return []\n const weapons = Object.keys(this.weapons)\n weapons.sort((a, b) => {\n if (Number(this.weapons[a].kills) < Number(this.weapons[b].kills)) {\n return -1\n }\n if (Number(this.weapons[a].kills) > Number(this.weapons[b].kills)) {\n return 1\n }\n return 0\n })\n return weapons\n }\n\n },\n data () {\n return {\n store: useStore(),\n refreshColors: 0\n }\n }\n})\n","import { render } from \"./WeaponChart.vue?vue&type=template&id=c9167984&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=c9167984&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\toneapi_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-c9167984\"]])\n\nexport default __exports__","\r\nimport { Store, useStore } from 'vuex'\r\nimport { Player, Weapon, Server } from '@/store/index'\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\n\r\nexport default defineComponent({\r\n name: 'PlayerView',\r\n components: {\r\n PlayerList, PlayerChart, VueMultiselect, WeaponChart\r\n },\r\n\r\n data () {\r\n return {\r\n models: {},\r\n filters: { minKills: 100, minDeaths: 100 },\r\n store: useStore(),\r\n playerHighlighted: undefined\r\n } as { filters: { weapon?: string, server?: string }, store: Store, playerHighlighted?: string }\r\n },\r\n computed: {\r\n servers (): Server[] { return this.store.state.servers },\r\n weapons (): { [key: string]: Weapon } { return this.store.getters.getWeaponList(this.filters) },\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 players (): { [key: string]: Player } { return this.store.getters.getPlayerList(this.filters) },\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\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 playerHighlighted: function (newval:string) {\r\n this.fetchPlayerData({ player: newval, ...this.filters })\r\n }\r\n },\r\n methods: {\r\n async fetchPlayerData ({ player, server }: { player?: string, server?:string }) {\r\n if (!this.store.getters.getWeaponList({ player, server })) return await this.store.dispatch('fetchWeapons', { player, server })\r\n },\r\n async changeFilter ({ weapon, server }: { weapon?: string, server?: string }) {\r\n const filters = JSON.parse(JSON.stringify(this.filters))\r\n if (weapon !== undefined) filters.weapon = weapon\r\n if (server !== undefined) filters.server = server\r\n if (weapon === '') delete filters.weapon\r\n if (server === '') delete filters.server\r\n const promises = []\r\n if (!this.store.getters.getPlayerList(filters)) promises.push(this.store.dispatch('fetchPlayers', filters))\r\n if (!this.store.getters.getWeaponList(filters)) promises.push(this.store.dispatch('fetchWeapons', filters))\r\n promises.push(this.fetchPlayerData({ player: this.playerHighlighted, ...filters }))\r\n await Promise.all(promises)\r\n // Delay the update of filters propery after we fetch the data to the API as changing it will cause subcomponents to reload before data is fetched\r\n this.filters = filters\r\n }\r\n }\r\n})\r\n","import { render } from \"./PlayerView.vue?vue&type=template&id=ac04060e&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=ac04060e&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\toneapi_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-ac04060e\"]])\n\nexport default __exports__","import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'\nimport HomeView from '../views/HomeView.vue'\nimport PlayerView from '../views/PlayerView.vue'\n\nconst routes: Array = [\n {\n path: '/',\n name: 'home',\n component: PlayerView\n }\n // {\n // path: '/players',\n // name: 'players',\n // component: PlayerView\n // },\n // {\n // path: '/about',\n // name: 'about',\n // // route level code-splitting\n // // this generates a separate chunk (about.[hash].js) for this route\n // // which is lazy-loaded when the route is visited.\n // component: () => import(/* webpackChunkName: \"about\" */ '../views/AboutView.vue')\n // }\n]\n\nconst router = createRouter({\n history: createWebHistory(process.env.BASE_URL),\n routes\n})\n\nexport default router\n","// store.ts\nimport { InjectionKey } from 'vue'\nimport { createStore, Store } from 'vuex'\n\nexport interface Player {\n deaths: number;\n username: string;\n // eslint-disable-next-line camelcase\n max_kill_distance: number;\n // eslint-disable-next-line camelcase\n avg_kill_distance: number;\n kills: number;\n}\n\nexport interface Weapon {\n id?:string,\n // eslint-disable-next-line camelcase\n max_kill_distance: number;\n // eslint-disable-next-line camelcase\n avg_kill_distance: number;\n kills: number;\n}\n\nexport interface Server{\n name:string;\n id:number;\n description:string\n}\n// define your typings for the store state\nexport interface State {\n servers: Server[]\n players: { [key: string]: { [key: string]: Player } };\n weapons: { [key: string]:{ [key: string]: Weapon }};\n}\n\n// define injection key\n// eslint-disable-next-line symbol-description\nexport const key: InjectionKey> = Symbol()\n\nexport default createStore({\n state: {\n servers: [],\n players: {},\n weapons: {}\n },\n getters: {\n getPlayerList: (state) => ({ server, weapon, minKills, minDeaths }: { server?: number, weapon?: string, minKills:number, minDeaths:number }) => {\n let playerFilter: string[] = []\n if (state.players['']) {\n playerFilter = Object.entries(state.players['']).filter(([, value]:any) => { return (value.kills >= minKills) || (value.deaths >= minDeaths) }).map(e => e[0])\n }\n if (playerFilter.length > 0 && state.players[(server || '') + (weapon || '')]) {\n return Object.fromEntries(Object.entries(state.players[(server || '') + (weapon || '')]).filter(([key]) => playerFilter.includes(key)))\n }\n\n return state.players[(server || '') + (weapon || '')]\n },\n getWeaponList: (state) => ({ server, player }: { server?: number, player?: string }) => {\n return state.weapons[(server || '') + (player || '')]\n }\n },\n mutations: {\n setPlayers (state, data: { data: { [key: string]: Player }, filters: { weapon: string, server: number } }) {\n state.players[(data.filters.server || '') + (data.filters.weapon || '')] = data.data\n },\n setWeapons (state, data:{data: {[key:string]:Weapon}, filters:{server:string, player:string}}) {\n state.weapons[(data.filters.server || '') + (data.filters.player || '')] = data.data\n },\n setServers (state, data) {\n state.servers = data\n }\n },\n actions: {\n async fetchPlayers (context, { weapon, server }) {\n const searchParams: Record = {}\n if (weapon?.toString()) { searchParams.weapon = weapon }\n if (server?.toString()) { searchParams.server = server }\n const response = await fetch(\n 'https://tone.sleepycat.date/v1/client/players?' + new URLSearchParams(searchParams)\n )\n const data = await response.json()\n Object.keys(data).forEach(e => {\n data[e].kills = Number(data[e].kills)\n data[e].deaths = Number(data[e].deaths)\n data[e].max_kill_distance = Number(data[e].max_kill_distance)\n data[e].avg_kill_distance = Number(data[e].avg_kill_distance)\n })\n\n context.commit('setPlayers', { data, filters: { weapon, server } })\n },\n async fetchWeapons (context, { player, server }) {\n const searchParams: Record = {}\n if (player?.toString()) { searchParams.player = player }\n if (server?.toString()) { searchParams.server = server }\n const response = await fetch(\n 'https://tone.sleepycat.date/v1/client/weapons?' + new URLSearchParams(searchParams)\n )\n const data = await response.json()\n context.commit('setWeapons', { data, filters: { player, server } })\n },\n async fetchServers (context) {\n const response = await fetch(\n 'https://tone.sleepycat.date/v1/client/servers'\n )\n const data = await response.json()\n context.commit('setServers', data)\n }\n },\n modules: {}\n})\n","import { createApp } from 'vue'\r\nimport App from './App.vue'\r\nimport router from './router'\r\nimport store from './store'\r\n\r\ncreateApp(App).use(store).use(router).mount('#app')\r\n\r\nstore.dispatch('fetchServers', {})\r\nstore.dispatch('fetchPlayers', {})\r\nstore.dispatch('fetchWeapons', {})\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__(5442); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["_createElementVNode","_hoisted_1","_createVNode","_component_router_link","to","class","_component_router_view","script","__exports__","render","id","_hoisted_2","_ctx","_cache","$props","$setup","$data","$options","_component_VueMultiselect","_resolveComponent","_component_PlayerList","_component_PlayerChart","_component_WeaponChart","_openBlock","_createElementBlock","_Fragment","selectLabel","deselectLabel","placeholder","modelValue","models","server","$event","options","servers","e","name","onSelect","changeFilter","onRemove","weapon","sortedWeaponList","playerHighlighted","sortedPlayerList","players","username","filters","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","ref","_toDisplayString","kills","deaths","Math","round","max_kill_distance","avg_kill_distance","defineComponent","props","Object","String","emits","data","direction","store","useStore","computed","this","getters","getPlayerList","watch","handler","newval","keys","immediate","newElement","$refs","scrollIntoView","behavior","block","updated","element","methods","arg","sort","a","b","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","components","Scatter","mounted","refreshColors","colors","container","style","getComputedStyle","fg","getPropertyValue","bg","orange","cyan","currentLine","chartData","datasets","label","labels","borderColor","context","backgroundColor","pointRadius","pointStyle","hoverRadius","map","x","y","responsive","maintainAspectRatio","animation","duration","layout","autoPadding","scales","title","text","display","color","ticks","plugins","tooltip","callbacks","ctx","dataset","dataIndex","parsed","annotation","legend","datalabels","formatter","value","borderWidth","borderRadius","align","anchor","clamp","undefined","onHover","native","target","cursor","maxX","max","maxY","endX","endY","annotations","line","type","yMin","xMin","yMax","xMax","borderDash","_component_Doughnut","ArcElement","Doughnut","yellow","green","purple","red","pink","weapons","font","weight","padding","getWeaponList","Number","PlayerList","PlayerChart","VueMultiselect","WeaponChart","minKills","minDeaths","state","fetchPlayerData","async","dispatch","JSON","parse","stringify","promises","push","Promise","all","routes","path","component","PlayerView","router","createRouter","history","createWebHistory","process","Symbol","createStore","playerFilter","entries","filter","fromEntries","mutations","setPlayers","setWeapons","setServers","actions","searchParams","toString","response","fetch","URLSearchParams","json","forEach","commit","modules","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