From b43eb982ee09d7b85d38ec8252e858598f0eb26d Mon Sep 17 00:00:00 2001 From: Natsumi Date: Mon, 13 Sep 2021 04:42:55 +1200 Subject: [PATCH] PyPyDance Discord RPC --- html/package-lock.json | 216 ++++++++++++++++++++-------------- html/package.json | 9 +- html/src/app.js | 258 +++++++++++++++++++++++++++++++++-------- html/src/app.scss | 2 +- html/src/vr.js | 15 +++ html/src/vr.pug | 15 ++- html/src/vr.scss | 7 +- 7 files changed, 374 insertions(+), 148 deletions(-) diff --git a/html/package-lock.json b/html/package-lock.json index 6ebfd28c..e0caa3a8 100644 --- a/html/package-lock.json +++ b/html/package-lock.json @@ -14,21 +14,22 @@ "eslint-config-prettier": "^8.3.0", "famfamfam-flags": "^1.0.0", "html-webpack-plugin": "^5.3.2", - "mini-css-extract-plugin": "^2.2.2", + "mini-css-extract-plugin": "^2.3.0", "normalize.css": "^8.0.1", "noty": "^3.2.0-beta-deprecated", - "prettier": "^2.3.2", + "prettier": "^2.4.0", "pug": "^3.0.2", "pug-plain-loader": "^1.1.0", "raw-loader": "^4.0.2", - "sass": "^1.39.0", + "sass": "^1.39.2", "sass-loader": "^12.1.0", "uuid": "^8.3.2", "vue": "^2.6.14", "vue-data-tables": "^3.4.5", "vue-lazyload": "^1.3.3", + "vue-marquee-text-component": "^1.2.0", "vue-swatches": "^2.1.1", - "webpack": "^5.52.0", + "webpack": "^5.52.1", "webpack-cli": "^4.8.0" } }, @@ -136,9 +137,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.15.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.5.tgz", - "integrity": "sha512-2hQstc6I7T6tQsWzlboMh3SgMRPaS4H6H7cPQsJkdzTzEGqQrpLDsE2BGASU5sBPoEQyHzeqU6C8uKbFeEk6sg==", + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.6.tgz", + "integrity": "sha512-S/TSCcsRuCkmpUuoWijua0Snt+f3ewU/8spLo+4AXJCZfT0bVCzLD5MuOKdrx0mlAptbKzn5AdgEIIKXxXkz9Q==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -148,9 +149,9 @@ } }, "node_modules/@babel/types": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.4.tgz", - "integrity": "sha512-0f1HJFuGmmbrKTCZtbm3cU+b/AqdEYk5toj5iQur58xkVMlS0JWaKxTBSmCXd47uiN7vbcozAupm6Mvs80GNhw==", + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.14.9", @@ -283,9 +284,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "16.7.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.10.tgz", - "integrity": "sha512-S63Dlv4zIPb8x6MMTgDq5WWRJQe56iBEY0O3SOFA9JrRienkOVDXSXBjjJw6HTNQYSE2JI6GMCR6LVbIMHJVvA==", + "version": "16.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz", + "integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==", "dev": true }, "node_modules/@webassemblyjs/ast": { @@ -770,9 +771,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001255", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001255.tgz", - "integrity": "sha512-F+A3N9jTZL882f/fg/WWVnKSu6IOo3ueLz4zwaOPbPYHNmM/ZaDUyzyJwS1mZhX7Ex5jqTyW599Gdelh5PDYLQ==", + "version": "1.0.30001256", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001256.tgz", + "integrity": "sha512-QirrvMLmB4txNnxiaG/xbm6FSzv9LqOZ3Jp9VtCYb3oPIfCHpr/oGn38pFq0udwlkctvXQgPthaXqJ76DaYGnA==", "dev": true, "funding": { "type": "opencollective", @@ -891,9 +892,9 @@ "dev": true }, "node_modules/colorette": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.3.0.tgz", - "integrity": "sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", "dev": true }, "node_modules/commander": { @@ -1171,9 +1172,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.3.830", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.830.tgz", - "integrity": "sha512-gBN7wNAxV5vl1430dG+XRcQhD4pIeYeak6p6rjdCtlz5wWNwDad8jwvphe5oi1chL5MV6RNRikfffBBiFuj+rQ==", + "version": "1.3.836", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.836.tgz", + "integrity": "sha512-Ney3pHOJBWkG/AqYjrW0hr2AUCsao+2uvq9HUlRP8OlpSdk/zOHOUJP7eu0icDvePC9DlgffuelP4TnOJmMRUg==", "dev": true }, "node_modules/element-ui": { @@ -1598,9 +1599,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.12.0.tgz", - "integrity": "sha512-VNX0QkHK3RsXVKr9KrlUv/FoTa0NdbYoHHl7uXHv2rzyHSlxjdNAKug2twd9luJxpcyNeAgf5iPPMutJO67Dfg==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -2159,9 +2160,9 @@ } }, "node_modules/jest-worker": { - "version": "27.1.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.1.0.tgz", - "integrity": "sha512-mO4PHb2QWLn9yRXGp7rkvXLAYuxwhq1ZYUo0LoDhg8wqvv4QizP1ZWEJOeolgbEgAWZLIEU0wsku8J+lGWfBhg==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.1.1.tgz", + "integrity": "sha512-XJKCL7tu+362IUYTWvw8+3S75U7qMiYiRU6u5yqscB48bTvzwN6i8L/7wVTXiFLwkRsxARNM7TISnTvcgv9hxA==", "dev": true, "dependencies": { "@types/node": "*", @@ -2422,9 +2423,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.2.2.tgz", - "integrity": "sha512-eUjQ/q1rQIeHWgIx7ny/DNgXHcMXHdBwgrZQK7Ev8dbR+HxhroFM2Cb6kMiswOYaq05IRJhPuQqXWUABIjjA3g==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.3.0.tgz", + "integrity": "sha512-uzWaOwC+gJrnKbr23J1ZRWx/Wd9W9Ce1mKPlsBGBV/r8zG7/G7oKMxGmxbI65pVGbae2cR7CUx9Ulk0HQt8BfQ==", "dev": true, "dependencies": { "schema-utils": "^3.1.0" @@ -2861,9 +2862,9 @@ } }, "node_modules/prettier": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.2.tgz", - "integrity": "sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.0.tgz", + "integrity": "sha512-DsEPLY1dE5HF3BxCRBmD4uYZ+5DCbvatnolqTqcxEgKVZnL2kUfyu7b8pPQ5+hTBkdhU9SLUmK0/pHb07RE4WQ==", "dev": true, "bin": { "prettier": "bin-prettier.js" @@ -3335,9 +3336,9 @@ ] }, "node_modules/sass": { - "version": "1.39.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.39.0.tgz", - "integrity": "sha512-F4o+RhJkNOIG0b6QudYU8c78ZADKZjKDk5cyrf8XTKWfrgbtyVVXImFstJrc+1pkQDCggyidIOytq6gS4gCCZg==", + "version": "1.39.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.39.2.tgz", + "integrity": "sha512-4/6Vn2RPc+qNwSclUSKvssh7dqK1Ih3FfHBW16I/GfH47b3scbYeOw65UIrYG7PkweFiKbpJjgkf5CV8EMmvzw==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0" @@ -3509,9 +3510,9 @@ } }, "node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", "dev": true, "dependencies": { "buffer-from": "^1.0.0", @@ -3649,9 +3650,9 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.3.tgz", - "integrity": "sha512-eDbuaDlXhVaaoKuLD3DTNTozKqln6xOG6Us0SzlKG5tNlazG+/cdl8pm9qiF1Di89iWScTI0HcO+CDcf2dkXiw==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.4.tgz", + "integrity": "sha512-E2CkNMN+1cho04YpdANyRrn8CyN4yMy+WdFKZIySFZrGXZxJwJP6PMNGGc/Mcr6qygQHUUqRxnAPmi0M9f00XA==", "dev": true, "dependencies": { "jest-worker": "^27.0.6", @@ -3865,6 +3866,27 @@ "integrity": "sha512-uHnq0FTEeNmqnbBC2aRKlmtd9LofMZ6Q3mWvgfLa+i9vhxU8fDK+nGs9c1iVT85axSua/AUnMttIq3xPaU9G3A==", "dev": true }, + "node_modules/vue-marquee-text-component": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vue-marquee-text-component/-/vue-marquee-text-component-1.2.0.tgz", + "integrity": "sha512-wMqr7AnyCF1VjXFAnAXavAD2yCeiBULy6AbLet/YIGaI2KzuaUmi+Q3UyFYJOM2gWt994jl2PWilnkh9heLqAA==", + "dev": true, + "dependencies": { + "core-js": "^3.6.5", + "vue": "^2.5.17" + } + }, + "node_modules/vue-marquee-text-component/node_modules/core-js": { + "version": "3.17.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.17.3.tgz", + "integrity": "sha512-lyvajs+wd8N1hXfzob1LdOCCHFU4bGMbqqmLn1Q4QlCpDqWPpGf+p0nj+LNrvDDG33j0hZXw2nsvvVpHysxyNw==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/vue-swatches": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/vue-swatches/-/vue-swatches-2.1.1.tgz", @@ -3885,9 +3907,9 @@ } }, "node_modules/webpack": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.52.0.tgz", - "integrity": "sha512-yRZOat8jWGwBwHpco3uKQhVU7HYaNunZiJ4AkAVQkPCUGoZk/tiIXiwG+8HIy/F+qsiZvSOa+GLQOj3q5RKRYg==", + "version": "5.52.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.52.1.tgz", + "integrity": "sha512-wkGb0hLfrS7ML3n2xIKfUIwHbjB6gxwQHyLmVHoAqEQBw+nWo+G6LoHL098FEXqahqximsntjBLuewStrnJk0g==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.0", @@ -4183,15 +4205,15 @@ } }, "@babel/parser": { - "version": "7.15.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.5.tgz", - "integrity": "sha512-2hQstc6I7T6tQsWzlboMh3SgMRPaS4H6H7cPQsJkdzTzEGqQrpLDsE2BGASU5sBPoEQyHzeqU6C8uKbFeEk6sg==", + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.6.tgz", + "integrity": "sha512-S/TSCcsRuCkmpUuoWijua0Snt+f3ewU/8spLo+4AXJCZfT0bVCzLD5MuOKdrx0mlAptbKzn5AdgEIIKXxXkz9Q==", "dev": true }, "@babel/types": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.4.tgz", - "integrity": "sha512-0f1HJFuGmmbrKTCZtbm3cU+b/AqdEYk5toj5iQur58xkVMlS0JWaKxTBSmCXd47uiN7vbcozAupm6Mvs80GNhw==", + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.14.9", @@ -4303,9 +4325,9 @@ "dev": true }, "@types/node": { - "version": "16.7.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.10.tgz", - "integrity": "sha512-S63Dlv4zIPb8x6MMTgDq5WWRJQe56iBEY0O3SOFA9JrRienkOVDXSXBjjJw6HTNQYSE2JI6GMCR6LVbIMHJVvA==", + "version": "16.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz", + "integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==", "dev": true }, "@webassemblyjs/ast": { @@ -4714,9 +4736,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001255", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001255.tgz", - "integrity": "sha512-F+A3N9jTZL882f/fg/WWVnKSu6IOo3ueLz4zwaOPbPYHNmM/ZaDUyzyJwS1mZhX7Ex5jqTyW599Gdelh5PDYLQ==", + "version": "1.0.30001256", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001256.tgz", + "integrity": "sha512-QirrvMLmB4txNnxiaG/xbm6FSzv9LqOZ3Jp9VtCYb3oPIfCHpr/oGn38pFq0udwlkctvXQgPthaXqJ76DaYGnA==", "dev": true }, "chalk": { @@ -4807,9 +4829,9 @@ "dev": true }, "colorette": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.3.0.tgz", - "integrity": "sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", "dev": true }, "commander": { @@ -5009,9 +5031,9 @@ } }, "electron-to-chromium": { - "version": "1.3.830", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.830.tgz", - "integrity": "sha512-gBN7wNAxV5vl1430dG+XRcQhD4pIeYeak6p6rjdCtlz5wWNwDad8jwvphe5oi1chL5MV6RNRikfffBBiFuj+rQ==", + "version": "1.3.836", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.836.tgz", + "integrity": "sha512-Ney3pHOJBWkG/AqYjrW0hr2AUCsao+2uvq9HUlRP8OlpSdk/zOHOUJP7eu0icDvePC9DlgffuelP4TnOJmMRUg==", "dev": true }, "element-ui": { @@ -5337,9 +5359,9 @@ "dev": true }, "fastq": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.12.0.tgz", - "integrity": "sha512-VNX0QkHK3RsXVKr9KrlUv/FoTa0NdbYoHHl7uXHv2rzyHSlxjdNAKug2twd9luJxpcyNeAgf5iPPMutJO67Dfg==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -5739,9 +5761,9 @@ "dev": true }, "jest-worker": { - "version": "27.1.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.1.0.tgz", - "integrity": "sha512-mO4PHb2QWLn9yRXGp7rkvXLAYuxwhq1ZYUo0LoDhg8wqvv4QizP1ZWEJOeolgbEgAWZLIEU0wsku8J+lGWfBhg==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.1.1.tgz", + "integrity": "sha512-XJKCL7tu+362IUYTWvw8+3S75U7qMiYiRU6u5yqscB48bTvzwN6i8L/7wVTXiFLwkRsxARNM7TISnTvcgv9hxA==", "dev": true, "requires": { "@types/node": "*", @@ -5953,9 +5975,9 @@ "dev": true }, "mini-css-extract-plugin": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.2.2.tgz", - "integrity": "sha512-eUjQ/q1rQIeHWgIx7ny/DNgXHcMXHdBwgrZQK7Ev8dbR+HxhroFM2Cb6kMiswOYaq05IRJhPuQqXWUABIjjA3g==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.3.0.tgz", + "integrity": "sha512-uzWaOwC+gJrnKbr23J1ZRWx/Wd9W9Ce1mKPlsBGBV/r8zG7/G7oKMxGmxbI65pVGbae2cR7CUx9Ulk0HQt8BfQ==", "dev": true, "requires": { "schema-utils": "^3.1.0" @@ -6275,9 +6297,9 @@ "dev": true }, "prettier": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.2.tgz", - "integrity": "sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.0.tgz", + "integrity": "sha512-DsEPLY1dE5HF3BxCRBmD4uYZ+5DCbvatnolqTqcxEgKVZnL2kUfyu7b8pPQ5+hTBkdhU9SLUmK0/pHb07RE4WQ==", "dev": true }, "pretty-error": { @@ -6633,9 +6655,9 @@ "dev": true }, "sass": { - "version": "1.39.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.39.0.tgz", - "integrity": "sha512-F4o+RhJkNOIG0b6QudYU8c78ZADKZjKDk5cyrf8XTKWfrgbtyVVXImFstJrc+1pkQDCggyidIOytq6gS4gCCZg==", + "version": "1.39.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.39.2.tgz", + "integrity": "sha512-4/6Vn2RPc+qNwSclUSKvssh7dqK1Ih3FfHBW16I/GfH47b3scbYeOw65UIrYG7PkweFiKbpJjgkf5CV8EMmvzw==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0" @@ -6740,9 +6762,9 @@ "dev": true }, "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -6856,9 +6878,9 @@ } }, "terser-webpack-plugin": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.3.tgz", - "integrity": "sha512-eDbuaDlXhVaaoKuLD3DTNTozKqln6xOG6Us0SzlKG5tNlazG+/cdl8pm9qiF1Di89iWScTI0HcO+CDcf2dkXiw==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.4.tgz", + "integrity": "sha512-E2CkNMN+1cho04YpdANyRrn8CyN4yMy+WdFKZIySFZrGXZxJwJP6PMNGGc/Mcr6qygQHUUqRxnAPmi0M9f00XA==", "dev": true, "requires": { "jest-worker": "^27.0.6", @@ -7012,6 +7034,24 @@ "integrity": "sha512-uHnq0FTEeNmqnbBC2aRKlmtd9LofMZ6Q3mWvgfLa+i9vhxU8fDK+nGs9c1iVT85axSua/AUnMttIq3xPaU9G3A==", "dev": true }, + "vue-marquee-text-component": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vue-marquee-text-component/-/vue-marquee-text-component-1.2.0.tgz", + "integrity": "sha512-wMqr7AnyCF1VjXFAnAXavAD2yCeiBULy6AbLet/YIGaI2KzuaUmi+Q3UyFYJOM2gWt994jl2PWilnkh9heLqAA==", + "dev": true, + "requires": { + "core-js": "^3.6.5", + "vue": "^2.5.17" + }, + "dependencies": { + "core-js": { + "version": "3.17.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.17.3.tgz", + "integrity": "sha512-lyvajs+wd8N1hXfzob1LdOCCHFU4bGMbqqmLn1Q4QlCpDqWPpGf+p0nj+LNrvDDG33j0hZXw2nsvvVpHysxyNw==", + "dev": true + } + } + }, "vue-swatches": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/vue-swatches/-/vue-swatches-2.1.1.tgz", @@ -7029,9 +7069,9 @@ } }, "webpack": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.52.0.tgz", - "integrity": "sha512-yRZOat8jWGwBwHpco3uKQhVU7HYaNunZiJ4AkAVQkPCUGoZk/tiIXiwG+8HIy/F+qsiZvSOa+GLQOj3q5RKRYg==", + "version": "5.52.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.52.1.tgz", + "integrity": "sha512-wkGb0hLfrS7ML3n2xIKfUIwHbjB6gxwQHyLmVHoAqEQBw+nWo+G6LoHL098FEXqahqximsntjBLuewStrnJk0g==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.0", diff --git a/html/package.json b/html/package.json index 0ef45a32..0d4413f4 100644 --- a/html/package.json +++ b/html/package.json @@ -30,21 +30,22 @@ "eslint-config-prettier": "^8.3.0", "famfamfam-flags": "^1.0.0", "html-webpack-plugin": "^5.3.2", - "mini-css-extract-plugin": "^2.2.2", + "mini-css-extract-plugin": "^2.3.0", "normalize.css": "^8.0.1", "noty": "^3.2.0-beta-deprecated", - "prettier": "^2.3.2", + "prettier": "^2.4.0", "pug": "^3.0.2", "pug-plain-loader": "^1.1.0", "raw-loader": "^4.0.2", - "sass": "^1.39.0", + "sass": "^1.39.2", "sass-loader": "^12.1.0", "uuid": "^8.3.2", "vue": "^2.6.14", "vue-data-tables": "^3.4.5", "vue-lazyload": "^1.3.3", + "vue-marquee-text-component": "^1.2.0", "vue-swatches": "^2.1.1", - "webpack": "^5.52.0", + "webpack": "^5.52.1", "webpack-cli": "^4.8.0" } } diff --git a/html/src/app.js b/html/src/app.js index 3e4824d0..a442b107 100644 --- a/html/src/app.js +++ b/html/src/app.js @@ -3994,6 +3994,7 @@ speechSynthesis.getVoices(); } AppApi.CheckGameRunning().then( ([isGameRunning, isGameNoVR]) => { + this.updateOpenVR(isGameRunning, isGameNoVR); if (isGameRunning !== this.isGameRunning) { this.isGameRunning = isGameRunning; if (isGameRunning) { @@ -4006,13 +4007,12 @@ speechSynthesis.getVoices(); this.autoVRChatCacheManagement(); } this.lastLocationReset(); + this.clearNowPlaying(); this.updateVRConfigVars(); - this.updateOpenVR(); } if (isGameNoVR !== this.isGameNoVR) { this.isGameNoVR = isGameNoVR; this.updateVRConfigVars(); - this.updateOpenVR(); } this.updateDiscord(); } @@ -5240,11 +5240,7 @@ speechSynthesis.getVoices(); AppApi.DesktopNotification('Event', noty.data, image); break; case 'VideoPlay': - AppApi.DesktopNotification( - 'Now playing', - noty.notyName, - image - ); + AppApi.DesktopNotification('Now playing', noty.notyName, image); break; case 'BlockedOnPlayerJoined': AppApi.DesktopNotification( @@ -7212,6 +7208,22 @@ speechSynthesis.getVoices(); this.lastLocationReset(); }; + $app.methods.sweepGameLog = function () { + var {data} = this.gameLogTable; + // 로그는 7일까지만 남김 + var limit = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toJSON(); + var i = 0; + var j = data.length; + while (i < j && data[i].created_at < limit) { + ++i; + } + if (i === j) { + this.gameLogTable.data = []; + } else if (i) { + data.splice(0, i); + } + }; + $app.methods.refreshEntireGameLog = async function () { await gameLogService.setDateTill('1970-01-01'); await database.initTables(); @@ -7241,7 +7253,7 @@ speechSynthesis.getVoices(); await gameLogService.setDateTill(dateTill); await gameLogService.reset(); await new Promise((resolve) => { - setTimeout(resolve, 1000); + setTimeout(resolve, 10000); }); var location = ''; var pushToTable = true; @@ -7261,11 +7273,7 @@ speechSynthesis.getVoices(); rawLogs.slice(3) ); var pushToTable = true; - this.addGameLogEntry( - gameLog, - this.lastLocation.location, - pushToTable - ); + this.addGameLogEntry(gameLog, this.lastLocation.location, pushToTable); }; $app.lastLocationDestinationTime = 0; @@ -7284,6 +7292,7 @@ speechSynthesis.getVoices(); case 'location-destination': if (this.isGameRunning) { this.cancelVRChatCacheDownload(gameLog.location); + this.clearNowPlaying(); } this.lastLocationDestinationTime = Date.parse(gameLog.dt); var entry = { @@ -7295,6 +7304,7 @@ speechSynthesis.getVoices(); case 'location': if (this.isGameRunning) { this.lastLocationReset(); + this.clearNowPlaying(); this.lastLocation = { date: Date.parse(gameLog.dt), location: gameLog.location, @@ -7430,11 +7440,18 @@ speechSynthesis.getVoices(); var videoName = ''; var videoLength = ''; var displayName = ''; + var videoPos = 5; // video loading delay if (typeof gameLog.displayName !== 'undefined') { displayName = gameLog.displayName; } + if (typeof gameLog.videoPos !== 'undefined') { + videoPos = gameLog.videoPos; + } var L = API.parseLocation(location); - if (L.worldId !== 'wrld_f20326da-f1ac-45fc-a062-609723b097b1') { + if ( + L.worldId !== 'wrld_f20326da-f1ac-45fc-a062-609723b097b1' || + gameLog.videoId === 'YouTube' + ) { // skip PyPyDance videos try { var url = new URL(videoUrl); @@ -7468,36 +7485,61 @@ speechSynthesis.getVoices(); videoLength, location, displayName, - userId + userId, + videoPos }; if (pushToTable) { + this.setNowPlaying(entry); this.queueGameLogNoty(entry); this.gameLogTable.data.push(entry); this.updateSharedFeed(false); this.notifyMenu('gameLog'); this.sweepGameLog(); } - if (this.youTubeApi && youtubeVideoId) { - var data = await this.lookupYouTubeVideo(youtubeVideoId); - if ( - data || - (data.status === 200 && data.pageInfo.totalResults !== 0) - ) { - videoId = 'YouTube'; - videoName = data.items[0].snippet.title; - videoLength = this.convertYoutubeTime( - data.items[0].contentDetails.duration - ); - } else { - console.error(`YouTube video lookup failed, error code: ${data.status}`); + database.addGamelogVideoPlayToDatabase(entry); + } + }; + + $app.methods.addGameLogPyPyDance = function ( + gameLog, + location, + pushToTable + ) { + var data = + /VideoPlay\(PyPyDance\) "(.+?)",([\d.]+),([\d.]+),"(.+?)\s*(?:)?"/g.exec( + gameLog.data + ); + var videoUrl = data[1]; + var videoPos = Number(data[2]); + var videoLength = Number(data[3]); + var title = data[4]; + var bracketArray = title.split('('); + var text1 = bracketArray.pop(); + var displayName = text1.slice(0, -1); + var text2 = bracketArray.join('('); + if (text2 === 'URL ') { + var videoId = 'YouTube'; + } else { + var videoId = text2.substr(0, text2.indexOf(':') - 1); + text2 = text2.substr(text2.indexOf(':') + 2); + } + var videoName = text2.slice(0, -1); + var userId = ''; + if (displayName && displayName !== 'Random') { + for (var ref of API.cachedUsers.values()) { + if (ref.displayName === displayName) { + userId = ref.id; + break; } } } - if (videoId === 'URL') { + if (videoId === 'YouTube') { var entry = { dt: gameLog.dt, videoUrl, - displayName + displayName, + videoPos, + videoId }; this.addGameLogVideo(entry, location, userId, pushToTable); } else { @@ -7510,9 +7552,11 @@ speechSynthesis.getVoices(); videoLength, location, displayName, - userId + userId, + videoPos }; if (pushToTable) { + this.setNowPlaying(entry); this.queueGameLogNoty(entry); this.gameLogTable.data.push(entry); this.updateSharedFeed(false); @@ -7550,20 +7594,127 @@ speechSynthesis.getVoices(); return data; }; - $app.methods.sweepGameLog = function () { - var {data} = this.gameLogTable; - // 로그는 7일까지만 남김 - var limit = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toJSON(); - var i = 0; - var j = data.length; - while (i < j && data[i].created_at < limit) { - ++i; + $app.data.nowPlaying = { + url: '', + name: '', + length: 0, + startTime: 0, + elapsed: 0, + percentage: 0, + remainingText: '', + playing: false + }; + + $app.methods.clearNowPlaying = function () { + this.nowPlaying = { + url: '', + name: '', + length: 0, + startTime: 0, + elapsed: 0, + percentage: 0, + remainingText: '', + playing: false + }; + this.updateVrNowPlaying(); + }; + + $app.methods.setNowPlaying = function (ctx) { + var videoId = ''; + var displayName = ''; + if (ctx.videoId) { + videoId = `${ctx.videoId} : `; } - if (i === j) { - this.gameLogTable.data = []; - } else if (i) { - data.splice(0, i); + if (ctx.displayName) { + displayName = ` (${ctx.displayName})`; } + var name = `${videoId}${ctx.videoName}${displayName} ‎`; + this.nowPlaying = { + url: ctx.videoUrl, + name, + length: ctx.videoLength, + startTime: Date.parse(ctx.created_at) / 1000 - ctx.videoPos, + elapsed: 0, + percentage: 0, + remainingText: '' + }; + if (!this.nowPlaying.playing) { + this.nowPlaying.playing = true; + this.updateNowPlaying(); + } + }; + + $app.methods.updateNowPlaying = function () { + var np = this.nowPlaying; + if (!np.url) { + this.nowPlaying.playing = false; + return; + } + var now = Date.now() / 1000; + np.elapsed = Math.round((now - np.startTime) * 10) / 10; + if (np.elapsed >= np.length) { + this.clearNowPlaying(); + return; + } + np.remainingText = this.formatSeconds(np.length - np.elapsed); + np.percentage = Math.round(((np.elapsed * 100) / np.length) * 10) / 10; + this.updateVrNowPlaying(); + setTimeout(() => this.updateNowPlaying(), 1000); + }; + + $app.methods.updateVrNowPlaying = function () { + var json = JSON.stringify(this.nowPlaying); + AppApi.ExecuteVrFeedFunction('nowPlayingUpdate', json); + }; + + $app.methods.formatSeconds = function (duration) { + var pad = function (num, size) { + return `000${num}`.slice(size * -1); + }, + time = parseFloat(duration).toFixed(3), + hours = Math.floor(time / 60 / 60), + minutes = Math.floor(time / 60) % 60, + seconds = Math.floor(time - minutes * 60); + var hoursOut = ''; + if (hours > '0') { + hoursOut = `${pad(hours, 2)}:`; + } + return `${hoursOut + pad(minutes, 2)}:${pad(seconds, 2)}`; + }; + + $app.methods.convertYoutubeTime = function (duration) { + var a = duration.match(/\d+/g); + if ( + duration.indexOf('M') >= 0 && + duration.indexOf('H') === -1 && + duration.indexOf('S') === -1 + ) { + a = [0, a[0], 0]; + } + if (duration.indexOf('H') >= 0 && duration.indexOf('M') === -1) { + a = [a[0], 0, a[1]]; + } + if ( + duration.indexOf('H') >= 0 && + duration.indexOf('M') === -1 && + duration.indexOf('S') === -1 + ) { + a = [a[0], 0, 0]; + } + var length = 0; + if (a.length === 3) { + length += parseInt(a[0], 10) * 3600; + length += parseInt(a[1], 10) * 60; + length += parseInt(a[2], 10); + } + if (a.length === 2) { + length += parseInt(a[0], 10) * 60; + length += parseInt(a[1], 10); + } + if (a.length === 1) { + length += parseInt(a[0], 10); + } + return length; }; $app.methods.updateDiscord = function () { @@ -7633,8 +7784,19 @@ speechSynthesis.getVoices(); L.statusImage = 'busy'; break; } + var appId = '883308884863901717'; + var bigIcon = 'vrchat'; + if (L.worldId === 'wrld_f20326da-f1ac-45fc-a062-609723b097b1') { + L.worldName = this.nowPlaying.name; + appId = '784094509008551956'; + bigIcon = 'pypy'; + Discord.SetTimestamps( + Date.now(), + (this.nowPlaying.startTime + this.nowPlaying.length) * 1000 + ); + } Discord.SetAssets( - 'vrchat', // big icon + bigIcon, // big icon 'Powered by VRCX', // big icon hover text L.statusImage, // small icon L.statusName, // small icon hover text @@ -7643,7 +7805,7 @@ speechSynthesis.getVoices(); L.worldCapacity, // party max size 'Join', // button text L.joinUrl, // button url - '883308884863901717' // app id + appId // app id ); // NOTE // 글자 수가 짧으면 업데이트가 안된다.. @@ -9330,11 +9492,11 @@ speechSynthesis.getVoices(); }); }; - $app.methods.updateOpenVR = function () { + $app.methods.updateOpenVR = function (isGameRunning, isGameNoVR) { if ( this.openVR && - this.isGameNoVR === false && - (this.isGameRunning || this.openVRAlways) + !isGameNoVR && + (isGameRunning || this.openVRAlways) ) { AppApi.StartVR(); } else { diff --git a/html/src/app.scss b/html/src/app.scss index 5ea84ed7..4a4e3b00 100644 --- a/html/src/app.scss +++ b/html/src/app.scss @@ -82,7 +82,7 @@ margin-top: 15px; } -.el-table__expanded-cell[class*=cell] { +.el-table__expanded-cell[class*='cell'] { padding: 20px 50px; } diff --git a/html/src/vr.js b/html/src/vr.js index acf972db..2bcb9763 100644 --- a/html/src/vr.js +++ b/html/src/vr.js @@ -8,6 +8,8 @@ import Noty from 'noty'; import Vue from 'vue'; import ElementUI from 'element-ui'; import locale from 'element-ui/lib/locale/lang/en'; +import MarqueeText from 'vue-marquee-text-component'; +Vue.component('marquee-text', MarqueeText); import configRepository from './repository/config.js'; @@ -178,6 +180,15 @@ speechSynthesis.getVoices(); currentTime: new Date().toJSON(), cpuUsage: 0, config: {}, + nowPlaying: { + url: '', + name: '', + length: 0, + startTime: 0, + elapsed: 0, + percentage: 0, + remainingText: '' + }, lastLocation: { date: 0, location: '', @@ -280,6 +291,10 @@ speechSynthesis.getVoices(); this.config = JSON.parse(json); }; + $app.methods.nowPlayingUpdate = function (json) { + this.nowPlaying = JSON.parse(json); + }; + $app.methods.lastLocationUpdate = function (json) { this.lastLocation = JSON.parse(json); }; diff --git a/html/src/vr.pug b/html/src/vr.pug index be5e6c35..96bd5394 100644 --- a/html/src/vr.pug +++ b/html/src/vr.pug @@ -69,8 +69,8 @@ html span.extra span.time {{ feed.created_at | formatDate('HH:MI') }} | 🎵 #[span.name(v-text="feed.displayName")] - template(v-if="feed.notyName") - | #[span(v-text="feed.notyName")] + template(v-if="feed.videoName") + | #[span(v-text="feed.videoName")] template(v-else) | #[span(v-text="feed.videoUrl")] div(v-else-if="feed.type === 'invite'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") @@ -215,8 +215,8 @@ html span.extra span.time {{ feed.created_at | formatDate('HH:MI') }} | #[span.name(v-text="feed.displayName")] changed video to - template(v-if="feed.notyName") - | #[span(v-text="feed.notyName")] + template(v-if="feed.videoName") + | #[span(v-text="feed.videoName")] template(v-else) | #[span(v-text="feed.videoUrl")] div(v-else-if="feed.type === 'invite'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") @@ -349,12 +349,15 @@ html br span {{ device[2] }}% .x-containerbottom + span(style="float:right;padding-left:10px") {{ nowPlaying.remainingText }} + marquee-text {{ nowPlaying.name }} + div.np-progress-bar(:style="{ width: nowPlaying.percentage + '%' }") template(v-if="config && config.minimalFeed") template(v-if="config.downloadProgress === 100") span(style="display:inline-block;margin-right:5px") #[i.el-icon-loading] template(v-else-if="config.downloadProgress > 0") span(style="display:inline-block;margin-right:5px") {{ config.downloadProgress }}% - template(v-if="lastLocation.date != 0") + template(v-if="lastLocation.date !== 0") span(style="float:right") {{ lastLocationTimer }} span(style="display:inline-block") {{ lastLocation.playerList.length }} span(style="display:inline-block;font-weight:bold") {{ lastLocation.friendList.length !== 0 ? `‎‎‎‎‎‎‎‎‏‏‎ ‎(${lastLocation.friendList.length})` : ''}} @@ -363,7 +366,7 @@ html span(style="display:inline-block;margin-right:5px") Downloading: #[i.el-icon-loading] template(v-else-if="config.downloadProgress > 0") span(style="display:inline-block;margin-right:5px") Downloading: {{ config.downloadProgress }}% - template(v-if="lastLocation.date != 0") + template(v-if="lastLocation.date !== 0") span(style="float:right") Timer: {{ lastLocationTimer }} span(style="display:inline-block") Players: {{ lastLocation.playerList.length }} span(style="display:inline-block;font-weight:bold") {{ lastLocation.friendList.length !== 0 ? `‎‎‎‎‎‎‎‎‏‏‎ ‎(${lastLocation.friendList.length})` : ''}} diff --git a/html/src/vr.scss b/html/src/vr.scss index f1b2495e..a685d9ae 100644 --- a/html/src/vr.scss +++ b/html/src/vr.scss @@ -211,11 +211,16 @@ button { } .x-containerbottom span { - padding: 0px; display: block; overflow: hidden; } +.np-progress-bar { + width: 0%; + height: 2px; + background-color: white; +} + .x-friend-item { box-sizing: border-box; display: flex;