Skip to content

Commit cf776a3

Browse files
committed
Enhance logging system with time-stamped messages and improve terminal interface
1 parent a7d06ab commit cf776a3

5 files changed

Lines changed: 189 additions & 65 deletions

File tree

build.gradle

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ plugins {
77

88
application {
99
mainClass = 'io.nodelink.server.NodeLink'
10+
applicationDefaultJvmArgs = ["--enable-native-access=ALL-UNNAMED"]
11+
}
12+
13+
tasks.withType(JavaExec) {
14+
jvmArgs += "--enable-native-access=ALL-UNNAMED"
1015
}
1116

1217
task generateVersionClass {

src/main/java/io/nodelink/server/NodeLink.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ public class NodeLink extends NodeLinkHelper {
99

1010
private static final NodeLink INSTANCE = new NodeLink();
1111

12-
public static void main(String[] args) {
12+
static void main(String[] args) {
1313
try {
1414
for (int i = 0; i < args.length; i++) {
1515
if ("--delete-old".equals(args[i]) && (i + 1) < args.length) {
Lines changed: 149 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,178 @@
11
package io.nodelink.server;
22

3-
import org.jline.reader.LineReader;
4-
import org.jline.reader.LineReaderBuilder;
3+
import io.nodelink.server.update.Version;
4+
import org.jline.reader.EndOfFileException;
5+
import org.jline.reader.UserInterruptException;
56
import org.jline.terminal.Terminal;
67
import org.jline.terminal.TerminalBuilder;
7-
8+
import org.jline.reader.LineReader;
9+
import org.jline.reader.LineReaderBuilder;
10+
import org.jline.utils.InfoCmp.Capability;
811
import java.nio.file.Paths;
912

1013
public class NodeLinkHelper {
1114

1215
private static final NodeLinkHelper INSTANCE = new NodeLinkHelper();
1316

14-
protected void INITIALIZE() {
15-
NodeLink.getInstance().getUpdater().checkForUpdates();
17+
private static final String RESET = "\u001B[0m";
18+
private static final String GREEN = "\u001B[32m";
19+
private static final String BLUE = "\u001B[34m";
20+
private static final String RED = "\u001B[31m";
21+
private static final String WHITE = "\u001B[37m";
22+
private static final String YELLOW = "\u001B[33m";
1623

17-
initTerminal();
24+
private static String STATUS = "Main";
25+
private static String PRODUCT = "Post Production";
26+
27+
private static final int RESERVED_ROWS = 36;
1828

29+
public static NodeLinkHelper getHelper() {
30+
return INSTANCE;
31+
}
32+
33+
protected void INITIALIZE() {
34+
initTerminal();
1935
}
2036

2137
private void initTerminal() {
2238
try {
23-
Terminal TERMINAL = TerminalBuilder.builder()
39+
Terminal terminal = TerminalBuilder.builder()
2440
.name("NodeLink Server")
2541
.system(true)
2642
.build();
2743

28-
LineReader READER = LineReaderBuilder.builder()
29-
.terminal(TERMINAL)
44+
LineReader reader = LineReaderBuilder.builder()
45+
.terminal(terminal)
3046
.variable(LineReader.HISTORY_FILE, Paths.get("bin/history.txt"))
3147
.option(LineReader.Option.AUTO_FRESH_LINE, true)
32-
.option(LineReader.Option.HISTORY_BEEP, true)
3348
.build();
3449

35-
} catch (Exception e) {
36-
NodeLink.getInstance().getLogger().ERROR(e.getMessage());
50+
fullClearAndRefresh(terminal);
51+
52+
while (true) {
53+
String prompt = GREEN + "Server" + RESET + "@" + YELLOW + "NodeLink" + RESET + "-(" + RED + STATUS + RESET + ")~" + WHITE + "$ " + RESET;
54+
55+
try {
56+
String command = reader.readLine(prompt);
57+
58+
if (command == null || command.equalsIgnoreCase("exit")) break;
59+
60+
if (command.equalsIgnoreCase("clear")) {
61+
fullClearAndRefresh(terminal);
62+
continue;
63+
}
64+
65+
if (command.equalsIgnoreCase("wow")) {
66+
STATUS = "Wow Mode";
67+
fullClearAndRefresh(terminal);
68+
continue;
69+
}
70+
71+
terminal.writer().println("Exécution de : " + command);
72+
73+
} catch (UserInterruptException | EndOfFileException e) {
74+
break;
75+
}
76+
}
77+
} catch (Exception _) {}
78+
}
79+
80+
private void fullClearAndRefresh(Terminal terminal) {
81+
terminal.writer().print("\u001B[r");
82+
terminal.writer().print("\u001B[2J\u001B[3J");
83+
terminal.puts(Capability.cursor_address, 0, 0);
84+
terminal.flush();
85+
86+
drawStaticInterface(terminal);
87+
88+
terminal.writer().print("\u001B[" + (RESERVED_ROWS + 1) + ";r");
89+
terminal.puts(Capability.cursor_address, RESERVED_ROWS, 0);
90+
terminal.flush();
91+
}
92+
93+
private void drawStaticInterface(Terminal terminal) {
94+
terminal.puts(Capability.cursor_address, 0, 0);
95+
96+
String[] logoLines = LOGO().split("\n");
97+
String[] headerLines = HEADER().split("\n");
98+
int width = terminal.getWidth();
99+
100+
int logoHeight = logoLines.length;
101+
for (int i = 0; i < logoHeight; i++) {
102+
String leftPart = (i >= 12 && (i - 12) < headerLines.length) ? BLUE + headerLines[i - 12] + RESET : "";
103+
String rightPart = logoLines[i];
104+
105+
int padding = width - getPlainTextLength(leftPart) - getPlainTextLength(rightPart);
106+
if (padding < 0) padding = 0;
107+
108+
terminal.writer().println(leftPart + " ".repeat(padding) + rightPart);
37109
}
110+
111+
terminal.writer().println(GREEN + " ● Status: " + RESET + YELLOW + PRODUCT + RESET);
112+
terminal.writer().println(GREEN + " ● Version: " + RESET + Version.VERSION);
113+
terminal.writer().println(GREEN + " ● Memory: " + RESET + getMemoryUsage());
114+
115+
int currentLine = logoHeight + 4;
116+
for (int i = currentLine; i < RESERVED_ROWS - 1; i++) {
117+
terminal.writer().println("");
118+
}
119+
120+
terminal.writer().print(BLUE + "─".repeat(width) + RESET);
121+
terminal.flush();
38122
}
39123

40-
/// Getters ///
124+
private String getMemoryUsage() {
125+
Runtime runtime = Runtime.getRuntime();
126+
long used = (runtime.totalMemory() - runtime.freeMemory()) / 1024 / 1024;
127+
return used + " MB / " + (runtime.maxMemory() / 1024 / 1024) + " MB";
128+
}
41129

42-
public static NodeLinkHelper getHelper() {
43-
return INSTANCE;
130+
private int getPlainTextLength(String s) {
131+
return s.replaceAll("\u001B\\[[;\\d]*m", "").length();
132+
}
133+
134+
private String LOGO() {
135+
return """
136+
\s
137+
░░ \s
138+
░░░ \s
139+
░░ \s
140+
░ ░ ░░ ░ \s
141+
░░░ ░░ ░░ ░ ░░ ░ \s
142+
░░░ ░░ ░ ░░░ ░░ ░░ \s
143+
░░░░ ░░░░ ░░░ ░ ░░░ \s
144+
░░░ ░░░░░░░ ░ ░░░░ \s
145+
░░░░░░░░░▒▒▒▒░░░░░░░░░ \s
146+
░░ ░░░░░░▒▒▒▒▒▒▒▒▒▒▒▒░░░░░ ░░ \s
147+
░░░░ ░░░░▒▒░░░░▒▒▓▓▓▓▒▒▒░░ ░░░░ \s
148+
░░░░▒░░░░░░▒▓▓▓▓▓▓▒▒▒░░░ \s
149+
░░░░░▒▒░▒░░░▒▓▓▓▓███▓▒▒▒░░░ \s
150+
░░░░░░░░░░░░░▒▒▒▒▒▒▒▓▓▓▓▓▓████▓▒▒▒░░░░░░░░░░░░░░░ \s
151+
░░░ ░░ ░░░░▒▒▒▓▓▓▓▓▓███▓▓▓▓▒▒▒░░░░ \s
152+
░░░░░▒▒▒▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒░░ \s
153+
░░░░░▒▒▒▓▓▓▓▓▓▒▒▒░░▒▒░░░░░ \s
154+
░░░ ░░░░▒▒▒▒▒▒▒░░░░▒▒▒░░░░ ░░░ \s
155+
░ ░░░░░░░▒▒▒▒▒▒▒▒░░░░░░░ \s
156+
░░░░ ░░ ░░░░▒░░░░░ ░░░░░░ \s
157+
░ ░░ ░ ░░░ ░ ░░ ░░░ \s
158+
░░ ░░ ░░░ ░ ░░ ░░ \s
159+
░░ ░░ ░░░ ░░ ░░ \s
160+
░ ░ ░░ ░ ░ \s
161+
░░ \s
162+
░░ \s
163+
░░ \s
164+
\s
165+
\s""";
166+
}
167+
168+
private String HEADER() {
169+
return """
170+
__ __ __ ____ __ ______ ____ __ __ ______ \s
171+
/\\ \\/\\ \\ /\\ \\ /\\ _`\\ /\\ \\ /\\__ _\\ /\\ _`\\ /\\ \\/\\ \\ /\\__ _\\ \s
172+
\\ \\ `\\\\ \\ \\ \\ \\ \\ \\ \\/\\_\\ \\ \\ \\ \\/_/\\ \\/ \\ \\ \\L\\_\\ \\ \\ `\\\\ \\ \\/_/\\ \\/ \s
173+
\\ \\ , ` \\ \\ \\ \\ __ _______ \\ \\ \\/_/_ \\ \\ \\ __ \\ \\ \\ \\ \\ _\\L \\ \\ , ` \\ \\ \\ \\ \s
174+
\\ \\ \\`\\ \\ \\ \\ \\L\\ \\ /\\______\\ \\ \\ \\L\\ \\ \\ \\ \\L\\ \\ \\_\\ \\__ \\ \\ \\L\\ \\ \\ \\ \\`\\ \\ \\ \\ \\\s
175+
\\ \\_\\ \\_\\ \\ \\____/ \\/______/ \\ \\____/ \\ \\____/ /\\_____\\ \\ \\____/ \\ \\_\\ \\_\\ \\ \\_\\
176+
\\/_/\\/_/ \\/___/ \\/___/ \\/___/ \\/_____/ \\/___/ \\/_/\\/_/ \\/_/""";
44177
}
45-
}
178+
}

src/main/java/io/nodelink/server/log/Logger.java

Lines changed: 32 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package io.nodelink.server.log;
22

3+
import java.time.LocalTime;
4+
import java.time.format.DateTimeFormatter;
5+
36
public class Logger {
47

58
/**
@@ -13,67 +16,48 @@ public class Logger {
1316
private final Logs logs = Logs.getLogsSingleton();
1417

1518
/**
16-
* Method to display an informational message in the console.
17-
* This method prints the message in green color if showLogs is enabled,
18-
* and always logs it to file.
19-
*
20-
* @param msg The message to log
19+
* Formatter for time in HH:mm:ss format
2120
*/
22-
public void INFO(String msg) {
23-
// Green
24-
String INFO = "\u001B[32m[INFO] \u001B[0m";
25-
System.out.println(INFO + msg);
21+
private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss");
2622

27-
logs.MakeALog(msg, "INFO");
28-
}
23+
private static final String RESET = "\u001B[0m";
24+
private static final String GREEN = "\u001B[32m";
25+
private static final String YELLOW = "\u001B[33m";
26+
private static final String RED = "\u001B[31m";
27+
private static final String MAGENTA = "\u001B[35m";
28+
private static final String CYAN = "\u001B[36m";
2929

30-
/**
31-
* Method to display a warning message in the console.
32-
* This method prints the message in yellow color if showLogs is enabled,
33-
* and always logs it to file.
34-
*
35-
* @param msg The message to log
36-
*/
37-
public void WARN(String msg) {
30+
private void printLog(String level, String msg, String levelColor, String msgColor) {
31+
String time = LocalTime.now().format(TIME_FORMATTER);
32+
33+
String formattedLine = String.format("%s%s %s[%s] %s%s%s",
34+
GREEN, time, levelColor, level, msgColor, msg, RESET);
3835

39-
// Yellow
40-
String WARN = "\u001B[33m[WARN] \u001B[0m";
41-
System.out.println(WARN + msg);
36+
System.out.println(formattedLine);
4237

43-
logs.MakeALog(msg, "WARN");
38+
if (logs != null) {
39+
logs.MakeALog(msg, level);
40+
}
4441
}
4542

46-
/**
47-
* Method to display an error message in the console.
48-
* This method prints the message in red color if showLogs is enabled,
49-
* and always logs it to file.
50-
*
51-
* @param msg The message to log
52-
*/
53-
public void ERROR(String msg) {
43+
public void INFO(String msg) {
44+
printLog("INFOS", msg, GREEN, CYAN);
45+
}
5446

55-
// Red
56-
String ERROR = "\u001B[31m[ERROR] \u001B[0m";
57-
System.out.println(ERROR + msg);
47+
public void WARN(String msg) {
48+
printLog("WARN", msg, YELLOW, YELLOW);
49+
}
5850

59-
logs.MakeALog(msg, "ERROR");
51+
public void ERROR(String msg) {
52+
printLog("ERROR", msg, RED, RED);
6053
}
6154

62-
/**
63-
* Method to display a critical message in the console.
64-
* This method prints the message in magenta color if showLogs is enabled,
65-
* and always logs it to file.
66-
*
67-
* @param msg The message to log
68-
*/
6955
public void CRITICAL(String msg) {
56+
printLog("CRITICAL", msg, MAGENTA, MAGENTA);
57+
}
7058

71-
// Magenta
72-
String CRITICAL = "\u001B[35m[CRITICAL] \u001B[0m";
73-
System.out.println(CRITICAL + msg);
74-
75-
76-
logs.MakeALog(msg, "CRITICAL");
59+
public void SUCCESS(String msg) {
60+
printLog("INFOS", msg, GREEN, GREEN);
7761
}
7862

7963
/**

src/main/resources/MANIFEST.MF

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Manifest-Version: 1.0
2+
Main-Class: io.nodelink.server.NodeLink

0 commit comments

Comments
 (0)