diff --git a/dist/css/app.d88917c8.css b/dist/css/app.86a8c86e.css
similarity index 98%
rename from dist/css/app.d88917c8.css
rename to dist/css/app.86a8c86e.css
index 30b8d19..02f0cfb 100644
--- a/dist/css/app.d88917c8.css
+++ b/dist/css/app.86a8c86e.css
@@ -1 +1 @@
-:root{--bg-color:#282a36;--accent:#353744;--current-line:#44475a;--comment:#6272a4;--foreground:#f8f8f2;--orange:#ffb86c;--cyan:#8be9fd;--green:#50fa7b;--pink:#ff79c6;--purple:#bd93f9;--red:#f55;--yellow:#f1fa8c}body{background:var(--bg-color);margin:0}#app{height:100vh;width:100vw;font-family:Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-align:center;color:var(--foreground);display:grid;grid-template-areas:"header header" "filters body " "stats body " "footer body ";grid-template-columns:1fr 5fr;grid-template-rows:auto 1fr auto auto}@media only screen and (max-width:922px){#app{grid-template-areas:"header header" "filters filters" "body body ";grid-template-rows:auto auto 1fr}}@media only screen and (max-width:600px){.github-link{display:none}}header{grid-area:header;height:64px;background:var(--bg-color);color:var(--foreground)}nav{display:flex;flex-direction:row;text-align:center;vertical-align:middle}nav a{font-weight:700;color:var(--foreground)}nav a.router-link-exact-active{color:var(--orange)}.navbar-element{text-align:center;line-height:16px;padding:24px 32px}.navbar-element:hover{background:var(--current-line)}.spacer{width:100%}.vlist[data-v-96db01e6]{overflow-y:auto}.vlist[data-v-96db01e6],.vscroll[data-v-96db01e6]{height:calc(100% - 3em)}.playerRow[data-v-96db01e6]:nth-child(odd){background:var(--accent)}.playerRow[data-v-96db01e6]:nth-child(2n){background:var(--current-line)}.playerRow[data-v-96db01e6]:hover{background:var(--bg-color)}.playerRow>div[data-v-96db01e6]:not(:last-child){border-right:solid var(--bg-color) 2px}.playerRow>div[data-v-96db01e6]{padding:.5em .8em 0 .25em;overflow:hidden}.playerTable *{box-sizing:border-box}.playerTable{grid-area:list;margin-right:1rem;height:100%;-webkit-user-select:none;-moz-user-select:none;user-select:none}.playerHeaders,.playerRow{box-sizing:border-box;display:grid;grid-template-columns:5ch 20ch 6ch 6ch 6ch 10ch 1fr;background:var(--bg-color);text-align:left;cursor:pointer;margin:0;transition:border .25s;height:2em}.playerHeaders{position:sticky;top:0;height:3em}.playerHeaders>span{padding:.5em .8em 0 .25em}.playerHeaders{background:var(--current-line)}.playerHeaders div:hover{background:var(--bg-color)}.playerHeaders>div:not(:last-child){border-right:solid var(--bg-color) 2px}.playerHeaders>span:last-child{width:100%}@media only screen and (max-width:600px){.playerHeaders>span:nth-child(6),.playerHeaders>span:nth-child(7),.playerRow>div:nth-child(6),.playerRow>div:nth-child(7){display:none}.playerHeaders,.playerRow{grid-template-columns:5ch 20ch 6ch 6ch 1fr}}.player span{pointer-events:none}.selected{background:var(--comment)!important}canvas[data-v-e83d63ce]{background:var(--accent)}.playerChart[data-v-e83d63ce]{position:relative}#refreshChart[data-v-e83d63ce]{position:absolute;top:0;left:0}@media only screen and (max-width:922px){canvas[data-v-e83d63ce]{display:none!important}}.weaponChart[data-v-921138fe]{width:calc(min(50vw, 50vh) - 3em);height:calc(min(50vw, 50vh) - 3em)}@media only screen and (max-width:922px){canvas[data-v-921138fe]{display:none!important}}fieldset[disabled] .multiselect{pointer-events:none}.multiselect__spinner{position:absolute;right:1px;top:1px;width:40px;height:38px;background:#fff;display:block}.multiselect__spinner:after,.multiselect__spinner:before{position:absolute;content:"";top:50%;left:50%;margin:-8px 0 0 -8px;width:16px;height:16px;border-radius:100%;border-color:#41b883 transparent transparent;border-style:solid;border-width:2px;box-shadow:0 0 0 1px transparent}.multiselect__spinner:before{animation:spinning 2.4s cubic-bezier(.41,.26,.2,.62);animation-iteration-count:infinite}.multiselect__spinner:after{animation:spinning 2.4s cubic-bezier(.51,.09,.21,.8);animation-iteration-count:infinite}.multiselect__loading-enter-active,.multiselect__loading-leave-active{transition:opacity .4s ease-in-out;opacity:1}.multiselect__loading-enter,.multiselect__loading-leave-active{opacity:0}.multiselect,.multiselect__input,.multiselect__single{font-family:inherit;font-size:16px;touch-action:manipulation}.multiselect{box-sizing:content-box;display:block;position:relative;width:100%;min-height:40px;text-align:left;color:#35495e}.multiselect *{box-sizing:border-box}.multiselect:focus{outline:none}.multiselect--disabled{background:#ededed;pointer-events:none;opacity:.6}.multiselect--active{z-index:50}.multiselect--active:not(.multiselect--above) .multiselect__current,.multiselect--active:not(.multiselect--above) .multiselect__input,.multiselect--active:not(.multiselect--above) .multiselect__tags{border-bottom-left-radius:0;border-bottom-right-radius:0}.multiselect--active .multiselect__select{transform:rotate(180deg)}.multiselect--above.multiselect--active .multiselect__current,.multiselect--above.multiselect--active .multiselect__input,.multiselect--above.multiselect--active .multiselect__tags{border-top-left-radius:0;border-top-right-radius:0}.multiselect__input,.multiselect__single{position:relative;display:inline-block;min-height:20px;line-height:20px;border:none;border-radius:5px;background:#fff;padding:0 0 0 5px;width:100%;transition:border .1s ease;box-sizing:border-box;margin-bottom:8px;vertical-align:top}.multiselect__input::-moz-placeholder{color:#35495e}.multiselect__input::placeholder{color:#35495e}.multiselect__tag~.multiselect__input,.multiselect__tag~.multiselect__single{width:auto}.multiselect__input:hover,.multiselect__single:hover{border-color:#cfcfcf}.multiselect__input:focus,.multiselect__single:focus{border-color:#a8a8a8;outline:none}.multiselect__single{padding-left:5px;margin-bottom:8px}.multiselect__tags-wrap{display:inline}.multiselect__tags{min-height:40px;display:block;padding:8px 40px 0 8px;border-radius:5px;border:1px solid #e8e8e8;background:#fff;font-size:14px}.multiselect__tag{position:relative;display:inline-block;padding:4px 26px 4px 10px;border-radius:5px;margin-right:10px;color:#fff;line-height:1;background:#41b883;margin-bottom:5px;white-space:nowrap;overflow:hidden;max-width:100%;text-overflow:ellipsis}.multiselect__tag-icon{cursor:pointer;margin-left:7px;position:absolute;right:0;top:0;bottom:0;font-weight:700;font-style:normal;width:22px;text-align:center;line-height:22px;transition:all .2s ease;border-radius:5px}.multiselect__tag-icon:after{content:"×";color:#266d4d;font-size:14px}.multiselect__tag-icon:focus:after,.multiselect__tag-icon:hover:after{color:#fff}.multiselect__current{min-height:40px;overflow:hidden;padding:8px 12px 0;padding-right:30px;white-space:nowrap;border-radius:5px;border:1px solid #e8e8e8}.multiselect__current,.multiselect__select{line-height:16px;box-sizing:border-box;display:block;margin:0;text-decoration:none;cursor:pointer}.multiselect__select{position:absolute;width:40px;height:38px;right:1px;top:1px;padding:4px 8px;text-align:center;transition:transform .2s ease}.multiselect__select:before{position:relative;right:0;top:65%;color:#999;margin-top:4px;border-style:solid;border-width:5px 5px 0 5px;border-color:#999 transparent transparent transparent;content:""}.multiselect__placeholder{color:#adadad;display:inline-block;margin-bottom:10px;padding-top:2px}.multiselect--active .multiselect__placeholder{display:none}.multiselect__content-wrapper{position:absolute;display:block;background:#fff;width:100%;max-height:240px;overflow:auto;border:1px solid #e8e8e8;border-top:none;border-bottom-left-radius:5px;border-bottom-right-radius:5px;z-index:50;-webkit-overflow-scrolling:touch}.multiselect__content{list-style:none;display:inline-block;padding:0;margin:0;min-width:100%;vertical-align:top}.multiselect--above .multiselect__content-wrapper{bottom:100%;border-bottom-left-radius:0;border-bottom-right-radius:0;border-top-left-radius:5px;border-top-right-radius:5px;border-bottom:none;border-top:1px solid #e8e8e8}.multiselect__content::-webkit-scrollbar{display:none}.multiselect__element{display:block}.multiselect__option{display:block;padding:12px;min-height:40px;line-height:16px;text-decoration:none;text-transform:none;vertical-align:middle;position:relative;cursor:pointer;white-space:nowrap}.multiselect__option:after{top:0;right:0;position:absolute;line-height:40px;padding-right:12px;padding-left:20px;font-size:13px}.multiselect__option--highlight{background:#41b883;outline:none;color:#fff}.multiselect__option--highlight:after{content:attr(data-select);background:#41b883;color:#fff}.multiselect__option--selected{background:#f3f3f3;color:#35495e;font-weight:700}.multiselect__option--selected:after{content:attr(data-selected);color:silver;background:inherit}.multiselect__option--selected.multiselect__option--highlight{background:#ff6a6a;color:#fff}.multiselect__option--selected.multiselect__option--highlight:after{background:#ff6a6a;content:attr(data-deselect);color:#fff}.multiselect--disabled .multiselect__current,.multiselect--disabled .multiselect__select{background:#ededed;color:#a6a6a6}.multiselect__option--disabled{background:#ededed!important;color:#a6a6a6!important;cursor:text;pointer-events:none}.multiselect__option--group{background:#ededed;color:#35495e}.multiselect__option--group.multiselect__option--highlight{background:#35495e;color:#fff}.multiselect__option--group.multiselect__option--highlight:after{background:#35495e}.multiselect__option--disabled.multiselect__option--highlight{background:#dedede}.multiselect__option--group-selected.multiselect__option--highlight{background:#ff6a6a;color:#fff}.multiselect__option--group-selected.multiselect__option--highlight:after{background:#ff6a6a;content:attr(data-deselect);color:#fff}.multiselect-enter-active,.multiselect-leave-active{transition:all .15s ease}.multiselect-enter,.multiselect-leave-active{opacity:0}.multiselect__strong{margin-bottom:8px;line-height:20px;display:inline-block;vertical-align:top}[dir=rtl] .multiselect{text-align:right}[dir=rtl] .multiselect__select{right:auto;left:1px}[dir=rtl] .multiselect__tags{padding:8px 8px 0 40px}[dir=rtl] .multiselect__content{text-align:right}[dir=rtl] .multiselect__option:after{right:auto;left:0}[dir=rtl] .multiselect__clear{right:auto;left:12px}[dir=rtl] .multiselect__spinner{right:auto;left:1px}@keyframes spinning{0%{transform:rotate(0)}to{transform:rotate(2turn)}}.multiselect[data-v-1aa0e63c]{margin:0 .5em 1em .5em}.multiselect-wrapper[data-v-1aa0e63c]{display:flex}.multiselect-wrapper button[data-v-1aa0e63c]{margin:0 0 1em 0;font-size:16px}#playerView[data-v-1aa0e63c]{margin:0 1rem 1rem 1rem;display:grid;overflow:auto;grid-template-areas:"list chart" "list info";grid-template-columns:50% 50%;grid-template-rows:50% 50%}@media only screen and (max-width:922px){#playerView[data-v-1aa0e63c]{margin:0 1rem 1rem 1rem;display:grid;overflow:auto;grid-template-areas:"list list";grid-template-columns:100%;grid-template-rows:100%;width:calc(100vw - 1em);margin:0 0 1rem 1rem}.multiselect-wrapper button[data-v-1aa0e63c]{margin:0 .5em 1em 0}.multiselect[data-v-1aa0e63c]{width:calc(100% - 1em)}.playerChart[data-v-1aa0e63c],.weaponChart[data-v-1aa0e63c]{display:none}}#filters[data-v-1aa0e63c]{grid-area:filters}
\ No newline at end of file
+:root{--bg-color:#282a36;--accent:#353744;--current-line:#44475a;--comment:#6272a4;--foreground:#f8f8f2;--orange:#ffb86c;--cyan:#8be9fd;--green:#50fa7b;--pink:#ff79c6;--purple:#bd93f9;--red:#f55;--yellow:#f1fa8c}body{background:var(--bg-color);margin:0}#app{height:100vh;width:100vw;font-family:Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-align:center;color:var(--foreground);display:grid;grid-template-areas:"header header" "filters body " "stats body " "footer body ";grid-template-columns:1fr 5fr;grid-template-rows:auto 1fr auto auto}@media only screen and (max-width:922px){#app{grid-template-areas:"header header" "filters filters" "body body ";grid-template-rows:auto auto 1fr}}@media only screen and (max-width:600px){.github-link{display:none}}header{grid-area:header;height:64px;background:var(--bg-color);color:var(--foreground)}nav{display:flex;flex-direction:row;text-align:center;vertical-align:middle}nav a{font-weight:700;color:var(--foreground)}nav a.router-link-exact-active{color:var(--orange)}.navbar-element{text-align:center;line-height:16px;padding:24px 32px}.navbar-element:hover{background:var(--current-line)}.spacer{width:100%}.vlist[data-v-96db01e6]{overflow-y:auto}.vlist[data-v-96db01e6],.vscroll[data-v-96db01e6]{height:calc(100% - 3em)}.playerRow[data-v-96db01e6]:nth-child(odd){background:var(--accent)}.playerRow[data-v-96db01e6]:nth-child(2n){background:var(--current-line)}.playerRow[data-v-96db01e6]:hover{background:var(--bg-color)}.playerRow>div[data-v-96db01e6]:not(:last-child){border-right:solid var(--bg-color) 2px}.playerRow>div[data-v-96db01e6]{padding:.5em .8em 0 .25em;overflow:hidden}.playerTable *{box-sizing:border-box}.playerTable{grid-area:list;margin-right:1rem;height:100%;-webkit-user-select:none;-moz-user-select:none;user-select:none}.playerHeaders,.playerRow{box-sizing:border-box;display:grid;grid-template-columns:5ch 20ch 6ch 6ch 6ch 10ch 1fr;background:var(--bg-color);text-align:left;cursor:pointer;margin:0;transition:border .25s;height:2em}.playerHeaders{position:sticky;top:0;height:3em}.playerHeaders>span{padding:.5em .8em 0 .25em}.playerHeaders{background:var(--current-line)}.playerHeaders div:hover{background:var(--bg-color)}.playerHeaders>div:not(:last-child){border-right:solid var(--bg-color) 2px}.playerHeaders>span:last-child{width:100%}@media only screen and (max-width:600px){.playerHeaders>span:nth-child(6),.playerHeaders>span:nth-child(7),.playerRow>div:nth-child(6),.playerRow>div:nth-child(7){display:none}.playerHeaders,.playerRow{grid-template-columns:5ch 20ch 6ch 6ch 1fr}}.player span{pointer-events:none}.selected{background:var(--comment)!important}canvas[data-v-e83d63ce]{background:var(--accent)}.playerChart[data-v-e83d63ce]{position:relative}#refreshChart[data-v-e83d63ce]{position:absolute;top:0;left:0}@media only screen and (max-width:922px){canvas[data-v-e83d63ce]{display:none!important}}.weaponChart[data-v-52416ec3]{width:calc(min(50vw, 50vh) - 3em);height:calc(min(50vw, 50vh) - 3em)}@media only screen and (max-width:922px){canvas[data-v-52416ec3]{display:none!important}}fieldset[disabled] .multiselect{pointer-events:none}.multiselect__spinner{position:absolute;right:1px;top:1px;width:40px;height:38px;background:#fff;display:block}.multiselect__spinner:after,.multiselect__spinner:before{position:absolute;content:"";top:50%;left:50%;margin:-8px 0 0 -8px;width:16px;height:16px;border-radius:100%;border-color:#41b883 transparent transparent;border-style:solid;border-width:2px;box-shadow:0 0 0 1px transparent}.multiselect__spinner:before{animation:spinning 2.4s cubic-bezier(.41,.26,.2,.62);animation-iteration-count:infinite}.multiselect__spinner:after{animation:spinning 2.4s cubic-bezier(.51,.09,.21,.8);animation-iteration-count:infinite}.multiselect__loading-enter-active,.multiselect__loading-leave-active{transition:opacity .4s ease-in-out;opacity:1}.multiselect__loading-enter,.multiselect__loading-leave-active{opacity:0}.multiselect,.multiselect__input,.multiselect__single{font-family:inherit;font-size:16px;touch-action:manipulation}.multiselect{box-sizing:content-box;display:block;position:relative;width:100%;min-height:40px;text-align:left;color:#35495e}.multiselect *{box-sizing:border-box}.multiselect:focus{outline:none}.multiselect--disabled{background:#ededed;pointer-events:none;opacity:.6}.multiselect--active{z-index:50}.multiselect--active:not(.multiselect--above) .multiselect__current,.multiselect--active:not(.multiselect--above) .multiselect__input,.multiselect--active:not(.multiselect--above) .multiselect__tags{border-bottom-left-radius:0;border-bottom-right-radius:0}.multiselect--active .multiselect__select{transform:rotate(180deg)}.multiselect--above.multiselect--active .multiselect__current,.multiselect--above.multiselect--active .multiselect__input,.multiselect--above.multiselect--active .multiselect__tags{border-top-left-radius:0;border-top-right-radius:0}.multiselect__input,.multiselect__single{position:relative;display:inline-block;min-height:20px;line-height:20px;border:none;border-radius:5px;background:#fff;padding:0 0 0 5px;width:100%;transition:border .1s ease;box-sizing:border-box;margin-bottom:8px;vertical-align:top}.multiselect__input::-moz-placeholder{color:#35495e}.multiselect__input::placeholder{color:#35495e}.multiselect__tag~.multiselect__input,.multiselect__tag~.multiselect__single{width:auto}.multiselect__input:hover,.multiselect__single:hover{border-color:#cfcfcf}.multiselect__input:focus,.multiselect__single:focus{border-color:#a8a8a8;outline:none}.multiselect__single{padding-left:5px;margin-bottom:8px}.multiselect__tags-wrap{display:inline}.multiselect__tags{min-height:40px;display:block;padding:8px 40px 0 8px;border-radius:5px;border:1px solid #e8e8e8;background:#fff;font-size:14px}.multiselect__tag{position:relative;display:inline-block;padding:4px 26px 4px 10px;border-radius:5px;margin-right:10px;color:#fff;line-height:1;background:#41b883;margin-bottom:5px;white-space:nowrap;overflow:hidden;max-width:100%;text-overflow:ellipsis}.multiselect__tag-icon{cursor:pointer;margin-left:7px;position:absolute;right:0;top:0;bottom:0;font-weight:700;font-style:normal;width:22px;text-align:center;line-height:22px;transition:all .2s ease;border-radius:5px}.multiselect__tag-icon:after{content:"×";color:#266d4d;font-size:14px}.multiselect__tag-icon:focus:after,.multiselect__tag-icon:hover:after{color:#fff}.multiselect__current{min-height:40px;overflow:hidden;padding:8px 12px 0;padding-right:30px;white-space:nowrap;border-radius:5px;border:1px solid #e8e8e8}.multiselect__current,.multiselect__select{line-height:16px;box-sizing:border-box;display:block;margin:0;text-decoration:none;cursor:pointer}.multiselect__select{position:absolute;width:40px;height:38px;right:1px;top:1px;padding:4px 8px;text-align:center;transition:transform .2s ease}.multiselect__select:before{position:relative;right:0;top:65%;color:#999;margin-top:4px;border-style:solid;border-width:5px 5px 0 5px;border-color:#999 transparent transparent transparent;content:""}.multiselect__placeholder{color:#adadad;display:inline-block;margin-bottom:10px;padding-top:2px}.multiselect--active .multiselect__placeholder{display:none}.multiselect__content-wrapper{position:absolute;display:block;background:#fff;width:100%;max-height:240px;overflow:auto;border:1px solid #e8e8e8;border-top:none;border-bottom-left-radius:5px;border-bottom-right-radius:5px;z-index:50;-webkit-overflow-scrolling:touch}.multiselect__content{list-style:none;display:inline-block;padding:0;margin:0;min-width:100%;vertical-align:top}.multiselect--above .multiselect__content-wrapper{bottom:100%;border-bottom-left-radius:0;border-bottom-right-radius:0;border-top-left-radius:5px;border-top-right-radius:5px;border-bottom:none;border-top:1px solid #e8e8e8}.multiselect__content::-webkit-scrollbar{display:none}.multiselect__element{display:block}.multiselect__option{display:block;padding:12px;min-height:40px;line-height:16px;text-decoration:none;text-transform:none;vertical-align:middle;position:relative;cursor:pointer;white-space:nowrap}.multiselect__option:after{top:0;right:0;position:absolute;line-height:40px;padding-right:12px;padding-left:20px;font-size:13px}.multiselect__option--highlight{background:#41b883;outline:none;color:#fff}.multiselect__option--highlight:after{content:attr(data-select);background:#41b883;color:#fff}.multiselect__option--selected{background:#f3f3f3;color:#35495e;font-weight:700}.multiselect__option--selected:after{content:attr(data-selected);color:silver;background:inherit}.multiselect__option--selected.multiselect__option--highlight{background:#ff6a6a;color:#fff}.multiselect__option--selected.multiselect__option--highlight:after{background:#ff6a6a;content:attr(data-deselect);color:#fff}.multiselect--disabled .multiselect__current,.multiselect--disabled .multiselect__select{background:#ededed;color:#a6a6a6}.multiselect__option--disabled{background:#ededed!important;color:#a6a6a6!important;cursor:text;pointer-events:none}.multiselect__option--group{background:#ededed;color:#35495e}.multiselect__option--group.multiselect__option--highlight{background:#35495e;color:#fff}.multiselect__option--group.multiselect__option--highlight:after{background:#35495e}.multiselect__option--disabled.multiselect__option--highlight{background:#dedede}.multiselect__option--group-selected.multiselect__option--highlight{background:#ff6a6a;color:#fff}.multiselect__option--group-selected.multiselect__option--highlight:after{background:#ff6a6a;content:attr(data-deselect);color:#fff}.multiselect-enter-active,.multiselect-leave-active{transition:all .15s ease}.multiselect-enter,.multiselect-leave-active{opacity:0}.multiselect__strong{margin-bottom:8px;line-height:20px;display:inline-block;vertical-align:top}[dir=rtl] .multiselect{text-align:right}[dir=rtl] .multiselect__select{right:auto;left:1px}[dir=rtl] .multiselect__tags{padding:8px 8px 0 40px}[dir=rtl] .multiselect__content{text-align:right}[dir=rtl] .multiselect__option:after{right:auto;left:0}[dir=rtl] .multiselect__clear{right:auto;left:12px}[dir=rtl] .multiselect__spinner{right:auto;left:1px}@keyframes spinning{0%{transform:rotate(0)}to{transform:rotate(2turn)}}.multiselect[data-v-1aa0e63c]{margin:0 .5em 1em .5em}.multiselect-wrapper[data-v-1aa0e63c]{display:flex}.multiselect-wrapper button[data-v-1aa0e63c]{margin:0 0 1em 0;font-size:16px}#playerView[data-v-1aa0e63c]{margin:0 1rem 1rem 1rem;display:grid;overflow:auto;grid-template-areas:"list chart" "list info";grid-template-columns:50% 50%;grid-template-rows:50% 50%}@media only screen and (max-width:922px){#playerView[data-v-1aa0e63c]{margin:0 1rem 1rem 1rem;display:grid;overflow:auto;grid-template-areas:"list list";grid-template-columns:100%;grid-template-rows:100%;width:calc(100vw - 1em);margin:0 0 1rem 1rem}.multiselect-wrapper button[data-v-1aa0e63c]{margin:0 .5em 1em 0}.multiselect[data-v-1aa0e63c]{width:calc(100% - 1em)}.playerChart[data-v-1aa0e63c],.weaponChart[data-v-1aa0e63c]{display:none}}#filters[data-v-1aa0e63c]{grid-area:filters}
\ No newline at end of file
diff --git a/dist/index.html b/dist/index.html
index bc8da2b..7854abc 100644
--- a/dist/index.html
+++ b/dist/index.html
@@ -1 +1 @@
-
toneapi_webclient We're sorry but toneapi_webclient doesn't work properly without JavaScript enabled. Please enable it to continue.
\ No newline at end of file
+toneapi_webclient We're sorry but toneapi_webclient doesn't work properly without JavaScript enabled. Please enable it to continue.
\ No newline at end of file
diff --git a/dist/js/app.62152a64.js b/dist/js/app.4d4cdd18.js
similarity index 60%
rename from dist/js/app.62152a64.js
rename to dist/js/app.4d4cdd18.js
index 7f21d3c..852fab3 100644
--- a/dist/js/app.62152a64.js
+++ b/dist/js/app.4d4cdd18.js
@@ -1,2 +1,2 @@
-(function(){"use strict";var e={9877:function(e,t,r){var a=r(3862),i=r(3396);const s=(0,i.uE)('TONE API
',4);function l(e,t,r,a,l,n){const o=(0,i.up)("router-link"),p=(0,i.up)("router-view");return(0,i.wg)(),(0,i.iD)(i.HY,null,[(0,i._)("header",null,[(0,i._)("nav",null,[s,(0,i.Wm)(o,{to:"/",class:"navbar-element"},{default:(0,i.w5)((()=>[(0,i.Uk)("Players")])),_:1})])]),(0,i.Wm)(p)],64)}var n=(0,i.aZ)({}),o=r(89);const p=(0,o.Z)(n,[["render",l]]);var h=p,d=r(2483);const u={id:"filters"},c={class:"multiselect-wrapper"},g=["disabled"],m={class:"multiselect-wrapper"},y=["disabled"],_={class:"multiselect-wrapper"},f=["disabled"],v={id:"playerView"};function w(e,t,r,a,s,l){const n=(0,i.up)("VueMultiselect"),o=(0,i.up)("PlayerList"),p=(0,i.up)("PlayerChart"),h=(0,i.up)("WeaponChart");return(0,i.wg)(),(0,i.iD)(i.HY,null,[(0,i._)("div",u,[(0,i._)("span",c,[(0,i.Wm)(n,{selectLabel:"",deselectLabel:"remove",placeholder:"Select server",modelValue:e.model.server,"onUpdate:modelValue":t[0]||(t[0]=t=>e.model.server=t),options:e.groupedServers,"group-values":"servers",group_label:"id","group-select":!1,"allow-empty":!0,multiple:!1,"custom-label":e=>e.name,"track-by":"name",label:"name"},null,8,["modelValue","options","custom-label"]),(0,i._)("button",{onClick:t[1]||(t[1]=t=>e.model.server=void 0),disabled:!e.model.server},"X",8,g)]),(0,i._)("span",m,[(0,i.Wm)(n,{selectLabel:"",deselectLabel:"remove",placeholder:"Select weapon",modelValue:e.model.weapon,"onUpdate:modelValue":t[2]||(t[2]=t=>e.model.weapon=t),"custom-label":t=>e.weaponLocale[t]||t,options:e.sortedWeaponList,"allow-empty":!0},null,8,["modelValue","custom-label","options"]),(0,i._)("button",{onClick:t[3]||(t[3]=t=>e.model.weapon=void 0),disabled:!e.model.weapon},"X",8,y)]),(0,i._)("span",_,[(0,i.Wm)(n,{"options-limit":20,selectLabel:"",deselectLabel:"remove",placeholder:"Search player",modelValue:e.playerHighlighted,"onUpdate:modelValue":t[4]||(t[4]=t=>e.playerHighlighted=t),options:e.sortedPlayerList,"allow-empty":!0,"custom-label":e=>e?.username},null,8,["modelValue","options","custom-label"]),(0,i._)("button",{onClick:t[5]||(t[5]=t=>e.playerHighlighted=void 0),disabled:!e.playerHighlighted},"X",8,f)])]),(0,i._)("div",v,[(0,i.Wm)(o,{filters:e.filters,onHighlightPlayer:e.highlight_player,playerHighlighted:e.playerHighlighted?.id},null,8,["filters","onHighlightPlayer","playerHighlighted"]),(0,i.Wm)(p,{filters:e.filters,onHighlightPlayer:e.highlight_player,playerHighlighted:e.playerHighlighted?.id},null,8,["filters","onHighlightPlayer","playerHighlighted"]),(0,i.Wm)(h,{filters:{player:e.playerHighlighted?.id,...e.filters},playerHighlighted:e.playerHighlighted?.id},null,8,["filters","playerHighlighted"])])],64)}r(7658);var b=r(1020),k=r(5130),P=r(4870);function L(e){return Object.fromEntries(Object.entries(e).filter((e=>void 0!==e[1]&&null!==e[1])))}function x(e,t){try{return e=L(e),t=L(t),k.deepStrictEqual(e,t),!0}catch{return!1}}const S=(0,b.Q_)("kill",{state:()=>({servers:[],players:[],weapons:[],maps:[],gamemodes:[],hosts:{}}),getters:{getPlayerList:e=>t=>e.players.find((e=>x((0,P.SU)(e).filter,t))),getWeaponList:e=>t=>e.weapons.find((e=>x((0,P.SU)(e).filter,t))),getServerList:e=>t=>e.servers.find((e=>x((0,P.SU)(e).filter,t)))},actions:{fetchPlayers(e){e=L(e);let t=this.players.find((t=>x((0,P.SU)(t).filter,e)));return void 0===t&&(t=(0,P.XI)({filter:e,data:{}}),this.players.push(t)),fetch("https://tone.sleepycat.date/v2/client/players?"+new URLSearchParams(e)).then((async e=>{(0,P.SU)(t).data=Object.fromEntries(Object.entries(await e.json()).map((e=>[e[0],(0,P.iH)(e[1])]))),(0,P.oR)(t)})),t},fetchWeapons(e){e=L(e);let t=this.weapons.find((t=>x((0,P.SU)(t).filter,e)));return t||(t=(0,P.XI)({filter:e,data:{}}),this.weapons.push(t)),fetch("https://tone.sleepycat.date/v2/client/weapons?"+new URLSearchParams(e)).then((async e=>{(0,P.SU)(t).data=Object.fromEntries(Object.entries(await e.json()).map((e=>[e[0],(0,P.iH)(e[1])]))),(0,P.oR)(t)})),t},fetchServers(e){e=L(e);let t=this.servers.find((t=>x((0,P.SU)(t).filter,e)));return t||(t=(0,P.XI)({filter:e,data:{}}),this.servers.push(t)),fetch("https://tone.sleepycat.date/v2/client/servers?"+new URLSearchParams(e)).then((async e=>{(0,P.SU)(t).data=Object.fromEntries(Object.entries(await e.json()).map((e=>[e[0],(0,P.iH)(e[1])]))),(0,P.oR)(t)})),t}}});var C=r(7139);const H={class:"playerHeaders"},O=(0,i._)("span",null,null,-1);function V(e,t,r,a,s,l){const n=(0,i.up)("VirtualList");return(0,i.wg)(),(0,i.iD)("div",{class:"playerTable",onKeydown:t[7]||(t[7]=(...t)=>e.selectNextPlayer&&e.selectNextPlayer(...t)),tabindex:"0"},[(0,i._)("div",H,[O,(0,i._)("span",{onClick:t[0]||(t[0]=t=>e.updateSort("username")),class:(0,C.C_)("username"==e.sortingData.argument?"selected":"")},"Username",2),(0,i._)("span",{onClick:t[1]||(t[1]=t=>e.updateSort("kills")),class:(0,C.C_)("kills"==e.sortingData.argument?"selected":"")},"K",2),(0,i._)("span",{onClick:t[2]||(t[2]=t=>e.updateSort("deaths")),class:(0,C.C_)("deaths"==e.sortingData.argument?"selected":"")},"D",2),(0,i._)("span",{onClick:t[3]||(t[3]=t=>e.updateSort("k/d")),class:(0,C.C_)("k/d"==e.sortingData.argument?"selected":"")},"K/D",2),(0,i._)("span",{onClick:t[4]||(t[4]=t=>e.updateSort("max_distance")),class:(0,C.C_)("max_distance"==e.sortingData.argument?"selected":"")},"max distance",2),(0,i._)("span",{onClick:t[5]||(t[5]=t=>e.updateSort("avg_distance")),class:(0,C.C_)("avg_distance"==e.sortingData.argument?"selected":"")},"average distance",2)]),(0,i.Wm)(n,{list:e.playerList,"row-height":32,onHighlightPlayer:t[6]||(t[6]=t=>e.$emit("highlightPlayer",t)),highlighted:e.playerHighlighted},null,8,["list","highlighted"])],32)}const $=["onClick"];function D(e,t,r,a,s,l){return(0,i.wg)(),(0,i.iD)("div",{ref:"vlist",class:"vlist",onScroll:t[0]||(t[0]=(...t)=>e.scroll&&e.scroll(...t))},[(0,i._)("div",{ref:"vscroll",class:"vscroll",style:(0,C.j5)(`padding: ${e.vIndex*e.$props.rowHeight}px 0px ${e.list.length*e.$props.rowHeight-e.vIndex*e.$props.rowHeight}px;`)},[((0,i.wg)(!0),(0,i.iD)(i.HY,null,(0,i.Ko)(e.visibleList,((t,r)=>((0,i.wg)(),(0,i.iD)("div",{class:(0,C.C_)("playerRow "+(t.id===e.$props.highlighted?"selected":"")),key:t.id,onClick:r=>e.$emit("highlightPlayer",t.id),ref_for:!0,ref:"player:"+t.id},[(0,i._)("div",null,[(0,i._)("span",null,(0,C.zw)(r+1+e.vIndex),1)]),(0,i._)("div",null,[(0,i._)("span",null,(0,C.zw)(t.value.username),1)]),(0,i._)("div",null,[(0,i._)("span",null,(0,C.zw)(t.value.kills),1)]),(0,i._)("div",null,[(0,i._)("span",null,(0,C.zw)(t.value.deaths),1)]),(0,i._)("div",null,[(0,i._)("span",null,(0,C.zw)(Math.round(t.value.kills/Math.max(1,t.value.deaths)*100)/100),1)]),(0,i._)("div",null,[(0,i._)("span",null,(0,C.zw)(t.value.max_distance),1)]),(0,i._)("div",null,[(0,i._)("span",null,(0,C.zw)(Math.round(100*(t.value.total_distance/t.value.kills||0))/100),1)])],10,$)))),128))],4)],544)}var I=(0,i.aZ)({data(){return{toLoad:10,vlistHeight:0,vIndex:0}},props:{list:{type:Array,default:()=>[]},rowHeight:{type:Number,default:()=>32},highlighted:String},emits:["highlightPlayer"],computed:{visibleList(){return this.list.slice(Math.max(this.vIndex,0),Math.min(this.vIndex+3*this.visibleCount,this.list.length))},visibleCount(){return Math.ceil(this.vlistHeight/this.$props.rowHeight)}},watch:{list(){this.vlistHeight=this.$refs.vlist?.getBoundingClientRect().height||0},highlighted(e){e&&setTimeout((()=>this.$refs.vlist?.scrollBy({top:this.list.findIndex((t=>t.id===e))*this.rowHeight-this.$refs.vlist?.scrollTop-(this.vlistHeight/2-this.$props.rowHeight),behavior:"smooth"})),1)}},methods:{scroll(e){const t=e.target?.scrollTop,r=Math.round(t/this.$props.rowHeight),a=Math.max(0,r-this.visibleCount)this.vIndex+2*this.visibleCount;a?this.vIndex=Math.max(0,4*Math.floor((r-this.visibleCount)/4)):i&&(this.vIndex=Math.max(0,4*Math.floor(r/4)))}}});const W=(0,o.Z)(I,[["render",D],["__scopeId","data-v-96db01e6"]]);var M=W,j=(0,i.aZ)({components:{VirtualList:M},props:{filters:{type:Object,default:()=>({})},playerHighlighted:String},emits:["highlightPlayer"],data(){return{sortingData:{direction:-1,argument:"kills"},store:S()}},computed:{players(){const{player:e,...t}=this.filters,r=this.store.getPlayerList(t)?.value.data;return r||this.store.fetchPlayers(t).value.data},playerList(){if(!this.players)return[];const e=Object.entries(this.players).map((e=>{const t={},r=new Proxy(e[1],t);return r.id=e[0],r})),t=new Date;if("username"===this.sortingData.argument){const t=new Intl.Collator("en",{numeric:!0,sensitivity:"base"});e.sort(((e,r)=>{const a=e._rawValue,i=r._rawValue;return t.compare(a.username,i.username)}))}else if("k/d"===this.sortingData.argument)e.sort(((e,t)=>{const r=e._rawValue,a=t._rawValue;return r.kills/Math.max(1,r.deaths)-a.kills/Math.max(1,a.deaths)}));else if("avg_distance"===this.sortingData.argument)e.sort(((e,t)=>{const r=e._rawValue,a=t._rawValue;return(r.total_distance/r.kills||0)-(a.total_distance/a.kills||0)}));else{const t=this.sortingData.argument;e.sort(((e,r)=>{const a=e._rawValue,i=r._rawValue;return a[t]-i[t]}))}return console.log("Sorting the player object took + "+((new Date).getTime()-t.getTime())+"ms"),this.sortingData.direction<0&&e.reverse(),e}},watch:{playerHighlighted(e){this.scrollToPlayer(e)},playerList(){this.playerHighlighted&&this.scrollToPlayer(this.playerHighlighted)}},updated(){},methods:{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.playerList.findIndex((e=>e.id===this.$props.playerHighlighted));let a=r+t[e.key];a>=this.playerList.length&&(a=this.playerList.length-1),a<0&&(a=0),this.$emit("highlightPlayer",this.playerList[a].id)},updateSort(e){this.sortingData.argument===e?this.sortingData.direction*=-1:this.sortingData.direction=-1,this.sortingData.argument=e},scrollToPlayer(e){const t=this.$refs["player:"+e];setTimeout((function(){t&&t[0]&&t[0].scrollIntoView({behavior:"smooth",block:"center"})}),10)}}});const R=(0,o.Z)(j,[["render",V]]);var A=R;const U={class:"playerChart",ref:"container"};function T(e,t,r,a,s,l){const n=(0,i.up)("Scatter");return(0,i.wg)(),(0,i.iD)("div",U,[(0,i.Wm)(n,{data:e.chart,options:e.chartOptions},null,8,["data","options"])],512)}var E=r(3254),q=r(9152),Z=r(1131),N=r(5866);E.kL.register(E.f$,E.od,E.jn,E.u,E.De,q.Z,Z.Z);var z=(0,i.aZ)({name:"PlayerChart",props:{filters:Object,playerHighlighted:String},data:()=>({store:S(),refreshColors:0,playerData:[]}),emits:["highlightPlayer"],components:{Scatter:N.bp},mounted(){this.refreshColors++},computed:{playerList(){const e=this.store.getPlayerList(this.filters||{})?.value.data;if(!e)return Object.entries(this.store.fetchPlayers(this.filters||{}).value.data).map((e=>({id:e[0],...(0,P.IU)(e[1].value)})));const t=Object.entries(e).map((e=>({id:e[0],...(0,P.IU)(e[1].value)})));return t.sort(((e,t)=>t.kills-e.kills)),t.slice(0,200)},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=this.playerList.findIndex((e=>e.id===this.$props.playerHighlighted)),t=this.colors.cyan,r=new Array(this.playerList.length).fill(t);r[e]=this.colors.orange;const a=r,i=new Array(this.playerList.length).fill(1);i[e]=20;const s=new Array(this.playerList.length).fill(4);s[e]=30;const l=new Array(this.playerList.length).fill("circle");return l[e]="crossRot",{datasets:[{label:"Players",labels:this.playerList.map((e=>e.id))||[],borderColor:r,backgroundColor:a,pointRadius:i,pointStyle:l,hoverRadius:s,data:this.playerList.map((e=>({y:e.kills,x:e.deaths})))}]}},chartStaticOptions(){return{responsive:!0,maintainAspectRatio:!1,animation:{duration:500},layout:{autoPadding:!1},scales:{y:{title:{text:"Kills",display:!0,color:this.colors.fg},ticks:{color:this.colors.fg}},x:{title:{text:"Deaths",display:!0,color:this.colors.fg},ticks:{color:this.colors.fg}}},onClick:(e,t)=>{this.$emit("highlightPlayer",t.length>0?this.playerList[t[0].index].id:void 0),void 0!==this.store.getPlayerList(this.filters||{})&&(0,P.oR)(this.store.getPlayerList(this.filters||{}))},onHover:(e,t)=>{e.native.target&&(e.native.target.style.cursor=t[0]?"pointer":"default")}}},chartStaticPlugins(){let e=0,t=0;if(this.playerList){const r=Math.max(...this.playerList.map((e=>e.deaths))),a=Math.max(...this.playerList.map((e=>e.kills)));a>r?(e=r,t=r/a*a):(t=a,e=a/r*r)}return{tooltip:{callbacks:{label:e=>{let t;return t=this.playerList?this.playerList[e.dataIndex].username:e.dataset.labels[e.dataIndex],t+=" ("+e.parsed.y+" kills "+e.parsed.x+" deaths)",t}}},annotation:{annotations:{line:{type:"line",yMin:0,xMin:0,yMax:t,xMax:e,borderWidth:2,borderColor:this.colors.orange,borderDash:[1,5]}}},legend:{display:!1}}},chartOptions(){return this.$props.playerHighlighted,{...this.chartStaticOptions,plugins:{...this.chartStaticPlugins,datalabels:{formatter:(e,t)=>this.playerList[t.dataIndex].username,backgroundColor:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerList[e.dataIndex].id?this.colors.orange:null,borderColor:this.colors.fg,borderWidth:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerList[e.dataIndex].id?1:0,borderRadius:5,display:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerList[e.dataIndex].id?"true":"auto",align:-45,anchor:"end",clamp:!0,color:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerList[e.dataIndex].id?this.colors.bg:this.colors.fg}}}}}});const B=(0,o.Z)(z,[["render",T],["__scopeId","data-v-e83d63ce"]]);var F=B;const G={class:"weaponChart",ref:"container"};function K(e,t,r,a,s,l){const n=(0,i.up)("Doughnut");return(0,i.wg)(),(0,i.iD)("div",G,[(0,i.Wm)(n,{data:e.chart,options:e.chartOptions},null,8,["data","options"])],512)}var X=JSON.parse('{"rodeo_battery_removal":"Rodeo Battery Removal","human_execution":"Human Execution","melee_pilot_kunai":"Kunai Melee","execution":"Execution","mp_weapon_car":"CAR","mp_weapon_defender":"Charge Rifle","mp_weapon_doubletake":"Double Take","mp_weapon_epg":"EPG-1","mp_weapon_hemlok_smg":"Volt","mp_weapon_lstar":"L-STAR","mp_weapon_r97":"R-97","mp_weapon_rspn101":"R-201","mp_weapon_smart_pistol":"Smart Pistol","mp_weapon_sniper":"Kraber","mp_weapon_vinson":"Flatline","mp_weapon_autopistol":"RE-45 auto","mp_weapon_alternator_smg":"Alternator","mp_weapon_frag_grenade":"Frag Grenade","mp_weapon_g2":"G2","mp_weapon_lmg":"Spitfire","mp_weapon_smr":"Sidewinder SMR","mp_weapon_softball":"Softball","mp_weapon_thermite_grenade":"Firestar","pilot_emptyhanded":"Melee","mp_weapon_mastiff":"Mastiff","mp_weapon_mgl":"MGL","mp_weapon_rspn101_og":"R-101","mp_weapon_wingman":"Wingman","invalid":"invalid","mp_weapon_arc_launcher":"Thunderbolt","mp_weapon_dmr":"DMR","mp_weapon_grenade_electric_smoke":"Electric Smoke","mp_weapon_pulse_lmg":"Cold War","mp_weapon_satchel":"Satchel","mp_weapon_shotgun":"EVA-8 Auto","mp_weapon_shotgun_pistol":"Mozambique","mp_weapon_wingman_n":"Wingman Elite","mp_weapon_grenade_gravity":"Gravity Star","mp_weapon_grenade_sonar":"Pulse Blade","mp_weapon_rocket_launcher":"Archer","outOfBounds":"OutOfBounds","mind_crime":"Mind Crime","mp_weapon_esaw":"Devotion","fall":"Fall","mp_weapon_semipistol":"P2016","mp_weapon_grenade_emp":"Arc Grenade","mp_weapon_hemlok":"Hemlok","melee_pilot_emptyhanded":"Melee","phase_shift":"Phase Shift","damagedef_suicide":"Suicide","damagedef_titan_hotdrop":"Crushed by Titanfall","mp_titanweapon_arc_cannon":"Arc Cannon","mp_weapon_peacekraber":"Peacekraber","damagedef_crush":"Crushed","mp_titanweapon_brute4_quad_rocket":"Quad Rocket Launcher","mp_weapon_turretplasma":"Antititan Turret","mp_titanweapon_xo16_vanguard":"XO-16","mp_titanweapon_sticky_40mm":"40mm Cannon","mp_titanweapon_predator_cannon":"Predator Cannon","mp_titanweapon_leadwall":"Leadwall","mp_titanweapon_sniper":"Plasma Railgun","titan_execution":"Titan Execution","titan_explosion":"Titan Explosion","auto_titan_melee":"Autotitan Melee","mp_titanweapon_vortex_shield_ion":"Vortex Shield","mp_titanweapon_heat_shield":"Heat shield","bubble_shield":"Bubble Shield","mp_titancore_salvo_core":"Salvo Core","mp_titancore_flame_wave":"Flame Wave","mp_titanweapon_flightcore_rockets":"Flight Core","mp_titancore_laser_cannon":"Laser Cannon","mp_titancore_flame_wave_secondary":"Scorched Earth","mp_titanweapon_flame_wall":"Flame Wall","mp_titanweapon_arc_wave":"Arc Wave"}');E.kL.register(E.qi,E.u,E.De,Z.Z);var Y=(0,i.aZ)({name:"PlayerChart",props:{filters:Object,playerHighlighted:String},emits:["highlightPlayer"],components:{Doughnut:N.$I},mounted(){this.refreshColors++},data:()=>({store:S(),refreshColors:0}),computed:{colors(){this.refreshColors;const e={};if(this.$refs.container){const t=getComputedStyle(this.$refs.container);e.fg=t.getPropertyValue("--foreground"),e.bg=t.getPropertyValue("--bg-color"),e.orange=t.getPropertyValue("--orange"),e.cyan=t.getPropertyValue("--cyan"),e.yellow=t.getPropertyValue("--yellow"),e.green=t.getPropertyValue("--green"),e.purple=t.getPropertyValue("--purple"),e.red=t.getPropertyValue("--red"),e.pink=t.getPropertyValue("--pink"),e.currentLine=t.getPropertyValue("--current-line")}else e.fg="#ffffff";return e},chart(){const e=["cyan","green","orange","pink","purple","red","yellow"],t={datasets:[{label:"Weapons",labels:this.sortedWeaponList||[],borderColor:()=>this.colors.fg,backgroundColor:t=>this.colors[e[3*t.dataIndex%e.length]],data:[]}]};return this.sortedWeaponList?(t.datasets[0].data=this.sortedWeaponList.map((e=>this.weapons?this.weapons[e].value.kills:0)),t):t},chartOptions(){this.$props.playerHighlighted;const e={responsive:!0,maintainAspectRatio:!0,animation:{duration:500},layout:{autoPadding:!1},plugins:{datalabels:{formatter:(e,t)=>{const r=this.sortedWeaponList[t.dataIndex];return X[r]||r},backgroundColor:e=>e.dataset.backgroundColor(e),borderColor:this.colors.fg,borderRadius:25,borderWidth:2,color:this.colors.bg,display:e=>e.dataIndex===e.dataset.labels.length-1||"auto",padding:6},tooltip:{callbacks:{label:e=>{let t;return t=this.sortedWeaponList?this.sortedWeaponList[e.dataIndex]:e.dataset.labels[e.dataIndex],t+=" ("+this.weapons[t].value.kills+" kills)",t}}}}};return e},weapons(){const{weapon:e,...t}=this.filters||{},r=this.store.getWeaponList(t)?.value.data;return r||this.store.fetchWeapons(t).value.data},sortedWeaponList(){if(!this.weapons)return[];const e=Object.keys(this.weapons);return e.sort(((e,t)=>Number(this.weapons[e].value.kills)Number(this.weapons[t].value.kills)?1:0)),e}}});const Q=(0,o.Z)(Y,[["render",K],["__scopeId","data-v-921138fe"]]);var J=Q,ee=r(6368),te=(0,i.aZ)({name:"PlayerView",components:{VueMultiselect:ee.ZP,PlayerList:A,PlayerChart:F,WeaponChart:J},data(){return{model:{server:void 0,weapon:void 0},filters:{},store:S(),playerHighlighted:void 0,weaponLocale:X}},created(){let e;this.$route.query.server&&(e={name:this.$route.query.server?.toString()}),this.model={server:e,weapon:this.$route.query.weapon?.toString()}},computed:{servers(){const{server:e,player:t,...r}=this.filters,a=this.store.getServerList(r)?.value.data;return a||(0,P.SU)(this.store.fetchServers(r)).data},groupedServers(){const e=[];return Object.entries(this.servers).forEach((t=>{const r=(0,P.SU)(t[1]);e.find((e=>e.id===r.host+"sfdsdfsd"))||e.push({id:r.host+"sfdsdfsd",servers:[]}),e.find((e=>e.id===r.host+"sfdsdfsd"))?.servers.push({name:t[0],...r})})),e},weapons(){const{weapon:e,player:t,...r}=this.filters,a=this.store.getWeaponList(r)?.value.data;return a||this.store.fetchWeapons(r).value.data},players(){const{player:e,...t}=this.filters,r=this.store.getPlayerList(t)?.value.data;return r||this.store.fetchPlayers(t).value.data},sortedWeaponList(){if(!this.weapons)return[];const e=Object.keys(this.weapons);return e.sort()},sortedServerList(){if(!this.servers)return[];const e=Object.keys(this.servers);return e.sort()},sortedPlayerList(){if(!this.players)return[];const e=Object.entries(this.players).map((e=>({id:e[0],...e[1]._rawValue})));return e.sort(((e,t)=>e.usernamet.username?1:0))}},watch:{players(){const e=this.$route.query.player?.toString();e&&this.playerHighlighted?.id!==e&&this.highlight_player(e)},model:{handler(e){this.filters.server=e.server?.name,this.filters.weapon=e.weapon},deep:!0},filters:{handler(e){const{server:t,weapon:r,...a}=this.$route.query;le.push({query:{...e,...a}})},deep:!0},playerHighlighted(e,t){if(e?.id===t?.id)return;const{player:r,...a}=this.$route.query;le.push({query:{player:e?.id,...a}})},$route(e){if(this.playerHighlighted?.id!==e.query.player){const t=e.query.player?.toString();t&&this.highlight_player(t)}this.filters.weapon!==e.query.weapon&&(this.model.weapon=e.query.weapon),this.filters.server!==e.query.server&&(e.query.server?this.model.server={name:e.query.server}:this.model.server=void 0)}},methods:{highlight_player(e){const t=this.players[e];this.playerHighlighted=t?{id:e,...(0,P.SU)(t)}:void 0}}});const re=(0,o.Z)(te,[["render",w],["__scopeId","data-v-1aa0e63c"]]);var ae=re;const ie=[{path:"/",name:"home",component:ae}],se=(0,d.p7)({history:(0,d.PO)("/ToneAPI_webclient/"),routes:ie});var le=se;const ne=(0,b.WB)();(0,a.ri)(h).use(ne).use(le).mount("#app");S()}},t={};function r(a){var i=t[a];if(void 0!==i)return i.exports;var s=t[a]={exports:{}};return e[a](s,s.exports,r),s.exports}r.m=e,function(){var e=[];r.O=function(t,a,i,s){if(!a){var l=1/0;for(h=0;h=s)&&Object.keys(r.O).every((function(e){return r.O[e](a[o])}))?a.splice(o--,1):(n=!1,s0&&e[h-1][2]>s;h--)e[h]=e[h-1];e[h]=[a,i,s]}}(),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 a in t)r.o(t,a)&&!r.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})}}(),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,a){var i,s,l=a[0],n=a[1],o=a[2],p=0;if(l.some((function(t){return 0!==e[t]}))){for(i in n)r.o(n,i)&&(r.m[i]=n[i]);if(o)var h=o(r)}for(t&&t(a);pTONE API
',4);function l(e,t,a,r,l,n){const o=(0,i.up)("router-link"),p=(0,i.up)("router-view");return(0,i.wg)(),(0,i.iD)(i.HY,null,[(0,i._)("header",null,[(0,i._)("nav",null,[s,(0,i.Wm)(o,{to:"/",class:"navbar-element"},{default:(0,i.w5)((()=>[(0,i.Uk)("Players")])),_:1})])]),(0,i.Wm)(p)],64)}var n=(0,i.aZ)({}),o=a(89);const p=(0,o.Z)(n,[["render",l]]);var h=p,d=a(2483);const u={id:"filters"},c={class:"multiselect-wrapper"},g=["disabled"],m={class:"multiselect-wrapper"},y=["disabled"],_={class:"multiselect-wrapper"},f=["disabled"],v={id:"playerView"};function w(e,t,a,r,s,l){const n=(0,i.up)("VueMultiselect"),o=(0,i.up)("PlayerList"),p=(0,i.up)("PlayerChart"),h=(0,i.up)("WeaponChart");return(0,i.wg)(),(0,i.iD)(i.HY,null,[(0,i._)("div",u,[(0,i._)("span",c,[(0,i.Wm)(n,{selectLabel:"",deselectLabel:"remove",placeholder:"Select server",modelValue:e.model.server,"onUpdate:modelValue":t[0]||(t[0]=t=>e.model.server=t),options:e.groupedServers,"group-values":"servers",group_label:"id","group-select":!1,"allow-empty":!0,multiple:!1,"custom-label":e=>e.name,"track-by":"name",label:"name"},null,8,["modelValue","options","custom-label"]),(0,i._)("button",{onClick:t[1]||(t[1]=t=>e.model.server=void 0),disabled:!e.model.server},"X",8,g)]),(0,i._)("span",m,[(0,i.Wm)(n,{selectLabel:"",deselectLabel:"remove",placeholder:"Select weapon",modelValue:e.model.weapon,"onUpdate:modelValue":t[2]||(t[2]=t=>e.model.weapon=t),"custom-label":t=>e.weaponLocale[t]||t,options:e.sortedWeaponList,"allow-empty":!0},null,8,["modelValue","custom-label","options"]),(0,i._)("button",{onClick:t[3]||(t[3]=t=>e.model.weapon=void 0),disabled:!e.model.weapon},"X",8,y)]),(0,i._)("span",_,[(0,i.Wm)(n,{"options-limit":20,selectLabel:"",deselectLabel:"remove",placeholder:"Search player",modelValue:e.playerHighlighted,"onUpdate:modelValue":t[4]||(t[4]=t=>e.playerHighlighted=t),options:e.sortedPlayerList,"allow-empty":!0,"custom-label":e=>e?.username},null,8,["modelValue","options","custom-label"]),(0,i._)("button",{onClick:t[5]||(t[5]=t=>e.playerHighlighted=void 0),disabled:!e.playerHighlighted},"X",8,f)])]),(0,i._)("div",v,[(0,i.Wm)(o,{filters:e.filters,onHighlightPlayer:e.highlight_player,playerHighlighted:e.playerHighlighted?.id},null,8,["filters","onHighlightPlayer","playerHighlighted"]),(0,i.Wm)(p,{filters:e.filters,onHighlightPlayer:e.highlight_player,playerHighlighted:e.playerHighlighted?.id},null,8,["filters","onHighlightPlayer","playerHighlighted"]),(0,i.Wm)(h,{filters:{player:e.playerHighlighted?.id,...e.filters},playerHighlighted:e.playerHighlighted?.id},null,8,["filters","playerHighlighted"])])],64)}a(7658);var b=a(1020),k=a(5130),L=a(4870);function P(e){return Object.fromEntries(Object.entries(e).filter((e=>void 0!==e[1]&&null!==e[1])))}function x(e,t){try{return e=P(e),t=P(t),k.deepStrictEqual(e,t),!0}catch{return!1}}const S=(0,b.Q_)("kill",{state:()=>({servers:[],players:[],weapons:[],maps:[],gamemodes:[],hosts:{}}),getters:{getPlayerList:e=>t=>e.players.find((e=>x((0,L.SU)(e).filter,t))),getWeaponList:e=>t=>e.weapons.find((e=>x((0,L.SU)(e).filter,t))),getServerList:e=>t=>e.servers.find((e=>x((0,L.SU)(e).filter,t)))},actions:{fetchPlayers(e){e=P(e);let t=this.players.find((t=>x((0,L.SU)(t).filter,e)));return void 0===t&&(t=(0,L.XI)({filter:e,data:{}}),this.players.push(t)),fetch("https://tone.sleepycat.date/v2/client/players?"+new URLSearchParams(e)).then((async e=>{(0,L.SU)(t).data=Object.fromEntries(Object.entries(await e.json()).map((e=>[e[0],(0,L.iH)(e[1])]))),(0,L.oR)(t)})),t},fetchWeapons(e){e=P(e);let t=this.weapons.find((t=>x((0,L.SU)(t).filter,e)));return t||(t=(0,L.XI)({filter:e,data:{}}),this.weapons.push(t)),fetch("https://tone.sleepycat.date/v2/client/weapons?"+new URLSearchParams(e)).then((async e=>{(0,L.SU)(t).data=Object.fromEntries(Object.entries(await e.json()).map((e=>[e[0],(0,L.iH)(e[1])]))),(0,L.oR)(t)})),t},fetchServers(e){e=P(e);let t=this.servers.find((t=>x((0,L.SU)(t).filter,e)));return t||(t=(0,L.XI)({filter:e,data:{}}),this.servers.push(t)),fetch("https://tone.sleepycat.date/v2/client/servers?"+new URLSearchParams(e)).then((async e=>{(0,L.SU)(t).data=Object.fromEntries(Object.entries(await e.json()).map((e=>[e[0],(0,L.iH)(e[1])]))),(0,L.oR)(t)})),t}}});var C=a(7139);const H={class:"playerHeaders"},O=(0,i._)("span",null,null,-1);function D(e,t,a,r,s,l){const n=(0,i.up)("VirtualList");return(0,i.wg)(),(0,i.iD)("div",{class:"playerTable",onKeydown:t[7]||(t[7]=(...t)=>e.selectNextPlayer&&e.selectNextPlayer(...t)),tabindex:"0"},[(0,i._)("div",H,[O,(0,i._)("span",{onClick:t[0]||(t[0]=t=>e.updateSort("username")),class:(0,C.C_)("username"==e.sortingData.argument?"selected":"")},"Username",2),(0,i._)("span",{onClick:t[1]||(t[1]=t=>e.updateSort("kills")),class:(0,C.C_)("kills"==e.sortingData.argument?"selected":"")},"K",2),(0,i._)("span",{onClick:t[2]||(t[2]=t=>e.updateSort("deaths")),class:(0,C.C_)("deaths"==e.sortingData.argument?"selected":"")},"D",2),(0,i._)("span",{onClick:t[3]||(t[3]=t=>e.updateSort("k/d")),class:(0,C.C_)("k/d"==e.sortingData.argument?"selected":"")},"K/D",2),(0,i._)("span",{onClick:t[4]||(t[4]=t=>e.updateSort("max_distance")),class:(0,C.C_)("max_distance"==e.sortingData.argument?"selected":"")},"max distance",2),(0,i._)("span",{onClick:t[5]||(t[5]=t=>e.updateSort("avg_distance")),class:(0,C.C_)("avg_distance"==e.sortingData.argument?"selected":"")},"average distance",2)]),(0,i.Wm)(n,{list:e.playerList,"row-height":32,onHighlightPlayer:t[6]||(t[6]=t=>e.$emit("highlightPlayer",t)),highlighted:e.playerHighlighted},null,8,["list","highlighted"])],32)}const V=["onClick"];function $(e,t,a,r,s,l){return(0,i.wg)(),(0,i.iD)("div",{ref:"vlist",class:"vlist",onScroll:t[0]||(t[0]=(...t)=>e.scroll&&e.scroll(...t))},[(0,i._)("div",{ref:"vscroll",class:"vscroll",style:(0,C.j5)(`padding: ${e.vIndex*e.$props.rowHeight}px 0px ${e.list.length*e.$props.rowHeight-e.vIndex*e.$props.rowHeight}px;`)},[((0,i.wg)(!0),(0,i.iD)(i.HY,null,(0,i.Ko)(e.visibleList,((t,a)=>((0,i.wg)(),(0,i.iD)("div",{class:(0,C.C_)("playerRow "+(t.id===e.$props.highlighted?"selected":"")),key:t.id,onClick:a=>e.$emit("highlightPlayer",t.id),ref_for:!0,ref:"player:"+t.id},[(0,i._)("div",null,[(0,i._)("span",null,(0,C.zw)(a+1+e.vIndex),1)]),(0,i._)("div",null,[(0,i._)("span",null,(0,C.zw)(t.value.username),1)]),(0,i._)("div",null,[(0,i._)("span",null,(0,C.zw)(t.value.kills),1)]),(0,i._)("div",null,[(0,i._)("span",null,(0,C.zw)(t.value.deaths),1)]),(0,i._)("div",null,[(0,i._)("span",null,(0,C.zw)(Math.round(t.value.kills/Math.max(1,t.value.deaths)*100)/100),1)]),(0,i._)("div",null,[(0,i._)("span",null,(0,C.zw)(t.value.max_distance),1)]),(0,i._)("div",null,[(0,i._)("span",null,(0,C.zw)(Math.round(100*(t.value.total_distance/t.value.kills||0))/100),1)])],10,V)))),128))],4)],544)}var W=(0,i.aZ)({data(){return{toLoad:10,vlistHeight:0,vIndex:0}},props:{list:{type:Array,default:()=>[]},rowHeight:{type:Number,default:()=>32},highlighted:String},emits:["highlightPlayer"],computed:{visibleList(){return this.list.slice(Math.max(this.vIndex,0),Math.min(this.vIndex+3*this.visibleCount,this.list.length))},visibleCount(){return Math.ceil(this.vlistHeight/this.$props.rowHeight)}},watch:{list(){this.vlistHeight=this.$refs.vlist?.getBoundingClientRect().height||0},highlighted(e){e&&setTimeout((()=>this.$refs.vlist?.scrollBy({top:this.list.findIndex((t=>t.id===e))*this.rowHeight-this.$refs.vlist?.scrollTop-(this.vlistHeight/2-this.$props.rowHeight),behavior:"smooth"})),1)}},methods:{scroll(e){const t=e.target?.scrollTop,a=Math.round(t/this.$props.rowHeight),r=Math.max(0,a-this.visibleCount)this.vIndex+2*this.visibleCount;r?this.vIndex=Math.max(0,4*Math.floor((a-this.visibleCount)/4)):i&&(this.vIndex=Math.max(0,4*Math.floor(a/4)))}}});const I=(0,o.Z)(W,[["render",$],["__scopeId","data-v-96db01e6"]]);var M=I,j=(0,i.aZ)({components:{VirtualList:M},props:{filters:{type:Object,default:()=>({})},playerHighlighted:String},emits:["highlightPlayer"],data(){return{sortingData:{direction:-1,argument:"kills"},store:S()}},computed:{players(){const{player:e,...t}=this.filters,a=this.store.getPlayerList(t)?.value.data;return a||this.store.fetchPlayers(t).value.data},playerList(){if(!this.players)return[];const e=Object.entries(this.players).map((e=>{const t={},a=new Proxy(e[1],t);return a.id=e[0],a})),t=new Date;if("username"===this.sortingData.argument){const t=new Intl.Collator("en",{numeric:!0,sensitivity:"base"});e.sort(((e,a)=>{const r=e._rawValue,i=a._rawValue;return t.compare(r.username,i.username)}))}else if("k/d"===this.sortingData.argument)e.sort(((e,t)=>{const a=e._rawValue,r=t._rawValue;return a.kills/Math.max(1,a.deaths)-r.kills/Math.max(1,r.deaths)}));else if("avg_distance"===this.sortingData.argument)e.sort(((e,t)=>{const a=e._rawValue,r=t._rawValue;return(a.total_distance/a.kills||0)-(r.total_distance/r.kills||0)}));else{const t=this.sortingData.argument;e.sort(((e,a)=>{const r=e._rawValue,i=a._rawValue;return r[t]-i[t]}))}return console.log("Sorting the player object took + "+((new Date).getTime()-t.getTime())+"ms"),this.sortingData.direction<0&&e.reverse(),e}},watch:{playerHighlighted(e){this.scrollToPlayer(e)},playerList(){this.playerHighlighted&&this.scrollToPlayer(this.playerHighlighted)}},updated(){},methods:{selectNextPlayer(e){const t={Home:-1/0,End:1/0,PageDown:100,PageUp:-100,ArrowUp:-1,ArrowDown:1,ArrowRight:10,ArrowLeft:-10};if(!this.$props.playerHighlighted)return;if(!Object.keys(t).includes(e.key))return;e.preventDefault();const a=this.playerList.findIndex((e=>e.id===this.$props.playerHighlighted));let r=a+t[e.key];r>=this.playerList.length&&(r=this.playerList.length-1),r<0&&(r=0),this.$emit("highlightPlayer",this.playerList[r].id)},updateSort(e){this.sortingData.argument===e?this.sortingData.direction*=-1:this.sortingData.direction=-1,this.sortingData.argument=e},scrollToPlayer(e){const t=this.$refs["player:"+e];setTimeout((function(){t&&t[0]&&t[0].scrollIntoView({behavior:"smooth",block:"center"})}),10)}}});const R=(0,o.Z)(j,[["render",D]]);var A=R;const T={class:"playerChart",ref:"container"};function U(e,t,a,r,s,l){const n=(0,i.up)("Scatter");return(0,i.wg)(),(0,i.iD)("div",T,[(0,i.Wm)(n,{data:e.chart,options:e.chartOptions},null,8,["data","options"])],512)}var E=a(3254),q=a(9152),Z=a(1131),N=a(5866);E.kL.register(E.f$,E.od,E.jn,E.u,E.De,q.Z,Z.Z);var z=(0,i.aZ)({name:"PlayerChart",props:{filters:Object,playerHighlighted:String},data:()=>({store:S(),refreshColors:0,playerData:[]}),emits:["highlightPlayer"],components:{Scatter:N.bp},mounted(){this.refreshColors++},computed:{playerList(){const e=this.store.getPlayerList(this.filters||{})?.value.data;if(!e)return Object.entries(this.store.fetchPlayers(this.filters||{}).value.data).map((e=>({id:e[0],...(0,L.IU)(e[1].value)})));const t=Object.entries(e).map((e=>({id:e[0],...(0,L.IU)(e[1].value)})));return t.sort(((e,t)=>t.kills-e.kills)),t.slice(0,200)},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=this.playerList.findIndex((e=>e.id===this.$props.playerHighlighted)),t=this.colors.cyan,a=new Array(this.playerList.length).fill(t);a[e]=this.colors.orange;const r=a,i=new Array(this.playerList.length).fill(1);i[e]=20;const s=new Array(this.playerList.length).fill(4);s[e]=30;const l=new Array(this.playerList.length).fill("circle");return l[e]="crossRot",{datasets:[{label:"Players",labels:this.playerList.map((e=>e.id))||[],borderColor:a,backgroundColor:r,pointRadius:i,pointStyle:l,hoverRadius:s,data:this.playerList.map((e=>({y:e.kills,x:e.deaths})))}]}},chartStaticOptions(){return{responsive:!0,maintainAspectRatio:!1,animation:{duration:500},layout:{autoPadding:!1},scales:{y:{title:{text:"Kills",display:!0,color:this.colors.fg},ticks:{color:this.colors.fg}},x:{title:{text:"Deaths",display:!0,color:this.colors.fg},ticks:{color:this.colors.fg}}},onClick:(e,t)=>{this.$emit("highlightPlayer",t.length>0?this.playerList[t[0].index].id:void 0),void 0!==this.store.getPlayerList(this.filters||{})&&(0,L.oR)(this.store.getPlayerList(this.filters||{}))},onHover:(e,t)=>{e.native.target&&(e.native.target.style.cursor=t[0]?"pointer":"default")}}},chartStaticPlugins(){let e=0,t=0;if(this.playerList){const a=Math.max(...this.playerList.map((e=>e.deaths))),r=Math.max(...this.playerList.map((e=>e.kills)));r>a?(e=a,t=a/r*r):(t=r,e=r/a*a)}return{tooltip:{callbacks:{label:e=>{let t;return t=this.playerList?this.playerList[e.dataIndex].username:e.dataset.labels[e.dataIndex],t+=" ("+e.parsed.y+" kills "+e.parsed.x+" deaths)",t}}},annotation:{annotations:{line:{type:"line",yMin:0,xMin:0,yMax:t,xMax:e,borderWidth:2,borderColor:this.colors.orange,borderDash:[1,5]}}},legend:{display:!1}}},chartOptions(){return this.$props.playerHighlighted,{...this.chartStaticOptions,plugins:{...this.chartStaticPlugins,datalabels:{formatter:(e,t)=>this.playerList[t.dataIndex].username,backgroundColor:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerList[e.dataIndex].id?this.colors.orange:null,borderColor:this.colors.fg,borderWidth:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerList[e.dataIndex].id?1:0,borderRadius:5,display:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerList[e.dataIndex].id?"true":"auto",align:-45,anchor:"end",clamp:!0,color:e=>this.$props.playerHighlighted&&this.$props.playerHighlighted===this.playerList[e.dataIndex].id?this.colors.bg:this.colors.fg}}}}}});const B=(0,o.Z)(z,[["render",U],["__scopeId","data-v-e83d63ce"]]);var F=B;const G={class:"weaponChart",ref:"container"};function K(e,t,a,r,s,l){const n=(0,i.up)("Doughnut");return(0,i.wg)(),(0,i.iD)("div",G,[(0,i.Wm)(n,{data:e.chart,options:e.chartOptions},null,8,["data","options"])],512)}var X=JSON.parse('{"rodeo_battery_removal":"Rodeo Battery Removal","human_execution":"Human Execution","melee_pilot_kunai":"Kunai Melee","execution":"Execution","mp_weapon_car":"CAR","mp_weapon_defender":"Charge Rifle","mp_weapon_doubletake":"Double Take","mp_weapon_epg":"EPG-1","mp_weapon_hemlok_smg":"Volt","mp_weapon_lstar":"L-STAR","mp_weapon_r97":"R-97","mp_weapon_rspn101":"R-201","mp_weapon_smart_pistol":"Smart Pistol","mp_weapon_sniper":"Kraber","mp_weapon_vinson":"Flatline","mp_weapon_autopistol":"RE-45 auto","mp_weapon_alternator_smg":"Alternator","mp_weapon_frag_grenade":"Frag Grenade","mp_weapon_g2":"G2","mp_weapon_lmg":"Spitfire","mp_weapon_smr":"Sidewinder SMR","mp_weapon_softball":"Softball","mp_weapon_thermite_grenade":"Firestar","pilot_emptyhanded":"Melee","mp_weapon_mastiff":"Mastiff","mp_weapon_mgl":"MGL","mp_weapon_rspn101_og":"R-101","mp_weapon_wingman":"Wingman","invalid":"invalid","mp_weapon_arc_launcher":"Thunderbolt","mp_weapon_dmr":"DMR","mp_weapon_grenade_electric_smoke":"Electric Smoke","mp_weapon_pulse_lmg":"Cold War","mp_weapon_satchel":"Satchel","mp_weapon_shotgun":"EVA-8 Auto","mp_weapon_shotgun_pistol":"Mozambique","mp_weapon_wingman_n":"Wingman Elite","mp_weapon_grenade_gravity":"Gravity Star","mp_weapon_grenade_sonar":"Pulse Blade","mp_weapon_rocket_launcher":"Archer","outOfBounds":"OutOfBounds","mind_crime":"Mind Crime","mp_weapon_esaw":"Devotion","fall":"Fall","mp_weapon_semipistol":"P2016","mp_weapon_grenade_emp":"Arc Grenade","mp_weapon_hemlok":"Hemlok","melee_pilot_emptyhanded":"Melee","phase_shift":"Phase Shift","damagedef_suicide":"Suicide","damagedef_titan_hotdrop":"Crushed by Titanfall","mp_titanweapon_arc_cannon":"Arc Cannon","mp_weapon_peacekraber":"Peacekraber","damagedef_crush":"Crushed","mp_titanweapon_brute4_quad_rocket":"Quad Rocket Launcher","mp_weapon_turretplasma":"Antititan Turret","mp_titanweapon_xo16_vanguard":"XO-16","mp_titanweapon_sticky_40mm":"40mm Cannon","mp_titanweapon_predator_cannon":"Predator Cannon","mp_titanweapon_leadwall":"Leadwall","mp_titanweapon_sniper":"Plasma Railgun","titan_execution":"Titan Execution","titan_explosion":"Titan Explosion","auto_titan_melee":"Autotitan Melee","mp_titanweapon_vortex_shield_ion":"Vortex Shield","mp_titanweapon_heat_shield":"Heat shield","bubble_shield":"Bubble Shield","mp_titancore_salvo_core":"Salvo Core","mp_titancore_flame_wave":"Flame Wave","mp_titanweapon_flightcore_rockets":"Flight Core","mp_titancore_laser_cannon":"Laser Cannon","mp_titancore_flame_wave_secondary":"Scorched Earth","mp_titanweapon_flame_wall":"Flame Wall","mp_titanweapon_arc_wave":"Arc Wave"}');E.kL.register(E.qi,E.u,E.De,Z.Z);var Y=(0,i.aZ)({name:"WeaponChart",props:{filters:Object,playerHighlighted:String},emits:["highlightPlayer"],components:{Doughnut:N.$I},mounted(){this.refreshColors++},data:()=>({store:S(),refreshColors:0}),computed:{colors(){this.refreshColors;const e={};if(this.$refs.container){const t=getComputedStyle(this.$refs.container);e.fg=t.getPropertyValue("--foreground"),e.bg=t.getPropertyValue("--bg-color"),e.orange=t.getPropertyValue("--orange"),e.cyan=t.getPropertyValue("--cyan"),e.yellow=t.getPropertyValue("--yellow"),e.green=t.getPropertyValue("--green"),e.purple=t.getPropertyValue("--purple"),e.red=t.getPropertyValue("--red"),e.pink=t.getPropertyValue("--pink"),e.currentLine=t.getPropertyValue("--current-line")}else e.fg="#ffffff";return e},chart(){const e=["cyan","green","orange","pink","purple","red","yellow"],t={datasets:[{label:"Weapons",labels:this.sortedWeaponList||[],borderColor:()=>this.colors.fg,backgroundColor:t=>this.colors[e[3*t.dataIndex%e.length]],data:[]}]};return this.sortedWeaponList?(t.datasets[0].data=this.sortedWeaponList.map((e=>this.weapons?this.weapons[e].value.kills:0)),t):t},chartOptions(){this.$props.playerHighlighted;const e={responsive:!0,maintainAspectRatio:!0,animation:{duration:500},layout:{autoPadding:!1},plugins:{datalabels:{formatter:(e,t)=>{const a=this.sortedWeaponList[t.dataIndex];return X[a]||a},backgroundColor:e=>e.dataset.backgroundColor(e),borderColor:this.colors.fg,borderRadius:25,borderWidth:2,color:this.colors.bg,display:e=>e.dataIndex===e.dataset.labels.length-1||"auto",padding:6},tooltip:{callbacks:{label:e=>{let t;return t=this.sortedWeaponList?this.sortedWeaponList[e.dataIndex]:e.dataset.labels[e.dataIndex],t+=" ("+this.weapons[t].value.kills+" kills)",t}}}}};return e},weapons(){const{weapon:e,...t}=this.filters||{},a=this.store.getWeaponList(t)?.value.data;return a||this.store.fetchWeapons(t).value.data},sortedWeaponList(){if(!this.weapons)return[];const e=new Date,t=Object.keys(this.weapons);return t.filter((e=>this.weapons[e].value.kills>0)).sort(((e,t)=>Number(this.weapons[e].value.kills)Number(this.weapons[t].value.kills)?1:0)),console.log("sorting the weapon list took "+((new Date).getTime()-e.getTime())+"ms"),t}}});const Q=(0,o.Z)(Y,[["render",K],["__scopeId","data-v-52416ec3"]]);var J=Q,ee=a(6368),te=(0,i.aZ)({name:"PlayerView",components:{VueMultiselect:ee.ZP,PlayerList:A,PlayerChart:F,WeaponChart:J},data(){return{model:{server:void 0,weapon:void 0},filters:{},store:S(),playerHighlighted:void 0,weaponLocale:X}},created(){let e;this.$route.query.server&&(e={name:this.$route.query.server?.toString()}),this.model={server:e,weapon:this.$route.query.weapon?.toString()}},computed:{servers(){const{server:e,player:t,...a}=this.filters,r=this.store.getServerList(a)?.value.data;return r||(0,L.SU)(this.store.fetchServers(a)).data},groupedServers(){const e=[];return Object.entries(this.servers).forEach((t=>{const a=(0,L.SU)(t[1]);e.find((e=>e.id===a.host+"sfdsdfsd"))||e.push({id:a.host+"sfdsdfsd",servers:[]}),e.find((e=>e.id===a.host+"sfdsdfsd"))?.servers.push({name:t[0],...a})})),e},weapons(){const{weapon:e,player:t,...a}=this.filters,r=this.store.getWeaponList(a)?.value.data;return r||this.store.fetchWeapons(a).value.data},players(){const{player:e,...t}=this.filters,a=this.store.getPlayerList(t)?.value.data;return a||this.store.fetchPlayers(t).value.data},sortedWeaponList(){if(!this.weapons)return[];const e=Object.keys(this.weapons);return e.sort()},sortedServerList(){if(!this.servers)return[];const e=Object.keys(this.servers);return e.sort()},sortedPlayerList(){if(!this.players)return[];const e=Object.entries(this.players).map((e=>({id:e[0],...e[1]._rawValue})));return e.sort(((e,t)=>e.usernamet.username?1:0))}},watch:{players(){const e=this.$route.query.player?.toString();e&&this.playerHighlighted?.id!==e&&this.highlight_player(e)},model:{handler(e){this.filters.server=e.server?.name,this.filters.weapon=e.weapon},deep:!0},filters:{handler(e){const{server:t,weapon:a,...r}=this.$route.query;le.push({query:{...e,...r}})},deep:!0},playerHighlighted(e,t){if(e?.id===t?.id)return;const{player:a,...r}=this.$route.query;le.push({query:{player:e?.id,...r}})},$route(e){if(this.playerHighlighted?.id!==e.query.player){const t=e.query.player?.toString();t&&this.highlight_player(t)}this.filters.weapon!==e.query.weapon&&(this.model.weapon=e.query.weapon),this.filters.server!==e.query.server&&(e.query.server?this.model.server={name:e.query.server}:this.model.server=void 0)}},methods:{highlight_player(e){const t=this.players[e];this.playerHighlighted=t?{id:e,...(0,L.SU)(t)}:void 0}}});const ae=(0,o.Z)(te,[["render",w],["__scopeId","data-v-1aa0e63c"]]);var re=ae;const ie=[{path:"/",name:"home",component:re}],se=(0,d.p7)({history:(0,d.PO)("/ToneAPI_webclient/"),routes:ie});var le=se;const ne=(0,b.WB)();(0,r.ri)(h).use(ne).use(le).mount("#app");S()}},t={};function a(r){var i=t[r];if(void 0!==i)return i.exports;var s=t[r]={exports:{}};return e[r](s,s.exports,a),s.exports}a.m=e,function(){var e=[];a.O=function(t,r,i,s){if(!r){var l=1/0;for(h=0;h=s)&&Object.keys(a.O).every((function(e){return a.O[e](r[o])}))?r.splice(o--,1):(n=!1,s0&&e[h-1][2]>s;h--)e[h]=e[h-1];e[h]=[r,i,s]}}(),function(){a.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return a.d(t,{a:t}),t}}(),function(){a.d=function(e,t){for(var r in t)a.o(t,r)&&!a.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})}}(),function(){a.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}}(),function(){var e={143:0};a.O.j=function(t){return 0===e[t]};var t=function(t,r){var i,s,l=r[0],n=r[1],o=r[2],p=0;if(l.some((function(t){return 0!==e[t]}))){for(i in n)a.o(n,i)&&(a.m[i]=n[i]);if(o)var h=o(a)}for(t&&t(r);pTONE API
\", 4)\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_router_link = _resolveComponent(\"router-link\")!\n const _component_router_view = _resolveComponent(\"router-view\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createElementVNode(\"header\", null, [\n _createElementVNode(\"nav\", null, [\n _hoisted_1,\n _createVNode(_component_router_link, {\n to: \"/\",\n class: \"navbar-element\"\n }, {\n default: _withCtx(() => [\n _createTextVNode(\"Players\")\n ]),\n _: 1\n })\n ])\n ]),\n _createVNode(_component_router_view)\n ], 64))\n}","\r\n\r\nimport { defineComponent } from 'vue'\r\n\r\nexport default defineComponent({\r\n\r\n})\r\n","import { render } from \"./App.vue?vue&type=template&id=4fdca3af&ts=true\"\nimport script from \"./App.vue?vue&type=script&lang=ts\"\nexport * from \"./App.vue?vue&type=script&lang=ts\"\n\nimport \"./App.vue?vue&type=style&index=0&id=4fdca3af&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, createElementVNode as _createElementVNode, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-1aa0e63c\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { id: \"filters\" }\nconst _hoisted_2 = { class: \"multiselect-wrapper\" }\nconst _hoisted_3 = [\"disabled\"]\nconst _hoisted_4 = { class: \"multiselect-wrapper\" }\nconst _hoisted_5 = [\"disabled\"]\nconst _hoisted_6 = { class: \"multiselect-wrapper\" }\nconst _hoisted_7 = [\"disabled\"]\nconst _hoisted_8 = { 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 _createElementVNode(\"span\", _hoisted_2, [\n _createVNode(_component_VueMultiselect, {\n selectLabel: \"\",\n deselectLabel: \"remove\",\n placeholder: \"Select server\",\n modelValue: _ctx.model.server,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((_ctx.model.server) = $event)),\n options: _ctx.groupedServers,\n \"group-values\": \"servers\",\n group_label: \"id\",\n \"group-select\": false,\n \"allow-empty\": true,\n multiple: false,\n \"custom-label\": ((e) => e.name),\n \"track-by\": \"name\",\n label: \"name\"\n }, null, 8, [\"modelValue\", \"options\", \"custom-label\"]),\n _createElementVNode(\"button\", {\n onClick: _cache[1] || (_cache[1] = ($event: any) => (_ctx.model.server = undefined)),\n disabled: !_ctx.model.server\n }, \"X\", 8, _hoisted_3)\n ]),\n _createElementVNode(\"span\", _hoisted_4, [\n _createVNode(_component_VueMultiselect, {\n selectLabel: \"\",\n deselectLabel: \"remove\",\n placeholder: \"Select weapon\",\n modelValue: _ctx.model.weapon,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = ($event: any) => ((_ctx.model.weapon) = $event)),\n \"custom-label\": ((e) => _ctx.weaponLocale[e] || e),\n options: _ctx.sortedWeaponList,\n \"allow-empty\": true\n }, null, 8, [\"modelValue\", \"custom-label\", \"options\"]),\n _createElementVNode(\"button\", {\n onClick: _cache[3] || (_cache[3] = ($event: any) => (_ctx.model.weapon = undefined)),\n disabled: !_ctx.model.weapon\n }, \"X\", 8, _hoisted_5)\n ]),\n _createElementVNode(\"span\", _hoisted_6, [\n _createVNode(_component_VueMultiselect, {\n \"options-limit\": 20,\n selectLabel: \"\",\n deselectLabel: \"remove\",\n placeholder: \"Search player\",\n modelValue: _ctx.playerHighlighted,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = ($event: any) => ((_ctx.playerHighlighted) = $event)),\n options: _ctx.sortedPlayerList,\n \"allow-empty\": true,\n \"custom-label\": ((e) => e?.username)\n }, null, 8, [\"modelValue\", \"options\", \"custom-label\"]),\n _createElementVNode(\"button\", {\n onClick: _cache[5] || (_cache[5] = ($event: any) => (_ctx.playerHighlighted = undefined)),\n disabled: !_ctx.playerHighlighted\n }, \"X\", 8, _hoisted_7)\n ])\n ]),\n _createElementVNode(\"div\", _hoisted_8, [\n _createVNode(_component_PlayerList, {\n filters: _ctx.filters,\n onHighlightPlayer: _ctx.highlight_player,\n playerHighlighted: _ctx.playerHighlighted?.id\n }, null, 8, [\"filters\", \"onHighlightPlayer\", \"playerHighlighted\"]),\n _createVNode(_component_PlayerChart, {\n filters: _ctx.filters,\n onHighlightPlayer: _ctx.highlight_player,\n playerHighlighted: _ctx.playerHighlighted?.id\n }, null, 8, [\"filters\", \"onHighlightPlayer\", \"playerHighlighted\"]),\n _createVNode(_component_WeaponChart, {\n filters: { player: _ctx.playerHighlighted?.id, ..._ctx.filters },\n playerHighlighted: _ctx.playerHighlighted?.id\n }, null, 8, [\"filters\", \"playerHighlighted\"])\n ])\n ], 64))\n}","import { defineStore } from 'pinia'\r\nimport * as assert from 'assert'\r\nimport { Ref, reactive, ref, shallowRef, triggerRef, unref } from 'vue'\r\n\r\nexport interface Filters {\r\n server?: string;\r\n player?: string;\r\n weapon?: string;\r\n host?: string;\r\n map?: string;\r\n gamemode?: string;\r\n}\r\n\r\nfunction removeNullEntries (a: Filters) {\r\n return Object.fromEntries(\r\n Object.entries(a).filter((e) => e[1] !== undefined && e[1] !== null)\r\n )\r\n}\r\nfunction objectEqual (a: Filters, b: Filters) {\r\n try {\r\n a = removeNullEntries(a)\r\n b = removeNullEntries(b)\r\n assert.deepStrictEqual(a, b)\r\n return true\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\nexport interface Kill {\r\n deaths: number;\r\n kills: number;\r\n // eslint-disable-next-line camelcase\r\n max_distance: number;\r\n // eslint-disable-next-line camelcase\r\n total_distance: number;\r\n}\r\nexport interface KillData {\r\n filter: Filters;\r\n data: { [key: string]: Ref };\r\n}\r\n\r\nexport interface Player extends Kill {\r\n username: string;\r\n // eslint-disable-next-line camelcase\r\n // deaths_while_equipped?: number;\r\n}\r\n\r\nexport interface Weapon extends Kill {\r\n // eslint-disable-next-line camelcase\r\n deaths_while_equipped: number;\r\n}\r\n\r\nexport interface Server extends Kill {\r\n host: number;\r\n}\r\n\r\n// define your typings for the store state\r\nexport interface State {\r\n servers: Ref>[];\r\n players: Ref>[];\r\n weapons: Ref>[];\r\n maps: Ref>[];\r\n gamemodes: Ref>[];\r\n hosts: { [key: number]: string };\r\n}\r\n\r\nexport const useKillStore = defineStore('kill', {\r\n state: (): State => ({\r\n servers: [],\r\n players: [],\r\n weapons: [],\r\n maps: [],\r\n gamemodes: [],\r\n hosts: {}\r\n }),\r\n getters: {\r\n getPlayerList: (state) => (filters: Filters) => {\r\n return state.players.find((e) => objectEqual(unref(e).filter, filters))\r\n },\r\n getWeaponList: (state) => (filters: Filters) =>\r\n state.weapons.find((e) => objectEqual(unref(e).filter, filters)),\r\n getServerList: (state) => (filters: Filters) =>\r\n state.servers.find((e) => objectEqual(unref(e).filter, filters))\r\n },\r\n actions: {\r\n fetchPlayers (filter: Filters) {\r\n filter = removeNullEntries(filter)\r\n let entry = this.players.find((e) => objectEqual(unref(e).filter, filter))\r\n if (entry === undefined) {\r\n entry = shallowRef({ filter, data: {} })\r\n this.players.push(entry)\r\n }\r\n fetch(\r\n 'https://tone.sleepycat.date/v2/client/players?' +\r\n new URLSearchParams(filter as Record)\r\n ).then(async response => {\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n unref(entry)!.data = Object.fromEntries(Object.entries(await response.json()).map(e => [e[0], ref(e[1] as Player)]))\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n triggerRef(entry!)\r\n })\r\n return entry\r\n },\r\n fetchWeapons (filter: Filters) {\r\n filter = removeNullEntries(filter)\r\n let entry = this.weapons.find((e) => objectEqual(unref(e).filter, filter))\r\n if (!entry) {\r\n entry = shallowRef({ filter, data: {} })\r\n this.weapons.push(entry)\r\n }\r\n\r\n fetch(\r\n 'https://tone.sleepycat.date/v2/client/weapons?' +\r\n new URLSearchParams(filter as Record)\r\n ).then(async response => {\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n unref(entry)!.data = Object.fromEntries(Object.entries(await response.json()).map(e => [e[0], ref(e[1] as Weapon)]))\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n triggerRef(entry!)\r\n })\r\n return entry\r\n },\r\n fetchServers (filter: Filters) {\r\n filter = removeNullEntries(filter)\r\n let entry = this.servers.find((e) => objectEqual(unref(e).filter, filter))\r\n if (!entry) {\r\n entry = shallowRef({ filter, data: {} })\r\n this.servers.push(entry)\r\n }\r\n fetch(\r\n 'https://tone.sleepycat.date/v2/client/servers?' +\r\n new URLSearchParams(filter as Record)\r\n ).then(async response => {\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n unref(entry)!.data = Object.fromEntries(Object.entries(await response.json()).map(e => [e[0], ref(e[1] as Server)]))\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n triggerRef(entry!)\r\n })\r\n return entry\r\n }\r\n }\r\n})\r\n","import { createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, resolveComponent as _resolveComponent, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"playerHeaders\" }\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"span\", null, null, -1)\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_VirtualList = _resolveComponent(\"VirtualList\")!\n\n return (_openBlock(), _createElementBlock(\"div\", {\n class: \"playerTable\",\n onKeydown: _cache[7] || (_cache[7] = \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.updateSort('username'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'username' ? 'selected' : '')\n }, \"Username\", 2),\n _createElementVNode(\"span\", {\n onClick: _cache[1] || (_cache[1] = ($event: any) => (_ctx.updateSort('kills'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'kills' ? 'selected' : '')\n }, \"K\", 2),\n _createElementVNode(\"span\", {\n onClick: _cache[2] || (_cache[2] = ($event: any) => (_ctx.updateSort('deaths'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'deaths' ? 'selected' : '')\n }, \"D\", 2),\n _createElementVNode(\"span\", {\n onClick: _cache[3] || (_cache[3] = ($event: any) => (_ctx.updateSort('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.updateSort('max_distance'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'max_distance' ? 'selected' : '')\n }, \"max distance\", 2),\n _createElementVNode(\"span\", {\n onClick: _cache[5] || (_cache[5] = ($event: any) => (_ctx.updateSort('avg_distance'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'avg_distance' ? 'selected' : '')\n }, \"average distance\", 2)\n ]),\n _createVNode(_component_VirtualList, {\n list: _ctx.playerList,\n \"row-height\": 32,\n onHighlightPlayer: _cache[6] || (_cache[6] = ($event: any) => (_ctx.$emit('highlightPlayer', $event))),\n highlighted: _ctx.playerHighlighted\n }, null, 8, [\"list\", \"highlighted\"])\n ], 32))\n}","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-96db01e6\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = [\"onClick\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"div\", {\n ref: \"vlist\",\n class: \"vlist\",\n onScroll: _cache[0] || (_cache[0] = \n//@ts-ignore\n(...args) => (_ctx.scroll && _ctx.scroll(...args)))\n }, [\n _createElementVNode(\"div\", {\n ref: \"vscroll\",\n class: \"vscroll\",\n style: _normalizeStyle(`padding: ${(_ctx.vIndex*_ctx.$props.rowHeight!)}px 0px ${(_ctx.list.length*_ctx.$props.rowHeight!)-(_ctx.vIndex*_ctx.$props.rowHeight!)}px;`)\n }, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.visibleList, (player, index) => {\n return (_openBlock(), _createElementBlock(\"div\", {\n class: _normalizeClass('playerRow ' + (player.id === _ctx.$props.highlighted ? 'selected' : '')),\n key: player.id,\n onClick: ($event: any) => (_ctx.$emit('highlightPlayer', player.id)),\n ref_for: true,\n ref: `player:` + player.id\n }, [\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(index + 1 + _ctx.vIndex), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(player.value.username), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(player.value.kills), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(player.value.deaths), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(Math.round(player.value.kills / Math.max(1, player.value.deaths) * 100) / 100), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(player.value.max_distance), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(Math.round(((player.value.total_distance / player.value.kills) || 0) * 100) / 100), 1)\n ])\n ], 10, _hoisted_1))\n }), 128))\n ], 4)\n ], 544))\n}","\r\nimport { Player } from '@/stores/kill'\r\nimport { defineComponent, PropType, Ref } from 'vue'\r\n\r\nexport default defineComponent({\r\n data () {\r\n return {\r\n toLoad: 10,\r\n vlistHeight: 0,\r\n vIndex: 0\r\n }\r\n },\r\n props: {\r\n list: { type: Array as PropType<(Ref & { id: string })[]>, default: () => [] },\r\n rowHeight: { type: Number, default: () => 32 },\r\n highlighted: String\r\n },\r\n emits: ['highlightPlayer'],\r\n\r\n computed: {\r\n visibleList () {\r\n return this.list.slice(Math.max(this.vIndex, 0), Math.min(this.vIndex + this.visibleCount * 3, this.list.length))\r\n },\r\n visibleCount () {\r\n return Math.ceil(this.vlistHeight / this.$props.rowHeight)\r\n }\r\n },\r\n watch: {\r\n list () {\r\n this.vlistHeight = (this.$refs.vlist as HTMLElement)?.getBoundingClientRect().height || 0\r\n },\r\n highlighted (newVal) {\r\n if (newVal) setTimeout(() => (this.$refs.vlist as HTMLElement)?.scrollBy({ top: ((this.list.findIndex(e => e.id === newVal)) * this.rowHeight) - ((this.$refs.vlist as HTMLElement))?.scrollTop - (this.vlistHeight / 2 - this.$props.rowHeight), behavior: 'smooth' }), 1)\r\n }\r\n },\r\n methods: {\r\n scroll (e:Event) {\r\n const scrollTop = (e.target as HTMLElement)?.scrollTop\r\n const scrollIndex = Math.round(scrollTop / this.$props.rowHeight)\r\n\r\n const mustScrollUp = Math.max(0, scrollIndex - (this.visibleCount)) < this.vIndex\r\n const mustScrollDown = Math.min(this.list.length, scrollIndex + (this.visibleCount)) > this.vIndex + (this.visibleCount * 2)\r\n if (mustScrollUp) {\r\n this.vIndex = Math.max(0, Math.floor((scrollIndex - this.visibleCount) / 4) * 4)\r\n } else if (mustScrollDown) {\r\n this.vIndex = Math.max(0, Math.floor(scrollIndex / 4) * 4)\r\n }\r\n }\r\n }\r\n\r\n})\r\n","import { render } from \"./VirtualList.vue?vue&type=template&id=96db01e6&scoped=true&ts=true\"\nimport script from \"./VirtualList.vue?vue&type=script&lang=ts\"\nexport * from \"./VirtualList.vue?vue&type=script&lang=ts\"\n\nimport \"./VirtualList.vue?vue&type=style&index=0&id=96db01e6&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-96db01e6\"]])\n\nexport default __exports__","\r\nimport { defineComponent, PropType, Ref } from 'vue'\r\nimport { useKillStore, Player, Filters } from '@/stores/kill'\r\nimport VirtualList from './List/VirtualList.vue'\r\n\r\nexport default defineComponent({\r\n components: { VirtualList },\r\n props: {\r\n filters: { type: Object as PropType, default: () => ({}) },\r\n playerHighlighted: String\r\n },\r\n emits: ['highlightPlayer'],\r\n data () {\r\n return {\r\n sortingData: { direction: -1, argument: 'kills' as keyof Player | 'k/d' | 'avg_distance' },\r\n store: useKillStore()\r\n }\r\n },\r\n computed: {\r\n players (): { [key: string]: Ref } {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { player: _, ...withoutPlayer } = this.filters\r\n const data = this.store.getPlayerList(withoutPlayer)?.value.data\r\n if (!data) return this.store.fetchPlayers(withoutPlayer).value.data\r\n return data\r\n },\r\n playerList (): (Ref & { id: string })[] {\r\n if (!this.players) return []\r\n const players = Object.entries(this.players).map(e => {\r\n const target = {} as ProxyHandler[>\r\n const player = new Proxy(e[1], target) as Ref] & { id: string }\r\n player.id = e[0]\r\n return player\r\n }) as (Ref & { id: string })[]\r\n\r\n const date = new Date()\r\n if (this.sortingData.argument === 'username') {\r\n const collator = new Intl.Collator('en', { numeric: true, sensitivity: 'base' })\r\n players.sort((a, b) => {\r\n // Hack because toRaw is slow as fuck\r\n const aVal = a._rawValue\r\n const bVal = b._rawValue\r\n return collator.compare(aVal.username, bVal.username)\r\n })\r\n } else if (this.sortingData.argument === 'k/d') {\r\n players.sort((a, b) => {\r\n // Hack because toRaw is slow as fuck\r\n const aVal = a._rawValue\r\n const bVal = b._rawValue\r\n return aVal.kills / Math.max(1, aVal.deaths) - bVal.kills / Math.max(1, bVal.deaths)\r\n })\r\n } else if (this.sortingData.argument === 'avg_distance') {\r\n players.sort((a, b) => {\r\n // Hack because toRaw is slow as fuck\r\n const aVal = a._rawValue\r\n const bVal = b._rawValue\r\n return ((aVal.total_distance / aVal.kills) || 0) - ((bVal.total_distance / bVal.kills) || 0)\r\n })\r\n } else {\r\n const argument = this.sortingData.argument\r\n players.sort((a, b) => {\r\n // Hack because toRaw is slow as fuck\r\n const aVal = a._rawValue\r\n const bVal = b._rawValue\r\n return aVal[argument] - bVal[argument]\r\n })\r\n }\r\n console.log('Sorting the player object took + ' + ((new Date()).getTime() - date.getTime()) + 'ms')\r\n if (this.sortingData.direction < 0) {\r\n players.reverse()\r\n }\r\n return players\r\n }\r\n },\r\n watch: {\r\n playerHighlighted (newval) {\r\n this.scrollToPlayer(newval)\r\n },\r\n playerList () {\r\n if (this.playerHighlighted) this.scrollToPlayer(this.playerHighlighted)\r\n }\r\n },\r\n updated () {\r\n /* const element = this.$refs['player:' + this.$props.playerHighlighted] as HTMLElement[]\r\n if (!element || !element[0]) return\r\n element[0].scrollIntoView({ behavior: 'smooth', block: 'center' }) */\r\n },\r\n methods: {\r\n selectNextPlayer (e: KeyboardEvent) {\r\n const values = {\r\n Home: -Infinity,\r\n End: Infinity,\r\n PageDown: 100,\r\n PageUp: -100,\r\n ArrowUp: -1,\r\n ArrowDown: 1,\r\n ArrowRight: 10,\r\n ArrowLeft: -10\r\n } as { [key: string]: number }\r\n if (!this.$props.playerHighlighted) return\r\n if (!Object.keys(values).includes(e.key)) return\r\n e.preventDefault()\r\n const index = this.playerList.findIndex(e => e.id === this.$props.playerHighlighted)\r\n let nextIndex = (index + values[e.key])\r\n if (nextIndex >= this.playerList.length) nextIndex = this.playerList.length - 1\r\n if (nextIndex < 0) nextIndex = 0\r\n this.$emit('highlightPlayer', this.playerList[nextIndex].id)\r\n },\r\n updateSort (argument: string) {\r\n if (this.sortingData.argument === argument) {\r\n this.sortingData.direction *= -1\r\n } else {\r\n this.sortingData.direction = -1\r\n }\r\n this.sortingData.argument = argument as typeof this.sortingData.argument\r\n },\r\n scrollToPlayer (playerid: string) {\r\n const newElement = this.$refs['player:' + playerid] as HTMLElement[]\r\n // Some hack because of some inconsistency\r\n setTimeout(function () {\r\n if (newElement && newElement[0]) { newElement[0].scrollIntoView({ behavior: 'smooth', block: 'center' }) }\r\n }, 10)\r\n }\r\n }\r\n\r\n})\r\n","import { render } from \"./PlayerList.vue?vue&type=template&id=092eb8cd&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=092eb8cd&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-e83d63ce\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = {\n class: \"playerChart\",\n ref: \"container\"\n}\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_Scatter = _resolveComponent(\"Scatter\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createVNode(_component_Scatter, {\n data: _ctx.chart,\n options: _ctx.chartOptions\n }, null, 8, [\"data\", \"options\"])\n ], 512))\n}","\r\nimport {\r\n Chart as ChartJS,\r\n LinearScale,\r\n PointElement,\r\n LineElement,\r\n Tooltip,\r\n Legend,\r\n CoreChartOptions,\r\n PluginChartOptions,\r\n ScaleChartOptions\r\n} from 'chart.js'\r\nimport annotationPlugin, { AnnotationPluginOptions } from 'chartjs-plugin-annotation'\r\nimport dataLabel from 'chartjs-plugin-datalabels'\r\nimport { useKillStore, Player, Filters } from '@/stores/kill'\r\n\r\nimport { Scatter } from 'vue-chartjs'\r\nimport { defineComponent, PropType, Ref, toRaw, triggerRef, unref } from 'vue'\r\nimport { ChartEvent } from 'chart.js/dist/core/core.plugins'\r\nimport { _DeepPartialObject } from 'chart.js/dist/types/utils'\r\n\r\nChartJS.register(LinearScale, PointElement, LineElement, Tooltip, Legend, annotationPlugin, dataLabel)\r\n\r\nexport default defineComponent({\r\n name: 'PlayerChart',\r\n props: {\r\n filters: Object as PropType,\r\n playerHighlighted: String\r\n },\r\n data: () => {\r\n return {\r\n store: useKillStore(),\r\n refreshColors: 0,\r\n playerData: []\r\n }\r\n },\r\n emits: ['highlightPlayer'],\r\n components: {\r\n Scatter\r\n },\r\n mounted () {\r\n this.refreshColors++\r\n },\r\n computed: {\r\n playerList (): (Player & {id:string})[] {\r\n const data = this.store.getPlayerList(this.filters || {})?.value.data\r\n if (!data) return Object.entries(this.store.fetchPlayers(this.filters || {}).value.data).map(e => ({ id: e[0], ...toRaw(e[1].value) }))\r\n const cut = Object.entries(data).map(e => ({ id: e[0], ...toRaw(e[1].value) }))\r\n cut.sort((a, b) => {\r\n return b.kills - a.kills\r\n })\r\n return cut.slice(0, 200)\r\n },\r\n colors () {\r\n // eslint-disable-next-line no-unused-expressions\r\n this.refreshColors\r\n const colors = {} as { [key: string]: string }\r\n if (this.$refs.container) {\r\n const style = getComputedStyle(this.$refs.container as Element)\r\n colors.fg = style.getPropertyValue('--foreground')\r\n colors.bg = style.getPropertyValue('--bg-color')\r\n colors.orange = style.getPropertyValue('--orange')\r\n colors.cyan = style.getPropertyValue('--cyan')\r\n colors.currentLine = style.getPropertyValue('--current-line')\r\n } else {\r\n colors.fg = '#ffffff'\r\n }\r\n return colors\r\n },\r\n chart () {\r\n const playerIndex = this.playerList.findIndex(e => e.id === this.$props.playerHighlighted)\r\n const defaultColor = this.colors.cyan\r\n const borderColor = new Array(this.playerList.length).fill(defaultColor)\r\n borderColor[playerIndex] = this.colors.orange\r\n const backgroundColor = borderColor\r\n const pointRadius = new Array(this.playerList.length).fill(1)\r\n pointRadius[playerIndex] = 20\r\n const hoverRadius = new Array(this.playerList.length).fill(4)\r\n hoverRadius[playerIndex] = 30\r\n const pointStyle = new Array(this.playerList.length).fill('circle')\r\n pointStyle[playerIndex] = 'crossRot'\r\n return {\r\n datasets: [\r\n {\r\n label: 'Players',\r\n labels: this.playerList.map(e => e.id) || [] as string[],\r\n borderColor,\r\n backgroundColor,\r\n pointRadius,\r\n pointStyle,\r\n hoverRadius,\r\n data: this.playerList.map((player) => ({ y: player.kills, x: player.deaths }))\r\n }\r\n ]\r\n }\r\n },\r\n chartStaticOptions () {\r\n return {\r\n responsive: true,\r\n maintainAspectRatio: false,\r\n animation: { duration: 500 },\r\n layout: { autoPadding: false },\r\n scales: {\r\n y: {\r\n title: {\r\n text: 'Kills',\r\n display: true,\r\n color: this.colors.fg\r\n },\r\n ticks: {\r\n color: this.colors.fg\r\n }\r\n },\r\n x: {\r\n title: {\r\n text: 'Deaths',\r\n display: true,\r\n color: this.colors.fg\r\n },\r\n ticks: {\r\n color: this.colors.fg\r\n }\r\n }\r\n },\r\n onClick: (e: ChartEvent, element: any) => {\r\n this.$emit('highlightPlayer', element.length > 0 ? this.playerList[element[0].index].id : undefined)\r\n if (this.store.getPlayerList(this.filters || {}) !== undefined) triggerRef(this.store.getPlayerList(this.filters || {}) as unknown as Ref)\r\n },\r\n onHover: (e: any, element: any) => {\r\n if (!e.native.target) return\r\n (e.native.target as HTMLElement).style.cursor = element[0] ? 'pointer' : 'default'\r\n }\r\n }\r\n },\r\n chartStaticPlugins () {\r\n let endX = 0\r\n let endY = 0\r\n if (this.playerList) {\r\n const maxX = Math.max(...this.playerList.map(e => e.deaths))\r\n const maxY = Math.max(...this.playerList.map(e => e.kills))\r\n if (maxY > maxX) {\r\n endX = maxX\r\n endY = (maxX / maxY) * maxY\r\n } else {\r\n endY = maxY\r\n endX = (maxY / maxX) * maxX\r\n }\r\n }\r\n return {\r\n tooltip: {\r\n callbacks: {\r\n label: (ctx: any) => {\r\n let label: string\r\n if (!this.playerList) {\r\n label = ctx.dataset.labels[ctx.dataIndex]\r\n } else {\r\n label = this.playerList[ctx.dataIndex].username\r\n }\r\n label += ' (' + ctx.parsed.y + ' kills ' + ctx.parsed.x + ' deaths)'\r\n return label\r\n }\r\n }\r\n },\r\n annotation: {\r\n annotations: {\r\n line: {\r\n type: 'line',\r\n yMin: 0,\r\n xMin: 0,\r\n yMax: endY,\r\n xMax: endX,\r\n borderWidth: 2,\r\n borderColor: this.colors.orange,\r\n borderDash: [1, 5]\r\n }\r\n }\r\n } as _DeepPartialObject,\r\n legend: { display: false }\r\n }\r\n },\r\n chartOptions (): _DeepPartialObject & PluginChartOptions<'scatter'> & ScaleChartOptions<'scatter'>> {\r\n // eslint-disable-next-line no-unused-expressions\r\n this.$props.playerHighlighted\r\n return {\r\n ...this.chartStaticOptions,\r\n plugins: {\r\n ...this.chartStaticPlugins,\r\n datalabels: {\r\n formatter: (value: any, context: any) => {\r\n return this.playerList[context.dataIndex].username\r\n },\r\n backgroundColor: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerList[context.dataIndex].id) ? this.colors.orange : null,\r\n borderColor: this.colors.fg,\r\n borderWidth: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerList[context.dataIndex].id) ? 1 : 0,\r\n borderRadius: 5,\r\n display: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerList[context.dataIndex].id) ? 'true' : 'auto',\r\n align: -45,\r\n anchor: 'end',\r\n clamp: true,\r\n color: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerList[context.dataIndex].id) ? this.colors.bg : this.colors.fg\r\n }\r\n }\r\n }\r\n }\r\n }\r\n /* methods: {\r\n refreshChart () {\r\n if (this.store.getPlayerList(this.filters || {}) !== undefined) triggerRef(this.store.getPlayerList(this.filters || {}) as unknown as Ref)\r\n }\r\n } */\r\n})\r\n","import { render } from \"./PlayerChart.vue?vue&type=template&id=e83d63ce&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=e83d63ce&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-e83d63ce\"]])\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-52416ec3\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = {\n class: \"weaponChart\",\n ref: \"container\"\n}\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_Doughnut = _resolveComponent(\"Doughnut\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createVNode(_component_Doughnut, {\n data: _ctx.chart,\n options: _ctx.chartOptions\n }, null, 8, [\"data\", \"options\"])\n ], 512))\n}","\r\nimport { Chart as ChartJS, ArcElement, Tooltip, Legend } from 'chart.js'\r\nimport dataLabel from 'chartjs-plugin-datalabels'\r\nimport { Weapon, Filters, useKillStore } from '@/stores/kill'\r\nimport { Doughnut } from 'vue-chartjs'\r\nimport { defineComponent, PropType, Ref } from 'vue'\r\nimport weapons from '../stores/weapons.json'\r\n\r\nChartJS.register(ArcElement, Tooltip, Legend, dataLabel)\r\n\r\nexport default defineComponent({\r\n name: 'WeaponChart',\r\n props: {\r\n filters: Object as PropType,\r\n playerHighlighted: String\r\n },\r\n emits: ['highlightPlayer'],\r\n components: {\r\n Doughnut\r\n },\r\n mounted () {\r\n this.refreshColors++\r\n },\r\n data: () => {\r\n return {\r\n store: useKillStore(),\r\n refreshColors: 0\r\n }\r\n },\r\n computed: {\r\n colors () {\r\n // eslint-disable-next-line no-unused-expressions\r\n this.refreshColors\r\n const colors = {} as { [key: string]: string }\r\n if (this.$refs.container) {\r\n const style = getComputedStyle(this.$refs.container as Element)\r\n colors.fg = style.getPropertyValue('--foreground')\r\n colors.bg = style.getPropertyValue('--bg-color')\r\n colors.orange = style.getPropertyValue('--orange')\r\n colors.cyan = style.getPropertyValue('--cyan')\r\n colors.yellow = style.getPropertyValue('--yellow')\r\n colors.green = style.getPropertyValue('--green')\r\n colors.purple = style.getPropertyValue('--purple')\r\n colors.red = style.getPropertyValue('--red')\r\n colors.pink = style.getPropertyValue('--pink')\r\n colors.currentLine = style.getPropertyValue('--current-line')\r\n } else {\r\n colors.fg = '#ffffff'\r\n }\r\n return colors\r\n },\r\n chart () {\r\n const colors = [\r\n 'cyan',\r\n 'green',\r\n 'orange',\r\n 'pink',\r\n 'purple',\r\n 'red',\r\n 'yellow'\r\n ]\r\n const chartData = {\r\n datasets: [\r\n {\r\n label: 'Weapons',\r\n labels: this.sortedWeaponList || ([] as string[]),\r\n borderColor: () => this.colors.fg,\r\n backgroundColor: (context: any) => {\r\n return this.colors[\r\n colors[(context.dataIndex * 3) % colors.length]\r\n ]\r\n },\r\n data: [] as number[]\r\n }\r\n ]\r\n }\r\n if (!this.sortedWeaponList) {\r\n return chartData\r\n }\r\n chartData.datasets[0].data = this.sortedWeaponList.map((e) => {\r\n if (!this.weapons) {\r\n return 0\r\n }\r\n return this.weapons[e].value.kills\r\n })\r\n return chartData\r\n },\r\n chartOptions () {\r\n // eslint-disable-next-line no-unused-expressions\r\n this.$props.playerHighlighted\r\n const options = {\r\n responsive: true,\r\n maintainAspectRatio: true,\r\n animation: { duration: 500 },\r\n layout: { autoPadding: false },\r\n plugins: {\r\n datalabels: {\r\n formatter: (value: any, context: any) => {\r\n const weaponId = this.sortedWeaponList[context.dataIndex]\r\n // if (!(weapons as {[key:string]:string})[weaponId]) console.log(weaponId)\r\n return (weapons as {[key:string]:string})[weaponId] || weaponId\r\n },\r\n backgroundColor: (context: any) => {\r\n return context.dataset.backgroundColor(context)\r\n },\r\n borderColor: this.colors.fg,\r\n borderRadius: 25,\r\n borderWidth: 2,\r\n color: this.colors.bg,\r\n display: (context: any) => {\r\n return context.dataIndex === context.dataset.labels.length - 1\r\n ? true\r\n : 'auto'\r\n },\r\n padding: 6\r\n },\r\n tooltip: {\r\n callbacks: {\r\n label: (ctx: any) => {\r\n let label: string\r\n if (!this.sortedWeaponList) {\r\n label = ctx.dataset.labels[ctx.dataIndex]\r\n } else {\r\n label = this.sortedWeaponList[ctx.dataIndex]\r\n }\r\n label += ' (' + this.weapons[label].value.kills + ' kills)'\r\n return label\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return options\r\n },\r\n weapons (): { [key: string]: Ref } {\r\n const { weapon: _, ...withoutWeapon } = this.filters || {}\r\n const data = this.store.getWeaponList(withoutWeapon)?.value.data\r\n if (!data) return this.store.fetchWeapons(withoutWeapon).value.data\r\n return data\r\n },\r\n sortedWeaponList (): string[] {\r\n if (!this.weapons) return []\r\n const date = new Date()\r\n const weapons = Object.keys(this.weapons)\r\n weapons.filter(e => this.weapons[e].value.kills > 0).sort((a, b) => {\r\n if (Number(this.weapons[a].value.kills) < Number(this.weapons[b].value.kills)) {\r\n return -1\r\n }\r\n if (Number(this.weapons[a].value.kills) > Number(this.weapons[b].value.kills)) {\r\n return 1\r\n }\r\n return 0\r\n })\r\n console.log('sorting the weapon list took ' + (new Date().getTime() - date.getTime()) + 'ms')\r\n return weapons\r\n }\r\n }\r\n})\r\n","import { render } from \"./WeaponChart.vue?vue&type=template&id=52416ec3&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=52416ec3&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-52416ec3\"]])\n\nexport default __exports__","\r\nimport { Player, Weapon, Server, useKillStore, Filters } from '@/stores/kill'\r\nimport PlayerList from '@/components/PlayerList.vue'\r\nimport PlayerChart from '@/components/PlayerChart.vue'\r\nimport WeaponChart from '@/components/WeaponChart.vue'\r\nimport { Ref, defineComponent, unref } from 'vue'\r\nimport VueMultiselect from 'vue-multiselect'\r\nimport 'vue-multiselect/dist/vue-multiselect.css'\r\nimport weapons from '../stores/weapons.json'\r\nimport router from '@/router'\r\n\r\nexport default defineComponent({\r\n name: 'PlayerView',\r\n components: {\r\n VueMultiselect,\r\n PlayerList,\r\n PlayerChart,\r\n WeaponChart\r\n },\r\n\r\n data () {\r\n return {\r\n model: { server: undefined, weapon: undefined } as unknown as {\r\n weapon: string | undefined;\r\n server: { name?: string } | (Server & { name?: string })[] | undefined;\r\n },\r\n filters: {} as Filters,\r\n store: useKillStore(),\r\n playerHighlighted: undefined as (Player & { id: string }) | undefined,\r\n weaponLocale: weapons as { [key: string]: string }\r\n }\r\n },\r\n created () {\r\n let server\r\n if (this.$route.query.server) server = { name: this.$route.query.server?.toString() }\r\n this.model = {\r\n server,\r\n weapon: this.$route.query.weapon?.toString()\r\n }\r\n },\r\n computed: {\r\n servers (): { [key: string]: Ref } {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { server: _, player: _1, ...withoutServer } = this.filters\r\n const data = this.store.getServerList(withoutServer)?.value.data\r\n if (!data) return unref(this.store.fetchServers(withoutServer)).data\r\n return data\r\n },\r\n groupedServers () {\r\n const hosts = [] as {\r\n id: string;\r\n servers: (Server & { name?: string })[];\r\n }[]\r\n Object.entries(this.servers).forEach((e) => {\r\n const server = unref(e[1])\r\n if (!hosts.find((host) => host.id === server.host + 'sfdsdfsd')) { hosts.push({ id: server.host + 'sfdsdfsd', servers: [] as Server[] }) }\r\n hosts\r\n .find((host) => host.id === server.host + 'sfdsdfsd')\r\n ?.servers.push({ name: e[0], ...server })\r\n })\r\n return hosts\r\n },\r\n weapons (): { [key: string]: Ref } {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { weapon: _, player: _1, ...withoutWeapons } = this.filters\r\n const data = this.store.getWeaponList(withoutWeapons)?.value.data\r\n if (!data) return this.store.fetchWeapons(withoutWeapons).value.data\r\n return data\r\n },\r\n players (): { [key: string]: Ref } {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { player: _, ...withoutPlayers } = this.filters\r\n const data = this.store.getPlayerList(withoutPlayers)?.value.data\r\n if (!data) return this.store.fetchPlayers(withoutPlayers).value.data\r\n return data\r\n },\r\n sortedWeaponList (): string[] {\r\n if (!this.weapons) return []\r\n const weapons = Object.keys(this.weapons)\r\n return weapons.sort()\r\n },\r\n sortedServerList (): string[] {\r\n if (!this.servers) return []\r\n const servers = Object.keys(this.servers)\r\n return servers.sort()\r\n },\r\n sortedPlayerList (): Player[] {\r\n if (!this.players) return []\r\n const players = Object.entries(this.players).map((e) => ({\r\n id: e[0],\r\n ...e[1]._rawValue\r\n }))\r\n return players.sort((a, b) => {\r\n if (a.username < b.username) {\r\n return -1\r\n }\r\n if (a.username > b.username) {\r\n return 1\r\n }\r\n return 0\r\n })\r\n }\r\n },\r\n watch: {\r\n players () {\r\n const player = this.$route.query.player?.toString()\r\n if (player && this.playerHighlighted?.id !== player) {\r\n this.highlight_player(player)\r\n }\r\n },\r\n model: {\r\n handler (newModel) {\r\n this.filters.server = newModel.server?.name\r\n this.filters.weapon = newModel.weapon\r\n },\r\n deep: true\r\n },\r\n filters: {\r\n handler (newValue) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { server: _, weapon: _2, ...withoutFilters } = this.$route.query\r\n router.push({ query: { ...newValue, ...withoutFilters } })// .then(e => { console.log(e) })\r\n },\r\n deep: true\r\n },\r\n playerHighlighted (newValue, oldValue) {\r\n if (newValue?.id === oldValue?.id) return\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { player: _, ...withoutPlayer } = this.$route.query\r\n router.push({ query: { player: newValue?.id, ...withoutPlayer } })// .then(e => { console.log(e) })\r\n },\r\n '$route' (to) {\r\n if (this.playerHighlighted?.id !== to.query.player) {\r\n const playerId = to.query.player?.toString()\r\n if (playerId) {\r\n this.highlight_player(playerId)\r\n }\r\n }\r\n if (this.filters.weapon !== to.query.weapon) {\r\n this.model.weapon = to.query.weapon\r\n }\r\n if (this.filters.server !== to.query.server) {\r\n if (to.query.server) this.model.server = { name: to.query.server }\r\n else this.model.server = undefined\r\n }\r\n }\r\n },\r\n methods: {\r\n highlight_player (playerid: string) {\r\n const player = this.players[playerid]\r\n if (player) {\r\n this.playerHighlighted = { id: playerid, ...unref(player) }\r\n return\r\n }\r\n this.playerHighlighted = undefined\r\n }\r\n }\r\n})\r\n","import { render } from \"./PlayerView.vue?vue&type=template&id=1aa0e63c&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=1aa0e63c&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-1aa0e63c\"]])\n\nexport default __exports__","import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'\r\nimport HomeView from '../views/HomeView.vue'\r\nimport PlayerView from '../views/PlayerView.vue'\r\n\r\nconst routes: Array = [\r\n {\r\n path: '/',\r\n name: 'home',\r\n component: PlayerView\r\n }\r\n // {\r\n // path: '/players',\r\n // name: 'players',\r\n // component: PlayerView\r\n // },\r\n // {\r\n // path: '/about',\r\n // name: 'about',\r\n // // route level code-splitting\r\n // // this generates a separate chunk (about.[hash].js) for this route\r\n // // which is lazy-loaded when the route is visited.\r\n // component: () => import(/* webpackChunkName: \"about\" */ '../views/AboutView.vue')\r\n // }\r\n]\r\n\r\nconst router = createRouter({\r\n history: createWebHistory(process.env.BASE_URL),\r\n routes\r\n})\r\n\r\nexport default router\r\n","import { createApp, ref, unref } from 'vue'\r\nimport App from './App.vue'\r\nimport router from './router'\r\nimport { createPinia } from 'pinia'\r\nimport { useKillStore } from './stores/kill'\r\n\r\nconst pinia = createPinia()\r\n\r\ncreateApp(App).use(pinia).use(router).mount('#app')\r\n\r\nconst websocketData = {\r\n attacker_id: '1010035351172',\r\n attacker_name: 'Iverral',\r\n cause_of_death: 'mp_weapon_car',\r\n victim_id: '1008553404453',\r\n victim_name: 'GURENTITANIUM',\r\n attacker_current_weapon: 'mp_weapon_car',\r\n victim_current_weapon: 'mp_weapon_sniper',\r\n distance: 300,\r\n game_mode: 'ps',\r\n servername: \"fvnkhead's 3v3\",\r\n map: 'lf_meadow',\r\n host: 1\r\n}\r\n\r\n// dev stuff\r\n\r\nconst store = useKillStore()\r\nfunction registerWebSocketKill () {\r\n const allPlayerArrays = store.$state.players.filter((e) => {\r\n return (\r\n (!e.value.filter.server ||\r\n e.value.filter.server === websocketData.servername) &&\r\n (!e.value.filter.weapon ||\r\n e.value.filter.weapon === websocketData.cause_of_death)\r\n // Handle other types of filters once those are implemented\r\n )\r\n })\r\n allPlayerArrays.forEach(e => {\r\n if (!e.value.data[websocketData.attacker_id]) {\r\n e.value.data[websocketData.attacker_id] = ref({\r\n deaths: 0,\r\n kills: 500,\r\n max_distance: 0,\r\n total_distance: 0,\r\n username: websocketData.attacker_name\r\n })\r\n }\r\n if (!e.value.data[websocketData.victim_id]) {\r\n e.value.data[websocketData.victim_id] = ref({\r\n deaths: 0,\r\n kills: 0,\r\n max_distance: 0,\r\n total_distance: 0,\r\n username: websocketData.victim_name\r\n })\r\n }\r\n // handle deaths with equipped, eventually\r\n /*\r\n if(e.value.filter.weapon){\r\n !e.value.data[websocketData.victim_id] = e.value.data[websocketData.victim_id] = {\r\n deaths: 0,\r\n kills: 0,\r\n max_distance: 0,\r\n total_distance: 0,\r\n username: websocketData.victim_name,\r\n }\r\n } */\r\n\r\n unref(e.value.data[websocketData.victim_id]).deaths++\r\n unref(e.value.data[websocketData.victim_id]).username = websocketData.victim_name\r\n unref(e.value.data[websocketData.attacker_id]).username = websocketData.attacker_name\r\n unref(e.value.data[websocketData.attacker_id]).kills++\r\n unref(e.value.data[websocketData.attacker_id]).total_distance += websocketData.distance\r\n unref(e.value.data[websocketData.attacker_id]).max_distance = Math.max(websocketData.distance, unref(e.value.data[websocketData.attacker_id]).max_distance)\r\n })\r\n const allWeaponsArrays = store.$state.weapons.filter((e) => {\r\n return (\r\n (!e.value.filter.player || e.value.filter.player === websocketData.attacker_id)\r\n // Handle other types of filters once those are implemented\r\n )\r\n })\r\n\r\n allWeaponsArrays.forEach(e => {\r\n if (!e.value.data[websocketData.cause_of_death]) {\r\n e.value.data[websocketData.cause_of_death] = ref({\r\n deaths: 0,\r\n kills: 500,\r\n max_distance: 0,\r\n total_distance: 0,\r\n deaths_while_equipped: 0\r\n })\r\n }\r\n // handle deaths with equipped, eventually\r\n /*\r\n if(e.value.filter.weapon){\r\n !e.value.data[websocketData.victim_id] = e.value.data[websocketData.victim_id] = {\r\n deaths: 0,\r\n kills: 0,\r\n max_distance: 0,\r\n total_distance: 0,\r\n username: websocketData.victim_name,\r\n }\r\n } */\r\n\r\n // unref(e.value.data[websocketData.cause_of_death]).deaths++\r\n unref(e.value.data[websocketData.cause_of_death]).total_distance += websocketData.distance\r\n unref(e.value.data[websocketData.cause_of_death]).kills++\r\n unref(e.value.data[websocketData.cause_of_death]).max_distance = Math.max(websocketData.distance, unref(e.value.data[websocketData.cause_of_death]).max_distance)\r\n })\r\n}\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__(5674); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["_hoisted_1","_createStaticVNode","render","_ctx","_cache","$props","$setup","$data","$options","_component_router_link","_resolveComponent","_component_router_view","_openBlock","_createElementBlock","_Fragment","_createElementVNode","_createVNode","to","class","default","_withCtx","_createTextVNode","_","defineComponent","__exports__","id","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_component_VueMultiselect","_component_PlayerList","_component_PlayerChart","_component_WeaponChart","selectLabel","deselectLabel","placeholder","modelValue","model","server","$event","options","groupedServers","group_label","multiple","e","name","label","onClick","undefined","disabled","weapon","weaponLocale","sortedWeaponList","playerHighlighted","sortedPlayerList","username","filters","onHighlightPlayer","highlight_player","player","removeNullEntries","a","Object","fromEntries","entries","filter","objectEqual","b","assert","deepStrictEqual","useKillStore","defineStore","state","servers","players","weapons","maps","gamemodes","hosts","getters","getPlayerList","find","unref","getWeaponList","getServerList","actions","fetchPlayers","entry","this","shallowRef","data","push","fetch","URLSearchParams","then","async","response","json","map","ref","triggerRef","fetchWeapons","fetchServers","_component_VirtualList","onKeydown","args","selectNextPlayer","tabindex","updateSort","_normalizeClass","sortingData","argument","list","playerList","$emit","highlighted","onScroll","scroll","style","_normalizeStyle","vIndex","rowHeight","length","_renderList","visibleList","index","key","ref_for","_toDisplayString","value","kills","deaths","Math","round","max","max_distance","total_distance","toLoad","vlistHeight","props","type","Array","Number","String","emits","computed","slice","min","visibleCount","ceil","watch","$refs","vlist","getBoundingClientRect","height","newVal","setTimeout","scrollBy","top","findIndex","scrollTop","behavior","methods","target","scrollIndex","mustScrollUp","mustScrollDown","floor","components","VirtualList","direction","store","withoutPlayer","Proxy","date","Date","collator","Intl","Collator","numeric","sensitivity","sort","aVal","_rawValue","bVal","compare","console","log","getTime","reverse","newval","scrollToPlayer","updated","values","Home","Infinity","End","PageDown","PageUp","ArrowUp","ArrowDown","ArrowRight","ArrowLeft","keys","includes","preventDefault","nextIndex","playerid","newElement","scrollIntoView","block","_component_Scatter","chart","chartOptions","ChartJS","LinearScale","PointElement","LineElement","Tooltip","Legend","annotationPlugin","dataLabel","refreshColors","playerData","Scatter","mounted","toRaw","cut","colors","container","getComputedStyle","fg","getPropertyValue","bg","orange","cyan","currentLine","playerIndex","defaultColor","borderColor","fill","backgroundColor","pointRadius","hoverRadius","pointStyle","datasets","labels","y","x","chartStaticOptions","responsive","maintainAspectRatio","animation","duration","layout","autoPadding","scales","title","text","display","color","ticks","element","onHover","native","cursor","chartStaticPlugins","endX","endY","maxX","maxY","tooltip","callbacks","ctx","dataIndex","dataset","parsed","annotation","annotations","line","yMin","xMin","yMax","xMax","borderWidth","borderDash","legend","plugins","datalabels","formatter","context","borderRadius","align","anchor","clamp","_component_Doughnut","ArcElement","Doughnut","yellow","green","purple","red","pink","chartData","weaponId","padding","withoutWeapon","VueMultiselect","PlayerList","PlayerChart","WeaponChart","created","$route","query","toString","_1","withoutServer","forEach","host","withoutWeapons","withoutPlayers","sortedServerList","handler","newModel","deep","newValue","_2","withoutFilters","router","oldValue","playerId","routes","path","component","PlayerView","createRouter","history","createWebHistory","process","pinia","createPinia","createApp","App","use","mount","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","m","deferred","O","result","chunkIds","fn","priority","notFulfilled","i","fulfilled","j","every","splice","r","n","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
diff --git a/dist/js/app.62152a64.js.map b/dist/js/app.62152a64.js.map
deleted file mode 100644
index ef0327c..0000000
--- a/dist/js/app.62152a64.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"js/app.62152a64.js","mappings":"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","sources":["webpack://toneapi_webclient/./src/App.vue?ce91","webpack://toneapi_webclient/./src/App.vue?847a","webpack://toneapi_webclient/./src/App.vue","webpack://toneapi_webclient/./src/views/PlayerView.vue?5b43","webpack://toneapi_webclient/./src/stores/kill.ts","webpack://toneapi_webclient/./src/components/PlayerList.vue?0abd","webpack://toneapi_webclient/./src/components/List/VirtualList.vue?0d47","webpack://toneapi_webclient/./src/components/List/VirtualList.vue?49a5","webpack://toneapi_webclient/./src/components/List/VirtualList.vue","webpack://toneapi_webclient/./src/components/PlayerList.vue?f30b","webpack://toneapi_webclient/./src/components/PlayerList.vue","webpack://toneapi_webclient/./src/components/PlayerChart.vue?1eb7","webpack://toneapi_webclient/./src/components/PlayerChart.vue?ec59","webpack://toneapi_webclient/./src/components/PlayerChart.vue","webpack://toneapi_webclient/./src/components/WeaponChart.vue?102c","webpack://toneapi_webclient/./src/components/WeaponChart.vue?1a04","webpack://toneapi_webclient/./src/components/WeaponChart.vue","webpack://toneapi_webclient/./src/views/PlayerView.vue?6941","webpack://toneapi_webclient/./src/views/PlayerView.vue","webpack://toneapi_webclient/./src/router/index.ts","webpack://toneapi_webclient/./src/main.ts","webpack://toneapi_webclient/webpack/bootstrap","webpack://toneapi_webclient/webpack/runtime/chunk loaded","webpack://toneapi_webclient/webpack/runtime/compat get default export","webpack://toneapi_webclient/webpack/runtime/define property getters","webpack://toneapi_webclient/webpack/runtime/global","webpack://toneapi_webclient/webpack/runtime/hasOwnProperty shorthand","webpack://toneapi_webclient/webpack/runtime/jsonp chunk loading","webpack://toneapi_webclient/webpack/startup"],"sourcesContent":["import { createElementVNode as _createElementVNode, createTextVNode as _createTextVNode, resolveComponent as _resolveComponent, withCtx as _withCtx, createVNode as _createVNode, createStaticVNode as _createStaticVNode, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = /*#__PURE__*/_createStaticVNode(\"TONE API
\", 4)\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_router_link = _resolveComponent(\"router-link\")!\n const _component_router_view = _resolveComponent(\"router-view\")!\n\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n _createElementVNode(\"header\", null, [\n _createElementVNode(\"nav\", null, [\n _hoisted_1,\n _createVNode(_component_router_link, {\n to: \"/\",\n class: \"navbar-element\"\n }, {\n default: _withCtx(() => [\n _createTextVNode(\"Players\")\n ]),\n _: 1\n })\n ])\n ]),\n _createVNode(_component_router_view)\n ], 64))\n}","\r\n\r\nimport { defineComponent } from 'vue'\r\n\r\nexport default defineComponent({\r\n\r\n})\r\n","import { render } from \"./App.vue?vue&type=template&id=4fdca3af&ts=true\"\nimport script from \"./App.vue?vue&type=script&lang=ts\"\nexport * from \"./App.vue?vue&type=script&lang=ts\"\n\nimport \"./App.vue?vue&type=style&index=0&id=4fdca3af&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, createElementVNode as _createElementVNode, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-1aa0e63c\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = { id: \"filters\" }\nconst _hoisted_2 = { class: \"multiselect-wrapper\" }\nconst _hoisted_3 = [\"disabled\"]\nconst _hoisted_4 = { class: \"multiselect-wrapper\" }\nconst _hoisted_5 = [\"disabled\"]\nconst _hoisted_6 = { class: \"multiselect-wrapper\" }\nconst _hoisted_7 = [\"disabled\"]\nconst _hoisted_8 = { 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 _createElementVNode(\"span\", _hoisted_2, [\n _createVNode(_component_VueMultiselect, {\n selectLabel: \"\",\n deselectLabel: \"remove\",\n placeholder: \"Select server\",\n modelValue: _ctx.model.server,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((_ctx.model.server) = $event)),\n options: _ctx.groupedServers,\n \"group-values\": \"servers\",\n group_label: \"id\",\n \"group-select\": false,\n \"allow-empty\": true,\n multiple: false,\n \"custom-label\": ((e) => e.name),\n \"track-by\": \"name\",\n label: \"name\"\n }, null, 8, [\"modelValue\", \"options\", \"custom-label\"]),\n _createElementVNode(\"button\", {\n onClick: _cache[1] || (_cache[1] = ($event: any) => (_ctx.model.server = undefined)),\n disabled: !_ctx.model.server\n }, \"X\", 8, _hoisted_3)\n ]),\n _createElementVNode(\"span\", _hoisted_4, [\n _createVNode(_component_VueMultiselect, {\n selectLabel: \"\",\n deselectLabel: \"remove\",\n placeholder: \"Select weapon\",\n modelValue: _ctx.model.weapon,\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = ($event: any) => ((_ctx.model.weapon) = $event)),\n \"custom-label\": ((e) => _ctx.weaponLocale[e] || e),\n options: _ctx.sortedWeaponList,\n \"allow-empty\": true\n }, null, 8, [\"modelValue\", \"custom-label\", \"options\"]),\n _createElementVNode(\"button\", {\n onClick: _cache[3] || (_cache[3] = ($event: any) => (_ctx.model.weapon = undefined)),\n disabled: !_ctx.model.weapon\n }, \"X\", 8, _hoisted_5)\n ]),\n _createElementVNode(\"span\", _hoisted_6, [\n _createVNode(_component_VueMultiselect, {\n \"options-limit\": 20,\n selectLabel: \"\",\n deselectLabel: \"remove\",\n placeholder: \"Search player\",\n modelValue: _ctx.playerHighlighted,\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = ($event: any) => ((_ctx.playerHighlighted) = $event)),\n options: _ctx.sortedPlayerList,\n \"allow-empty\": true,\n \"custom-label\": ((e) => e?.username)\n }, null, 8, [\"modelValue\", \"options\", \"custom-label\"]),\n _createElementVNode(\"button\", {\n onClick: _cache[5] || (_cache[5] = ($event: any) => (_ctx.playerHighlighted = undefined)),\n disabled: !_ctx.playerHighlighted\n }, \"X\", 8, _hoisted_7)\n ])\n ]),\n _createElementVNode(\"div\", _hoisted_8, [\n _createVNode(_component_PlayerList, {\n filters: _ctx.filters,\n onHighlightPlayer: _ctx.highlight_player,\n playerHighlighted: _ctx.playerHighlighted?.id\n }, null, 8, [\"filters\", \"onHighlightPlayer\", \"playerHighlighted\"]),\n _createVNode(_component_PlayerChart, {\n filters: _ctx.filters,\n onHighlightPlayer: _ctx.highlight_player,\n playerHighlighted: _ctx.playerHighlighted?.id\n }, null, 8, [\"filters\", \"onHighlightPlayer\", \"playerHighlighted\"]),\n _createVNode(_component_WeaponChart, {\n filters: { player: _ctx.playerHighlighted?.id, ..._ctx.filters },\n playerHighlighted: _ctx.playerHighlighted?.id\n }, null, 8, [\"filters\", \"playerHighlighted\"])\n ])\n ], 64))\n}","import { defineStore } from 'pinia'\r\nimport * as assert from 'assert'\r\nimport { Ref, reactive, ref, shallowRef, triggerRef, unref } from 'vue'\r\n\r\nexport interface Filters {\r\n server?: string;\r\n player?: string;\r\n weapon?: string;\r\n host?: string;\r\n map?: string;\r\n gamemode?: string;\r\n}\r\n\r\nfunction removeNullEntries (a: Filters) {\r\n return Object.fromEntries(\r\n Object.entries(a).filter((e) => e[1] !== undefined && e[1] !== null)\r\n )\r\n}\r\nfunction objectEqual (a: Filters, b: Filters) {\r\n try {\r\n a = removeNullEntries(a)\r\n b = removeNullEntries(b)\r\n assert.deepStrictEqual(a, b)\r\n return true\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\nexport interface Kill {\r\n deaths: number;\r\n kills: number;\r\n // eslint-disable-next-line camelcase\r\n max_distance: number;\r\n // eslint-disable-next-line camelcase\r\n total_distance: number;\r\n}\r\nexport interface KillData {\r\n filter: Filters;\r\n data: { [key: string]: Ref };\r\n}\r\n\r\nexport interface Player extends Kill {\r\n username: string;\r\n // eslint-disable-next-line camelcase\r\n // deaths_while_equipped?: number;\r\n}\r\n\r\nexport interface Weapon extends Kill {\r\n // eslint-disable-next-line camelcase\r\n deaths_while_equipped: number;\r\n}\r\n\r\nexport interface Server extends Kill {\r\n host: number;\r\n}\r\n\r\n// define your typings for the store state\r\nexport interface State {\r\n servers: Ref>[];\r\n players: Ref>[];\r\n weapons: Ref>[];\r\n maps: Ref>[];\r\n gamemodes: Ref>[];\r\n hosts: { [key: number]: string };\r\n}\r\n\r\nexport const useKillStore = defineStore('kill', {\r\n state: (): State => ({\r\n servers: [],\r\n players: [],\r\n weapons: [],\r\n maps: [],\r\n gamemodes: [],\r\n hosts: {}\r\n }),\r\n getters: {\r\n getPlayerList: (state) => (filters: Filters) => {\r\n return state.players.find((e) => objectEqual(unref(e).filter, filters))\r\n },\r\n getWeaponList: (state) => (filters: Filters) =>\r\n state.weapons.find((e) => objectEqual(unref(e).filter, filters)),\r\n getServerList: (state) => (filters: Filters) =>\r\n state.servers.find((e) => objectEqual(unref(e).filter, filters))\r\n },\r\n actions: {\r\n fetchPlayers (filter: Filters) {\r\n filter = removeNullEntries(filter)\r\n let entry = this.players.find((e) => objectEqual(unref(e).filter, filter))\r\n if (entry === undefined) {\r\n entry = shallowRef({ filter, data: {} })\r\n this.players.push(entry)\r\n }\r\n fetch(\r\n 'https://tone.sleepycat.date/v2/client/players?' +\r\n new URLSearchParams(filter as Record)\r\n ).then(async response => {\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n unref(entry)!.data = Object.fromEntries(Object.entries(await response.json()).map(e => [e[0], ref(e[1] as Player)]))\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n triggerRef(entry!)\r\n })\r\n return entry\r\n },\r\n fetchWeapons (filter: Filters) {\r\n filter = removeNullEntries(filter)\r\n let entry = this.weapons.find((e) => objectEqual(unref(e).filter, filter))\r\n if (!entry) {\r\n entry = shallowRef({ filter, data: {} })\r\n this.weapons.push(entry)\r\n }\r\n\r\n fetch(\r\n 'https://tone.sleepycat.date/v2/client/weapons?' +\r\n new URLSearchParams(filter as Record)\r\n ).then(async response => {\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n unref(entry)!.data = Object.fromEntries(Object.entries(await response.json()).map(e => [e[0], ref(e[1] as Weapon)]))\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n triggerRef(entry!)\r\n })\r\n return entry\r\n },\r\n fetchServers (filter: Filters) {\r\n filter = removeNullEntries(filter)\r\n let entry = this.servers.find((e) => objectEqual(unref(e).filter, filter))\r\n if (!entry) {\r\n entry = shallowRef({ filter, data: {} })\r\n this.servers.push(entry)\r\n }\r\n fetch(\r\n 'https://tone.sleepycat.date/v2/client/servers?' +\r\n new URLSearchParams(filter as Record)\r\n ).then(async response => {\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n unref(entry)!.data = Object.fromEntries(Object.entries(await response.json()).map(e => [e[0], ref(e[1] as Server)]))\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n triggerRef(entry!)\r\n })\r\n return entry\r\n }\r\n }\r\n})\r\n","import { createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, resolveComponent as _resolveComponent, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = { class: \"playerHeaders\" }\nconst _hoisted_2 = /*#__PURE__*/_createElementVNode(\"span\", null, null, -1)\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_VirtualList = _resolveComponent(\"VirtualList\")!\n\n return (_openBlock(), _createElementBlock(\"div\", {\n class: \"playerTable\",\n onKeydown: _cache[7] || (_cache[7] = \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.updateSort('username'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'username' ? 'selected' : '')\n }, \"Username\", 2),\n _createElementVNode(\"span\", {\n onClick: _cache[1] || (_cache[1] = ($event: any) => (_ctx.updateSort('kills'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'kills' ? 'selected' : '')\n }, \"K\", 2),\n _createElementVNode(\"span\", {\n onClick: _cache[2] || (_cache[2] = ($event: any) => (_ctx.updateSort('deaths'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'deaths' ? 'selected' : '')\n }, \"D\", 2),\n _createElementVNode(\"span\", {\n onClick: _cache[3] || (_cache[3] = ($event: any) => (_ctx.updateSort('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.updateSort('max_distance'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'max_distance' ? 'selected' : '')\n }, \"max distance\", 2),\n _createElementVNode(\"span\", {\n onClick: _cache[5] || (_cache[5] = ($event: any) => (_ctx.updateSort('avg_distance'))),\n class: _normalizeClass(_ctx.sortingData.argument == 'avg_distance' ? 'selected' : '')\n }, \"average distance\", 2)\n ]),\n _createVNode(_component_VirtualList, {\n list: _ctx.playerList,\n \"row-height\": 32,\n onHighlightPlayer: _cache[6] || (_cache[6] = ($event: any) => (_ctx.$emit('highlightPlayer', $event))),\n highlighted: _ctx.playerHighlighted\n }, null, 8, [\"list\", \"highlighted\"])\n ], 32))\n}","import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock, toDisplayString as _toDisplayString, createElementVNode as _createElementVNode, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-96db01e6\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = [\"onClick\"]\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n return (_openBlock(), _createElementBlock(\"div\", {\n ref: \"vlist\",\n class: \"vlist\",\n onScroll: _cache[0] || (_cache[0] = \n//@ts-ignore\n(...args) => (_ctx.scroll && _ctx.scroll(...args)))\n }, [\n _createElementVNode(\"div\", {\n ref: \"vscroll\",\n class: \"vscroll\",\n style: _normalizeStyle(`padding: ${(_ctx.vIndex*_ctx.$props.rowHeight!)}px 0px ${(_ctx.list.length*_ctx.$props.rowHeight!)-(_ctx.vIndex*_ctx.$props.rowHeight!)}px;`)\n }, [\n (_openBlock(true), _createElementBlock(_Fragment, null, _renderList(_ctx.visibleList, (player, index) => {\n return (_openBlock(), _createElementBlock(\"div\", {\n class: _normalizeClass('playerRow ' + (player.id === _ctx.$props.highlighted ? 'selected' : '')),\n key: player.id,\n onClick: ($event: any) => (_ctx.$emit('highlightPlayer', player.id)),\n ref_for: true,\n ref: `player:` + player.id\n }, [\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(index + 1 + _ctx.vIndex), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(player.value.username), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(player.value.kills), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(player.value.deaths), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(Math.round(player.value.kills / Math.max(1, player.value.deaths) * 100) / 100), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(player.value.max_distance), 1)\n ]),\n _createElementVNode(\"div\", null, [\n _createElementVNode(\"span\", null, _toDisplayString(Math.round(((player.value.total_distance / player.value.kills) || 0) * 100) / 100), 1)\n ])\n ], 10, _hoisted_1))\n }), 128))\n ], 4)\n ], 544))\n}","\r\nimport { Player } from '@/stores/kill'\r\nimport { defineComponent, PropType, Ref } from 'vue'\r\n\r\nexport default defineComponent({\r\n data () {\r\n return {\r\n toLoad: 10,\r\n vlistHeight: 0,\r\n vIndex: 0\r\n }\r\n },\r\n props: {\r\n list: { type: Array as PropType<(Ref & { id: string })[]>, default: () => [] },\r\n rowHeight: { type: Number, default: () => 32 },\r\n highlighted: String\r\n },\r\n emits: ['highlightPlayer'],\r\n\r\n computed: {\r\n visibleList () {\r\n return this.list.slice(Math.max(this.vIndex, 0), Math.min(this.vIndex + this.visibleCount * 3, this.list.length))\r\n },\r\n visibleCount () {\r\n return Math.ceil(this.vlistHeight / this.$props.rowHeight)\r\n }\r\n },\r\n watch: {\r\n list () {\r\n this.vlistHeight = (this.$refs.vlist as HTMLElement)?.getBoundingClientRect().height || 0\r\n },\r\n highlighted (newVal) {\r\n if (newVal) setTimeout(() => (this.$refs.vlist as HTMLElement)?.scrollBy({ top: ((this.list.findIndex(e => e.id === newVal)) * this.rowHeight) - ((this.$refs.vlist as HTMLElement))?.scrollTop - (this.vlistHeight / 2 - this.$props.rowHeight), behavior: 'smooth' }), 1)\r\n }\r\n },\r\n methods: {\r\n scroll (e:Event) {\r\n const scrollTop = (e.target as HTMLElement)?.scrollTop\r\n const scrollIndex = Math.round(scrollTop / this.$props.rowHeight)\r\n\r\n const mustScrollUp = Math.max(0, scrollIndex - (this.visibleCount)) < this.vIndex\r\n const mustScrollDown = Math.min(this.list.length, scrollIndex + (this.visibleCount)) > this.vIndex + (this.visibleCount * 2)\r\n if (mustScrollUp) {\r\n this.vIndex = Math.max(0, Math.floor((scrollIndex - this.visibleCount) / 4) * 4)\r\n } else if (mustScrollDown) {\r\n this.vIndex = Math.max(0, Math.floor(scrollIndex / 4) * 4)\r\n }\r\n }\r\n }\r\n\r\n})\r\n","import { render } from \"./VirtualList.vue?vue&type=template&id=96db01e6&scoped=true&ts=true\"\nimport script from \"./VirtualList.vue?vue&type=script&lang=ts\"\nexport * from \"./VirtualList.vue?vue&type=script&lang=ts\"\n\nimport \"./VirtualList.vue?vue&type=style&index=0&id=96db01e6&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-96db01e6\"]])\n\nexport default __exports__","\r\nimport { defineComponent, PropType, Ref } from 'vue'\r\nimport { useKillStore, Player, Filters } from '@/stores/kill'\r\nimport VirtualList from './List/VirtualList.vue'\r\n\r\nexport default defineComponent({\r\n components: { VirtualList },\r\n props: {\r\n filters: { type: Object as PropType, default: () => ({}) },\r\n playerHighlighted: String\r\n },\r\n emits: ['highlightPlayer'],\r\n data () {\r\n return {\r\n sortingData: { direction: -1, argument: 'kills' as keyof Player | 'k/d' | 'avg_distance' },\r\n store: useKillStore()\r\n }\r\n },\r\n computed: {\r\n players (): { [key: string]: Ref } {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { player: _, ...withoutPlayer } = this.filters\r\n const data = this.store.getPlayerList(withoutPlayer)?.value.data\r\n if (!data) return this.store.fetchPlayers(withoutPlayer).value.data\r\n return data\r\n },\r\n playerList (): (Ref & { id: string })[] {\r\n if (!this.players) return []\r\n const players = Object.entries(this.players).map(e => {\r\n const target = {} as ProxyHandler[>\r\n const player = new Proxy(e[1], target) as Ref] & { id: string }\r\n player.id = e[0]\r\n return player\r\n }) as (Ref & { id: string })[]\r\n\r\n const date = new Date()\r\n if (this.sortingData.argument === 'username') {\r\n const collator = new Intl.Collator('en', { numeric: true, sensitivity: 'base' })\r\n players.sort((a, b) => {\r\n // Hack because toRaw is slow as fuck\r\n const aVal = a._rawValue\r\n const bVal = b._rawValue\r\n return collator.compare(aVal.username, bVal.username)\r\n })\r\n } else if (this.sortingData.argument === 'k/d') {\r\n players.sort((a, b) => {\r\n // Hack because toRaw is slow as fuck\r\n const aVal = a._rawValue\r\n const bVal = b._rawValue\r\n return aVal.kills / Math.max(1, aVal.deaths) - bVal.kills / Math.max(1, bVal.deaths)\r\n })\r\n } else if (this.sortingData.argument === 'avg_distance') {\r\n players.sort((a, b) => {\r\n // Hack because toRaw is slow as fuck\r\n const aVal = a._rawValue\r\n const bVal = b._rawValue\r\n return ((aVal.total_distance / aVal.kills) || 0) - ((bVal.total_distance / bVal.kills) || 0)\r\n })\r\n } else {\r\n const argument = this.sortingData.argument\r\n players.sort((a, b) => {\r\n // Hack because toRaw is slow as fuck\r\n const aVal = a._rawValue\r\n const bVal = b._rawValue\r\n return aVal[argument] - bVal[argument]\r\n })\r\n }\r\n console.log('Sorting the player object took + ' + ((new Date()).getTime() - date.getTime()) + 'ms')\r\n if (this.sortingData.direction < 0) {\r\n players.reverse()\r\n }\r\n return players\r\n }\r\n },\r\n watch: {\r\n playerHighlighted (newval) {\r\n this.scrollToPlayer(newval)\r\n },\r\n playerList () {\r\n if (this.playerHighlighted) this.scrollToPlayer(this.playerHighlighted)\r\n }\r\n },\r\n updated () {\r\n /* const element = this.$refs['player:' + this.$props.playerHighlighted] as HTMLElement[]\r\n if (!element || !element[0]) return\r\n element[0].scrollIntoView({ behavior: 'smooth', block: 'center' }) */\r\n },\r\n methods: {\r\n selectNextPlayer (e: KeyboardEvent) {\r\n const values = {\r\n Home: -Infinity,\r\n End: Infinity,\r\n PageDown: 100,\r\n PageUp: -100,\r\n ArrowUp: -1,\r\n ArrowDown: 1,\r\n ArrowRight: 10,\r\n ArrowLeft: -10\r\n } as { [key: string]: number }\r\n if (!this.$props.playerHighlighted) return\r\n if (!Object.keys(values).includes(e.key)) return\r\n e.preventDefault()\r\n const index = this.playerList.findIndex(e => e.id === this.$props.playerHighlighted)\r\n let nextIndex = (index + values[e.key])\r\n if (nextIndex >= this.playerList.length) nextIndex = this.playerList.length - 1\r\n if (nextIndex < 0) nextIndex = 0\r\n this.$emit('highlightPlayer', this.playerList[nextIndex].id)\r\n },\r\n updateSort (argument: string) {\r\n if (this.sortingData.argument === argument) {\r\n this.sortingData.direction *= -1\r\n } else {\r\n this.sortingData.direction = -1\r\n }\r\n this.sortingData.argument = argument as typeof this.sortingData.argument\r\n },\r\n scrollToPlayer (playerid: string) {\r\n const newElement = this.$refs['player:' + playerid] as HTMLElement[]\r\n // Some hack because of some inconsistency\r\n setTimeout(function () {\r\n if (newElement && newElement[0]) { newElement[0].scrollIntoView({ behavior: 'smooth', block: 'center' }) }\r\n }, 10)\r\n }\r\n }\r\n\r\n})\r\n","import { render } from \"./PlayerList.vue?vue&type=template&id=092eb8cd&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=092eb8cd&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { resolveComponent as _resolveComponent, createVNode as _createVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-e83d63ce\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = {\n class: \"playerChart\",\n ref: \"container\"\n}\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_Scatter = _resolveComponent(\"Scatter\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createVNode(_component_Scatter, {\n data: _ctx.chart,\n options: _ctx.chartOptions\n }, null, 8, [\"data\", \"options\"])\n ], 512))\n}","\r\nimport {\r\n Chart as ChartJS,\r\n LinearScale,\r\n PointElement,\r\n LineElement,\r\n Tooltip,\r\n Legend,\r\n CoreChartOptions,\r\n PluginChartOptions,\r\n ScaleChartOptions\r\n} from 'chart.js'\r\nimport annotationPlugin, { AnnotationPluginOptions } from 'chartjs-plugin-annotation'\r\nimport dataLabel from 'chartjs-plugin-datalabels'\r\nimport { useKillStore, Player, Filters } from '@/stores/kill'\r\n\r\nimport { Scatter } from 'vue-chartjs'\r\nimport { defineComponent, PropType, Ref, toRaw, triggerRef, unref } from 'vue'\r\nimport { ChartEvent } from 'chart.js/dist/core/core.plugins'\r\nimport { _DeepPartialObject } from 'chart.js/dist/types/utils'\r\n\r\nChartJS.register(LinearScale, PointElement, LineElement, Tooltip, Legend, annotationPlugin, dataLabel)\r\n\r\nexport default defineComponent({\r\n name: 'PlayerChart',\r\n props: {\r\n filters: Object as PropType,\r\n playerHighlighted: String\r\n },\r\n data: () => {\r\n return {\r\n store: useKillStore(),\r\n refreshColors: 0,\r\n playerData: []\r\n }\r\n },\r\n emits: ['highlightPlayer'],\r\n components: {\r\n Scatter\r\n },\r\n mounted () {\r\n this.refreshColors++\r\n },\r\n computed: {\r\n playerList (): (Player & {id:string})[] {\r\n const data = this.store.getPlayerList(this.filters || {})?.value.data\r\n if (!data) return Object.entries(this.store.fetchPlayers(this.filters || {}).value.data).map(e => ({ id: e[0], ...toRaw(e[1].value) }))\r\n const cut = Object.entries(data).map(e => ({ id: e[0], ...toRaw(e[1].value) }))\r\n cut.sort((a, b) => {\r\n return b.kills - a.kills\r\n })\r\n return cut.slice(0, 200)\r\n },\r\n colors () {\r\n // eslint-disable-next-line no-unused-expressions\r\n this.refreshColors\r\n const colors = {} as { [key: string]: string }\r\n if (this.$refs.container) {\r\n const style = getComputedStyle(this.$refs.container as Element)\r\n colors.fg = style.getPropertyValue('--foreground')\r\n colors.bg = style.getPropertyValue('--bg-color')\r\n colors.orange = style.getPropertyValue('--orange')\r\n colors.cyan = style.getPropertyValue('--cyan')\r\n colors.currentLine = style.getPropertyValue('--current-line')\r\n } else {\r\n colors.fg = '#ffffff'\r\n }\r\n return colors\r\n },\r\n chart () {\r\n const playerIndex = this.playerList.findIndex(e => e.id === this.$props.playerHighlighted)\r\n const defaultColor = this.colors.cyan\r\n const borderColor = new Array(this.playerList.length).fill(defaultColor)\r\n borderColor[playerIndex] = this.colors.orange\r\n const backgroundColor = borderColor\r\n const pointRadius = new Array(this.playerList.length).fill(1)\r\n pointRadius[playerIndex] = 20\r\n const hoverRadius = new Array(this.playerList.length).fill(4)\r\n hoverRadius[playerIndex] = 30\r\n const pointStyle = new Array(this.playerList.length).fill('circle')\r\n pointStyle[playerIndex] = 'crossRot'\r\n return {\r\n datasets: [\r\n {\r\n label: 'Players',\r\n labels: this.playerList.map(e => e.id) || [] as string[],\r\n borderColor,\r\n backgroundColor,\r\n pointRadius,\r\n pointStyle,\r\n hoverRadius,\r\n data: this.playerList.map((player) => ({ y: player.kills, x: player.deaths }))\r\n }\r\n ]\r\n }\r\n },\r\n chartStaticOptions () {\r\n return {\r\n responsive: true,\r\n maintainAspectRatio: false,\r\n animation: { duration: 500 },\r\n layout: { autoPadding: false },\r\n scales: {\r\n y: {\r\n title: {\r\n text: 'Kills',\r\n display: true,\r\n color: this.colors.fg\r\n },\r\n ticks: {\r\n color: this.colors.fg\r\n }\r\n },\r\n x: {\r\n title: {\r\n text: 'Deaths',\r\n display: true,\r\n color: this.colors.fg\r\n },\r\n ticks: {\r\n color: this.colors.fg\r\n }\r\n }\r\n },\r\n onClick: (e: ChartEvent, element: any) => {\r\n this.$emit('highlightPlayer', element.length > 0 ? this.playerList[element[0].index].id : undefined)\r\n if (this.store.getPlayerList(this.filters || {}) !== undefined) triggerRef(this.store.getPlayerList(this.filters || {}) as unknown as Ref)\r\n },\r\n onHover: (e: any, element: any) => {\r\n if (!e.native.target) return\r\n (e.native.target as HTMLElement).style.cursor = element[0] ? 'pointer' : 'default'\r\n }\r\n }\r\n },\r\n chartStaticPlugins () {\r\n let endX = 0\r\n let endY = 0\r\n if (this.playerList) {\r\n const maxX = Math.max(...this.playerList.map(e => e.deaths))\r\n const maxY = Math.max(...this.playerList.map(e => e.kills))\r\n if (maxY > maxX) {\r\n endX = maxX\r\n endY = (maxX / maxY) * maxY\r\n } else {\r\n endY = maxY\r\n endX = (maxY / maxX) * maxX\r\n }\r\n }\r\n return {\r\n tooltip: {\r\n callbacks: {\r\n label: (ctx: any) => {\r\n let label: string\r\n if (!this.playerList) {\r\n label = ctx.dataset.labels[ctx.dataIndex]\r\n } else {\r\n label = this.playerList[ctx.dataIndex].username\r\n }\r\n label += ' (' + ctx.parsed.y + ' kills ' + ctx.parsed.x + ' deaths)'\r\n return label\r\n }\r\n }\r\n },\r\n annotation: {\r\n annotations: {\r\n line: {\r\n type: 'line',\r\n yMin: 0,\r\n xMin: 0,\r\n yMax: endY,\r\n xMax: endX,\r\n borderWidth: 2,\r\n borderColor: this.colors.orange,\r\n borderDash: [1, 5]\r\n }\r\n }\r\n } as _DeepPartialObject,\r\n legend: { display: false }\r\n }\r\n },\r\n chartOptions (): _DeepPartialObject & PluginChartOptions<'scatter'> & ScaleChartOptions<'scatter'>> {\r\n // eslint-disable-next-line no-unused-expressions\r\n this.$props.playerHighlighted\r\n return {\r\n ...this.chartStaticOptions,\r\n plugins: {\r\n ...this.chartStaticPlugins,\r\n datalabels: {\r\n formatter: (value: any, context: any) => {\r\n return this.playerList[context.dataIndex].username\r\n },\r\n backgroundColor: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerList[context.dataIndex].id) ? this.colors.orange : null,\r\n borderColor: this.colors.fg,\r\n borderWidth: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerList[context.dataIndex].id) ? 1 : 0,\r\n borderRadius: 5,\r\n display: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerList[context.dataIndex].id) ? 'true' : 'auto',\r\n align: -45,\r\n anchor: 'end',\r\n clamp: true,\r\n color: (context: any) => (this.$props.playerHighlighted && this.$props.playerHighlighted === this.playerList[context.dataIndex].id) ? this.colors.bg : this.colors.fg\r\n }\r\n }\r\n }\r\n }\r\n }\r\n /* methods: {\r\n refreshChart () {\r\n if (this.store.getPlayerList(this.filters || {}) !== undefined) triggerRef(this.store.getPlayerList(this.filters || {}) as unknown as Ref)\r\n }\r\n } */\r\n})\r\n","import { render } from \"./PlayerChart.vue?vue&type=template&id=e83d63ce&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=e83d63ce&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-e83d63ce\"]])\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-921138fe\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = {\n class: \"weaponChart\",\n ref: \"container\"\n}\n\nexport function render(_ctx: any,_cache: any,$props: any,$setup: any,$data: any,$options: any) {\n const _component_Doughnut = _resolveComponent(\"Doughnut\")!\n\n return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n _createVNode(_component_Doughnut, {\n data: _ctx.chart,\n options: _ctx.chartOptions\n }, null, 8, [\"data\", \"options\"])\n ], 512))\n}","\r\nimport { Chart as ChartJS, ArcElement, Tooltip, Legend } from 'chart.js'\r\nimport dataLabel from 'chartjs-plugin-datalabels'\r\nimport { Weapon, Filters, useKillStore } from '@/stores/kill'\r\nimport { Doughnut } from 'vue-chartjs'\r\nimport { defineComponent, PropType, Ref } from 'vue'\r\nimport weapons from '../stores/weapons.json'\r\n\r\nChartJS.register(ArcElement, Tooltip, Legend, dataLabel)\r\n\r\nexport default defineComponent({\r\n name: 'PlayerChart',\r\n props: {\r\n filters: Object as PropType,\r\n playerHighlighted: String\r\n },\r\n emits: ['highlightPlayer'],\r\n components: {\r\n Doughnut\r\n },\r\n mounted () {\r\n this.refreshColors++\r\n },\r\n data: () => {\r\n return {\r\n store: useKillStore(),\r\n refreshColors: 0\r\n }\r\n },\r\n computed: {\r\n colors () {\r\n // eslint-disable-next-line no-unused-expressions\r\n this.refreshColors\r\n const colors = {} as { [key: string]: string }\r\n if (this.$refs.container) {\r\n const style = getComputedStyle(this.$refs.container as Element)\r\n colors.fg = style.getPropertyValue('--foreground')\r\n colors.bg = style.getPropertyValue('--bg-color')\r\n colors.orange = style.getPropertyValue('--orange')\r\n colors.cyan = style.getPropertyValue('--cyan')\r\n colors.yellow = style.getPropertyValue('--yellow')\r\n colors.green = style.getPropertyValue('--green')\r\n colors.purple = style.getPropertyValue('--purple')\r\n colors.red = style.getPropertyValue('--red')\r\n colors.pink = style.getPropertyValue('--pink')\r\n colors.currentLine = style.getPropertyValue('--current-line')\r\n } else {\r\n colors.fg = '#ffffff'\r\n }\r\n return colors\r\n },\r\n chart () {\r\n const colors = [\r\n 'cyan',\r\n 'green',\r\n 'orange',\r\n 'pink',\r\n 'purple',\r\n 'red',\r\n 'yellow'\r\n ]\r\n const chartData = {\r\n datasets: [\r\n {\r\n label: 'Weapons',\r\n labels: this.sortedWeaponList || ([] as string[]),\r\n borderColor: () => this.colors.fg,\r\n backgroundColor: (context: any) => {\r\n return this.colors[\r\n colors[(context.dataIndex * 3) % colors.length]\r\n ]\r\n },\r\n data: [] as number[]\r\n }\r\n ]\r\n }\r\n if (!this.sortedWeaponList) {\r\n return chartData\r\n }\r\n chartData.datasets[0].data = this.sortedWeaponList.map((e) => {\r\n if (!this.weapons) {\r\n return 0\r\n }\r\n return this.weapons[e].value.kills\r\n })\r\n return chartData\r\n },\r\n chartOptions () {\r\n // eslint-disable-next-line no-unused-expressions\r\n this.$props.playerHighlighted\r\n const options = {\r\n responsive: true,\r\n maintainAspectRatio: true,\r\n animation: { duration: 500 },\r\n layout: { autoPadding: false },\r\n plugins: {\r\n datalabels: {\r\n formatter: (value: any, context: any) => {\r\n const weaponId = this.sortedWeaponList[context.dataIndex]\r\n // if (!(weapons as {[key:string]:string})[weaponId]) console.log(weaponId)\r\n return (weapons as {[key:string]:string})[weaponId] || weaponId\r\n },\r\n backgroundColor: (context: any) => {\r\n return context.dataset.backgroundColor(context)\r\n },\r\n borderColor: this.colors.fg,\r\n borderRadius: 25,\r\n borderWidth: 2,\r\n color: this.colors.bg,\r\n display: (context: any) => {\r\n return context.dataIndex === context.dataset.labels.length - 1\r\n ? true\r\n : 'auto'\r\n },\r\n padding: 6\r\n },\r\n tooltip: {\r\n callbacks: {\r\n label: (ctx: any) => {\r\n let label: string\r\n if (!this.sortedWeaponList) {\r\n label = ctx.dataset.labels[ctx.dataIndex]\r\n } else {\r\n label = this.sortedWeaponList[ctx.dataIndex]\r\n }\r\n label += ' (' + this.weapons[label].value.kills + ' kills)'\r\n return label\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return options\r\n },\r\n weapons (): { [key: string]: Ref } {\r\n const { weapon: _, ...withoutWeapon } = this.filters || {}\r\n const data = this.store.getWeaponList(withoutWeapon)?.value.data\r\n if (!data) return this.store.fetchWeapons(withoutWeapon).value.data\r\n return data\r\n },\r\n sortedWeaponList (): string[] {\r\n if (!this.weapons) return []\r\n const weapons = Object.keys(this.weapons)\r\n weapons.sort((a, b) => {\r\n if (Number(this.weapons[a].value.kills) < Number(this.weapons[b].value.kills)) {\r\n return -1\r\n }\r\n if (Number(this.weapons[a].value.kills) > Number(this.weapons[b].value.kills)) {\r\n return 1\r\n }\r\n return 0\r\n })\r\n return weapons\r\n }\r\n }\r\n})\r\n","import { render } from \"./WeaponChart.vue?vue&type=template&id=921138fe&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=921138fe&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-921138fe\"]])\n\nexport default __exports__","\r\nimport { Player, Weapon, Server, useKillStore, Filters } from '@/stores/kill'\r\nimport PlayerList from '@/components/PlayerList.vue'\r\nimport PlayerChart from '@/components/PlayerChart.vue'\r\nimport WeaponChart from '@/components/WeaponChart.vue'\r\nimport { Ref, defineComponent, unref } from 'vue'\r\nimport VueMultiselect from 'vue-multiselect'\r\nimport 'vue-multiselect/dist/vue-multiselect.css'\r\nimport weapons from '../stores/weapons.json'\r\nimport router from '@/router'\r\n\r\nexport default defineComponent({\r\n name: 'PlayerView',\r\n components: {\r\n VueMultiselect,\r\n PlayerList,\r\n PlayerChart,\r\n WeaponChart\r\n },\r\n\r\n data () {\r\n return {\r\n model: { server: undefined, weapon: undefined } as unknown as {\r\n weapon: string | undefined;\r\n server: { name?: string } | (Server & { name?: string })[] | undefined;\r\n },\r\n filters: {} as Filters,\r\n store: useKillStore(),\r\n playerHighlighted: undefined as (Player & { id: string }) | undefined,\r\n weaponLocale: weapons as { [key: string]: string }\r\n }\r\n },\r\n created () {\r\n let server\r\n if (this.$route.query.server) server = { name: this.$route.query.server?.toString() }\r\n this.model = {\r\n server,\r\n weapon: this.$route.query.weapon?.toString()\r\n }\r\n },\r\n computed: {\r\n servers (): { [key: string]: Ref } {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { server: _, player: _1, ...withoutServer } = this.filters\r\n const data = this.store.getServerList(withoutServer)?.value.data\r\n if (!data) return unref(this.store.fetchServers(withoutServer)).data\r\n return data\r\n },\r\n groupedServers () {\r\n const hosts = [] as {\r\n id: string;\r\n servers: (Server & { name?: string })[];\r\n }[]\r\n Object.entries(this.servers).forEach((e) => {\r\n const server = unref(e[1])\r\n if (!hosts.find((host) => host.id === server.host + 'sfdsdfsd')) { hosts.push({ id: server.host + 'sfdsdfsd', servers: [] as Server[] }) }\r\n hosts\r\n .find((host) => host.id === server.host + 'sfdsdfsd')\r\n ?.servers.push({ name: e[0], ...server })\r\n })\r\n return hosts\r\n },\r\n weapons (): { [key: string]: Ref } {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { weapon: _, player: _1, ...withoutWeapons } = this.filters\r\n const data = this.store.getWeaponList(withoutWeapons)?.value.data\r\n if (!data) return this.store.fetchWeapons(withoutWeapons).value.data\r\n return data\r\n },\r\n players (): { [key: string]: Ref } {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { player: _, ...withoutPlayers } = this.filters\r\n const data = this.store.getPlayerList(withoutPlayers)?.value.data\r\n if (!data) return this.store.fetchPlayers(withoutPlayers).value.data\r\n return data\r\n },\r\n sortedWeaponList (): string[] {\r\n if (!this.weapons) return []\r\n const weapons = Object.keys(this.weapons)\r\n return weapons.sort()\r\n },\r\n sortedServerList (): string[] {\r\n if (!this.servers) return []\r\n const servers = Object.keys(this.servers)\r\n return servers.sort()\r\n },\r\n sortedPlayerList (): Player[] {\r\n if (!this.players) return []\r\n const players = Object.entries(this.players).map((e) => ({\r\n id: e[0],\r\n ...e[1]._rawValue\r\n }))\r\n return players.sort((a, b) => {\r\n if (a.username < b.username) {\r\n return -1\r\n }\r\n if (a.username > b.username) {\r\n return 1\r\n }\r\n return 0\r\n })\r\n }\r\n },\r\n watch: {\r\n players () {\r\n const player = this.$route.query.player?.toString()\r\n if (player && this.playerHighlighted?.id !== player) {\r\n this.highlight_player(player)\r\n }\r\n },\r\n model: {\r\n handler (newModel) {\r\n this.filters.server = newModel.server?.name\r\n this.filters.weapon = newModel.weapon\r\n },\r\n deep: true\r\n },\r\n filters: {\r\n handler (newValue) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { server: _, weapon: _2, ...withoutFilters } = this.$route.query\r\n router.push({ query: { ...newValue, ...withoutFilters } })// .then(e => { console.log(e) })\r\n },\r\n deep: true\r\n },\r\n playerHighlighted (newValue, oldValue) {\r\n if (newValue?.id === oldValue?.id) return\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const { player: _, ...withoutPlayer } = this.$route.query\r\n router.push({ query: { player: newValue?.id, ...withoutPlayer } })// .then(e => { console.log(e) })\r\n },\r\n '$route' (to) {\r\n if (this.playerHighlighted?.id !== to.query.player) {\r\n const playerId = to.query.player?.toString()\r\n if (playerId) {\r\n this.highlight_player(playerId)\r\n }\r\n }\r\n if (this.filters.weapon !== to.query.weapon) {\r\n this.model.weapon = to.query.weapon\r\n }\r\n if (this.filters.server !== to.query.server) {\r\n if (to.query.server) this.model.server = { name: to.query.server }\r\n else this.model.server = undefined\r\n }\r\n }\r\n },\r\n methods: {\r\n highlight_player (playerid: string) {\r\n const player = this.players[playerid]\r\n if (player) {\r\n this.playerHighlighted = { id: playerid, ...unref(player) }\r\n return\r\n }\r\n this.playerHighlighted = undefined\r\n }\r\n }\r\n})\r\n","import { render } from \"./PlayerView.vue?vue&type=template&id=1aa0e63c&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=1aa0e63c&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\legon\\\\Documents\\\\Code\\\\Tone\\\\ToneAPI_webclient\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-1aa0e63c\"]])\n\nexport default __exports__","import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'\r\nimport HomeView from '../views/HomeView.vue'\r\nimport PlayerView from '../views/PlayerView.vue'\r\n\r\nconst routes: Array = [\r\n {\r\n path: '/',\r\n name: 'home',\r\n component: PlayerView\r\n }\r\n // {\r\n // path: '/players',\r\n // name: 'players',\r\n // component: PlayerView\r\n // },\r\n // {\r\n // path: '/about',\r\n // name: 'about',\r\n // // route level code-splitting\r\n // // this generates a separate chunk (about.[hash].js) for this route\r\n // // which is lazy-loaded when the route is visited.\r\n // component: () => import(/* webpackChunkName: \"about\" */ '../views/AboutView.vue')\r\n // }\r\n]\r\n\r\nconst router = createRouter({\r\n history: createWebHistory(process.env.BASE_URL),\r\n routes\r\n})\r\n\r\nexport default router\r\n","import { createApp, ref, unref } from 'vue'\r\nimport App from './App.vue'\r\nimport router from './router'\r\nimport { createPinia } from 'pinia'\r\nimport { useKillStore } from './stores/kill'\r\n\r\nconst pinia = createPinia()\r\n\r\ncreateApp(App).use(pinia).use(router).mount('#app')\r\n\r\nconst websocketData = {\r\n attacker_id: '1010035351172',\r\n attacker_name: 'Iverral',\r\n cause_of_death: 'mp_weapon_car',\r\n victim_id: '1008553404453',\r\n victim_name: 'GURENTITANIUM',\r\n attacker_current_weapon: 'mp_weapon_car',\r\n victim_current_weapon: 'mp_weapon_sniper',\r\n distance: 300,\r\n game_mode: 'ps',\r\n servername: \"fvnkhead's 3v3\",\r\n map: 'lf_meadow',\r\n host: 1\r\n}\r\n\r\n// dev stuff\r\n\r\nconst store = useKillStore()\r\nfunction registerWebSocketKill () {\r\n const allPlayerArrays = store.$state.players.filter((e) => {\r\n return (\r\n (!e.value.filter.server ||\r\n e.value.filter.server === websocketData.servername) &&\r\n (!e.value.filter.weapon ||\r\n e.value.filter.weapon === websocketData.cause_of_death)\r\n // Handle other types of filters once those are implemented\r\n )\r\n })\r\n allPlayerArrays.forEach(e => {\r\n if (!e.value.data[websocketData.attacker_id]) {\r\n e.value.data[websocketData.attacker_id] = ref({\r\n deaths: 0,\r\n kills: 500,\r\n max_distance: 0,\r\n total_distance: 0,\r\n username: websocketData.attacker_name\r\n })\r\n }\r\n if (!e.value.data[websocketData.victim_id]) {\r\n e.value.data[websocketData.victim_id] = ref({\r\n deaths: 0,\r\n kills: 0,\r\n max_distance: 0,\r\n total_distance: 0,\r\n username: websocketData.victim_name\r\n })\r\n }\r\n // handle deaths with equipped, eventually\r\n /*\r\n if(e.value.filter.weapon){\r\n !e.value.data[websocketData.victim_id] = e.value.data[websocketData.victim_id] = {\r\n deaths: 0,\r\n kills: 0,\r\n max_distance: 0,\r\n total_distance: 0,\r\n username: websocketData.victim_name,\r\n }\r\n } */\r\n\r\n unref(e.value.data[websocketData.victim_id]).deaths++\r\n unref(e.value.data[websocketData.victim_id]).username = websocketData.victim_name\r\n unref(e.value.data[websocketData.attacker_id]).username = websocketData.attacker_name\r\n unref(e.value.data[websocketData.attacker_id]).kills++\r\n unref(e.value.data[websocketData.attacker_id]).total_distance += websocketData.distance\r\n unref(e.value.data[websocketData.attacker_id]).max_distance = Math.max(websocketData.distance, unref(e.value.data[websocketData.attacker_id]).max_distance)\r\n })\r\n const allWeaponsArrays = store.$state.weapons.filter((e) => {\r\n return (\r\n (!e.value.filter.player || e.value.filter.player === websocketData.attacker_id)\r\n // Handle other types of filters once those are implemented\r\n )\r\n })\r\n\r\n allWeaponsArrays.forEach(e => {\r\n if (!e.value.data[websocketData.cause_of_death]) {\r\n e.value.data[websocketData.cause_of_death] = ref({\r\n deaths: 0,\r\n kills: 500,\r\n max_distance: 0,\r\n total_distance: 0,\r\n deaths_while_equipped: 0\r\n })\r\n }\r\n // handle deaths with equipped, eventually\r\n /*\r\n if(e.value.filter.weapon){\r\n !e.value.data[websocketData.victim_id] = e.value.data[websocketData.victim_id] = {\r\n deaths: 0,\r\n kills: 0,\r\n max_distance: 0,\r\n total_distance: 0,\r\n username: websocketData.victim_name,\r\n }\r\n } */\r\n\r\n // unref(e.value.data[websocketData.cause_of_death]).deaths++\r\n unref(e.value.data[websocketData.cause_of_death]).total_distance += websocketData.distance\r\n unref(e.value.data[websocketData.cause_of_death]).kills++\r\n unref(e.value.data[websocketData.cause_of_death]).max_distance = Math.max(websocketData.distance, unref(e.value.data[websocketData.cause_of_death]).max_distance)\r\n })\r\n}\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__(9877); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["_hoisted_1","_createStaticVNode","render","_ctx","_cache","$props","$setup","$data","$options","_component_router_link","_resolveComponent","_component_router_view","_openBlock","_createElementBlock","_Fragment","_createElementVNode","_createVNode","to","class","default","_withCtx","_createTextVNode","_","defineComponent","__exports__","id","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_component_VueMultiselect","_component_PlayerList","_component_PlayerChart","_component_WeaponChart","selectLabel","deselectLabel","placeholder","modelValue","model","server","$event","options","groupedServers","group_label","multiple","e","name","label","onClick","undefined","disabled","weapon","weaponLocale","sortedWeaponList","playerHighlighted","sortedPlayerList","username","filters","onHighlightPlayer","highlight_player","player","removeNullEntries","a","Object","fromEntries","entries","filter","objectEqual","b","assert","deepStrictEqual","useKillStore","defineStore","state","servers","players","weapons","maps","gamemodes","hosts","getters","getPlayerList","find","unref","getWeaponList","getServerList","actions","fetchPlayers","entry","this","shallowRef","data","push","fetch","URLSearchParams","then","async","response","json","map","ref","triggerRef","fetchWeapons","fetchServers","_component_VirtualList","onKeydown","args","selectNextPlayer","tabindex","updateSort","_normalizeClass","sortingData","argument","list","playerList","$emit","highlighted","onScroll","scroll","style","_normalizeStyle","vIndex","rowHeight","length","_renderList","visibleList","index","key","ref_for","_toDisplayString","value","kills","deaths","Math","round","max","max_distance","total_distance","toLoad","vlistHeight","props","type","Array","Number","String","emits","computed","slice","min","visibleCount","ceil","watch","$refs","vlist","getBoundingClientRect","height","newVal","setTimeout","scrollBy","top","findIndex","scrollTop","behavior","methods","target","scrollIndex","mustScrollUp","mustScrollDown","floor","components","VirtualList","direction","store","withoutPlayer","Proxy","date","Date","collator","Intl","Collator","numeric","sensitivity","sort","aVal","_rawValue","bVal","compare","console","log","getTime","reverse","newval","scrollToPlayer","updated","values","Home","Infinity","End","PageDown","PageUp","ArrowUp","ArrowDown","ArrowRight","ArrowLeft","keys","includes","preventDefault","nextIndex","playerid","newElement","scrollIntoView","block","_component_Scatter","chart","chartOptions","ChartJS","LinearScale","PointElement","LineElement","Tooltip","Legend","annotationPlugin","dataLabel","refreshColors","playerData","Scatter","mounted","toRaw","cut","colors","container","getComputedStyle","fg","getPropertyValue","bg","orange","cyan","currentLine","playerIndex","defaultColor","borderColor","fill","backgroundColor","pointRadius","hoverRadius","pointStyle","datasets","labels","y","x","chartStaticOptions","responsive","maintainAspectRatio","animation","duration","layout","autoPadding","scales","title","text","display","color","ticks","element","onHover","native","cursor","chartStaticPlugins","endX","endY","maxX","maxY","tooltip","callbacks","ctx","dataIndex","dataset","parsed","annotation","annotations","line","yMin","xMin","yMax","xMax","borderWidth","borderDash","legend","plugins","datalabels","formatter","context","borderRadius","align","anchor","clamp","_component_Doughnut","ArcElement","Doughnut","yellow","green","purple","red","pink","chartData","weaponId","padding","withoutWeapon","VueMultiselect","PlayerList","PlayerChart","WeaponChart","created","$route","query","toString","_1","withoutServer","forEach","host","withoutWeapons","withoutPlayers","sortedServerList","handler","newModel","deep","newValue","_2","withoutFilters","router","oldValue","playerId","routes","path","component","PlayerView","createRouter","history","createWebHistory","process","pinia","createPinia","createApp","App","use","mount","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","m","deferred","O","result","chunkIds","fn","priority","notFulfilled","i","fulfilled","j","every","splice","r","n","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