diff --git a/packages/ctl/ctl.js b/packages/ctl/ctl.js
index 3966abb8..9e9e27d5 100755
--- a/packages/ctl/ctl.js
+++ b/packages/ctl/ctl.js
@@ -43,7 +43,11 @@ function formatOutputColored(output) {
let info = "";
if (output.type === "log") {
let level = output.level;
- if (level === "Info") {
+ if (level === "Script") {
+ level = chalk.bold.greenBright(level);
+ } else if (level === "Verbose") {
+ level = chalk.bold.gray(level);
+ } else if (level === "Info") {
level = chalk.bold.blueBright(level);
} else if (output.level === "Warning") {
level = chalk.bold.yellowBright(level);
diff --git a/packages/lib/factorio/server.js b/packages/lib/factorio/server.js
index 842bb1f7..658e5a15 100644
--- a/packages/lib/factorio/server.js
+++ b/packages/lib/factorio/server.js
@@ -318,13 +318,15 @@ function parseOutput(line, source) {
// A seconds output has two different kinds of formats: The first is a
// log level and source location and has a format of
// "Level File.cpp:123: message"
- const secLogRegex = /^(\w+) (\w+\.cpp:\d+): (.*)$/;
+ // "Script @/path/to/file.lua:123: message"
+ // "Script =(command):123: message"
+ const secLogRegex = /^(\w+) ((\w+\.cpp:\d+)|([@=].*?:\d+)): (.*)$/;
let secLogMatch = secLogRegex.exec(secContent);
if (secLogMatch) {
output.type = "log";
output.level = secLogMatch[1];
output.file = secLogMatch[2];
- output.message = secLogMatch[3];
+ output.message = secLogMatch[5];
// The other possibility is that the content is a generic message
} else {
diff --git a/packages/web_ui/src/components/InstanceViewPage.jsx b/packages/web_ui/src/components/InstanceViewPage.jsx
index 91c51d33..5e0057d6 100644
--- a/packages/web_ui/src/components/InstanceViewPage.jsx
+++ b/packages/web_ui/src/components/InstanceViewPage.jsx
@@ -83,7 +83,11 @@ function formatOutputColored(output, key) {
let info = "";
if (output.type === "log") {
let level = output.level;
- if (level === "Info") {
+ if (level === "Script") {
+ level = {level};
+ } else if (level === "Verbose") {
+ level = {level};
+ } else if (level === "Info") {
level = {level};
} else if (output.level === "Warning") {
level = {level};
diff --git a/packages/web_ui/src/index.css b/packages/web_ui/src/index.css
index 246613cb..f1ad3417 100644
--- a/packages/web_ui/src/index.css
+++ b/packages/web_ui/src/index.css
@@ -118,6 +118,16 @@ body {
color: #808080;
}
+.instance-console .factorio-script {
+ font-weight: bold;
+ color: #49c33c;
+}
+
+.instance-console .factorio-verbose {
+ font-weight: bold;
+ color: #888888;
+}
+
.instance-console .factorio-info {
font-weight: bold;
color: #4646ea;
diff --git a/test/lib/factorio/lines.js b/test/lib/factorio/lines.js
index d5ced40e..aeba4b9d 100644
--- a/test/lib/factorio/lines.js
+++ b/test/lib/factorio/lines.js
@@ -143,6 +143,51 @@ let testLines = new Map([
message: "Saving finished",
},
],
+ [
+ " 1.277 Script @/srv/clusterio/instances/test/temp/currently-playing/modules/example/test.lua:7: " +
+ "Example log line.",
+ {
+ format: "seconds",
+ time: "1.277",
+ type: "log",
+ level: "Script",
+ file: "@/srv/clusterio/instances/test/temp/currently-playing/modules/example/test.lua:7",
+ message: "Example log line.",
+ },
+ ],
+ [
+ " 1.277 Script @C:\\My Cluster\\temp\\current-save\\file.lua:7: Contrived :12: example",
+ {
+ format: "seconds",
+ time: "1.277",
+ type: "log",
+ level: "Script",
+ file: "@C:\\My Cluster\\temp\\current-save\\file.lua:7",
+ message: "Contrived :12: example",
+ },
+ ],
+ [
+ " 344.683 Script =(command):1: test",
+ {
+ format: "seconds",
+ time: "344.683",
+ type: "log",
+ level: "Script",
+ file: "=(command):1",
+ message: "test",
+ },
+ ],
+ [
+ " 0.751 Verbose ModManager.cpp:554: Time to load mods: 0.746762",
+ {
+ format: "seconds",
+ time: "0.751",
+ type: "log",
+ level: "Verbose",
+ file: "ModManager.cpp:554",
+ message: "Time to load mods: 0.746762",
+ },
+ ],
]);
module.exports = {