diff --git a/package-lock.json b/package-lock.json index 2e2a3e13..5e1bb27f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "compare-versions": "^5.0.1", "dockerode": "^3.3.4", "follow-redirects": "^1.15.2", + "gamedig": "^4.0.6", "i18next": "^21.9.2", "js-yaml": "^4.1.0", "json-rpc-2.0": "^1.4.1", @@ -27,10 +28,12 @@ "react-dom": "^18.2.0", "react-i18next": "^11.18.6", "react-icons": "^4.4.0", + "recharts": "^2.7.2", "shvl": "^3.0.0", "swr": "^1.3.0", "systeminformation": "^5.17.12", "tough-cookie": "^4.1.2", + "urbackup-server-api": "^0.8.9", "winston": "^3.8.2", "xml-js": "^1.6.11" }, @@ -468,6 +471,17 @@ "integrity": "sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==", "dev": true }, + "node_modules/@sindresorhus/is": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, "node_modules/@swc/helpers": { "version": "0.4.11", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.11.tgz", @@ -481,6 +495,17 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, "node_modules/@tailwindcss/forms": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.3.tgz", @@ -493,6 +518,60 @@ "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1" } }, + "node_modules/@types/d3-array": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.5.tgz", + "integrity": "sha512-Qk7fpJ6qFp+26VeQ47WY0mkwXaiq8+76RJcncDEfMc2ocRzXLO67bLFRNI4OX1aGBoPzsM5Y2T+/m1pldOgD+A==" + }, + "node_modules/@types/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz", + "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", + "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.3.tgz", + "integrity": "sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.1.tgz", + "integrity": "sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A==", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", + "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==" + }, "node_modules/@types/hoist-non-react-statics": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", @@ -502,6 +581,11 @@ "hoist-non-react-statics": "^3.3.0" } }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -685,6 +769,14 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", + "engines": { + "node": ">=0.4.2" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -712,8 +804,7 @@ "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" }, "node_modules/anymatch": { "version": "3.1.3", @@ -865,6 +956,19 @@ "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" }, + "node_modules/async-mutex": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.3.2.tgz", + "integrity": "sha512-HuTK7E7MT7jZEh1P9GtRW9+aTWiDWWi9InbZ5hjxrnRa39KS4BW04+xLBhYNS2aXhHUIKZSw3gj4Pn1pj+qGAA==", + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/async-mutex/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -951,6 +1055,35 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/barse": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/barse/-/barse-0.4.3.tgz", + "integrity": "sha512-UEpvriJqAn8zuVinYICuKoPttZy3XxXEoqX/V2uYAL4zzJRuNzCK3+20nAu3YUIa2U7G53kf90wfBIp9/A+Odw==", + "dependencies": { + "readable-stream": "~1.0.2" + } + }, + "node_modules/barse/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/barse/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/barse/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -997,6 +1130,11 @@ "readable-stream": "^3.4.0" } }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1094,6 +1232,31 @@ "node": ">= 0.8" } }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "10.2.13", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.13.tgz", + "integrity": "sha512-3SD4rrMu1msNGEtNSt8Od6enwdo//U9s4ykmXfA2TD58kcLkCobtCDiby7kNyj7a/Q7lz/mAesAFI54rTdnvBA==", + "dependencies": { + "@types/http-cache-semantics": "^4.0.1", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -1165,6 +1328,42 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -1304,6 +1503,29 @@ "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-5.0.3.tgz", "integrity": "sha512-4UZlZP8Z99MGEY+Ovg/uJxJuvoXuN4M6B3hKaiackiHrgzQFEe3diJi1mf1PNHbFujM7FvLrK2bpgIaImbtZ1A==" }, + "node_modules/compressjs": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/compressjs/-/compressjs-1.0.3.tgz", + "integrity": "sha512-jpKJjBTretQACTGLNuvnozP1JdP2ZLrjdGdBgk/tz1VfXlUcBhhSZW6vEsuThmeot/yjvSrPQKEgfF3X2Lpi8Q==", + "dependencies": { + "amdefine": "~1.0.0", + "commander": "~2.8.1" + }, + "bin": { + "compressjs": "bin/compressjs" + } + }, + "node_modules/compressjs/node_modules/commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha512-+pJLBFVk+9ZZdlAOB5WuIElVPPth47hILFkmGym57aq8kwxsowvByvB0DHs1vQAhyMZzdcpTtF0VDKGkSDR4ZQ==", + "dependencies": { + "graceful-readlink": ">= 1.0.0" + }, + "engines": { + "node": ">= 0.6.x" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1357,6 +1579,37 @@ "node": ">= 8" } }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-unit-converter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz", + "integrity": "sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==" + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -1374,6 +1627,116 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" + } + }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -1407,6 +1770,36 @@ } } }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==" + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/deep-equal": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", @@ -1441,6 +1834,14 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "engines": { + "node": ">=10" + } + }, "node_modules/define-properties": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", @@ -1536,6 +1937,65 @@ "node": ">=6.0.0" } }, + "node_modules/dom-helpers": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", + "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", + "dependencies": { + "@babel/runtime": "^7.1.2" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -1570,6 +2030,17 @@ "once": "^1.4.0" } }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/es-abstract": { "version": "1.21.2", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", @@ -2175,6 +2646,17 @@ "node": ">=0.10.0" } }, + "node_modules/event-to-promise": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/event-to-promise/-/event-to-promise-0.7.0.tgz", + "integrity": "sha512-VOBBfyaADfe378ZzG0tgkzmsvzUyeU5arehrFzNRt5yaASUDshgctTwSrPI17ocAwR3+YftsxRClHF+GBKFByQ==", + "deprecated": "Use promise-toolbox/fromEvent instead" + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, "node_modules/execa": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", @@ -2221,6 +2703,14 @@ "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", "dev": true }, + "node_modules/fast-equals": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz", + "integrity": "sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/fast-glob": { "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", @@ -2387,6 +2877,14 @@ "node": ">= 0.12" } }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "engines": { + "node": ">= 14.17" + } + }, "node_modules/fraction.js": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", @@ -2478,6 +2976,54 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gamedig": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/gamedig/-/gamedig-4.0.6.tgz", + "integrity": "sha512-h0k9n/e5vNrd9Mh2wyFUp2Vo7ABWbDkdBxKC6FNJLOZiU5d9Z29bntGeYbXtOkcRWoV6Q63wSAJ3jLWxYQkpZw==", + "dependencies": { + "cheerio": "^1.0.0-rc.10", + "compressjs": "^1.0.2", + "gbxremote": "^0.2.1", + "got": "^12.0.3", + "iconv-lite": "^0.6.3", + "long": "^5.2.0", + "minimist": "^1.2.6", + "punycode": "^2.1.1", + "varint": "^6.0.0" + }, + "bin": { + "gamedig": "bin/gamedig.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/gamedig/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gbxremote": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/gbxremote/-/gbxremote-0.2.1.tgz", + "integrity": "sha512-SMehu6Y6ndq2Qgp9VxAb8Np3f+UUD+RWoW2SAMaxzGS96rWXyr4T1GGkecO0HHtxeH1m7pEh4FJWB8a/6aM2XQ==", + "dependencies": { + "any-promise": "^1.1.0", + "barse": "~0.4.2", + "event-to-promise": "^0.7.0", + "string-to-stream": "^1.0.1", + "xmlrpc": "^1.3.1" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/get-intrinsic": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", @@ -2620,6 +3166,35 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==" + }, "node_modules/grapheme-splitter": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", @@ -2743,6 +3318,29 @@ "void-elements": "3.1.0" } }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -2772,6 +3370,18 @@ "npm": ">=1.3.7" } }, + "node_modules/http2-wrapper": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", + "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -2899,6 +3509,14 @@ "node": ">= 0.4" } }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "engines": { + "node": ">=12" + } + }, "node_modules/interpret": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", @@ -3304,6 +3922,11 @@ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, "node_modules/json-rpc-2.0": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/json-rpc-2.0/-/json-rpc-2.0-1.5.1.tgz", @@ -3377,6 +4000,14 @@ "node": ">=4.0" } }, + "node_modules/keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kuler": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", @@ -3440,6 +4071,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -3459,6 +4095,11 @@ "triple-beam": "^1.3.0" } }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -3470,6 +4111,17 @@ "loose-envify": "cli.js" } }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -3541,6 +4193,17 @@ "node": ">=6" } }, + "node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minecraft-ping-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/minecraft-ping-js/-/minecraft-ping-js-1.0.2.tgz", @@ -3574,7 +4237,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3781,6 +4443,25 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -3810,6 +4491,17 @@ "node": ">=0.10.0" } }, + "node_modules/normalize-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", + "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -3821,6 +4513,17 @@ "node": ">=8" } }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, "node_modules/oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -3833,7 +4536,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -4044,6 +4746,14 @@ "node": ">=4.0.0" } }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "engines": { + "node": ">=12.20" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -4086,6 +4796,29 @@ "node": ">=6" } }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -4339,11 +5072,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -4409,7 +5146,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, "engines": { "node": ">=10" }, @@ -4488,6 +5224,52 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "node_modules/react-resize-detector": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-8.1.0.tgz", + "integrity": "sha512-S7szxlaIuiy5UqLhLL1KY3aoyGHbZzsTpYal9eYMwCyKqoqoVLCmIgAgNyIM1FhnP2KyBygASJxdhejrzjMb+w==", + "dependencies": { + "lodash": "^4.17.21" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-smooth": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-2.0.3.tgz", + "integrity": "sha512-yl4y3XiMorss7ayF5QnBiSprig0+qFHui8uh7Hgg46QX5O+aRMRKlfGGNGLHno35JkQSvSYY8eCWkBfHfrSHfg==", + "dependencies": { + "fast-equals": "^5.0.0", + "react-transition-group": "2.9.0" + }, + "peerDependencies": { + "prop-types": "^15.6.0", + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-transition-group": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", + "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", + "dependencies": { + "dom-helpers": "^3.4.0", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": ">=15.0.0", + "react-dom": ">=15.0.0" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -4522,6 +5304,38 @@ "node": ">=8.10.0" } }, + "node_modules/recharts": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.7.2.tgz", + "integrity": "sha512-HMKRBkGoOXHW+7JcRa6+MukPSifNtJlqbc+JreGVNA407VLE/vOP+8n3YYjprDVVIF9E2ZgwWnL3D7K/LUFzBg==", + "dependencies": { + "classnames": "^2.2.5", + "eventemitter3": "^4.0.1", + "lodash": "^4.17.19", + "react-is": "^16.10.2", + "react-resize-detector": "^8.0.4", + "react-smooth": "^2.0.2", + "recharts-scale": "^0.4.4", + "reduce-css-calc": "^2.1.8", + "victory-vendor": "^36.6.8" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "prop-types": "^15.6.0", + "react": "^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/recharts-scale": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", + "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", + "dependencies": { + "decimal.js-light": "^2.4.1" + } + }, "node_modules/rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", @@ -4533,6 +5347,20 @@ "node": ">= 0.10" } }, + "node_modules/reduce-css-calc": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz", + "integrity": "sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg==", + "dependencies": { + "css-unit-converter": "^1.1.1", + "postcss-value-parser": "^3.3.0" + } + }, + "node_modules/reduce-css-calc/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, "node_modules/regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", @@ -4619,6 +5447,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -4628,6 +5461,20 @@ "node": ">=4" } }, + "node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -4927,6 +5774,47 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/string-to-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string-to-stream/-/string-to-stream-1.1.1.tgz", + "integrity": "sha512-QySF2+3Rwq0SdO3s7BAp4x+c3qsClpPQ6abAmb0DGViiSBAkT5kL6JT2iyzEVP+T1SmzHrQD1TwlP9QAHCc+Sw==", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.1.0" + } + }, + "node_modules/string-to-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/string-to-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/string-to-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/string-to-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", @@ -5343,6 +6231,11 @@ "node": ">=6" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "node_modules/triple-beam": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", @@ -5515,6 +6408,15 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/urbackup-server-api": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/urbackup-server-api/-/urbackup-server-api-0.8.9.tgz", + "integrity": "sha512-Igu6A0xSZeMsiN6PWT7zG4aD+iJR5fXT/j5+xwAvnD/vCNfvVrettIsXv6MftxOajvTmtlgaYu8KDoH1EJQ6DQ==", + "dependencies": { + "async-mutex": "^0.3.1", + "node-fetch": "^2.6.1" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -5572,6 +6474,27 @@ "extsprintf": "^1.2.0" } }, + "node_modules/victory-vendor": { + "version": "36.6.11", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.6.11.tgz", + "integrity": "sha512-nT8kCiJp8dQh8g991J/R5w5eE2KnO8EAIP0xocWlh9l2okngMWglOPoMZzJvek8Q1KUc4XE/mJxTZnvOB1sTYg==", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, "node_modules/void-elements": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", @@ -5580,6 +6503,20 @@ "node": ">=0.10.0" } }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -5724,6 +6661,27 @@ "xml-js": "bin/cli.js" } }, + "node_modules/xmlbuilder": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz", + "integrity": "sha512-eKRAFz04jghooy8muekqzo8uCSVNeyRedbuJrp0fovbLIi7wlsYtdUn3vBAAPq2Y3/0xMz2WMEUQ8yhVVO9Stw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlrpc": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/xmlrpc/-/xmlrpc-1.3.2.tgz", + "integrity": "sha512-jQf5gbrP6wvzN71fgkcPPkF4bF/Wyovd7Xdff8d6/ihxYmgETQYSuTc+Hl+tsh/jmgPLro/Aro48LMFlIyEKKQ==", + "dependencies": { + "sax": "1.2.x", + "xmlbuilder": "8.2.x" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.0.0" + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", diff --git a/package.json b/package.json index 8c774188..fd9965fd 100644 --- a/package.json +++ b/package.json @@ -30,10 +30,12 @@ "react-dom": "^18.2.0", "react-i18next": "^11.18.6", "react-icons": "^4.4.0", + "recharts": "^2.7.2", "shvl": "^3.0.0", "swr": "^1.3.0", "systeminformation": "^5.17.12", "tough-cookie": "^4.1.2", + "urbackup-server-api": "^0.8.9", "winston": "^3.8.2", "xml-js": "^1.6.11" }, diff --git a/public/locales/ar/common.json b/public/locales/ar/common.json index 6ff5acab..9ef8c8fe 100644 --- a/public/locales/ar/common.json +++ b/public/locales/ar/common.json @@ -310,7 +310,13 @@ "warn": "Warn", "total": "Total", "free": "Free", - "used": "Used" + "used": "Used", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "quicklaunch": { "bookmark": "مفضلة", @@ -656,14 +662,32 @@ "seriesCount": "Series", "totalFiles": "Files" }, - "azurePipelines": { + "gamedig": { + "name": "Name", + "map": "Map", + "currentPlayers": "Current players", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots", + "ping": "Ping" + }, + "azuredevops": { "result": "Result", "status": "Status", + "inProgress": "In Progress", + "totalPrs": "Total PRs", + "myPrs": "My PRs", "buildId": "Build ID", "succeeded": "Succeeded", "notStarted": "Not Started", "failed": "Failed", "canceled": "Canceled", - "inProgress": "In Progress" + "approved": "Approved" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/bg/common.json b/public/locales/bg/common.json index d0dea6a9..1185514e 100644 --- a/public/locales/bg/common.json +++ b/public/locales/bg/common.json @@ -248,7 +248,13 @@ "warn": "Warn", "total": "Total", "free": "Free", - "used": "Used" + "used": "Used", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "changedetectionio": { "totalObserved": "Total Observed", @@ -656,7 +662,16 @@ "seriesCount": "Series", "totalFiles": "Files" }, - "azurePipelines": { + "gamedig": { + "name": "Name", + "map": "Map", + "currentPlayers": "Current players", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots", + "ping": "Ping" + }, + "azuredevops": { "result": "Result", "status": "Status", "buildId": "Build ID", @@ -664,6 +679,15 @@ "notStarted": "Not Started", "failed": "Failed", "canceled": "Canceled", - "inProgress": "In Progress" + "inProgress": "In Progress", + "totalPrs": "Total PRs", + "myPrs": "My PRs", + "approved": "Approved" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/ca/common.json b/public/locales/ca/common.json index 83fc95a4..d605c805 100644 --- a/public/locales/ca/common.json +++ b/public/locales/ca/common.json @@ -248,7 +248,13 @@ "warn": "Warn", "total": "Total", "free": "Free", - "used": "Used" + "used": "Used", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "changedetectionio": { "totalObserved": "Total d'observats", @@ -656,7 +662,16 @@ "seriesCount": "Series", "totalFiles": "Files" }, - "azurePipelines": { + "gamedig": { + "name": "Name", + "map": "Map", + "currentPlayers": "Current players", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots", + "ping": "Ping" + }, + "azuredevops": { "result": "Result", "status": "Status", "buildId": "Build ID", @@ -664,6 +679,15 @@ "notStarted": "Not Started", "failed": "Failed", "canceled": "Canceled", - "inProgress": "In Progress" + "inProgress": "In Progress", + "totalPrs": "Total PRs", + "myPrs": "My PRs", + "approved": "Approved" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "totalUsed": "Used Storage", + "noRecent": "Out of Date" } } diff --git a/public/locales/cs/common.json b/public/locales/cs/common.json index ed5dc276..3e09060c 100644 --- a/public/locales/cs/common.json +++ b/public/locales/cs/common.json @@ -322,7 +322,13 @@ "free": "Free", "used": "Used", "load": "Load", - "warn": "Warn" + "warn": "Warn", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "quicklaunch": { "bookmark": "Záložka", @@ -656,7 +662,16 @@ "seriesCount": "Series", "totalFiles": "Files" }, - "azurePipelines": { + "gamedig": { + "map": "Map", + "currentPlayers": "Current players", + "name": "Name", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots", + "ping": "Ping" + }, + "azuredevops": { "result": "Result", "status": "Status", "buildId": "Build ID", @@ -664,6 +679,15 @@ "notStarted": "Not Started", "failed": "Failed", "canceled": "Canceled", - "inProgress": "In Progress" + "inProgress": "In Progress", + "totalPrs": "Total PRs", + "myPrs": "My PRs", + "approved": "Approved" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/da/common.json b/public/locales/da/common.json index 797f9f4a..98af801d 100644 --- a/public/locales/da/common.json +++ b/public/locales/da/common.json @@ -79,7 +79,13 @@ "warn": "Warn", "total": "Total", "free": "Free", - "used": "Used" + "used": "Used", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "wmo": { "1-day": "Hovedsageligt solrigt", @@ -656,7 +662,16 @@ "seriesCount": "Series", "totalFiles": "Files" }, - "azurePipelines": { + "gamedig": { + "name": "Name", + "map": "Map", + "currentPlayers": "Current players", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots", + "ping": "Ping" + }, + "azuredevops": { "result": "Result", "status": "Status", "buildId": "Build ID", @@ -664,6 +679,15 @@ "notStarted": "Not Started", "failed": "Failed", "canceled": "Canceled", - "inProgress": "In Progress" + "inProgress": "In Progress", + "totalPrs": "Total PRs", + "myPrs": "My PRs", + "approved": "Approved" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/de/common.json b/public/locales/de/common.json index 8bd743ea..756ade92 100644 --- a/public/locales/de/common.json +++ b/public/locales/de/common.json @@ -248,7 +248,13 @@ "warn": "Warnung", "total": "Gesamt", "free": "Frei", - "used": "Verwendet" + "used": "Verwendet", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap", + "crit": "Crit", + "read": "Read" }, "changedetectionio": { "totalObserved": "Gesamt beobachtet", @@ -656,7 +662,16 @@ "seriesCount": "Series", "totalFiles": "Files" }, - "azurePipelines": { + "gamedig": { + "name": "Name", + "map": "Map", + "currentPlayers": "Current players", + "players": "Players", + "bots": "Bots", + "ping": "Ping", + "maxPlayers": "Max players" + }, + "azuredevops": { "result": "Result", "status": "Status", "buildId": "Build ID", @@ -664,6 +679,15 @@ "notStarted": "Not Started", "failed": "Failed", "canceled": "Canceled", + "totalPrs": "Total PRs", + "myPrs": "My PRs", + "approved": "Approved", "inProgress": "In Progress" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/el/common.json b/public/locales/el/common.json index 506a25d7..0a745d90 100644 --- a/public/locales/el/common.json +++ b/public/locales/el/common.json @@ -369,7 +369,13 @@ "total": "Total", "free": "Free", "used": "Used", - "load": "Load" + "load": "Load", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "quicklaunch": { "bookmark": "Bookmark", @@ -656,7 +662,18 @@ "seriesCount": "Series", "totalFiles": "Files" }, - "azurePipelines": { + "gamedig": { + "name": "Name", + "map": "Map", + "currentPlayers": "Current players", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots", + "ping": "Ping" + }, + "azuredevops": { + "myPrs": "My PRs", + "approved": "Approved", "result": "Result", "status": "Status", "buildId": "Build ID", @@ -664,6 +681,13 @@ "notStarted": "Not Started", "failed": "Failed", "canceled": "Canceled", - "inProgress": "In Progress" + "inProgress": "In Progress", + "totalPrs": "Total PRs" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/eo/common.json b/public/locales/eo/common.json index 4a1ae6f3..b74723ae 100644 --- a/public/locales/eo/common.json +++ b/public/locales/eo/common.json @@ -266,7 +266,13 @@ "warn": "Warn", "total": "Total", "free": "Free", - "used": "Used" + "used": "Used", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "quicklaunch": { "bookmark": "Bookmark", @@ -656,7 +662,16 @@ "seriesCount": "Series", "totalFiles": "Files" }, - "azurePipelines": { + "gamedig": { + "name": "Name", + "map": "Map", + "currentPlayers": "Current players", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots", + "ping": "Ping" + }, + "azuredevops": { "result": "Result", "status": "Status", "buildId": "Build ID", @@ -664,6 +679,15 @@ "notStarted": "Not Started", "failed": "Failed", "canceled": "Canceled", - "inProgress": "In Progress" + "inProgress": "In Progress", + "totalPrs": "Total PRs", + "myPrs": "My PRs", + "approved": "Approved" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/es/common.json b/public/locales/es/common.json index c4712669..6d73f553 100644 --- a/public/locales/es/common.json +++ b/public/locales/es/common.json @@ -248,7 +248,13 @@ "warn": "Advertir", "total": "Total", "free": "Libre", - "used": "Utilizado" + "used": "Utilizado", + "crit": "Crít.", + "read": "Leer", + "write": "Escribir", + "gpu": "GPU", + "mem": "Memoria", + "swap": "Intercambiar" }, "changedetectionio": { "totalObserved": "Total Observados", @@ -656,14 +662,32 @@ "seriesCount": "Serie", "totalFiles": "Archivos" }, - "azurePipelines": { + "gamedig": { + "name": "Nombre", + "map": "Mapa", + "currentPlayers": "Jugadores actuales", + "players": "Jugadores", + "maxPlayers": "Jugadores máximos", + "bots": "Bots", + "ping": "Ping" + }, + "azuredevops": { "result": "Resultado", "status": "Estado", - "buildId": "ID de la compilación", - "succeeded": "Con éxito", - "notStarted": "No iniciado", + "buildId": "Identificador de la construcción", + "succeeded": "Exitoso", + "notStarted": "Sin empezar", "failed": "Fallido", "canceled": "Cancelado", - "inProgress": "En proceso" + "inProgress": "En curso", + "totalPrs": "RP totales", + "myPrs": "Mis logros", + "approved": "Aprobados" + }, + "urbackup": { + "ok": "De acuerdo", + "errored": "Errores", + "noRecent": "Caducado", + "totalUsed": "Almacenamiento usado" } } diff --git a/public/locales/eu/common.json b/public/locales/eu/common.json index 27685703..fcb6026d 100644 --- a/public/locales/eu/common.json +++ b/public/locales/eu/common.json @@ -431,7 +431,13 @@ "free": "Free", "used": "Used", "days": "d", - "hours": "h" + "hours": "h", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "quicklaunch": { "bookmark": "Bookmark", @@ -656,14 +662,32 @@ "seriesCount": "Series", "totalFiles": "Files" }, - "azurePipelines": { + "gamedig": { + "currentPlayers": "Current players", + "name": "Name", + "map": "Map", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots", + "ping": "Ping" + }, + "azuredevops": { + "notStarted": "Not Started", "result": "Result", "status": "Status", "buildId": "Build ID", "succeeded": "Succeeded", - "notStarted": "Not Started", "failed": "Failed", "canceled": "Canceled", - "inProgress": "In Progress" + "inProgress": "In Progress", + "totalPrs": "Total PRs", + "myPrs": "My PRs", + "approved": "Approved" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/fi/common.json b/public/locales/fi/common.json index ad457f2c..5a1f22ae 100644 --- a/public/locales/fi/common.json +++ b/public/locales/fi/common.json @@ -248,7 +248,13 @@ "warn": "Warn", "total": "Total", "free": "Free", - "used": "Used" + "used": "Used", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "changedetectionio": { "totalObserved": "Total Observed", @@ -656,7 +662,16 @@ "seriesCount": "Series", "totalFiles": "Files" }, - "azurePipelines": { + "gamedig": { + "name": "Name", + "map": "Map", + "currentPlayers": "Current players", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots", + "ping": "Ping" + }, + "azuredevops": { "result": "Result", "status": "Status", "buildId": "Build ID", @@ -664,6 +679,15 @@ "notStarted": "Not Started", "failed": "Failed", "canceled": "Canceled", - "inProgress": "In Progress" + "inProgress": "In Progress", + "totalPrs": "Total PRs", + "myPrs": "My PRs", + "approved": "Approved" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/he/common.json b/public/locales/he/common.json index 78545f39..962ebd7d 100644 --- a/public/locales/he/common.json +++ b/public/locales/he/common.json @@ -248,7 +248,13 @@ "load": "Load", "total": "Total", "free": "Free", - "used": "Used" + "used": "Used", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "changedetectionio": { "totalObserved": "Total Observed", @@ -656,7 +662,16 @@ "seriesCount": "Series", "totalFiles": "Files" }, - "azurePipelines": { + "gamedig": { + "name": "Name", + "map": "Map", + "currentPlayers": "Current players", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots", + "ping": "Ping" + }, + "azuredevops": { "result": "Result", "status": "Status", "buildId": "Build ID", @@ -664,6 +679,15 @@ "notStarted": "Not Started", "failed": "Failed", "canceled": "Canceled", - "inProgress": "In Progress" + "inProgress": "In Progress", + "myPrs": "My PRs", + "totalPrs": "Total PRs", + "approved": "Approved" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/hi/common.json b/public/locales/hi/common.json index 70dd22e8..3778776d 100644 --- a/public/locales/hi/common.json +++ b/public/locales/hi/common.json @@ -256,7 +256,13 @@ "warn": "Warn", "total": "Total", "free": "Free", - "used": "Used" + "used": "Used", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "quicklaunch": { "bookmark": "Bookmark", @@ -656,7 +662,17 @@ "seriesCount": "Series", "totalFiles": "Files" }, - "azurePipelines": { + "gamedig": { + "name": "Name", + "map": "Map", + "currentPlayers": "Current players", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots", + "ping": "Ping" + }, + "azuredevops": { + "myPrs": "My PRs", "result": "Result", "status": "Status", "buildId": "Build ID", @@ -664,6 +680,14 @@ "notStarted": "Not Started", "failed": "Failed", "canceled": "Canceled", - "inProgress": "In Progress" + "inProgress": "In Progress", + "totalPrs": "Total PRs", + "approved": "Approved" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/hr/common.json b/public/locales/hr/common.json index 49e13492..7b094f74 100644 --- a/public/locales/hr/common.json +++ b/public/locales/hr/common.json @@ -248,7 +248,13 @@ "load": "Opterećenje", "warn": "Upozori", "total": "Ukupno", - "free": "Slobodno" + "free": "Slobodno", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "changedetectionio": { "totalObserved": "Ukupno promatrano", @@ -656,7 +662,16 @@ "seriesCount": "Serije", "totalFiles": "Datoteke" }, - "azurePipelines": { + "gamedig": { + "name": "Name", + "map": "Map", + "currentPlayers": "Current players", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots", + "ping": "Ping" + }, + "azuredevops": { "result": "Result", "status": "Status", "buildId": "Build ID", @@ -664,6 +679,15 @@ "notStarted": "Not Started", "failed": "Failed", "canceled": "Canceled", - "inProgress": "In Progress" + "inProgress": "In Progress", + "totalPrs": "Total PRs", + "myPrs": "My PRs", + "approved": "Approved" + }, + "urbackup": { + "noRecent": "Out of Date", + "totalUsed": "Used Storage", + "ok": "Ok", + "errored": "Errors" } } diff --git a/public/locales/hu/common.json b/public/locales/hu/common.json index 56bfd877..f7bb97a3 100644 --- a/public/locales/hu/common.json +++ b/public/locales/hu/common.json @@ -248,7 +248,13 @@ "warn": "Figyelmeztet", "total": "Összes", "free": "Szabad", - "used": "Felhasznált" + "used": "Felhasznált", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "changedetectionio": { "totalObserved": "Összes Megfigyelt", @@ -656,14 +662,32 @@ "seriesCount": "Sorozatok", "totalFiles": "Fájlok" }, - "azurePipelines": { - "result": "Eredmény", - "status": "Állapot", + "gamedig": { + "ping": "Ping", + "name": "Name", + "map": "Map", + "currentPlayers": "Current players", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots" + }, + "azuredevops": { + "status": "Status", + "myPrs": "My PRs", + "approved": "Approved", + "result": "Result", "buildId": "Build ID", - "succeeded": "Sikeres", - "notStarted": "Nincs elindítva", - "failed": "Sikertelen", - "canceled": "Megszakítva", - "inProgress": "Folyamatban" + "succeeded": "Succeeded", + "notStarted": "Not Started", + "failed": "Failed", + "canceled": "Canceled", + "inProgress": "In Progress", + "totalPrs": "Total PRs" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/id/common.json b/public/locales/id/common.json index d3cab359..6f165bb1 100644 --- a/public/locales/id/common.json +++ b/public/locales/id/common.json @@ -222,7 +222,13 @@ "wait": "Please wait", "used": "Used", "days": "d", - "hours": "h" + "hours": "h", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "quicklaunch": { "bookmark": "Bookmark", @@ -494,9 +500,9 @@ }, "weather": { "wait": "Harap tunggu", - "current": "Current Location", - "allow": "Click to allow", - "updating": "Updating" + "current": "Lokasi Saat Ini", + "allow": "Klik untuk mengizinkan", + "updating": "Memperbarui" }, "search": { "placeholder": "Telusuri…" @@ -590,11 +596,11 @@ "cpu": "CPU", "mem": "MEM", "total": "Total", - "free": "Free", - "used": "Used", + "free": "Luang", + "used": "Digunakan", "load": "Load", "temp": "TEMP", - "max": "Max", + "max": "Maks", "uptime": "UP", "months": "mo", "hours": "h", @@ -656,7 +662,16 @@ "seriesCount": "Series", "totalFiles": "Files" }, - "azurePipelines": { + "gamedig": { + "name": "Name", + "map": "Map", + "currentPlayers": "Current players", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots", + "ping": "Ping" + }, + "azuredevops": { "result": "Result", "status": "Status", "buildId": "Build ID", @@ -664,6 +679,15 @@ "notStarted": "Not Started", "failed": "Failed", "canceled": "Canceled", - "inProgress": "In Progress" + "inProgress": "In Progress", + "totalPrs": "Total PRs", + "myPrs": "My PRs", + "approved": "Approved" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/it/common.json b/public/locales/it/common.json index 0e45b23f..9b1adb2a 100644 --- a/public/locales/it/common.json +++ b/public/locales/it/common.json @@ -248,7 +248,13 @@ "warn": "Avviso", "total": "Totale", "free": "Libero", - "used": "Usato" + "used": "Usato", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "changedetectionio": { "totalObserved": "Totale Osservato", @@ -656,14 +662,32 @@ "seriesCount": "Serie", "totalFiles": "File" }, - "azurePipelines": { + "gamedig": { + "name": "Name", + "map": "Map", + "currentPlayers": "Current players", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots", + "ping": "Ping" + }, + "azuredevops": { "result": "Result", + "myPrs": "My PRs", + "approved": "Approved", "status": "Status", "buildId": "Build ID", "succeeded": "Succeeded", "notStarted": "Not Started", "failed": "Failed", "canceled": "Canceled", - "inProgress": "In Progress" + "inProgress": "In Progress", + "totalPrs": "Total PRs" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/ja/common.json b/public/locales/ja/common.json index 5a0eccee..46369324 100644 --- a/public/locales/ja/common.json +++ b/public/locales/ja/common.json @@ -25,7 +25,13 @@ "warn": "Warn", "total": "Total", "free": "Free", - "used": "Used" + "used": "Used", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "autobrr": { "filters": "フィルター", @@ -656,7 +662,16 @@ "seriesCount": "Series", "totalFiles": "Files" }, - "azurePipelines": { + "gamedig": { + "name": "Name", + "map": "Map", + "currentPlayers": "Current players", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots", + "ping": "Ping" + }, + "azuredevops": { "result": "Result", "status": "Status", "buildId": "Build ID", @@ -664,6 +679,15 @@ "notStarted": "Not Started", "failed": "Failed", "canceled": "Canceled", - "inProgress": "In Progress" + "inProgress": "In Progress", + "totalPrs": "Total PRs", + "myPrs": "My PRs", + "approved": "Approved" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/ko/common.json b/public/locales/ko/common.json index f1325b75..c814369c 100644 --- a/public/locales/ko/common.json +++ b/public/locales/ko/common.json @@ -315,7 +315,13 @@ "warn": "Warn", "total": "Total", "free": "Free", - "used": "Used" + "used": "Used", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "quicklaunch": { "bookmark": "Bookmark", @@ -656,7 +662,16 @@ "seriesCount": "Series", "totalFiles": "Files" }, - "azurePipelines": { + "gamedig": { + "name": "Name", + "map": "Map", + "ping": "Ping", + "currentPlayers": "Current players", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots" + }, + "azuredevops": { "result": "Result", "status": "Status", "buildId": "Build ID", @@ -664,6 +679,15 @@ "notStarted": "Not Started", "failed": "Failed", "canceled": "Canceled", - "inProgress": "In Progress" + "inProgress": "In Progress", + "totalPrs": "Total PRs", + "myPrs": "My PRs", + "approved": "Approved" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/lv/common.json b/public/locales/lv/common.json index 696b4d85..6d31e49a 100644 --- a/public/locales/lv/common.json +++ b/public/locales/lv/common.json @@ -304,7 +304,13 @@ "warn": "Warn", "total": "Total", "free": "Free", - "used": "Used" + "used": "Used", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "quicklaunch": { "bookmark": "Bookmark", @@ -656,14 +662,32 @@ "seriesCount": "Series", "totalFiles": "Files" }, - "azurePipelines": { + "gamedig": { + "name": "Name", + "map": "Map", + "currentPlayers": "Current players", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots", + "ping": "Ping" + }, + "azuredevops": { + "result": "Result", "status": "Status", "buildId": "Build ID", + "canceled": "Canceled", + "inProgress": "In Progress", + "totalPrs": "Total PRs", + "myPrs": "My PRs", + "approved": "Approved", "succeeded": "Succeeded", "notStarted": "Not Started", - "failed": "Failed", - "canceled": "Canceled", - "result": "Result", - "inProgress": "In Progress" + "failed": "Failed" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/ms/common.json b/public/locales/ms/common.json index a25ed71f..dad759ab 100644 --- a/public/locales/ms/common.json +++ b/public/locales/ms/common.json @@ -75,7 +75,13 @@ "warn": "Warn", "total": "Total", "free": "Free", - "used": "Used" + "used": "Used", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "quicklaunch": { "bookmark": "Tandabuku", @@ -656,7 +662,16 @@ "seriesCount": "Series", "totalFiles": "Files" }, - "azurePipelines": { + "gamedig": { + "name": "Name", + "map": "Map", + "currentPlayers": "Current players", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots", + "ping": "Ping" + }, + "azuredevops": { "result": "Result", "status": "Status", "buildId": "Build ID", @@ -664,6 +679,15 @@ "notStarted": "Not Started", "failed": "Failed", "canceled": "Canceled", - "inProgress": "In Progress" + "inProgress": "In Progress", + "totalPrs": "Total PRs", + "myPrs": "My PRs", + "approved": "Approved" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/nb-NO/common.json b/public/locales/nb-NO/common.json index 38dd3012..b13b4c36 100644 --- a/public/locales/nb-NO/common.json +++ b/public/locales/nb-NO/common.json @@ -248,7 +248,13 @@ "warn": "Warn", "total": "Total", "free": "Free", - "used": "Used" + "used": "Used", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "changedetectionio": { "totalObserved": "Total Observed", @@ -656,7 +662,16 @@ "seriesCount": "Series", "totalFiles": "Filer" }, - "azurePipelines": { + "gamedig": { + "name": "Name", + "map": "Map", + "currentPlayers": "Current players", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots", + "ping": "Ping" + }, + "azuredevops": { "result": "Result", "status": "Status", "buildId": "Build ID", @@ -664,6 +679,15 @@ "notStarted": "Not Started", "failed": "Failed", "canceled": "Canceled", - "inProgress": "In Progress" + "inProgress": "In Progress", + "totalPrs": "Total PRs", + "myPrs": "My PRs", + "approved": "Approved" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/nl/common.json b/public/locales/nl/common.json index 5bcce505..2131e246 100644 --- a/public/locales/nl/common.json +++ b/public/locales/nl/common.json @@ -248,7 +248,13 @@ "warn": "Warn", "total": "Total", "free": "Free", - "used": "Used" + "used": "Used", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "changedetectionio": { "totalObserved": "Totaal waargenomen", @@ -656,7 +662,16 @@ "seriesCount": "Series", "totalFiles": "Files" }, - "azurePipelines": { + "gamedig": { + "name": "Name", + "map": "Map", + "currentPlayers": "Current players", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots", + "ping": "Ping" + }, + "azuredevops": { "result": "Result", "status": "Status", "buildId": "Build ID", @@ -664,6 +679,15 @@ "notStarted": "Not Started", "failed": "Failed", "canceled": "Canceled", - "inProgress": "In Progress" + "inProgress": "In Progress", + "totalPrs": "Total PRs", + "myPrs": "My PRs", + "approved": "Approved" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/pl/common.json b/public/locales/pl/common.json index c44da833..b9f979e3 100644 --- a/public/locales/pl/common.json +++ b/public/locales/pl/common.json @@ -248,7 +248,13 @@ "warn": "Warn", "total": "Total", "free": "Free", - "used": "Used" + "used": "Used", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "changedetectionio": { "diffsDetected": "Wykryto różnic", @@ -656,14 +662,32 @@ "seriesCount": "Series", "totalFiles": "Files" }, - "azurePipelines": { - "result": "Result", + "gamedig": { + "name": "Name", + "map": "Map", + "currentPlayers": "Current players", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots", + "ping": "Ping" + }, + "azuredevops": { "status": "Status", "buildId": "Build ID", "succeeded": "Succeeded", "notStarted": "Not Started", "failed": "Failed", + "myPrs": "My PRs", + "approved": "Approved", + "result": "Result", "canceled": "Canceled", - "inProgress": "In Progress" + "inProgress": "In Progress", + "totalPrs": "Total PRs" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/pt-BR/common.json b/public/locales/pt-BR/common.json index 55e45757..f10c25e3 100644 --- a/public/locales/pt-BR/common.json +++ b/public/locales/pt-BR/common.json @@ -91,7 +91,7 @@ "transcoding": "Transcodificando", "bitrate": "Taxa de bits", "no_active": "Sem transmissões ativas", - "plex_connection_error": "Check Plex Connection" + "plex_connection_error": "Verifique a conexão do Plex" }, "nzbget": { "rate": "Taxa", @@ -114,21 +114,21 @@ "wanted": "Desejado", "queued": "Na fila", "series": "Séries", - "queue": "Queue", - "unknown": "Unknown" + "queue": "Fila", + "unknown": "Desconhecido" }, "radarr": { "wanted": "Desejado", "queued": "Na fila", "movies": "Filmes", "missing": "Faltando", - "queue": "Queue", - "unknown": "Unknown" + "queue": "Fila", + "unknown": "Desconhecido" }, "lidarr": { "wanted": "Desejado", "queued": "Na fila", - "artists": "Artists" + "artists": "Artistas" }, "readarr": { "wanted": "Desejado", @@ -159,7 +159,7 @@ "queries": "Consultas", "blocked": "Bloqueados", "gravity": "Gravidade", - "blocked_percent": "Blocked %" + "blocked_percent": "Bloqueado %" }, "adguard": { "queries": "Consultas", @@ -244,11 +244,17 @@ "uptime": "LIGADO", "days": "d", "hours": "h", - "load": "Load", - "warn": "Warn", + "load": "Carga", + "warn": "Aviso", "total": "Total", - "free": "Free", - "used": "Used" + "free": "Livre", + "used": "Usado", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "changedetectionio": { "totalObserved": "Observados", @@ -524,8 +530,8 @@ "memoryusage": "Memória Utilizada", "freespace": "Espaço Livre", "activeusers": "Usuários Ativos", - "numfiles": "Files", - "numshares": "Shared Items" + "numfiles": "Arquivos", + "numshares": "Itens Compartilhados" }, "kopia": { "status": "Status", @@ -582,81 +588,90 @@ "switches_on": "Interruptores Ligados" }, "freshrss": { - "subscriptions": "Subscriptions", - "unread": "Unread" + "subscriptions": "Assinaturas", + "unread": "Não lida" }, "channelsdvrserver": { "shows": "Shows", - "recordings": "Recordings", - "scheduled": "Scheduled", + "recordings": "Gravações", + "scheduled": "Agendado", "passes": "Passes" }, "whatsupdocker": { - "monitoring": "Monitoring", - "updates": "Updates" + "monitoring": "Monitorando", + "updates": "Atualizações" }, "tailscale": { - "address": "Address", - "expires": "Expires", - "never": "Never", - "last_seen": "Last Seen", - "now": "Now", - "years": "{{number}}y", - "weeks": "{{number}}w", + "address": "Endereço", + "expires": "Expira", + "never": "Nunca", + "last_seen": "Visto pela última vez", + "now": "Agora", + "years": "{{number}}a", + "weeks": "{{number}}s", "hours": "{{number}}h", "days": "{{number}}d", "minutes": "{{number}}m", "seconds": "{{number}}s", - "ago": "{{value}} Ago" + "ago": "{{value}} Atrás" }, "qnap": { - "systemTempC": "System Temp", - "cpuUsage": "CPU Usage", - "memUsage": "MEM Usage", + "systemTempC": "Temp Sistema", + "cpuUsage": "Uso CPU", + "memUsage": "Uso MEM", "poolUsage": "Pool Usage", - "volumeUsage": "Volume Usage", - "invalid": "Invalid" + "volumeUsage": "Uso Volume", + "invalid": "Invalido" }, "pfsense": { - "load": "Load Avg", - "memory": "Mem Usage", + "load": "Média de carga", + "memory": "Uso Mem", "wanStatus": "WAN Status", "up": "Up", "down": "Down", "temp": "Temp", - "disk": "Disk Usage", + "disk": "Uso de disco", "wanIP": "WAN IP" }, "caddy": { "upstreams": "Upstreams", - "requests": "Current requests", - "requests_failed": "Failed requests" + "requests": "Solicitações atuais", + "requests_failed": "Solicitações com falha" }, "evcc": { - "pv_power": "Production", - "battery_soc": "Battery", - "grid_power": "Grid", - "home_power": "Consumption", - "charge_power": "Charger", + "pv_power": "Produção", + "battery_soc": "Bateria", + "grid_power": "Grade", + "home_power": "Consumo", + "charge_power": "Carregador", "watt_hour": "Wh" }, "pialert": { "total": "Total", - "connected": "Connected", - "new_devices": "New Devices", - "down_alerts": "Down Alerts" + "connected": "Conectado", + "new_devices": "Novos dispositivos", + "down_alerts": "Alertas de Quedas" }, "jdownloader": { - "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed", - "downloadBytesRemaining": "Remaining", - "downloadTotalBytes": "Size" + "downloadCount": "Fila", + "downloadSpeed": "Velocidade de download", + "downloadBytesRemaining": "Restante", + "downloadTotalBytes": "Tamanho" }, "kavita": { "seriesCount": "Series", - "totalFiles": "Files" + "totalFiles": "Arquivos" }, - "azurePipelines": { + "gamedig": { + "name": "Nome", + "map": "Mapa", + "currentPlayers": "Jogadores atuais", + "players": "Jogadores", + "maxPlayers": "Jogadores Max", + "bots": "Robos", + "ping": "Ping" + }, + "azuredevops": { "result": "Result", "status": "Status", "buildId": "Build ID", @@ -664,6 +679,15 @@ "notStarted": "Not Started", "failed": "Failed", "canceled": "Canceled", - "inProgress": "In Progress" + "inProgress": "In Progress", + "totalPrs": "Total PRs", + "myPrs": "My PRs", + "approved": "Approved" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/pt/common.json b/public/locales/pt/common.json index add4573a..0840bc55 100644 --- a/public/locales/pt/common.json +++ b/public/locales/pt/common.json @@ -261,7 +261,13 @@ "warn": "Warn", "total": "Total", "free": "Free", - "used": "Used" + "used": "Used", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "changedetectionio": { "totalObserved": "Total Observado", @@ -665,14 +671,32 @@ "seriesCount": "Series", "totalFiles": "Files" }, - "azurePipelines": { + "gamedig": { + "name": "Name", + "map": "Map", + "currentPlayers": "Current players", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots", + "ping": "Ping" + }, + "azuredevops": { "result": "Result", + "approved": "Approved", "status": "Status", "buildId": "Build ID", "succeeded": "Succeeded", "notStarted": "Not Started", "failed": "Failed", "canceled": "Canceled", - "inProgress": "In Progress" + "inProgress": "In Progress", + "totalPrs": "Total PRs", + "myPrs": "My PRs" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/ro/common.json b/public/locales/ro/common.json index 96fd22b4..2b19ded4 100644 --- a/public/locales/ro/common.json +++ b/public/locales/ro/common.json @@ -248,7 +248,13 @@ "warn": "Warn", "total": "Total", "free": "Free", - "used": "Used" + "used": "Used", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "changedetectionio": { "totalObserved": "Total Observed", @@ -656,14 +662,32 @@ "seriesCount": "Series", "totalFiles": "Files" }, - "azurePipelines": { + "gamedig": { + "name": "Name", + "map": "Map", + "currentPlayers": "Current players", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots", + "ping": "Ping" + }, + "azuredevops": { + "canceled": "Canceled", + "inProgress": "In Progress", + "totalPrs": "Total PRs", + "myPrs": "My PRs", + "approved": "Approved", "result": "Result", "status": "Status", "buildId": "Build ID", "succeeded": "Succeeded", "notStarted": "Not Started", - "failed": "Failed", - "canceled": "Canceled", - "inProgress": "In Progress" + "failed": "Failed" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/ru/common.json b/public/locales/ru/common.json index ed23a2a9..01f664ac 100644 --- a/public/locales/ru/common.json +++ b/public/locales/ru/common.json @@ -248,7 +248,13 @@ "warn": "Warn", "total": "Total", "free": "Free", - "used": "Used" + "used": "Used", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "changedetectionio": { "totalObserved": "Всего наблюдаемых", @@ -656,14 +662,32 @@ "seriesCount": "Series", "totalFiles": "Files" }, - "azurePipelines": { - "inProgress": "In Progress", + "gamedig": { + "name": "Name", + "map": "Map", + "currentPlayers": "Current players", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots", + "ping": "Ping" + }, + "azuredevops": { "result": "Result", "status": "Status", "buildId": "Build ID", "succeeded": "Succeeded", "notStarted": "Not Started", "failed": "Failed", - "canceled": "Canceled" + "canceled": "Canceled", + "inProgress": "In Progress", + "totalPrs": "Total PRs", + "myPrs": "My PRs", + "approved": "Approved" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/sk/common.json b/public/locales/sk/common.json index 710b5007..8a793009 100644 --- a/public/locales/sk/common.json +++ b/public/locales/sk/common.json @@ -412,7 +412,13 @@ "warn": "Warn", "total": "Total", "free": "Free", - "used": "Used" + "used": "Used", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "quicklaunch": { "bookmark": "Bookmark", @@ -656,14 +662,32 @@ "seriesCount": "Series", "totalFiles": "Files" }, - "azurePipelines": { + "gamedig": { + "name": "Name", + "map": "Map", + "currentPlayers": "Current players", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots", + "ping": "Ping" + }, + "azuredevops": { + "succeeded": "Succeeded", + "notStarted": "Not Started", + "inProgress": "In Progress", "result": "Result", "status": "Status", "buildId": "Build ID", - "succeeded": "Succeeded", - "notStarted": "Not Started", "failed": "Failed", "canceled": "Canceled", - "inProgress": "In Progress" + "totalPrs": "Total PRs", + "myPrs": "My PRs", + "approved": "Approved" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/sl/common.json b/public/locales/sl/common.json index 60cee85f..429d09dd 100644 --- a/public/locales/sl/common.json +++ b/public/locales/sl/common.json @@ -364,7 +364,13 @@ "load": "Obremenitev", "warn": "Opoz.", "total": "Skupaj", - "used": "V uporabi" + "used": "V uporabi", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "authentik": { "users": "Uporabniki", @@ -656,7 +662,16 @@ "seriesCount": "Serije", "totalFiles": "Datoteke" }, - "azurePipelines": { + "gamedig": { + "name": "Name", + "map": "Map", + "currentPlayers": "Current players", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots", + "ping": "Ping" + }, + "azuredevops": { "result": "Result", "status": "Status", "buildId": "Build ID", @@ -664,6 +679,15 @@ "notStarted": "Not Started", "failed": "Failed", "canceled": "Canceled", - "inProgress": "In Progress" + "inProgress": "In Progress", + "totalPrs": "Total PRs", + "myPrs": "My PRs", + "approved": "Approved" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/sr/common.json b/public/locales/sr/common.json index bb387d90..0c7462cf 100644 --- a/public/locales/sr/common.json +++ b/public/locales/sr/common.json @@ -248,7 +248,13 @@ "warn": "Warn", "total": "Total", "free": "Free", - "used": "Used" + "used": "Used", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "changedetectionio": { "totalObserved": "Total Observed", @@ -656,7 +662,16 @@ "seriesCount": "Series", "totalFiles": "Files" }, - "azurePipelines": { + "gamedig": { + "name": "Name", + "map": "Map", + "currentPlayers": "Current players", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots", + "ping": "Ping" + }, + "azuredevops": { "result": "Result", "status": "Status", "buildId": "Build ID", @@ -664,6 +679,15 @@ "notStarted": "Not Started", "failed": "Failed", "canceled": "Canceled", - "inProgress": "In Progress" + "inProgress": "In Progress", + "totalPrs": "Total PRs", + "myPrs": "My PRs", + "approved": "Approved" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/sv/common.json b/public/locales/sv/common.json index d432afc4..fe39cb36 100644 --- a/public/locales/sv/common.json +++ b/public/locales/sv/common.json @@ -248,7 +248,13 @@ "warn": "Warn", "total": "Total", "free": "Free", - "used": "Used" + "used": "Used", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "changedetectionio": { "totalObserved": "Total Observed", @@ -656,7 +662,17 @@ "totalFiles": "Files", "seriesCount": "Series" }, - "azurePipelines": { + "gamedig": { + "name": "Name", + "map": "Map", + "currentPlayers": "Current players", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots", + "ping": "Ping" + }, + "azuredevops": { + "approved": "Approved", "result": "Result", "status": "Status", "buildId": "Build ID", @@ -664,6 +680,14 @@ "notStarted": "Not Started", "failed": "Failed", "canceled": "Canceled", - "inProgress": "In Progress" + "inProgress": "In Progress", + "totalPrs": "Total PRs", + "myPrs": "My PRs" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/te/common.json b/public/locales/te/common.json index a73051a4..1357081f 100644 --- a/public/locales/te/common.json +++ b/public/locales/te/common.json @@ -248,7 +248,13 @@ "warn": "Warn", "total": "Total", "free": "Free", - "used": "Used" + "used": "Used", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "changedetectionio": { "totalObserved": "మొత్తం గమనించబడింది", @@ -656,14 +662,32 @@ "totalFiles": "Files", "seriesCount": "Series" }, - "azurePipelines": { + "gamedig": { + "name": "Name", + "map": "Map", + "currentPlayers": "Current players", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots", + "ping": "Ping" + }, + "azuredevops": { "result": "Result", "status": "Status", + "myPrs": "My PRs", + "approved": "Approved", "buildId": "Build ID", "succeeded": "Succeeded", "notStarted": "Not Started", "failed": "Failed", "canceled": "Canceled", - "inProgress": "In Progress" + "inProgress": "In Progress", + "totalPrs": "Total PRs" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/th/common.json b/public/locales/th/common.json index 64300953..865643d9 100644 --- a/public/locales/th/common.json +++ b/public/locales/th/common.json @@ -324,7 +324,13 @@ "warn": "Warn", "total": "Total", "free": "Free", - "used": "Used" + "used": "Used", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "quicklaunch": { "bookmark": "Bookmark", @@ -656,7 +662,16 @@ "seriesCount": "Series", "totalFiles": "Files" }, - "azurePipelines": { + "gamedig": { + "name": "Name", + "map": "Map", + "currentPlayers": "Current players", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots", + "ping": "Ping" + }, + "azuredevops": { "result": "Result", "status": "Status", "buildId": "Build ID", @@ -664,6 +679,15 @@ "notStarted": "Not Started", "failed": "Failed", "canceled": "Canceled", - "inProgress": "In Progress" + "inProgress": "In Progress", + "totalPrs": "Total PRs", + "myPrs": "My PRs", + "approved": "Approved" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/tr/common.json b/public/locales/tr/common.json index 0aac8e9f..32ccf07b 100644 --- a/public/locales/tr/common.json +++ b/public/locales/tr/common.json @@ -248,7 +248,13 @@ "warn": "Uyarı", "total": "Toplam", "free": "Boş", - "used": "Kullanım" + "used": "Kullanım", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "changedetectionio": { "totalObserved": "Toplam Gözlenen", @@ -656,14 +662,32 @@ "seriesCount": "Series", "totalFiles": "Files" }, - "azurePipelines": { + "gamedig": { + "name": "Name", + "map": "Map", + "currentPlayers": "Current players", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots", + "ping": "Ping" + }, + "azuredevops": { "result": "Result", "status": "Status", + "canceled": "Canceled", + "inProgress": "In Progress", + "totalPrs": "Total PRs", + "myPrs": "My PRs", + "approved": "Approved", "buildId": "Build ID", "succeeded": "Succeeded", "notStarted": "Not Started", - "failed": "Failed", - "canceled": "Canceled", - "inProgress": "In Progress" + "failed": "Failed" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/uk/common.json b/public/locales/uk/common.json index 86008450..97345e91 100644 --- a/public/locales/uk/common.json +++ b/public/locales/uk/common.json @@ -372,7 +372,13 @@ "warn": "Увага", "total": "Всього", "free": "Вільний", - "used": "Використовується" + "used": "Використовується", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "quicklaunch": { "bookmark": "Закладка", @@ -656,14 +662,32 @@ "seriesCount": "Серій", "totalFiles": "Файлів" }, - "azurePipelines": { - "failed": "Невдача", - "result": "Результат", - "status": "Стан", - "buildId": "ID збірки", - "succeeded": "Успішно", - "notStarted": "Не розпочато", - "canceled": "Скасовано", - "inProgress": "В процесі" + "gamedig": { + "name": "Назва", + "map": "Мапа", + "currentPlayers": "Поточні гравці", + "players": "Гравці", + "maxPlayers": "Максимум гравців", + "bots": "Ботів", + "ping": "Пінг" + }, + "azuredevops": { + "result": "Result", + "status": "Status", + "buildId": "Build ID", + "succeeded": "Succeeded", + "notStarted": "Not Started", + "failed": "Failed", + "canceled": "Canceled", + "inProgress": "In Progress", + "totalPrs": "Total PRs", + "myPrs": "My PRs", + "approved": "Approved" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/vi/common.json b/public/locales/vi/common.json index d3341c7a..a3df3c20 100644 --- a/public/locales/vi/common.json +++ b/public/locales/vi/common.json @@ -248,7 +248,13 @@ "warn": "Warn", "total": "Total", "free": "Free", - "used": "Used" + "used": "Used", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "changedetectionio": { "totalObserved": "Total Observed", @@ -656,7 +662,16 @@ "seriesCount": "Series", "totalFiles": "Files" }, - "azurePipelines": { + "gamedig": { + "name": "Name", + "map": "Map", + "currentPlayers": "Current players", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots", + "ping": "Ping" + }, + "azuredevops": { "result": "Result", "status": "Status", "buildId": "Build ID", @@ -664,6 +679,15 @@ "notStarted": "Not Started", "failed": "Failed", "canceled": "Canceled", - "inProgress": "In Progress" + "inProgress": "In Progress", + "totalPrs": "Total PRs", + "myPrs": "My PRs", + "approved": "Approved" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/yue/common.json b/public/locales/yue/common.json index 91775685..4fa9b4e5 100644 --- a/public/locales/yue/common.json +++ b/public/locales/yue/common.json @@ -248,7 +248,13 @@ "warn": "Warn", "total": "Total", "free": "Free", - "used": "Used" + "used": "Used", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "changedetectionio": { "totalObserved": "Total Observed", @@ -656,7 +662,16 @@ "seriesCount": "Series", "totalFiles": "Files" }, - "azurePipelines": { + "gamedig": { + "name": "Name", + "map": "Map", + "currentPlayers": "Current players", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots", + "ping": "Ping" + }, + "azuredevops": { "result": "Result", "status": "Status", "buildId": "Build ID", @@ -664,6 +679,15 @@ "notStarted": "Not Started", "failed": "Failed", "canceled": "Canceled", - "inProgress": "In Progress" + "inProgress": "In Progress", + "totalPrs": "Total PRs", + "myPrs": "My PRs", + "approved": "Approved" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/zh-CN/common.json b/public/locales/zh-CN/common.json index 448893aa..29b63d4f 100644 --- a/public/locales/zh-CN/common.json +++ b/public/locales/zh-CN/common.json @@ -248,7 +248,13 @@ "warn": "Warn", "total": "Total", "free": "Free", - "used": "Used" + "used": "Used", + "crit": "Crit", + "read": "Read", + "write": "Write", + "gpu": "GPU", + "mem": "Mem", + "swap": "Swap" }, "changedetectionio": { "totalObserved": "观察到的总数", @@ -656,14 +662,32 @@ "seriesCount": "Series", "totalFiles": "Files" }, - "azurePipelines": { + "gamedig": { + "name": "Name", + "map": "Map", + "currentPlayers": "Current players", + "players": "Players", + "maxPlayers": "Max players", + "bots": "Bots", + "ping": "Ping" + }, + "azuredevops": { + "canceled": "Canceled", + "inProgress": "In Progress", "result": "Result", "status": "Status", "buildId": "Build ID", "succeeded": "Succeeded", "notStarted": "Not Started", "failed": "Failed", - "canceled": "Canceled", - "inProgress": "In Progress" + "totalPrs": "Total PRs", + "myPrs": "My PRs", + "approved": "Approved" + }, + "urbackup": { + "ok": "Ok", + "errored": "Errors", + "noRecent": "Out of Date", + "totalUsed": "Used Storage" } } diff --git a/public/locales/zh-Hant/common.json b/public/locales/zh-Hant/common.json index 2f9d8622..fbbd8dfe 100644 --- a/public/locales/zh-Hant/common.json +++ b/public/locales/zh-Hant/common.json @@ -45,7 +45,7 @@ "transcoding": "轉碼", "bitrate": "位元率", "no_active": "無播放活動", - "plex_connection_error": "Check Plex Connection" + "plex_connection_error": "檢查Plex的連接狀態" }, "jellyseerr": { "pending": "待下載", @@ -90,15 +90,15 @@ "wanted": "關注中", "queued": "已加入佇列", "missing": "缺少", - "queue": "Queue", - "unknown": "Unknown" + "queue": "佇列", + "unknown": "未知的" }, "sonarr": { "wanted": "關注中", "queued": "已加入佇列", "series": "影集", - "queue": "Queue", - "unknown": "Unknown" + "queue": "佇列", + "unknown": "未知的" }, "readarr": { "wanted": "關注中", @@ -178,7 +178,7 @@ "lidarr": { "wanted": "關注中", "queued": "已加入佇列", - "artists": "Artists" + "artists": "創作者" }, "adguard": { "queries": "查詢", @@ -248,7 +248,13 @@ "used": "已使用", "load": "負載量", "warn": "警告", - "total": "總共" + "total": "總共", + "crit": "Crit", + "read": "讀取", + "write": "寫入", + "gpu": "GPU", + "mem": "記憶體", + "swap": "Swap" }, "changedetectionio": { "totalObserved": "總監測數", @@ -647,23 +653,41 @@ "down_alerts": "離線警告" }, "jdownloader": { - "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed", - "downloadBytesRemaining": "Remaining", - "downloadTotalBytes": "Size" + "downloadCount": "下載佇列", + "downloadSpeed": "下載速率", + "downloadBytesRemaining": "剩餘", + "downloadTotalBytes": "總下載量" }, "kavita": { - "seriesCount": "Series", - "totalFiles": "Files" + "seriesCount": "叢刊", + "totalFiles": "檔案" }, - "azurePipelines": { - "result": "Result", - "status": "Status", - "buildId": "Build ID", - "succeeded": "Succeeded", - "notStarted": "Not Started", - "failed": "Failed", - "canceled": "Canceled", - "inProgress": "In Progress" + "gamedig": { + "name": "名稱", + "map": "地圖", + "currentPlayers": "當前玩家數", + "players": "玩家", + "maxPlayers": "玩家數上限", + "bots": "機器人", + "ping": "Ping" + }, + "azuredevops": { + "result": "結果", + "status": "狀態", + "buildId": "組建編號", + "succeeded": "成功", + "notStarted": "尚未啟用", + "failed": "失敗", + "canceled": "取消", + "inProgress": "執行中", + "totalPrs": "總提取要求", + "myPrs": "我的提取要求", + "approved": "已核准" + }, + "urbackup": { + "ok": "Ok", + "errored": "錯誤", + "noRecent": "已過時", + "totalUsed": "已使用空間" } } diff --git a/src/components/bookmarks/item.jsx b/src/components/bookmarks/item.jsx index 89dd698d..87ef691c 100644 --- a/src/components/bookmarks/item.jsx +++ b/src/components/bookmarks/item.jsx @@ -1,4 +1,5 @@ import { useContext } from "react"; +import classNames from "classnames"; import { SettingsContext } from "utils/contexts/settings"; import ResolvedIcon from "components/resolvedicon"; @@ -16,7 +17,10 @@ export default function Item({ bookmark }) { className="block w-full text-left cursor-pointer transition-all h-15 mb-3 rounded-md font-medium text-theme-700 dark:text-theme-200 dark:hover:text-theme-300 shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-100/20 hover:bg-theme-300/20 dark:bg-white/5 dark:hover:bg-white/10" >
-
+
{bookmark.icon &&
@@ -24,7 +28,10 @@ export default function Item({ bookmark }) { } {!bookmark.icon && bookmark.abbr}
-
+
{bookmark.name}
{hostname}
diff --git a/src/components/quicklaunch.jsx b/src/components/quicklaunch.jsx index 229b2f4d..c371ccf6 100644 --- a/src/components/quicklaunch.jsx +++ b/src/components/quicklaunch.jsx @@ -145,7 +145,7 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear return ( ); } diff --git a/src/components/services/item.jsx b/src/components/services/item.jsx index 36e454ce..6f715eef 100644 --- a/src/components/services/item.jsx +++ b/src/components/services/item.jsx @@ -32,11 +32,13 @@ export default function Item({ service, group }) { return (
  • -
    +
    {service.icon && (hasLink ? ( -
    +
    {service.name}

    {service.description}

    ) : (
    -
    +
    {service.name}

    {service.description}

    )} -
    +
    {service.ping && (
    diff --git a/src/components/services/widget/container.jsx b/src/components/services/widget/container.jsx index 7d883336..647742e1 100644 --- a/src/components/services/widget/container.jsx +++ b/src/components/services/widget/container.jsx @@ -19,7 +19,7 @@ export default function Container({ error = false, children, service }) { let visibleChildren = childrenArray; let fields = service?.widget?.fields; - if (typeof service.widget.fields === 'string') fields = JSON.parse(service.widget.fields); + if (typeof fields === 'string') fields = JSON.parse(service.widget.fields); const type = service?.widget?.type; if (fields && type) { // if the field contains a "." then it most likely contains a common loc value diff --git a/src/components/widgets/glances/glances.jsx b/src/components/widgets/glances/glances.jsx index cf580630..689a1e10 100644 --- a/src/components/widgets/glances/glances.jsx +++ b/src/components/widgets/glances/glances.jsx @@ -37,7 +37,7 @@ export default function Widget({ options }) { { options.cputemp && } { options.disk && !Array.isArray(options.disk) && } - { options.disk && Array.isArray(options.disk) && options.disk.map((disk) => ) } + { options.disk && Array.isArray(options.disk) && options.disk.map((disk) => ) } { options.uptime && } { options.label && } ; @@ -108,7 +108,7 @@ export default function Widget({ options }) { expanded={options.expanded} /> {disks.map((disk) => ( -
    - {options.cpu && } - {options.memory && } + {options.cpu && } + {options.memory && } {Array.isArray(options.disk) - ? options.disk.map((disk) => ) - : options.disk && } - {options.cputemp && } - {options.uptime && } + ? options.disk.map((disk) => ) + : options.disk && } + {options.cputemp && } + {options.uptime && }
    {options.label && (
    {options.label}
    diff --git a/src/components/widgets/resources/uptime.jsx b/src/components/widgets/resources/uptime.jsx index 3984975f..73ec0a35 100644 --- a/src/components/widgets/resources/uptime.jsx +++ b/src/components/widgets/resources/uptime.jsx @@ -5,11 +5,11 @@ import { useTranslation } from "next-i18next"; import Resource from "../widget/resource"; import Error from "../widget/error"; -export default function Uptime() { +export default function Uptime({ refresh = 1500 }) { const { t } = useTranslation(); const { data, error } = useSWR(`/api/widgets/resources?type=uptime`, { - refreshInterval: 1500, + refreshInterval: refresh, }); if (error || data?.error) { diff --git a/src/components/widgets/widget/resource.jsx b/src/components/widgets/widget/resource.jsx index 18e7c800..7ca50367 100644 --- a/src/components/widgets/widget/resource.jsx +++ b/src/components/widgets/widget/resource.jsx @@ -15,7 +15,7 @@ export default function Resource({ children, icon, value, label, expandedValue =
    {expandedLabel}
    } - { percentage && } + { percentage >= 0 && } { children }
    ; diff --git a/src/utils/config/service-helpers.js b/src/utils/config/service-helpers.js index dc625f2e..1e241e46 100644 --- a/src/utils/config/service-helpers.js +++ b/src/utils/config/service-helpers.js @@ -293,6 +293,9 @@ export function cleanServiceGroups(groups) { node, // Proxmox snapshotHost, // kopia snapshotPath, + userEmail, // azuredevops + repositoryId, + metric, // glances } = cleanedService.widget; let fieldsList = fields; @@ -312,6 +315,11 @@ export function cleanServiceGroups(groups) { service_group: serviceGroup.name, }; + if (type === "azuredevops") { + if (userEmail) cleanedService.widget.userEmail = userEmail; + if (repositoryId) cleanedService.widget.repositoryId = repositoryId; + } + if (type === "coinmarketcap") { if (currency) cleanedService.widget.currency = currency; if (symbols) cleanedService.widget.symbols = symbols; @@ -351,6 +359,9 @@ export function cleanServiceGroups(groups) { if (snapshotHost) cleanedService.widget.snapshotHost = snapshotHost; if (snapshotPath) cleanedService.widget.snapshotPath = snapshotPath; } + if (type === "glances") { + if (metric) cleanedService.widget.metric = metric; + } } return cleanedService; diff --git a/src/utils/proxy/api-helpers.js b/src/utils/proxy/api-helpers.js index ca2721ec..be73a5b7 100644 --- a/src/utils/proxy/api-helpers.js +++ b/src/utils/proxy/api-helpers.js @@ -5,7 +5,7 @@ export function formatApiCall(url, args) { return args[key] || ""; }; - return url.replace(/\/+$/, "").replace(find, replace); + return url.replace(/\/+$/, "").replace(find, replace).replace(find,replace); } function getURLSearchParams(widget, endpoint) { diff --git a/src/utils/proxy/handlers/credentialed.js b/src/utils/proxy/handlers/credentialed.js index 3d181ead..d0321cb8 100644 --- a/src/utils/proxy/handlers/credentialed.js +++ b/src/utils/proxy/handlers/credentialed.js @@ -62,8 +62,10 @@ export default async function credentialedProxyHandler(req, res, map) { headers.Authorization = `Basic ${Buffer.from(`${widget.username}:${widget.password}`).toString("base64")}`; } } - else if (widget.type === "azurePipelines") { + else if (widget.type === "azuredevops") { headers.Authorization = `Basic ${Buffer.from(`$:${widget.key}`).toString("base64")}`; + } else if (widget.type === "glances") { + headers.Authorization = `Basic ${Buffer.from(`${widget.username}:${widget.password}`).toString("base64")}`; } else { headers["X-API-Key"] = `${widget.key}`; } diff --git a/src/widgets/authentik/widget.js b/src/widgets/authentik/widget.js index 7a7b532f..051c2514 100644 --- a/src/widgets/authentik/widget.js +++ b/src/widgets/authentik/widget.js @@ -9,10 +9,10 @@ const widget = { endpoint: "core/users?page_size=1", }, login: { - endpoint: "events/events/per_month/?action=login&query={}", + endpoint: "events/events/per_month/?action=login", }, login_failed: { - endpoint: "events/events/per_month/?action=login_failed&query={}", + endpoint: "events/events/per_month/?action=login_failed", }, }, }; diff --git a/src/widgets/azurePipelines/component.jsx b/src/widgets/azurePipelines/component.jsx deleted file mode 100644 index a47296f3..00000000 --- a/src/widgets/azurePipelines/component.jsx +++ /dev/null @@ -1,36 +0,0 @@ -import { useTranslation } from "next-i18next"; - -import Container from "components/services/widget/container"; -import Block from "components/services/widget/block"; -import useWidgetAPI from "utils/proxy/use-widget-api"; - -export default function Component({ service }) { - const { t } = useTranslation(); - - const { widget } = service; - - const { data: pipelineData, error: pipelineError } = useWidgetAPI(widget); - - if (pipelineError) { - return ; - } - - if (!pipelineData || !Array.isArray(pipelineData.value)) { - return ( - - - - - ); - } - - return ( - - {pipelineData.value[0].result ? - : - - } - - - ); -} diff --git a/src/widgets/azurePipelines/widget.js b/src/widgets/azurePipelines/widget.js deleted file mode 100644 index 708266d2..00000000 --- a/src/widgets/azurePipelines/widget.js +++ /dev/null @@ -1,8 +0,0 @@ -import credentialedProxyHandler from "utils/proxy/handlers/credentialed"; - -const widget = { - api: "https://dev.azure.com/{organization}/{project}/_apis/build/Builds?branchName={branchName}&definitions={definitionId}", - proxyHandler: credentialedProxyHandler, -}; - -export default widget; \ No newline at end of file diff --git a/src/widgets/azuredevops/component.jsx b/src/widgets/azuredevops/component.jsx new file mode 100644 index 00000000..a9db4403 --- /dev/null +++ b/src/widgets/azuredevops/component.jsx @@ -0,0 +1,65 @@ +import { useTranslation } from "next-i18next"; + +import Container from "components/services/widget/container"; +import Block from "components/services/widget/block"; +import useWidgetAPI from "utils/proxy/use-widget-api"; + +export default function Component({ service }) { + const { t } = useTranslation(); + const { widget } = service; + const { userEmail, repositoryId } = widget; + const includePR = userEmail !== undefined && repositoryId !== undefined; + const { data: prData, error: prError } = useWidgetAPI(widget, includePR ? "pr" : null); + const { data: pipelineData, error: pipelineError } = useWidgetAPI(widget, "pipeline"); + + if ( + pipelineError || + (includePR && (prError || prData?.errorCode !== undefined)) + ) { + let finalError = pipelineError ?? prError; + if (includePR && prData?.errorCode !== null) { + // pr call failed possibly with more specific message + finalError = { message: prData?.message ?? 'Error communicating with Azure API' } + } + return ; + } + + if (!pipelineData || !Array.isArray(pipelineData.value) || (includePR && !prData)) { + return ( + + + + + + + ); + } + + return ( + + {pipelineData.value[0].result ? ( + + ) : ( + + )} + + {includePR && } + {includePR && item.createdBy.uniqueName.toLowerCase() === userEmail.toLowerCase()) + .length, + })} + />} + {includePR && item.createdBy.uniqueName.toLowerCase() === userEmail.toLowerCase()) + .filter((item) => item.reviewers.some((reviewer) => reviewer.vote === 10)).length, + })} + />} + + + ); +} diff --git a/src/widgets/azuredevops/widget.js b/src/widgets/azuredevops/widget.js new file mode 100644 index 00000000..84c9fdf3 --- /dev/null +++ b/src/widgets/azuredevops/widget.js @@ -0,0 +1,18 @@ +import credentialedProxyHandler from "utils/proxy/handlers/credentialed"; + +const widget = { + api: "https://dev.azure.com/{organization}/{project}/_apis/{endpoint}", + proxyHandler: credentialedProxyHandler, + + mappings: { + pr: { + endpoint: "git/repositories/{repositoryId}/pullrequests" + }, + + pipeline: { + endpoint: "build/Builds?branchName={branchName}&definitions={definitionId}&$top=1" + }, + }, +}; + +export default widget; diff --git a/src/widgets/components.js b/src/widgets/components.js index 4b7ef50c..851322e7 100644 --- a/src/widgets/components.js +++ b/src/widgets/components.js @@ -5,7 +5,7 @@ const components = { audiobookshelf: dynamic(() => import("./audiobookshelf/component")), authentik: dynamic(() => import("./authentik/component")), autobrr: dynamic(() => import("./autobrr/component")), - azurePipelines: dynamic(() => import("./azurePipelines/component")), + azuredevops: dynamic(() => import("./azuredevops/component")), bazarr: dynamic(() => import("./bazarr/component")), caddy: dynamic(() => import("./caddy/component")), changedetectionio: dynamic(() => import("./changedetectionio/component")), @@ -24,6 +24,7 @@ const components = { freshrss: dynamic(() => import("./freshrss/component")), gamedig: dynamic(() => import("./gamedig/component")), ghostfolio: dynamic(() => import("./ghostfolio/component")), + glances: dynamic(() => import("./glances/component")), gluetun: dynamic(() => import("./gluetun/component")), gotify: dynamic(() => import("./gotify/component")), grafana: dynamic(() => import("./grafana/component")), @@ -90,6 +91,7 @@ const components = { unifi: dynamic(() => import("./unifi/component")), unmanic: dynamic(() => import("./unmanic/component")), uptimekuma: dynamic(() => import("./uptimekuma/component")), + urbackup: dynamic(() => import("./urbackup/component")), watchtower: dynamic(() => import("./watchtower/component")), whatsupdocker: dynamic(() => import("./whatsupdocker/component")), xteve: dynamic(() => import("./xteve/component")), diff --git a/src/widgets/glances/component.jsx b/src/widgets/glances/component.jsx new file mode 100644 index 00000000..3abef0d4 --- /dev/null +++ b/src/widgets/glances/component.jsx @@ -0,0 +1,44 @@ +import Memory from "./metrics/memory"; +import Cpu from "./metrics/cpu"; +import Sensor from "./metrics/sensor"; +import Net from "./metrics/net"; +import Process from "./metrics/process"; +import Disk from "./metrics/disk"; +import GPU from "./metrics/gpu"; +import Info from "./metrics/info"; + +export default function Component({ service }) { + const { widget } = service; + + if (widget.metric === "info") { + return ; + } + + if (widget.metric === "memory") { + return ; + } + + if (widget.metric === "process") { + return ; + } + + if (widget.metric.match(/^network:/)) { + return ; + } + + if (widget.metric.match(/^sensor:/)) { + return ; + } + + if (widget.metric.match(/^disk:/)) { + return ; + } + + if (widget.metric.match(/^gpu:/)) { + return ; + } + + if (widget.metric === "cpu") { + return ; + } +} diff --git a/src/widgets/glances/components/block.jsx b/src/widgets/glances/components/block.jsx new file mode 100644 index 00000000..1243771a --- /dev/null +++ b/src/widgets/glances/components/block.jsx @@ -0,0 +1,7 @@ +export default function Block({ position, children }) { + return ( +
    + {children} +
    + ); +} diff --git a/src/widgets/glances/components/chart.jsx b/src/widgets/glances/components/chart.jsx new file mode 100644 index 00000000..2cd01107 --- /dev/null +++ b/src/widgets/glances/components/chart.jsx @@ -0,0 +1,48 @@ +import { PureComponent } from "react"; +import { AreaChart, Area, ResponsiveContainer, Tooltip } from "recharts"; + +import CustomTooltip from "./custom_tooltip"; + +class Chart extends PureComponent { + render() { + const { dataPoints, formatter, label } = this.props; + + return ( +
    +
    + + + + + + + + + + } + classNames="rounded-md text-xs p-0.5" + contentStyle={{ + backgroundColor: "rgb(var(--color-800))", + color: "rgb(var(--color-100))" + }} + /> + + +
    +
    + ); + } +} + +export default Chart; diff --git a/src/widgets/glances/components/chart_dual.jsx b/src/widgets/glances/components/chart_dual.jsx new file mode 100644 index 00000000..e5b7e9f8 --- /dev/null +++ b/src/widgets/glances/components/chart_dual.jsx @@ -0,0 +1,63 @@ +import { PureComponent } from "react"; +import { AreaChart, Area, ResponsiveContainer, Tooltip } from "recharts"; + +import CustomTooltip from "./custom_tooltip"; + +class ChartDual extends PureComponent { + render() { + const { dataPoints, formatter, stack, label, stackOffset } = this.props; + + return ( +
    +
    + + + + + + + + + + + + + + + + } + classNames="rounded-md text-xs p-0.5" + contentStyle={{ + backgroundColor: "rgb(var(--color-800))", + color: "rgb(var(--color-100))" + }} + + /> + + +
    +
    + ); + } +} + +export default ChartDual; diff --git a/src/widgets/glances/components/container.jsx b/src/widgets/glances/components/container.jsx new file mode 100644 index 00000000..b2755305 --- /dev/null +++ b/src/widgets/glances/components/container.jsx @@ -0,0 +1,9 @@ +export default function Container({ children, className = "" }) { + return ( +
    + {children} +
    +
    +
    + ); +} diff --git a/src/widgets/glances/components/custom_tooltip.jsx b/src/widgets/glances/components/custom_tooltip.jsx new file mode 100644 index 00000000..ef3881ef --- /dev/null +++ b/src/widgets/glances/components/custom_tooltip.jsx @@ -0,0 +1,15 @@ +export default function Tooltip({ active, payload, formatter }) { + if (active && payload && payload.length) { + return ( +
    + {payload.map((pld, id) => ( +
    +
    {formatter(pld.value)} {payload[id].name}
    +
    + ))} +
    + ); + } + + return null; +}; diff --git a/src/widgets/glances/components/error.jsx b/src/widgets/glances/components/error.jsx new file mode 100644 index 00000000..6e3b4da0 --- /dev/null +++ b/src/widgets/glances/components/error.jsx @@ -0,0 +1,9 @@ +import { useTranslation } from "next-i18next"; + +export default function Error() { + const { t } = useTranslation(); + + return
    + {t("widget.api_error")} +
    ; +} diff --git a/src/widgets/glances/metrics/cpu.jsx b/src/widgets/glances/metrics/cpu.jsx new file mode 100644 index 00000000..f3acd045 --- /dev/null +++ b/src/widgets/glances/metrics/cpu.jsx @@ -0,0 +1,91 @@ +import dynamic from "next/dynamic"; +import { useState, useEffect } from "react"; +import { useTranslation } from "next-i18next"; + +import Error from "../components/error"; +import Container from "../components/container"; +import Block from "../components/block"; + +import useWidgetAPI from "utils/proxy/use-widget-api"; + +const Chart = dynamic(() => import("../components/chart"), { ssr: false }); + +const pointsLimit = 15; + +export default function Component({ service }) { + const { t } = useTranslation(); + + const [dataPoints, setDataPoints] = useState(new Array(pointsLimit).fill({ value: 0 }, 0, pointsLimit)); + + const { data, error } = useWidgetAPI(service.widget, 'cpu', { + refreshInterval: 1000, + }); + + const { data: systemData, error: systemError } = useWidgetAPI(service.widget, 'system'); + + useEffect(() => { + if (data) { + setDataPoints((prevDataPoints) => { + const newDataPoints = [...prevDataPoints, { value: data.total }]; + if (newDataPoints.length > pointsLimit) { + newDataPoints.shift(); + } + return newDataPoints; + }); + } + }, [data]); + + if (error) { + return ; + } + + if (!data) { + return -; + } + + return ( + + t("common.number", { + value, + style: "unit", + unit: "percent", + maximumFractionDigits: 0, + })} + /> + + {systemData && !systemError && ( + + {systemData.linux_distro && ( +
    + {systemData.linux_distro} +
    + )} + {systemData.os_version && ( +
    + {systemData.os_version} +
    + )} + {systemData.hostname && ( +
    + {systemData.hostname} +
    + )} +
    + )} + + +
    + {t("common.number", { + value: data.total, + style: "unit", + unit: "percent", + maximumFractionDigits: 0, + })} {t("resources.used")} +
    +
    +
    + ); +} diff --git a/src/widgets/glances/metrics/disk.jsx b/src/widgets/glances/metrics/disk.jsx new file mode 100644 index 00000000..e831a700 --- /dev/null +++ b/src/widgets/glances/metrics/disk.jsx @@ -0,0 +1,102 @@ +import dynamic from "next/dynamic"; +import { useState, useEffect } from "react"; +import { useTranslation } from "next-i18next"; + +import Error from "../components/error"; +import Container from "../components/container"; +import Block from "../components/block"; + +import useWidgetAPI from "utils/proxy/use-widget-api"; + +const ChartDual = dynamic(() => import("../components/chart_dual"), { ssr: false }); + +const pointsLimit = 15; + +export default function Component({ service }) { + const { t } = useTranslation(); + const { widget } = service; + const [, diskName] = widget.metric.split(':'); + + const [dataPoints, setDataPoints] = useState(new Array(pointsLimit).fill({ read_bytes: 0, write_bytes: 0, time_since_update: 0 }, 0, pointsLimit)); + const [ratePoints, setRatePoints] = useState(new Array(pointsLimit).fill({ a: 0, b: 0 }, 0, pointsLimit)); + + const { data, error } = useWidgetAPI(service.widget, 'diskio', { + refreshInterval: 1000, + }); + + const calculateRates = (d) => d.map(item => ({ + a: item.read_bytes / item.time_since_update, + b: item.write_bytes / item.time_since_update + })); + + useEffect(() => { + if (data) { + const diskData = data.find((item) => item.disk_name === diskName); + + setDataPoints((prevDataPoints) => { + const newDataPoints = [...prevDataPoints, diskData]; + if (newDataPoints.length > pointsLimit) { + newDataPoints.shift(); + } + return newDataPoints; + }); + } + }, [data, diskName]); + + useEffect(() => { + setRatePoints(calculateRates(dataPoints)); + }, [dataPoints]); + + if (error) { + return ; + } + + if (!data) { + return -; + } + + const diskData = data.find((item) => item.disk_name === diskName); + + if (!diskData) { + return -; + } + + const diskRates = calculateRates(dataPoints); + const currentRate = diskRates[diskRates.length - 1]; + + return ( + + t("common.bitrate", { + value, + })} + /> + + {currentRate && !error && ( + +
    + {t("common.bitrate", { + value: currentRate.a, + })} {t("glances.read")} +
    +
    + {t("common.bitrate", { + value: currentRate.b, + })} {t("glances.write")} +
    +
    + )} + + +
    + {t("common.bitrate", { + value: currentRate.a + currentRate.b, + })} +
    +
    +
    + ); +} diff --git a/src/widgets/glances/metrics/gpu.jsx b/src/widgets/glances/metrics/gpu.jsx new file mode 100644 index 00000000..c83710ce --- /dev/null +++ b/src/widgets/glances/metrics/gpu.jsx @@ -0,0 +1,104 @@ +import dynamic from "next/dynamic"; +import { useState, useEffect } from "react"; +import { useTranslation } from "next-i18next"; + +import Error from "../components/error"; +import Container from "../components/container"; +import Block from "../components/block"; + +import useWidgetAPI from "utils/proxy/use-widget-api"; + +const ChartDual = dynamic(() => import("../components/chart_dual"), { ssr: false }); + +const pointsLimit = 15; + +export default function Component({ service }) { + const { t } = useTranslation(); + const { widget } = service; + const [, gpuName] = widget.metric.split(':'); + + const [dataPoints, setDataPoints] = useState(new Array(pointsLimit).fill({ a: 0, b: 0 }, 0, pointsLimit)); + + const { data, error } = useWidgetAPI(widget, 'gpu', { + refreshInterval: 1000, + }); + + useEffect(() => { + if (data) { + // eslint-disable-next-line eqeqeq + const gpuData = data.find((item) => item[item.key] == gpuName); + + if (gpuData) { + setDataPoints((prevDataPoints) => { + const newDataPoints = [...prevDataPoints, { a: gpuData.mem, b: gpuData.proc }]; + if (newDataPoints.length > pointsLimit) { + newDataPoints.shift(); + } + return newDataPoints; + }); + } + } + }, [data, gpuName]); + + if (error) { + return ; + } + + if (!data) { + return -; + } + + // eslint-disable-next-line eqeqeq + const gpuData = data.find((item) => item[item.key] == gpuName); + + if (!gpuData) { + return -; + } + + return ( + + t("common.percent", { + value, + maximumFractionDigits: 1, + })} + /> + + + {gpuData && gpuData.name && ( +
    + {gpuData.name} +
    + )} + +
    + {t("common.number", { + value: gpuData.mem, + maximumFractionDigits: 1, + })}% {t("glances.mem")} {t("resources.used")} +
    +
    + + +
    + {t("common.number", { + value: gpuData.proc, + maximumFractionDigits: 1, + })}% {t("glances.gpu")} +
    +
    + + +
    + {t("common.number", { + value: gpuData.temperature, + maximumFractionDigits: 1, + })}° +
    +
    +
    + ); +} diff --git a/src/widgets/glances/metrics/info.jsx b/src/widgets/glances/metrics/info.jsx new file mode 100644 index 00000000..104130ee --- /dev/null +++ b/src/widgets/glances/metrics/info.jsx @@ -0,0 +1,115 @@ +import { useTranslation } from "next-i18next"; + +import Error from "../components/error"; +import Container from "../components/container"; +import Block from "../components/block"; + +import useWidgetAPI from "utils/proxy/use-widget-api"; + +export default function Component({ service }) { + const { t } = useTranslation(); + + const { data: quicklookData, errorL: quicklookError } = useWidgetAPI(service.widget, 'quicklook', { + refreshInterval: 1000, + }); + + const { data: systemData, errorL: systemError } = useWidgetAPI(service.widget, 'system', { + refreshInterval: 30000, + }); + + if (quicklookError) { + return ; + } + + if (systemError) { + return ; + } + + const dataCharts = []; + + if (quicklookData) { + quicklookData.percpu.forEach((cpu, index) => { + dataCharts.push({ + name: `CPU ${index}`, + cpu: cpu.total, + mem: quicklookData.mem, + swap: quicklookData.swap, + proc: quicklookData.cpu, + }); + }); + } + + + return ( + + + {quicklookData && quicklookData.cpu_name && ( +
    + {quicklookData.cpu_name} +
    + )} +
    + + {systemData && systemData.linux_distro && ( +
    + {systemData.linux_distro} +
    + )} + {systemData && systemData.os_version && ( +
    + {systemData.os_version} +
    + )} + {systemData && systemData.hostname && ( +
    + {systemData.hostname} +
    + )} +
    + + + {quicklookData && quicklookData.cpu && ( +
    +
    {t("glances.cpu")}
    +
    + {t("common.number", { + value: quicklookData.cpu, + style: "unit", + unit: "percent", + maximumFractionDigits: 0, + })} +
    +
    + )} + + {quicklookData && quicklookData.mem && ( +
    +
    {t("glances.mem")}
    +
    + {t("common.number", { + value: quicklookData.mem, + style: "unit", + unit: "percent", + maximumFractionDigits: 0, + })} +
    +
    + )} + + {quicklookData && quicklookData.swap && ( +
    +
    {t("glances.swap")}
    +
    + {t("common.number", { + value: quicklookData.swap, + style: "unit", + unit: "percent", + maximumFractionDigits: 0, + })} +
    +
    + )} +
    +
    + ); +} diff --git a/src/widgets/glances/metrics/memory.jsx b/src/widgets/glances/metrics/memory.jsx new file mode 100644 index 00000000..7ff3dda4 --- /dev/null +++ b/src/widgets/glances/metrics/memory.jsx @@ -0,0 +1,92 @@ +import dynamic from "next/dynamic"; +import { useState, useEffect } from "react"; +import { useTranslation } from "next-i18next"; + +import Error from "../components/error"; +import Container from "../components/container"; +import Block from "../components/block"; + +import useWidgetAPI from "utils/proxy/use-widget-api"; + +const ChartDual = dynamic(() => import("../components/chart_dual"), { ssr: false }); + +const pointsLimit = 15; + +export default function Component({ service }) { + const { t } = useTranslation(); + + const [dataPoints, setDataPoints] = useState(new Array(pointsLimit).fill({ value: 0 }, 0, pointsLimit)); + + const { data, error } = useWidgetAPI(service.widget, 'mem', { + refreshInterval: 1000, + }); + + useEffect(() => { + if (data) { + setDataPoints((prevDataPoints) => { + const newDataPoints = [...prevDataPoints, { a: data.used, b: data.free }]; + if (newDataPoints.length > pointsLimit) { + newDataPoints.shift(); + } + return newDataPoints; + }); + } + }, [data]); + + if (error) { + return ; + } + + if (!data) { + return -; + } + + return ( + + t("common.bytes", { + value, + maximumFractionDigits: 0, + binary: true, + })} + /> + + {data && !error && ( + + {data.free && ( +
    + {t("common.bytes", { + value: data.free, + maximumFractionDigits: 0, + binary: true, + })} {t("resources.free")} +
    + )} + + {data.total && ( +
    + {t("common.bytes", { + value: data.total, + maximumFractionDigits: 0, + binary: true, + })} {t("resources.total")} +
    + )} +
    + )} + + +
    + {t("common.bytes", { + value: data.used, + maximumFractionDigits: 0, + binary: true, + })} {t("resources.used")} +
    +
    +
    + ); +} diff --git a/src/widgets/glances/metrics/net.jsx b/src/widgets/glances/metrics/net.jsx new file mode 100644 index 00000000..adc325bb --- /dev/null +++ b/src/widgets/glances/metrics/net.jsx @@ -0,0 +1,92 @@ +import dynamic from "next/dynamic"; +import { useState, useEffect } from "react"; +import { useTranslation } from "next-i18next"; + +import Error from "../components/error"; +import Container from "../components/container"; +import Block from "../components/block"; + +import useWidgetAPI from "utils/proxy/use-widget-api"; + +const ChartDual = dynamic(() => import("../components/chart_dual"), { ssr: false }); + +const pointsLimit = 15; + +export default function Component({ service }) { + const { t } = useTranslation(); + const { widget } = service; + const [, interfaceName] = widget.metric.split(':'); + + const [dataPoints, setDataPoints] = useState(new Array(pointsLimit).fill({ value: 0 }, 0, pointsLimit)); + + const { data, error } = useWidgetAPI(widget, 'network', { + refreshInterval: 1000, + }); + + useEffect(() => { + if (data) { + const interfaceData = data.find((item) => item[item.key] === interfaceName); + + if (interfaceData) { + setDataPoints((prevDataPoints) => { + const newDataPoints = [...prevDataPoints, { a: interfaceData.tx, b: interfaceData.rx }]; + if (newDataPoints.length > pointsLimit) { + newDataPoints.shift(); + } + return newDataPoints; + }); + } + } + }, [data, interfaceName]); + + if (error) { + return ; + } + + if (!data) { + return -; + } + + const interfaceData = data.find((item) => item[item.key] === interfaceName); + + if (!interfaceData) { + return -; + } + + return ( + + t("common.byterate", { + value, + maximumFractionDigits: 0, + })} + /> + + + {interfaceData && interfaceData.interface_name && ( +
    + {interfaceData.interface_name} +
    + )} + +
    + {t("common.bitrate", { + value: interfaceData.tx, + maximumFractionDigits: 0, + })} {t("docker.tx")} +
    +
    + + +
    + {t("common.bitrate", { + value: interfaceData.rx, + maximumFractionDigits: 0, + })} {t("docker.rx")} +
    +
    +
    + ); +} diff --git a/src/widgets/glances/metrics/process.jsx b/src/widgets/glances/metrics/process.jsx new file mode 100644 index 00000000..3ff63a56 --- /dev/null +++ b/src/widgets/glances/metrics/process.jsx @@ -0,0 +1,66 @@ +import { useTranslation } from "next-i18next"; + +import Error from "../components/error"; +import Container from "../components/container"; +import Block from "../components/block"; + +import useWidgetAPI from "utils/proxy/use-widget-api"; +import ResolvedIcon from "components/resolvedicon"; + +const statusMap = { + "R": , // running + "S": , // sleeping + "D": , // disk sleep + "Z": , // zombie + "T": , // traced + "t": , // traced + "X": , // dead +}; + +export default function Component({ service }) { + const { t } = useTranslation(); + + const { data, error } = useWidgetAPI(service.widget, 'processlist', { + refreshInterval: 1000, + }); + + if (error) { + return ; + } + + if (!data) { + return -; + } + + data.splice(5); + + return ( + + +
    +
    +
    {t("resources.cpu")}
    +
    {t("resources.mem")}
    +
    + + + +
    + { data.map((item) =>
    +
    +
    + {statusMap[item.status]} +
    +
    {item.name}
    +
    {item.cpu_percent.toFixed(1)}%
    +
    {t("common.bytes", { + value: item.memory_info[0], + maximumFractionDigits: 0, + })}
    +
    +
    ) } +
    +
    + + ); +} diff --git a/src/widgets/glances/metrics/sensor.jsx b/src/widgets/glances/metrics/sensor.jsx new file mode 100644 index 00000000..02ce6812 --- /dev/null +++ b/src/widgets/glances/metrics/sensor.jsx @@ -0,0 +1,88 @@ +import dynamic from "next/dynamic"; +import { useState, useEffect } from "react"; +import { useTranslation } from "next-i18next"; + +import Error from "../components/error"; +import Container from "../components/container"; +import Block from "../components/block"; + +import useWidgetAPI from "utils/proxy/use-widget-api"; + +const Chart = dynamic(() => import("../components/chart"), { ssr: false }); + +const pointsLimit = 15; + +export default function Component({ service }) { + const { t } = useTranslation(); + const { widget } = service; + const [, sensorName] = widget.metric.split(':'); + + const [dataPoints, setDataPoints] = useState(new Array(pointsLimit).fill({ value: 0 }, 0, pointsLimit)); + + const { data, error } = useWidgetAPI(service.widget, 'sensors', { + refreshInterval: 1000, + }); + + useEffect(() => { + if (data) { + const sensorData = data.find((item) => item.label === sensorName); + setDataPoints((prevDataPoints) => { + const newDataPoints = [...prevDataPoints, { value: sensorData.value }]; + if (newDataPoints.length > pointsLimit) { + newDataPoints.shift(); + } + return newDataPoints; + }); + } + }, [data, sensorName]); + + if (error) { + return ; + } + + if (!data) { + return -; + } + + const sensorData = data.find((item) => item.label === sensorName); + + if (!sensorData) { + return -; + } + + return ( + + t("common.number", { + value, + })} + /> + + {sensorData && !error && ( + + {sensorData.warning && ( +
    + {sensorData.warning}{sensorData.unit} {t("glances.warn")} +
    + )} + {sensorData.critical && ( +
    + {sensorData.critical} {sensorData.unit} {t("glances.crit")} +
    + )} +
    + )} + + +
    + {t("common.number", { + value: sensorData.value, + })} {sensorData.unit} +
    +
    +
    + ); +} diff --git a/src/widgets/glances/widget.js b/src/widgets/glances/widget.js new file mode 100644 index 00000000..3da1c6d1 --- /dev/null +++ b/src/widgets/glances/widget.js @@ -0,0 +1,8 @@ +import credentialedProxyHandler from "utils/proxy/handlers/credentialed"; + +const widget = { + api: "{url}/api/3/{endpoint}", + proxyHandler: credentialedProxyHandler, +}; + +export default widget; diff --git a/src/widgets/urbackup/component.jsx b/src/widgets/urbackup/component.jsx new file mode 100644 index 00000000..2e3b5166 --- /dev/null +++ b/src/widgets/urbackup/component.jsx @@ -0,0 +1,93 @@ +import { useTranslation } from "next-i18next"; + +import Container from "components/services/widget/container"; +import Block from "components/services/widget/block"; +import useWidgetAPI from "utils/proxy/use-widget-api"; + +const Status = Object.freeze({ + ok: Symbol("Ok"), + errored: Symbol("Errored"), + noRecent: Symbol("No Recent Backups") +}); + +function hasRecentBackups(client, maxDays){ + const days = maxDays || 3; + const diffTime = days*24*60*60 // 7 days + const recentFile = (client.lastbackup > (Date.now() / 1000 - diffTime)); + const recentImage = client.image_not_supported || client.image_disabled || (client.lastbackup_image > (Date.now() / 1000 - diffTime)); + return (recentFile && recentImage); +} + +function determineStatuses(urbackupData) { + let ok = 0; + let errored = 0; + let noRecent = 0; + let status; + urbackupData.clientStatuses.forEach((client) => { + status = Status.noRecent; + if (hasRecentBackups(client, urbackupData.maxDays)) { + status = (client.file_ok && (client.image_ok || client.image_not_supported || client.image_disabled)) ? Status.ok : Status.errored; + } + switch (status) { + case Status.ok: + ok += 1; + break; + case Status.errored: + errored += 1; + break; + case Status.noRecent: + noRecent += 1; + break; + default: + break; + } + }); + + let totalUsage = false; + + // calculate total disk space if provided + if (urbackupData.diskUsage) { + totalUsage = 0.0; + urbackupData.diskUsage.forEach((client) => { + totalUsage += client.used; + }); + } + + return { ok, errored, noRecent, totalUsage }; +} + +export default function Component({ service }) { + const { t } = useTranslation(); + + const { widget } = service; + + const showDiskUsage = widget.fields?.includes('totalUsed') + + const { data: urbackupData, error: urbackupError } = useWidgetAPI(widget, "status"); + + if (urbackupError) { + return ; + } + + if (!urbackupData) { + return ( + + + + + {showDiskUsage && } + + ); + } + + const statusData = determineStatuses(urbackupData, widget); + + return ( + + + + + {showDiskUsage && } + + ); +} diff --git a/src/widgets/urbackup/proxy.js b/src/widgets/urbackup/proxy.js new file mode 100644 index 00000000..b0e4a38b --- /dev/null +++ b/src/widgets/urbackup/proxy.js @@ -0,0 +1,33 @@ +import {UrbackupServer} from "urbackup-server-api"; + +import getServiceWidget from "utils/config/service-helpers"; + +export default async function urbackupProxyHandler(req, res) { + const {group, service} = req.query; + const serviceWidget = await getServiceWidget(group, service); + + const server = new UrbackupServer({ + url: serviceWidget.url, + username: serviceWidget.username, + password: serviceWidget.password + }); + +await (async () => { + try { + const allClients = await server.getStatus({includeRemoved: false}); + let diskUsage = false + if (serviceWidget.fields?.includes("totalUsed")) { + diskUsage = await server.getUsage(); + } + res.status(200).send({ + clientStatuses: allClients, + diskUsage, + maxDays: serviceWidget.maxDays + }); + } catch (error) { + res.status(500).json({ error: "Error communicating with UrBackup server" }) + } + })(); + + +} diff --git a/src/widgets/urbackup/widget.js b/src/widgets/urbackup/widget.js new file mode 100644 index 00000000..5eac66d0 --- /dev/null +++ b/src/widgets/urbackup/widget.js @@ -0,0 +1,7 @@ +import urbackupProxyHandler from "./proxy"; + +const widget = { + proxyHandler: urbackupProxyHandler, +}; + +export default widget; diff --git a/src/widgets/widgets.js b/src/widgets/widgets.js index 6ae47efd..41a31253 100644 --- a/src/widgets/widgets.js +++ b/src/widgets/widgets.js @@ -2,7 +2,7 @@ import adguard from "./adguard/widget"; import audiobookshelf from "./audiobookshelf/widget"; import authentik from "./authentik/widget"; import autobrr from "./autobrr/widget"; -import azurePipelines from "./azurePipelines/widget"; +import azuredevops from "./azuredevops/widget"; import bazarr from "./bazarr/widget"; import caddy from "./caddy/widget"; import changedetectionio from "./changedetectionio/widget"; @@ -19,6 +19,7 @@ import flood from "./flood/widget"; import freshrss from "./freshrss/widget"; import gamedig from "./gamedig/widget"; import ghostfolio from "./ghostfolio/widget"; +import glances from "./glances/widget"; import gluetun from "./gluetun/widget"; import gotify from "./gotify/widget"; import grafana from "./grafana/widget"; @@ -87,13 +88,14 @@ import uptimekuma from "./uptimekuma/widget"; import watchtower from "./watchtower/widget"; import whatsupdocker from "./whatsupdocker/widget"; import xteve from "./xteve/widget"; +import urbackup from "./urbackup/widget"; const widgets = { adguard, audiobookshelf, authentik, autobrr, - azurePipelines, + azuredevops, bazarr, caddy, changedetectionio, @@ -110,6 +112,7 @@ const widgets = { freshrss, gamedig, ghostfolio, + glances, gluetun, gotify, grafana, @@ -177,6 +180,7 @@ const widgets = { unifi_console: unifi, unmanic, uptimekuma, + urbackup, watchtower, whatsupdocker, xteve,