From 8a57d9b5f6968341d19a9c16cb1f0ce0dd57c397 Mon Sep 17 00:00:00 2001 From: CCpersonguy Date: Sun, 21 Jan 2024 16:02:29 -0800 Subject: [PATCH 1/9] display Factorio version in Instances web UI --- packages/controller/src/Controller.ts | 2 +- packages/controller/src/HostConnection.ts | 3 +++ packages/controller/src/InstanceInfo.ts | 4 ++++ packages/host/src/Host.ts | 2 ++ packages/host/src/Instance.ts | 2 ++ packages/lib/src/data/messages_instance.ts | 11 +++++++++-- packages/web_ui/src/components/InstanceList.tsx | 15 ++++++++++++++- 7 files changed, 35 insertions(+), 4 deletions(-) diff --git a/packages/controller/src/Controller.ts b/packages/controller/src/Controller.ts index e1e53293..b59499dc 100644 --- a/packages/controller/src/Controller.ts +++ b/packages/controller/src/Controller.ts @@ -896,7 +896,7 @@ export default class Controller { }; instanceConfig.set("factorio.settings", settings); - let instance = new InstanceInfo(instanceConfig, "unassigned", undefined, Date.now()); + let instance = new InstanceInfo(instanceConfig, "unassigned", undefined, undefined, Date.now()); this.instances.set(instanceId, instance); this.instancesDirty = true; await lib.invokeHook(this.plugins, "onInstanceStatusChanged", instance); diff --git a/packages/controller/src/HostConnection.ts b/packages/controller/src/HostConnection.ts index ab566a40..770a7a9d 100644 --- a/packages/controller/src/HostConnection.ts +++ b/packages/controller/src/HostConnection.ts @@ -188,6 +188,7 @@ export default class HostConnection extends BaseConnection { let prev = instance.status; instance.status = request.status; instance.gamePort = request.gamePort; + instance.factorioVersion = request.factorioVersion ?? instance.factorioVersion; instance.updatedAtMs = Date.now(); logger.verbose(`Instance ${instance.config.get("instance.name")} State: ${instance.status}`); this._controller.instanceDetailsUpdated([instance]); @@ -225,6 +226,7 @@ export default class HostConnection extends BaseConnection { let prev = controllerInstance.status; controllerInstance.status = instanceData.status; controllerInstance.gamePort = instanceData.gamePort; + controllerInstance.factorioVersion = instanceData.factorioVersion ?? controllerInstance.factorioVersion; controllerInstance.updatedAtMs = Date.now(); logger.verbose(`Instance ${instanceConfig.get("instance.name")} State: ${instanceData.status}`); instanceUpdates.push(controllerInstance); @@ -240,6 +242,7 @@ export default class HostConnection extends BaseConnection { instanceConfig, instanceData.status, instanceData.gamePort, + instanceData.factorioVersion, Date.now(), ); this._controller.instances.set(instanceConfig.get("instance.id"), newInstance); diff --git a/packages/controller/src/InstanceInfo.ts b/packages/controller/src/InstanceInfo.ts index 0534c20d..ab664511 100644 --- a/packages/controller/src/InstanceInfo.ts +++ b/packages/controller/src/InstanceInfo.ts @@ -11,6 +11,7 @@ export default class InstanceInfo { public config: lib.InstanceConfig, public status: lib.InstanceStatus, public gamePort?: number, + public factorioVersion?: string, public updatedAtMs = 0, ) { this.config = config; @@ -22,6 +23,7 @@ export default class InstanceInfo { "status": lib.InstanceStatus, "gamePort": Type.Optional(Type.Number()), "updatedAtMs": Type.Optional(Type.Number()), + "factorioVersion": Type.Optional(Type.String()), }); static fromJSON(json: Static, location: lib.ConfigLocation) { @@ -29,6 +31,7 @@ export default class InstanceInfo { lib.InstanceConfig.fromJSON(json.config, location), json.status, json.gamePort, + json.factorioVersion, json.updatedAtMs, ); } @@ -40,6 +43,7 @@ export default class InstanceInfo { this.config.get("instance.assigned_host") ?? undefined, this.gamePort, this.status, + this.factorioVersion, this.updatedAtMs, ); } diff --git a/packages/host/src/Host.ts b/packages/host/src/Host.ts index 75e80ffa..ae5cf861 100644 --- a/packages/host/src/Host.ts +++ b/packages/host/src/Host.ts @@ -667,6 +667,7 @@ export default class Host extends lib.Link { instanceId, instanceConnection ? instanceConnection.instance.status : "stopped", instanceConnection ? instanceConnection.instance.server.gamePort : this.gamePort(instanceId), + instanceConnection ? instanceConnection.instance.server.version ?? undefined : undefined, ) ); @@ -1060,6 +1061,7 @@ export default class Host extends lib.Link { instanceInfo.config.toRemote("controller"), instanceConnection ? instanceConnection.instance.status : "stopped", instanceConnection ? instanceConnection.instance.server.gamePort : this.gamePort(instanceId), + instanceConnection ? instanceConnection.instance.server.version ?? undefined : undefined, )); } await this.send(new lib.InstancesUpdateRequest(list)); diff --git a/packages/host/src/Instance.ts b/packages/host/src/Instance.ts index f6163611..a31d7b73 100644 --- a/packages/host/src/Instance.ts +++ b/packages/host/src/Instance.ts @@ -453,6 +453,8 @@ rcon.print(game.table_to_json(players))`.replace(/\r?\n/g, " "); this.id, status, this.server.gamePort, + // server.version can be null before server is initialized + this.server.version ?? undefined, ), ); } diff --git a/packages/lib/src/data/messages_instance.ts b/packages/lib/src/data/messages_instance.ts index d14894d4..13d80966 100644 --- a/packages/lib/src/data/messages_instance.ts +++ b/packages/lib/src/data/messages_instance.ts @@ -42,6 +42,7 @@ export class InstanceDetails { public assignedHost: number | undefined, public gamePort: number | undefined, public status: InstanceStatus, + public factorioVersion: string | undefined, /** Millisecond Unix timestamp this entry was last updated at */ public updatedAtMs = 0, ) { } @@ -55,6 +56,7 @@ export class InstanceDetails { "unknown", "unassigned", "stopped", "starting", "running", "stopping", "creating_save", "exporting_data", "deleted", ]), + "factorioVersion": Type.Optional(Type.String()), "updatedAtMs": Type.Optional(Type.Number()), }); @@ -65,6 +67,7 @@ export class InstanceDetails { json.assignedHost, json.gamePort, json.status, + json.factorioVersion, json.updatedAtMs, ); } @@ -717,6 +720,7 @@ export class HostInstanceUpdate { public config: Static, public status: InstanceStatus, public gamePort: undefined | number, + public factorioVersion: undefined | string, ) { } static jsonSchema = Type.Object({ @@ -725,10 +729,11 @@ export class HostInstanceUpdate { "stopped", "starting", "running", "stopping", "creating_save", "exporting_data", ]), "gamePort": Type.Optional(Type.Number()), + "factorioVersion": Type.Optional(Type.String()), }); static fromJSON(json: Static) { - return new this(json.config, json.status, json.gamePort); + return new this(json.config, json.status, json.gamePort, json.factorioVersion); } } @@ -822,6 +827,7 @@ export class InstanceStatusChangedEvent { public instanceId: number, public status: InstanceStatus, public gamePort?: number, + public factorioVersion?: string, ) { } static jsonSchema = Type.Object({ @@ -830,10 +836,11 @@ export class InstanceStatusChangedEvent { "stopped", "starting", "running", "stopping", "creating_save", "exporting_data", ]), "gamePort": Type.Optional(Type.Integer()), + "factorioVersion": Type.Optional(Type.String()), }); static fromJSON(json: Static) { - return new this(json.instanceId, json.status, json.gamePort); + return new this(json.instanceId, json.status, json.gamePort, json.factorioVersion); } } diff --git a/packages/web_ui/src/components/InstanceList.tsx b/packages/web_ui/src/components/InstanceList.tsx index c1aa76d0..41034db5 100644 --- a/packages/web_ui/src/components/InstanceList.tsx +++ b/packages/web_ui/src/components/InstanceList.tsx @@ -9,7 +9,7 @@ import { useAccount } from "../model/account"; import { useHosts } from "../model/host"; import InstanceStatusTag from "./InstanceStatusTag"; import StartStopInstanceButton from "./StartStopInstanceButton"; -import { InstanceDetails } from "@clusterio/lib"; +import { InstanceDetails, integerFactorioVersion } from "@clusterio/lib"; import Link from "./Link"; const strcmp = new Intl.Collator(undefined, { numeric: true, sensitivity: "base" }).compare; @@ -46,6 +46,13 @@ export default function InstanceList(props: InstanceListProps) { return `${host.publicAddress}:${instance.gamePort}`; } + function integerFactorioVersionOrDefault(instance: InstanceDetails) { + if (instance.factorioVersion === undefined) { + return -1; + } + return integerFactorioVersion(instance.factorioVersion); + } + let columns: ColumnsType = [ { title: "Name", @@ -86,6 +93,12 @@ export default function InstanceList(props: InstanceListProps) { sorter: (a, b) => strcmp(instancePublicAddress(a), instancePublicAddress(b)), responsive: ["lg"], }, + { + title: "Factorio Version", + key: "version", + render: (_, instance) => instance.factorioVersion ?? "unknown", + sorter: (a, b) => integerFactorioVersionOrDefault(a) - integerFactorioVersionOrDefault(b) + }, { title: "Status", key: "status", From dc2f86dcf37621a733b6903d2e8a645b62bb62a9 Mon Sep 17 00:00:00 2001 From: CCpersonguy Date: Sun, 21 Jan 2024 16:03:52 -0800 Subject: [PATCH 2/9] allow FactorioServer.version to return undefined --- packages/host/src/Host.ts | 4 ++-- packages/host/src/Instance.ts | 3 +-- packages/host/src/export.ts | 2 +- packages/host/src/server.ts | 10 +++++----- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/packages/host/src/Host.ts b/packages/host/src/Host.ts index ae5cf861..491989d5 100644 --- a/packages/host/src/Host.ts +++ b/packages/host/src/Host.ts @@ -667,7 +667,7 @@ export default class Host extends lib.Link { instanceId, instanceConnection ? instanceConnection.instance.status : "stopped", instanceConnection ? instanceConnection.instance.server.gamePort : this.gamePort(instanceId), - instanceConnection ? instanceConnection.instance.server.version ?? undefined : undefined, + instanceConnection ? instanceConnection.instance.server.version : undefined, ) ); @@ -1061,7 +1061,7 @@ export default class Host extends lib.Link { instanceInfo.config.toRemote("controller"), instanceConnection ? instanceConnection.instance.status : "stopped", instanceConnection ? instanceConnection.instance.server.gamePort : this.gamePort(instanceId), - instanceConnection ? instanceConnection.instance.server.version ?? undefined : undefined, + instanceConnection ? instanceConnection.instance.server.version : undefined, )); } await this.send(new lib.InstancesUpdateRequest(list)); diff --git a/packages/host/src/Instance.ts b/packages/host/src/Instance.ts index a31d7b73..5bd1b9ac 100644 --- a/packages/host/src/Instance.ts +++ b/packages/host/src/Instance.ts @@ -453,8 +453,7 @@ rcon.print(game.table_to_json(players))`.replace(/\r?\n/g, " "); this.id, status, this.server.gamePort, - // server.version can be null before server is initialized - this.server.version ?? undefined, + this.server.version, ), ); } diff --git a/packages/host/src/export.ts b/packages/host/src/export.ts index 530f8fc9..f5f83528 100644 --- a/packages/host/src/export.ts +++ b/packages/host/src/export.ts @@ -64,7 +64,7 @@ async function generateExportMod(server: FactorioServer) { sourceDir: path.join(__dirname, "..", "..", "..", "lua", "export"), outputDir: server.writePath("mods"), bumpPatch: false, - factorioVersion: server.version.replace(/\.\d+$/, ""), + factorioVersion: server.version?.replace(/\.\d+$/, ""), dependencies, }); } diff --git a/packages/host/src/server.ts b/packages/host/src/server.ts index e61f91c0..f58d476b 100644 --- a/packages/host/src/server.ts +++ b/packages/host/src/server.ts @@ -725,12 +725,12 @@ export class FactorioServer extends events.EventEmitter { } /** - * The version of Factorio in use. This will be the actual version if - * "latest" (the default) was specified as `factorioVersion` to the - * constructor. + * The version of Factorio in use. This will be the actual version if + * "latest" (the default) was specified as `factorioVersion` to the constructor. + * This will be undefined before the server is initialized, or if init failed. */ - get version() { - return this._version!; + get version(): string | undefined { + return this._version ?? undefined; } /** From 3d3276b02cdb0e1a62105b9b30d7d2e74af60cc3 Mon Sep 17 00:00:00 2001 From: CCpersonguy Date: Sun, 21 Jan 2024 16:10:49 -0800 Subject: [PATCH 3/9] fix lint errors --- packages/controller/src/HostConnection.ts | 4 +++- packages/web_ui/src/components/InstanceList.tsx | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/controller/src/HostConnection.ts b/packages/controller/src/HostConnection.ts index 770a7a9d..6f725f7a 100644 --- a/packages/controller/src/HostConnection.ts +++ b/packages/controller/src/HostConnection.ts @@ -226,7 +226,9 @@ export default class HostConnection extends BaseConnection { let prev = controllerInstance.status; controllerInstance.status = instanceData.status; controllerInstance.gamePort = instanceData.gamePort; - controllerInstance.factorioVersion = instanceData.factorioVersion ?? controllerInstance.factorioVersion; + if (instanceData.factorioVersion) { + controllerInstance.factorioVersion = instanceData.factorioVersion; + } controllerInstance.updatedAtMs = Date.now(); logger.verbose(`Instance ${instanceConfig.get("instance.name")} State: ${instanceData.status}`); instanceUpdates.push(controllerInstance); diff --git a/packages/web_ui/src/components/InstanceList.tsx b/packages/web_ui/src/components/InstanceList.tsx index 41034db5..053320cb 100644 --- a/packages/web_ui/src/components/InstanceList.tsx +++ b/packages/web_ui/src/components/InstanceList.tsx @@ -97,7 +97,7 @@ export default function InstanceList(props: InstanceListProps) { title: "Factorio Version", key: "version", render: (_, instance) => instance.factorioVersion ?? "unknown", - sorter: (a, b) => integerFactorioVersionOrDefault(a) - integerFactorioVersionOrDefault(b) + sorter: (a, b) => integerFactorioVersionOrDefault(a) - integerFactorioVersionOrDefault(b), }, { title: "Status", From 594158deac45239a1a1630d60ae6dd22c26bb58f Mon Sep 17 00:00:00 2001 From: CCpersonguy Date: Mon, 22 Jan 2024 21:00:33 -0800 Subject: [PATCH 4/9] Remove verion-caching logic in Controller --- packages/controller/src/HostConnection.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/controller/src/HostConnection.ts b/packages/controller/src/HostConnection.ts index 6f725f7a..7540452c 100644 --- a/packages/controller/src/HostConnection.ts +++ b/packages/controller/src/HostConnection.ts @@ -188,7 +188,7 @@ export default class HostConnection extends BaseConnection { let prev = instance.status; instance.status = request.status; instance.gamePort = request.gamePort; - instance.factorioVersion = request.factorioVersion ?? instance.factorioVersion; + instance.factorioVersion = request.factorioVersion; instance.updatedAtMs = Date.now(); logger.verbose(`Instance ${instance.config.get("instance.name")} State: ${instance.status}`); this._controller.instanceDetailsUpdated([instance]); @@ -226,9 +226,7 @@ export default class HostConnection extends BaseConnection { let prev = controllerInstance.status; controllerInstance.status = instanceData.status; controllerInstance.gamePort = instanceData.gamePort; - if (instanceData.factorioVersion) { - controllerInstance.factorioVersion = instanceData.factorioVersion; - } + controllerInstance.factorioVersion = instanceData.factorioVersion; controllerInstance.updatedAtMs = Date.now(); logger.verbose(`Instance ${instanceConfig.get("instance.name")} State: ${instanceData.status}`); instanceUpdates.push(controllerInstance); From b57c419769b6ee11d26aea7f1edfeee0e22e40f4 Mon Sep 17 00:00:00 2001 From: CCpersonguy Date: Mon, 22 Jan 2024 21:01:39 -0800 Subject: [PATCH 5/9] Version should disappear first on narrow windows --- packages/web_ui/src/components/InstanceList.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/web_ui/src/components/InstanceList.tsx b/packages/web_ui/src/components/InstanceList.tsx index 053320cb..7c05fd41 100644 --- a/packages/web_ui/src/components/InstanceList.tsx +++ b/packages/web_ui/src/components/InstanceList.tsx @@ -98,6 +98,7 @@ export default function InstanceList(props: InstanceListProps) { key: "version", render: (_, instance) => instance.factorioVersion ?? "unknown", sorter: (a, b) => integerFactorioVersionOrDefault(a) - integerFactorioVersionOrDefault(b), + responsive: ["xl"], }, { title: "Status", From e3753f292babb191bb7522311c4d2f23cc9ae05d Mon Sep 17 00:00:00 2001 From: Danielv123 Date: Tue, 27 Feb 2024 11:25:50 -0600 Subject: [PATCH 6/9] Show current factorio version on instance page --- packages/web_ui/src/components/InstanceViewPage.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/web_ui/src/components/InstanceViewPage.tsx b/packages/web_ui/src/components/InstanceViewPage.tsx index 5973cdfa..2f8b03a1 100644 --- a/packages/web_ui/src/components/InstanceViewPage.tsx +++ b/packages/web_ui/src/components/InstanceViewPage.tsx @@ -59,6 +59,9 @@ function InstanceDescription(props: InstanceDescriptionProps) { buttonContent={assigned ? "Reassign" : "Assign"} />} + + {instance.factorioVersion ?? "unknown"} + ; } From 92912fa9e5312fcdcaa8436a8ce3526227c2ea4c Mon Sep 17 00:00:00 2001 From: Danielv123 Date: Wed, 15 May 2024 10:33:37 +0100 Subject: [PATCH 7/9] Show configured instance version while not running --- packages/host/src/Host.ts | 6 ++++-- packages/host/src/Instance.ts | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/host/src/Host.ts b/packages/host/src/Host.ts index 491989d5..2f7742dc 100644 --- a/packages/host/src/Host.ts +++ b/packages/host/src/Host.ts @@ -667,7 +667,9 @@ export default class Host extends lib.Link { instanceId, instanceConnection ? instanceConnection.instance.status : "stopped", instanceConnection ? instanceConnection.instance.server.gamePort : this.gamePort(instanceId), - instanceConnection ? instanceConnection.instance.server.version : undefined, + instanceConnection + ? instanceConnection.instance.server.version + : instanceInfo.config.get("factorio.version"), ) ); @@ -737,7 +739,7 @@ export default class Host extends lib.Link { } assignGamePort(instanceId: number) { - const availablePorts = lib.parseRanges(this.config.get("host.factorio_port_range"), 1, 2**16 - 1); + const availablePorts = lib.parseRanges(this.config.get("host.factorio_port_range"), 1, 2 ** 16 - 1); for (const [id, instance] of this.instanceInfos) { if (id === instanceId) { continue; diff --git a/packages/host/src/Instance.ts b/packages/host/src/Instance.ts index 5bd1b9ac..98aaf5de 100644 --- a/packages/host/src/Instance.ts +++ b/packages/host/src/Instance.ts @@ -453,7 +453,7 @@ rcon.print(game.table_to_json(players))`.replace(/\r?\n/g, " "); this.id, status, this.server.gamePort, - this.server.version, + status === "running"? this.server.version : this.config.get("factorio.version"), ), ); } From f1fd8247fb5480ad9d7ebca56ceb930d2da7d70e Mon Sep 17 00:00:00 2001 From: Danielv123 Date: Wed, 15 May 2024 10:40:36 +0100 Subject: [PATCH 8/9] Add factorio version indicator feature to changelog --- CHANGELOG.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9dd176b9..f6dbf33c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,20 @@ Many thanks to the following for contributing to this release: [@username](https://github.com/username) --> +## Version 2.0.0-alpha.19 + +### Features + +- Added instance version display [#573](https://github.com/clusterio/clusterio/pull/573) + +### Breaking changes + +- @clusterio/controller export InstanceInfo has added factorioVersion parameter + +Many thanks to the following for contributing to this release: +[@CCpersonguy](https://github.com/CCpersonguy) +[@Danielv123](https://github.com/Danielv123) + ## Version 2.0.0-alpha.18 ### Features From b2f0000a642c55619a523ff006e13f2d566cef05 Mon Sep 17 00:00:00 2001 From: Arvids Godjuks Date: Tue, 3 Sep 2024 14:58:38 +0300 Subject: [PATCH 9/9] Update CHANGELOG.md Fixed extra new line in changelog --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 688cc823..7acd543b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,7 +27,6 @@ Many thanks to the following for contributing to this release: ### Features - - Added clean script to speed up publishing and debugging of build steps [#640](https://github.com/clusterio/clusterio/pull/640). - Added sub-tile option on plugin page headers [#642](https://github.com/clusterio/clusterio/pull/642). - Greatly improved plugin and module template generation [#641](https://github.com/clusterio/clusterio/pull/641).