From 34102c9f47165f1f8105efba698bd0a47c82285c Mon Sep 17 00:00:00 2001 From: I-Have-An-Issue <34550332+I-Have-An-Issue@users.noreply.github.com> Date: Sun, 22 Jan 2023 21:59:22 -0500 Subject: [PATCH] gamesd --- .env.example | 19 +++++---- package-lock.json | 23 ++++------ package.json | 1 + src/index.js | 11 ++--- src/lib/classes/GameJob.js | 42 ++++++++++++++++++- src/routes/{place => game}/execute.js | 0 src/routes/game/renew.js | 14 +++++++ src/routes/game/start.js | 18 ++++++++ src/routes/game/stop.js | 14 +++++++ src/routes/place/start.js | 6 --- src/routes/place/stop.js | 6 --- src/routes/{place/renew.js => render/game.js} | 0 src/routes/render/place.js | 6 --- 13 files changed, 111 insertions(+), 49 deletions(-) rename src/routes/{place => game}/execute.js (100%) create mode 100644 src/routes/game/renew.js create mode 100644 src/routes/game/start.js create mode 100644 src/routes/game/stop.js delete mode 100644 src/routes/place/start.js delete mode 100644 src/routes/place/stop.js rename src/routes/{place/renew.js => render/game.js} (100%) delete mode 100644 src/routes/render/place.js diff --git a/.env.example b/.env.example index 1e48d06..904b29b 100644 --- a/.env.example +++ b/.env.example @@ -1,15 +1,16 @@ RCCSERVICE= +ARBITER_TOKEN= -BASE_URL= +BASE_URL=https://crapblox.cf -RENDER_FORMAT= -RENDER_BASE64= +RENDER_FORMAT=PNG +RENDER_BASE64=true -RENDER_USER_WIDTH= -RENDER_USER_HEIGHT= +RENDER_USER_WIDTH=420 +RENDER_USER_HEIGHT=420 -RENDER_ASSET_WIDTH= -RENDER_ASSET_HEIGHT= +RENDER_ASSET_WIDTH=420 +RENDER_ASSET_HEIGHT=420 -RENDER_PLACE_WIDTH= -RENDER_PLACE_HEIGHT= +RENDER_PLACE_WIDTH=720 +RENDER_PLACE_HEIGHT=480 diff --git a/package-lock.json b/package-lock.json index aae7bcf..f494448 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "0.1", "license": "ISC", "dependencies": { + "axios": "^1.2.3", "chalk": "^4.1.2", "dotenv": "^16.0.3", "express": "^4.18.2", @@ -66,13 +67,13 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/axios": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", - "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", - "peer": true, + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.3.tgz", + "integrity": "sha512-pdDkMYJeuXLZ6Xj/Q5J3Phpe+jbGdsSzlQaFVkMQzRUL05+6+tetX8TV3p4HrU4kzuO9bt+io/yGQxuyxA/xcw==", "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "node_modules/axios-ntlm": { @@ -84,16 +85,6 @@ "dev-null": "^0.1.1" } }, - "node_modules/axios-ntlm/node_modules/axios": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.3.tgz", - "integrity": "sha512-pdDkMYJeuXLZ6Xj/Q5J3Phpe+jbGdsSzlQaFVkMQzRUL05+6+tetX8TV3p4HrU4kzuO9bt+io/yGQxuyxA/xcw==", - "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, "node_modules/body-parser": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", diff --git a/package.json b/package.json index 43b7b04..821a616 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "author": "", "license": "ISC", "dependencies": { + "axios": "^1.2.3", "chalk": "^4.1.2", "dotenv": "^16.0.3", "express": "^4.18.2", diff --git a/src/index.js b/src/index.js index 83ecb62..d561a0f 100644 --- a/src/index.js +++ b/src/index.js @@ -5,14 +5,15 @@ 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() -app.use("/place/start", require("./routes/place/start.js")) -app.use("/place/stop", require("./routes/place/stop.js")) -app.use("/place/execute", require("./routes/place/execute.js")) -app.use("/place/renew", require("./routes/place/renew.js")) +app.use("/game/start", require("./routes/game/start.js")) +app.use("/game/stop", require("./routes/game/stop.js")) +app.use("/game/execute", require("./routes/game/execute.js")) +app.use("/game/renew", require("./routes/game/renew.js")) app.use("/render/asset", require("./routes/render/asset.js")) -app.use("/render/place", require("./routes/render/place.js")) +app.use("/render/game", require("./routes/render/game.js")) app.use("/render/headshot", require("./routes/render/headshot.js")) app.use("/render/bodyshot", require("./routes/render/bodyshot.js")) diff --git a/src/lib/classes/GameJob.js b/src/lib/classes/GameJob.js index 0a66797..0165014 100644 --- a/src/lib/classes/GameJob.js +++ b/src/lib/classes/GameJob.js @@ -1,9 +1,49 @@ +const axios = require("axios") +const { readFileSync } = require("fs") + const Job = require("./Job.js") +const logger = require("../logger.js") class GameJob extends Job { - constructor({ placeId }) { + constructor() { super() } + + StartGame(id) { + return new Promise(async (resolve, reject) => { + const response = await axios(`${process.env.BASE_URL}/API/Game/${id}?t=${process.env.ARBITER_TOKEN}`).catch((_) => reject(_)) + const { server_token, server_port, server_owner_id } = response.data + + this.id = server_token + + const started = await this.Start() + if (!started) throw new Error("RCCService failed to start") + if (!this.client) await this.CreateClient() + + logger.info(`[${this.id}] GameJob started for ${id}`) + + this.OpenJobEx({ + name: this.id, + script: readFileSync(__dirname + "/../../lua/gameserver.lua", { encoding: "utf-8" }), + arguments: { + LuaValue: [ + { type: "LUA_TSTRING", value: this.id }, + { type: "LUA_TSTRING", value: "Place" }, + + { type: "LUA_TSTRING", value: process.env.BASE_URL }, + + { type: "LUA_TNUMBER", value: id }, + { type: "LUA_TNUMBER", value: 53640 }, + // { type: "LUA_TNUMBER", value: server_port }, + { type: "LUA_TNUMBER", value: server_owner_id }, + ], + }, + }).catch((e) => reject(e)) + + resolve() + }) + } } module.exports = GameJob +// a http://crapblox.cf/ -t 1 -j http://crapblox.cf//Game/JoinServer?Token=jRCfrKmwFfLBAvjNOQqNuOB210rjIvz4UfMhwIaY7teYGxXniECENL2vh8rvhSU2&PlaceId=10052 diff --git a/src/routes/place/execute.js b/src/routes/game/execute.js similarity index 100% rename from src/routes/place/execute.js rename to src/routes/game/execute.js diff --git a/src/routes/game/renew.js b/src/routes/game/renew.js new file mode 100644 index 0000000..ca3f580 --- /dev/null +++ b/src/routes/game/renew.js @@ -0,0 +1,14 @@ +const express = require("express") +const app = express.Router() + +const GameJob = require("../../lib/classes/GameJob.js") + +app.get("/:token/:expire", async (request, response) => { + const game = global.games.get(request.params.token) + if (!game) return response.status(404).json({ error: "Game is not running" }) + + await game.RenewLease(request.params.expire) + return response.json({ success: true }) +}) + +module.exports = app diff --git a/src/routes/game/start.js b/src/routes/game/start.js new file mode 100644 index 0000000..f7736e3 --- /dev/null +++ b/src/routes/game/start.js @@ -0,0 +1,18 @@ +const express = require("express") +const app = express.Router() + +const GameJob = require("../../lib/classes/GameJob.js") + +app.get("/:id", async (request, response) => { + const job = new GameJob() + const result = await job.StartGame(request.params.id).catch((_) => _) + + global.games.set(job.id, job) + job.proc.once("exit", () => { + global.games.delete(job.id) + }) + + return response.json({ success: true }) +}) + +module.exports = app diff --git a/src/routes/game/stop.js b/src/routes/game/stop.js new file mode 100644 index 0000000..b82cd49 --- /dev/null +++ b/src/routes/game/stop.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" }) + + game.Stop() + return response.json({ success: true }) +}) + +module.exports = app diff --git a/src/routes/place/start.js b/src/routes/place/start.js deleted file mode 100644 index 88822f0..0000000 --- a/src/routes/place/start.js +++ /dev/null @@ -1,6 +0,0 @@ -const express = require("express") -const app = express.Router() - -app.all("*", (request, response) => response.status(404).json({ status: 404 })) - -module.exports = app diff --git a/src/routes/place/stop.js b/src/routes/place/stop.js deleted file mode 100644 index 88822f0..0000000 --- a/src/routes/place/stop.js +++ /dev/null @@ -1,6 +0,0 @@ -const express = require("express") -const app = express.Router() - -app.all("*", (request, response) => response.status(404).json({ status: 404 })) - -module.exports = app diff --git a/src/routes/place/renew.js b/src/routes/render/game.js similarity index 100% rename from src/routes/place/renew.js rename to src/routes/render/game.js diff --git a/src/routes/render/place.js b/src/routes/render/place.js deleted file mode 100644 index 88822f0..0000000 --- a/src/routes/render/place.js +++ /dev/null @@ -1,6 +0,0 @@ -const express = require("express") -const app = express.Router() - -app.all("*", (request, response) => response.status(404).json({ status: 404 })) - -module.exports = app