From 363e0a3b0888fa812249b317eb933ce46d6c75c4 Mon Sep 17 00:00:00 2001 From: legonzaur Date: Sun, 23 Apr 2023 14:09:20 +0200 Subject: [PATCH] works for v2 --- package-lock.json | 189 +++++++++++++++++++++++++++------ package.json | 7 +- src/App.vue | 14 +++ src/components/PlayerChart.vue | 125 ++++++++++++---------- src/components/PlayerList.vue | 43 ++++---- src/components/WeaponChart.vue | 71 +++++++------ src/main.ts | 8 +- src/store/index.ts | 110 ------------------- src/stores/kill.ts | 113 ++++++++++++++++++++ src/views/PlayerView.vue | 86 +++++++-------- tsconfig.json | 3 - 11 files changed, 462 insertions(+), 307 deletions(-) delete mode 100644 src/store/index.ts create mode 100644 src/stores/kill.ts diff --git a/package-lock.json b/package-lock.json index 60e4301..61af58e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,18 +8,21 @@ "name": "toneapi_webclient", "version": "0.1.0", "dependencies": { + "assert": "^2.0.0", "chart.js": "^4.2.1", "chartjs-plugin-annotation": "^2.2.1", "chartjs-plugin-datalabels": "^2.2.0", "core-js": "^3.8.3", + "pinia": "^2.0.35", "vue": "^3.2.13", "vue-chartjs": "^5.2.0", "vue-class-component": "^8.0.0-0", "vue-multiselect": "^3.0.0-beta.1", - "vue-router": "^4.0.3", - "vuex": "^4.0.0" + "vue-router": "^4.0.3" }, "devDependencies": { + "@types/assert": "^1.5.6", + "@types/node": "^18.16.0", "@typescript-eslint/eslint-plugin": "^5.4.0", "@typescript-eslint/parser": "^5.4.0", "@vue/cli-plugin-babel": "~5.0.0", @@ -2107,6 +2110,12 @@ "node": ">=10.13.0" } }, + "node_modules/@types/assert": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/@types/assert/-/assert-1.5.6.tgz", + "integrity": "sha512-Y7gDJiIqb9qKUHfBQYOWGngUpLORtirAVPuj/CWJrU2C6ZM4/y3XLwuwfGMF8s7QzW746LQZx23m0+1FSgjfug==", + "dev": true + }, "node_modules/@types/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", @@ -2234,9 +2243,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.15.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.3.tgz", - "integrity": "sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==", + "version": "18.16.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.0.tgz", + "integrity": "sha512-BsAaKhB+7X+H4GnSjGhJG9Qi8Tw+inU9nJDwmD5CgOmBLEI6ArdhikpLX7DjbjDRDTbqZzU2LSQNZg8WGPiSZQ==", "dev": true }, "node_modules/@types/normalize-package-data": { @@ -3898,6 +3907,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/assert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "dependencies": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" + } + }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -3962,7 +3982,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -4277,7 +4296,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -5393,7 +5411,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, "dependencies": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" @@ -5776,6 +5793,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==" + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -7020,7 +7042,6 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, "dependencies": { "is-callable": "^1.1.3" } @@ -7260,8 +7281,7 @@ "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/function.prototype.name": { "version": "1.1.5", @@ -7318,7 +7338,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -7442,7 +7461,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -7487,7 +7505,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -7517,7 +7534,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, "dependencies": { "get-intrinsic": "^1.1.1" }, @@ -7541,7 +7557,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -7553,7 +7568,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, "dependencies": { "has-symbols": "^1.0.2" }, @@ -7892,8 +7906,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/internal-slot": { "version": "1.0.5", @@ -7927,6 +7940,21 @@ "node": ">= 10" } }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", @@ -7991,7 +8019,6 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -8080,6 +8107,20 @@ "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -8101,6 +8142,21 @@ "node": ">=8" } }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -8232,7 +8288,6 @@ "version": "1.1.10", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -9341,11 +9396,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, "engines": { "node": ">= 0.4" } @@ -9775,6 +9844,56 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pinia": { + "version": "2.0.35", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.0.35.tgz", + "integrity": "sha512-P1IKKQWhxGXiiZ3atOaNI75bYlFUbRxtJdhPLX059Z7+b9Z04rnTZdSY8Aph1LA+/4QEMAYHsTQ638Wfe+6K5g==", + "dependencies": { + "@vue/devtools-api": "^6.5.0", + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@vue/composition-api": "^1.4.0", + "typescript": ">=4.4.4", + "vue": "^2.6.14 || ^3.2.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/pinia/node_modules/vue-demi": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.0.tgz", + "integrity": "sha512-gt58r2ogsNQeVoQ3EhoUAvUsH9xviydl0dWJj7dabBC/2L4uBId7ujtCwDRD0JhkGsV1i0CtfLAeyYKBht9oWg==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -12090,7 +12209,7 @@ "version": "4.5.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", - "dev": true, + "devOptional": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -12207,6 +12326,18 @@ "punycode": "^2.1.0" } }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -12544,17 +12675,6 @@ "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", "dev": true }, - "node_modules/vuex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/vuex/-/vuex-4.1.0.tgz", - "integrity": "sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ==", - "dependencies": { - "@vue/devtools-api": "^6.0.0-beta.11" - }, - "peerDependencies": { - "vue": "^3.2.0" - } - }, "node_modules/watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", @@ -13102,7 +13222,6 @@ "version": "1.1.9", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", diff --git a/package.json b/package.json index f30fc61..891cddd 100644 --- a/package.json +++ b/package.json @@ -8,18 +8,21 @@ "lint": "vue-cli-service lint" }, "dependencies": { + "assert": "^2.0.0", "chart.js": "^4.2.1", "chartjs-plugin-annotation": "^2.2.1", "chartjs-plugin-datalabels": "^2.2.0", "core-js": "^3.8.3", + "pinia": "^2.0.35", "vue": "^3.2.13", "vue-chartjs": "^5.2.0", "vue-class-component": "^8.0.0-0", "vue-multiselect": "^3.0.0-beta.1", - "vue-router": "^4.0.3", - "vuex": "^4.0.0" + "vue-router": "^4.0.3" }, "devDependencies": { + "@types/assert": "^1.5.6", + "@types/node": "^18.16.0", "@typescript-eslint/eslint-plugin": "^5.4.0", "@typescript-eslint/parser": "^5.4.0", "@vue/cli-plugin-babel": "~5.0.0", diff --git a/src/App.vue b/src/App.vue index 296a87c..fbdebcc 100644 --- a/src/App.vue +++ b/src/App.vue @@ -15,6 +15,20 @@ + + diff --git a/src/main.ts b/src/main.ts index 797b3e5..cb2b43d 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,10 +1,8 @@ import { createApp } from 'vue' import App from './App.vue' import router from './router' -import store from './store' +import { createPinia } from 'pinia' -createApp(App).use(store).use(router).mount('#app') +const pinia = createPinia() -store.dispatch('fetchServers', {}) -store.dispatch('fetchPlayers', {}) -store.dispatch('fetchWeapons', {}) +createApp(App).use(pinia).use(router).mount('#app') diff --git a/src/store/index.ts b/src/store/index.ts deleted file mode 100644 index 98c4018..0000000 --- a/src/store/index.ts +++ /dev/null @@ -1,110 +0,0 @@ -// store.ts -import { InjectionKey } from 'vue' -import { createStore, Store } from 'vuex' - -export interface Player { - deaths: number; - username: string; - // eslint-disable-next-line camelcase - max_kill_distance: number; - // eslint-disable-next-line camelcase - avg_kill_distance: number; - kills: number; -} - -export interface Weapon { - id?:string, - // eslint-disable-next-line camelcase - max_kill_distance: number; - // eslint-disable-next-line camelcase - avg_kill_distance: number; - kills: number; -} - -export interface Server{ - name:string; - id:number; - description:string -} -// define your typings for the store state -export interface State { - servers: Server[] - players: { [key: string]: { [key: string]: Player } }; - weapons: { [key: string]:{ [key: string]: Weapon }}; -} - -// define injection key -// eslint-disable-next-line symbol-description -export const key: InjectionKey> = Symbol() - -export default createStore({ - state: { - servers: [], - players: {}, - weapons: {} - }, - getters: { - getPlayerList: (state) => ({ server, weapon, minKills, minDeaths }: { server?: number, weapon?: string, minKills:number, minDeaths:number }) => { - let playerFilter: string[] = [] - if (state.players['']) { - playerFilter = Object.entries(state.players['']).filter(([, value]:any) => { return (value.kills >= minKills) || (value.deaths >= minDeaths) }).map(e => e[0]) - } - if (playerFilter.length > 0 && state.players[(server || '') + (weapon || '')]) { - return Object.fromEntries(Object.entries(state.players[(server || '') + (weapon || '')]).filter(([key]) => playerFilter.includes(key))) - } - - return state.players[(server || '') + (weapon || '')] - }, - getWeaponList: (state) => ({ server, player }: { server?: number, player?: string }) => { - return state.weapons[(server || '') + (player || '')] - } - }, - mutations: { - setPlayers (state, data: { data: { [key: string]: Player }, filters: { weapon: string, server: number } }) { - state.players[(data.filters.server || '') + (data.filters.weapon || '')] = data.data - }, - setWeapons (state, data:{data: {[key:string]:Weapon}, filters:{server:string, player:string}}) { - state.weapons[(data.filters.server || '') + (data.filters.player || '')] = data.data - }, - setServers (state, data) { - state.servers = data - } - }, - actions: { - async fetchPlayers (context, { weapon, server }) { - const searchParams: Record = {} - if (weapon?.toString()) { searchParams.weapon = weapon } - if (server?.toString()) { searchParams.server = server } - const response = await fetch( - 'https://tone.sleepycat.date/v1/client/players?' + new URLSearchParams(searchParams) - ) - const data = await response.json() - Object.keys(data).forEach(e => { - data[e].kills = Number(data[e].kills) - data[e].deaths = Number(data[e].deaths) - data[e].max_kill_distance = Number(data[e].max_kill_distance) - data[e].avg_kill_distance = Number(data[e].avg_kill_distance) - }) - - context.commit('setPlayers', { data, filters: { weapon, server } }) - }, - async fetchWeapons (context, { player, server }) { - const searchParams: Record = {} - if (player?.toString()) { searchParams.player = player } - if (server?.toString()) { searchParams.server = server } - const response = await fetch( - 'https://tone.sleepycat.date/v1/client/weapons?' + new URLSearchParams(searchParams) - ) - const data = await response.json() - context.commit('setWeapons', { data, filters: { player, server } }) - }, - async fetchServers (context) { - const response = await fetch( - 'https://tone.sleepycat.date/v1/client/servers' - ) - const data = await response.json() - context.commit('setServers', data) - } - }, - modules: {} -}) diff --git a/src/stores/kill.ts b/src/stores/kill.ts new file mode 100644 index 0000000..10447af --- /dev/null +++ b/src/stores/kill.ts @@ -0,0 +1,113 @@ +import { defineStore } from 'pinia' +import * as assert from 'assert' + +function removeNullEntries (a:any) { + return Object.fromEntries(Object.entries(a).filter(e => e[1] !== undefined && e[1] !== null)) +} +function objectEqual (a:any, b:any) { + try { + a = removeNullEntries(a) + b = removeNullEntries(b) + assert.deepStrictEqual(a, b) + return true + } catch { + return false + } +} +export interface Filters { + server?: string; + player?: string; + weapon?: string; + host?: string; + map?: string; + gamemode?: string; +} + +export interface Kill { + deaths: number; + kills: number; + // eslint-disable-next-line camelcase + max_distance: number; + // eslint-disable-next-line camelcase + total_distance: number; +} +export interface KillData { + filter: Filters; + data: { [key: string]: T }; +} + +export interface Player extends Kill { + username: string; + // eslint-disable-next-line camelcase + deaths_while_equipped?: number; +} + +export interface Weapon extends Kill { + // eslint-disable-next-line camelcase + deaths_while_equipped: number; +} + +export interface Server extends Kill { + host: number; +} + +// define your typings for the store state +export interface State { + servers: KillData[]; + players: KillData[]; + weapons: KillData[]; + maps: KillData[]; + gamemodes: KillData[]; + hosts: { [key: number]: string }; +} + +export const useKillStore = defineStore('kill', { + state: (): State => ({ + servers: [], + players: [], + weapons: [], + maps: [], + gamemodes: [], + hosts: {} + }), + getters: { + getPlayerList: (state) => (filters: Filters) => state.players.find((e) => objectEqual(e.filter, filters)), + getWeaponList: (state) => (filters: Filters) => state.weapons.find((e) => objectEqual(e.filter, filters)), + getServerList: (state) => (filters: Filters) => state.servers.find((e) => objectEqual(e.filter, filters)) + }, + actions: { + async fetchPlayers (filter: Filters) { + filter = removeNullEntries(filter) + const response = await fetch( + 'https://tone.sleepycat.date/v2_test/client/players?' + + new URLSearchParams(filter as Record) + ) + const data = await response.json() + const entry = this.players.find((e) => objectEqual(e.filter, filter)) + if (!entry) return this.players.push({ filter, data }) + entry.data = data + }, + async fetchWeapons (filter: Filters) { + filter = removeNullEntries(filter) + const response = await fetch( + 'https://tone.sleepycat.date/v2_test/client/weapons?' + + new URLSearchParams(filter as Record) + ) + const data = await response.json() + const entry = this.weapons.find((e) => objectEqual(e.filter, filter)) + if (!entry) return this.weapons.push({ filter, data }) + entry.data = data + }, + async fetchServers (filter: Filters) { + filter = removeNullEntries(filter) + const response = await fetch( + 'https://tone.sleepycat.date/v2_test/client/servers?' + + new URLSearchParams(filter as Record) + ) + const data = await response.json() + const entry = this.servers.find((e) => objectEqual(e.filter, filter)) + if (!entry) return this.servers.push({ filter, data }) + entry.data = data + } + } +}) diff --git a/src/views/PlayerView.vue b/src/views/PlayerView.vue index 631dd33..e426b1f 100644 --- a/src/views/PlayerView.vue +++ b/src/views/PlayerView.vue @@ -12,16 +12,16 @@ --> - + - + + :options="sortedPlayerList" :allow-empty="true" :custom-label="((e:string) => players[e]?.username)">
@@ -34,8 +34,7 @@ diff --git a/tsconfig.json b/tsconfig.json index 6497d64..d1cfbf4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -34,8 +34,5 @@ "src/**/*.vue", "tests/**/*.ts", "tests/**/*.tsx" - ], - "exclude": [ - "node_modules" ] }