From 8604418fb10d3ad045661d20757075beb266b216 Mon Sep 17 00:00:00 2001 From: Sairenity Date: Thu, 23 Feb 2023 18:24:53 +0000 Subject: [PATCH 1/6] implemented fetching of minecraft server status --- src/widgets/components.js | 1 + src/widgets/minecraft/component.jsx | 26 ++++++++++++++++++++++++++ src/widgets/minecraft/widget.js | 21 +++++++++++++++++++++ src/widgets/widgets.js | 2 ++ 4 files changed, 50 insertions(+) create mode 100644 src/widgets/minecraft/component.jsx create mode 100644 src/widgets/minecraft/widget.js diff --git a/src/widgets/components.js b/src/widgets/components.js index cfd4d01a6..1dc2d896f 100644 --- a/src/widgets/components.js +++ b/src/widgets/components.js @@ -30,6 +30,7 @@ const components = { lidarr: dynamic(() => import("./lidarr/component")), mastodon: dynamic(() => import("./mastodon/component")), medusa: dynamic(() => import("./medusa/component")), + minecraft: dynamic(() => import("./minecraft/component")), miniflux: dynamic(() => import("./miniflux/component")), mikrotik: dynamic(() => import("./mikrotik/component")), moonraker: dynamic(() => import("./moonraker/component")), diff --git a/src/widgets/minecraft/component.jsx b/src/widgets/minecraft/component.jsx new file mode 100644 index 000000000..a07bcb5f1 --- /dev/null +++ b/src/widgets/minecraft/component.jsx @@ -0,0 +1,26 @@ +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 { widget } = service; + const { data: serverData, error: serverError } = useWidgetAPI(widget, "status"); + if(serverError){ + return ; + } + if (!serverData) { + return ( + + + + + ); + } + + return ( + + + + + ); +} diff --git a/src/widgets/minecraft/widget.js b/src/widgets/minecraft/widget.js new file mode 100644 index 000000000..c71f966ef --- /dev/null +++ b/src/widgets/minecraft/widget.js @@ -0,0 +1,21 @@ +import genericProxyHandler from "utils/proxy/handlers/generic"; +import { asJson } from "utils/proxy/api-helpers"; + +const widget = { + api: "{url}/{endpoint}/{domain}", + proxyHandler: genericProxyHandler, + mappings: { + status: { + endpoint: "2", + map: (data) => { + const jsonData = asJson(data); + return { + players: jsonData.players, + version: jsonData.version + } + } + } + } +} + +export default widget; diff --git a/src/widgets/widgets.js b/src/widgets/widgets.js index 7df127764..969e44c82 100644 --- a/src/widgets/widgets.js +++ b/src/widgets/widgets.js @@ -24,6 +24,7 @@ import kopia from "./kopia/widget"; import lidarr from "./lidarr/widget"; import mastodon from "./mastodon/widget"; import medusa from "./medusa/widget"; +import minecraft from "./minecraft/widget"; import miniflux from "./miniflux/widget"; import mikrotik from "./mikrotik/widget"; import moonraker from "./moonraker/widget"; @@ -97,6 +98,7 @@ const widgets = { lidarr, mastodon, medusa, + minecraft, miniflux, mikrotik, moonraker, From 8f3ae6d674dbd7552a9fe4cb7793f6d85af9877a Mon Sep 17 00:00:00 2001 From: Sairenity Date: Thu, 23 Feb 2023 18:33:42 +0000 Subject: [PATCH 2/6] added english translations for minecraft server status --- public/locales/en/common.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/locales/en/common.json b/public/locales/en/common.json index 50e796f58..522a3acc2 100755 --- a/public/locales/en/common.json +++ b/public/locales/en/common.json @@ -262,6 +262,10 @@ "queued": "Queued", "series": "Series" }, + "minecraft":{ + "players": "Players", + "version": "Version" + }, "miniflux": { "read": "Read", "unread": "Unread" From f418ee6327a2aacc0c1393a1f430b3337c2ff6ed Mon Sep 17 00:00:00 2001 From: Sairenity Date: Mon, 27 Feb 2023 11:59:37 +0000 Subject: [PATCH 3/6] Add minecraft server status indicator --- public/locales/en/common.json | 7 +++- src/widgets/minecraft/component.jsx | 58 +++++++++++++++++++---------- src/widgets/minecraft/widget.js | 3 +- 3 files changed, 46 insertions(+), 22 deletions(-) diff --git a/public/locales/en/common.json b/public/locales/en/common.json index 522a3acc2..709e72c66 100755 --- a/public/locales/en/common.json +++ b/public/locales/en/common.json @@ -262,9 +262,12 @@ "queued": "Queued", "series": "Series" }, - "minecraft":{ + "minecraft": { "players": "Players", - "version": "Version" + "version": "Version", + "status": "Status", + "up": "Online", + "down": "Offline" }, "miniflux": { "read": "Read", diff --git a/src/widgets/minecraft/component.jsx b/src/widgets/minecraft/component.jsx index a07bcb5f1..6b3da91d4 100644 --- a/src/widgets/minecraft/component.jsx +++ b/src/widgets/minecraft/component.jsx @@ -1,26 +1,46 @@ +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 { widget } = service; - const { data: serverData, error: serverError } = useWidgetAPI(widget, "status"); - if(serverError){ - return ; - } - if (!serverData) { - return ( - - - - - ); - } + const { widget } = service; + const { data: serverData, error: serverError } = useWidgetAPI(widget, "status"); + const { t } = useTranslation(); + + if(serverError){ + return ; + } + if (!serverData) { + return ( + + + + + + ); + } - return ( - - - - - ); + const statusIndicator = serverData.online ? + {t("minecraft.up")}: + {t("minecraft.down")}; + + if(serverData.players){ + return ( + + + + + + ); + } + return ( + + + + + + ); } + \ No newline at end of file diff --git a/src/widgets/minecraft/widget.js b/src/widgets/minecraft/widget.js index c71f966ef..358043505 100644 --- a/src/widgets/minecraft/widget.js +++ b/src/widgets/minecraft/widget.js @@ -11,7 +11,8 @@ const widget = { const jsonData = asJson(data); return { players: jsonData.players, - version: jsonData.version + version: jsonData.version, + online: jsonData.online } } } From ad66637ff1dc20f52d2a285dfe575a31c80ed7f1 Mon Sep 17 00:00:00 2001 From: Sairenity Date: Tue, 28 Feb 2023 11:49:39 +0000 Subject: [PATCH 4/6] rewrite minecraft server status widget to directly ping server --- package.json | 1 + pnpm-lock.yaml | 17 +++++++++++++++++ src/utils/proxy/handlers/minecraft.js | 27 +++++++++++++++++++++++++++ src/widgets/minecraft/component.jsx | 19 ++++++------------- src/widgets/minecraft/widget.js | 7 +++---- 5 files changed, 54 insertions(+), 17 deletions(-) create mode 100644 src/utils/proxy/handlers/minecraft.js diff --git a/package.json b/package.json index 0238c6cdc..bbe3cbf0c 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "js-yaml": "^4.1.0", "json-rpc-2.0": "^1.4.1", "memory-cache": "^0.2.0", + "minecraft-ping-js": "^1.0.2", "next": "^12.3.1", "next-i18next": "^12.0.1", "node-os-utils": "^1.3.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e26fee84d..a3ce3fcd8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,6 +22,7 @@ specifiers: js-yaml: ^4.1.0 json-rpc-2.0: ^1.4.1 memory-cache: ^0.2.0 + minecraft-ping-js: ^1.0.2 next: ^12.3.1 next-i18next: ^12.0.1 node-os-utils: ^1.3.7 @@ -53,6 +54,7 @@ dependencies: js-yaml: 4.1.0 json-rpc-2.0: 1.4.1 memory-cache: 0.2.0 + minecraft-ping-js: 1.0.2 next: 12.3.1_biqbaboplfbrettd7655fr4n2y next-i18next: 12.0.1_azq6kxkn3od7qdylwkyksrwopy node-os-utils: 1.3.7 @@ -2152,6 +2154,13 @@ packages: engines: {node: '>=6'} dev: false + /minecraft-ping-js/1.0.2: + resolution: {integrity: sha512-h9QYG2n+fBKgp520tXBwR354XRzR/w5wXe8CJCmxKm6jbLpAoLODM8Nj5+ssuIVQF8rtxkAnjwv7PH+7ehFzQQ==} + dependencies: + node-int64: 0.4.0 + varint: 6.0.0 + dev: false + /mini-svg-data-uri/1.4.4: resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} hasBin: true @@ -2288,6 +2297,10 @@ packages: - babel-plugin-macros dev: false + /node-int64/0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + dev: false + /node-os-utils/1.3.7: resolution: {integrity: sha512-fvnX9tZbR7WfCG5BAy3yO/nCLyjVWD6MghEq0z5FDfN+ZXpLWNITBdbifxQkQ25ebr16G0N7eRWJisOcMEHG3Q==} dev: false @@ -3296,6 +3309,10 @@ packages: hasBin: true dev: false + /varint/6.0.0: + resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} + dev: false + /verror/1.10.0: resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} engines: {'0': node >=0.6.0} diff --git a/src/utils/proxy/handlers/minecraft.js b/src/utils/proxy/handlers/minecraft.js new file mode 100644 index 000000000..ae902bb7d --- /dev/null +++ b/src/utils/proxy/handlers/minecraft.js @@ -0,0 +1,27 @@ +import { pingWithPromise } from "minecraft-ping-js"; + +import createLogger from "utils/logger"; +import getServiceWidget from "utils/config/service-helpers"; + +const proxyName = "minecraftProxyHandler"; +const logger = createLogger(proxyName); + +export default async function minecraftProxyHandler(req, res) { + const { group, service } = req.query; + const serviceWidget = await getServiceWidget(group, service); + try { + const pingResponse = await pingWithPromise(serviceWidget.domain, serviceWidget.port || 25565); + res.status(200).send({ + version: pingResponse.version.name, + online: true, + players: pingResponse.players + }); + } catch (e) { + logger.warn(e) + res.status(500).send({ + version: undefined, + online: false, + players: undefined + }); + } +} diff --git a/src/widgets/minecraft/component.jsx b/src/widgets/minecraft/component.jsx index 6b3da91d4..013d7606a 100644 --- a/src/widgets/minecraft/component.jsx +++ b/src/widgets/minecraft/component.jsx @@ -25,22 +25,15 @@ export default function Component({ service }) { const statusIndicator = serverData.online ? {t("minecraft.up")}: {t("minecraft.down")}; + const players = serverData.players ? `${serverData.players.online} / ${serverData.players.max}` : "-"; + const version = serverData.version || "-"; - if(serverData.players){ - return ( - - - - - - ); - } return ( - + - - - + + + ); } \ No newline at end of file diff --git a/src/widgets/minecraft/widget.js b/src/widgets/minecraft/widget.js index 358043505..a88a91078 100644 --- a/src/widgets/minecraft/widget.js +++ b/src/widgets/minecraft/widget.js @@ -1,12 +1,11 @@ -import genericProxyHandler from "utils/proxy/handlers/generic"; +import minecraftProxyHandler from "utils/proxy/handlers/minecraft"; import { asJson } from "utils/proxy/api-helpers"; const widget = { - api: "{url}/{endpoint}/{domain}", - proxyHandler: genericProxyHandler, + proxyHandler: minecraftProxyHandler, mappings: { status: { - endpoint: "2", + endpoint: "_", map: (data) => { const jsonData = asJson(data); return { From b36ef0234e5efb16c9c58968f1657f76cf04d938 Mon Sep 17 00:00:00 2001 From: Sairenity Date: Tue, 28 Feb 2023 16:22:43 +0000 Subject: [PATCH 5/6] refactor widget.js, return http 200 when server is offline --- src/utils/proxy/handlers/minecraft.js | 2 +- src/widgets/minecraft/widget.js | 16 +--------------- 2 files changed, 2 insertions(+), 16 deletions(-) diff --git a/src/utils/proxy/handlers/minecraft.js b/src/utils/proxy/handlers/minecraft.js index ae902bb7d..739a14f3a 100644 --- a/src/utils/proxy/handlers/minecraft.js +++ b/src/utils/proxy/handlers/minecraft.js @@ -18,7 +18,7 @@ export default async function minecraftProxyHandler(req, res) { }); } catch (e) { logger.warn(e) - res.status(500).send({ + res.status(200).send({ version: undefined, online: false, players: undefined diff --git a/src/widgets/minecraft/widget.js b/src/widgets/minecraft/widget.js index a88a91078..feac13852 100644 --- a/src/widgets/minecraft/widget.js +++ b/src/widgets/minecraft/widget.js @@ -1,21 +1,7 @@ import minecraftProxyHandler from "utils/proxy/handlers/minecraft"; -import { asJson } from "utils/proxy/api-helpers"; const widget = { - proxyHandler: minecraftProxyHandler, - mappings: { - status: { - endpoint: "_", - map: (data) => { - const jsonData = asJson(data); - return { - players: jsonData.players, - version: jsonData.version, - online: jsonData.online - } - } - } - } + proxyHandler: minecraftProxyHandler } export default widget; From c6e76f4e311f66dc76ca5ed6cb9e9541121a55a5 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Tue, 28 Feb 2023 08:50:43 -0800 Subject: [PATCH 6/6] move minecraft proxy & use `url` key --- .../handlers/minecraft.js => widgets/minecraft/proxy.js} | 5 +++-- src/widgets/minecraft/widget.js | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) rename src/{utils/proxy/handlers/minecraft.js => widgets/minecraft/proxy.js} (82%) diff --git a/src/utils/proxy/handlers/minecraft.js b/src/widgets/minecraft/proxy.js similarity index 82% rename from src/utils/proxy/handlers/minecraft.js rename to src/widgets/minecraft/proxy.js index 739a14f3a..19d2206ff 100644 --- a/src/utils/proxy/handlers/minecraft.js +++ b/src/widgets/minecraft/proxy.js @@ -9,15 +9,16 @@ const logger = createLogger(proxyName); export default async function minecraftProxyHandler(req, res) { const { group, service } = req.query; const serviceWidget = await getServiceWidget(group, service); + const url = new URL(serviceWidget.url); try { - const pingResponse = await pingWithPromise(serviceWidget.domain, serviceWidget.port || 25565); + const pingResponse = await pingWithPromise(url.hostname, url.port || 25565); res.status(200).send({ version: pingResponse.version.name, online: true, players: pingResponse.players }); } catch (e) { - logger.warn(e) + logger.error(e); res.status(200).send({ version: undefined, online: false, diff --git a/src/widgets/minecraft/widget.js b/src/widgets/minecraft/widget.js index feac13852..aef9bb571 100644 --- a/src/widgets/minecraft/widget.js +++ b/src/widgets/minecraft/widget.js @@ -1,4 +1,4 @@ -import minecraftProxyHandler from "utils/proxy/handlers/minecraft"; +import minecraftProxyHandler from "./proxy"; const widget = { proxyHandler: minecraftProxyHandler