From 2956e9152a16fd9cbdf2d2ba10a5bb3853faf473 Mon Sep 17 00:00:00 2001 From: I-Have-An-Issue <34550332+I-Have-An-Issue@users.noreply.github.com> Date: Mon, 23 Jan 2023 17:23:59 -0500 Subject: [PATCH] :D --- src/index.js | 9 +++++++++ src/lib/classes/GameJob.js | 5 +++++ src/lib/classes/Job.js | 5 +++++ src/routes/game/running.js | 10 +++++++++- src/routes/game/status.js | 14 ++++++++++++++ 5 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 src/routes/game/status.js diff --git a/src/index.js b/src/index.js index b40700d..3048105 100644 --- a/src/index.js +++ b/src/index.js @@ -5,12 +5,21 @@ const app = express() const logger = require("./lib/logger.js") if (process.platform == "linux") logger.warn("Game hosting might not be fully compatible with Linux") + global.games = new Map() +setInterval(() => { + logger.info("Killing jobless RCCService instances...") + global.games.forEach(async (value, key) => { + if (!(await game.Running())) game.Stop() + }) +}, 15000) + app.use("/game/start", require("./routes/game/start.js")) app.use("/game/stop", require("./routes/game/stop.js")) app.use("/game/running", require("./routes/game/running.js")) app.use("/game/renew", require("./routes/game/renew.js")) +app.use("/game/status", require("./routes/game/status.js")) app.use("/render/asset", require("./routes/render/asset.js")) app.use("/render/game", require("./routes/render/game.js")) diff --git a/src/lib/classes/GameJob.js b/src/lib/classes/GameJob.js index 645debb..22508ea 100644 --- a/src/lib/classes/GameJob.js +++ b/src/lib/classes/GameJob.js @@ -43,6 +43,11 @@ class GameJob extends Job { resolve() }) } + + async Running() { + const result = await game.Execute("IsRunning", "return true").catch((_) => _) + return !result?.message + } } module.exports = GameJob diff --git a/src/lib/classes/Job.js b/src/lib/classes/Job.js index 4a0ea4f..54778b2 100644 --- a/src/lib/classes/Job.js +++ b/src/lib/classes/Job.js @@ -46,6 +46,11 @@ class Job extends RCCService { if (!this.client) throw new Error("There is no client") return await this.client.ExecuteAsync({ jobID: this.id, script: { name, script, arguments: {} } }) } + + async GetStatus() { + if (!this.client) throw new Error("There is no client") + return await this.client.GetStatusAsync({}) + } } module.exports = Job diff --git a/src/routes/game/running.js b/src/routes/game/running.js index e03de8b..e387e7b 100644 --- a/src/routes/game/running.js +++ b/src/routes/game/running.js @@ -5,7 +5,15 @@ const GameJob = require("../../lib/classes/GameJob.js") app.get("/:token", async (request, response) => { const game = global.games.get(request.params.token) - return response.json(!!game) + if (!game) return response.json(false) + + const running = await game.Running() + if (!running && game) { + game.Close() + return response.json(false) + } + + return response.json(true) }) module.exports = app diff --git a/src/routes/game/status.js b/src/routes/game/status.js new file mode 100644 index 0000000..915bf71 --- /dev/null +++ b/src/routes/game/status.js @@ -0,0 +1,14 @@ +const express = require("express") +const app = express.Router() + +const GameJob = require("../../lib/classes/GameJob.js") + +app.get("/:token", async (request, response) => { + const game = global.games.get(request.params.token) + if (!game) return response.status(404).json({ error: "Game is not running" }) + + const status = await game.GetStatus() + return response.json(status[0]?.GetStatusResult) +}) + +module.exports = app