Skip to content

Commit 76b956b

Browse files
committed
feat: Refactoring
1 parent a83c17e commit 76b956b

File tree

13 files changed

+384
-132
lines changed

13 files changed

+384
-132
lines changed

build.gradle

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ loom {
1414
splitEnvironmentSourceSets()
1515

1616
mods {
17-
"websocket_console" {
17+
"web_socket_console" {
1818
sourceSet sourceSets.main
1919
sourceSet sourceSets.client
2020
}
@@ -27,6 +27,8 @@ repositories {
2727
// Loom adds the essential maven repositories to download Minecraft and libraries from automatically.
2828
// See https://docs.gradle.org/current/userguide/declaring_repositories.html
2929
// for more information about repositories.
30+
31+
maven { url 'https://maven.wispforest.io/releases/' }
3032
}
3133

3234
dependencies {
@@ -38,6 +40,10 @@ dependencies {
3840
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
3941

4042
implementation 'org.java-websocket:Java-WebSocket:1.5.3'
43+
44+
annotationProcessor modImplementation("io.wispforest:owo-lib:${project.owo_version}")
45+
46+
implementation 'org.json:json:20250107'
4147
}
4248

4349
processResources {

gradle.properties

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ loader_version=0.16.10
88
# Mod Properties
99
mod_version=1.0.0
1010
maven_group=dev.loat
11-
archives_base_name=websocket_console
11+
archives_base_name=web_socket_console
1212
# Dependencies
1313
# check this on https://modmuss50.me/fabric.html
1414
fabric_version=0.119.2+1.21.4
15-
loom_version=1.9-SNAPSHOT
15+
loom_version=1.9-SNAPSHOT
16+
owo_version=0.12.20+1.21.4

src/client/resources/websocket_console.client.mixins.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"required": true,
33
"minVersion": "0.8",
4-
"package": "dev.loat.websocket_console.mixin.client",
4+
"package": "dev.loat.web_socket_console.mixin.client",
55
"compatibilityLevel": "JAVA_21",
66
"client": [
77
],
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package dev.loat.web_socket_console;
2+
3+
import dev.loat.web_socket_console.config.ModConfig;
4+
import dev.loat.web_socket_console.console.LogAppender;
5+
import dev.loat.web_socket_console.logging.Logger;
6+
import dev.loat.web_socket_console.web_socket.WebSocketConsoleServer;
7+
import net.fabricmc.api.ModInitializer;
8+
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
9+
import net.minecraft.server.MinecraftServer;
10+
import org.apache.logging.log4j.Level;
11+
import org.apache.logging.log4j.core.LoggerContext;
12+
13+
import org.apache.logging.log4j.LogManager;
14+
15+
public class WebSocketConsole implements ModInitializer {
16+
private static WebSocketConsoleServer webSocketConsoleServer;
17+
private static MinecraftServer serverInstance;
18+
19+
@Override
20+
public void onInitialize() {
21+
Logger.setLoggerClass(WebSocketConsole.class);
22+
23+
ServerLifecycleEvents.SERVER_STARTED.register(server -> {
24+
int port = ModConfig.WEB_SOCKET_CONFIG.port();
25+
Level logLevel = Level.valueOf(ModConfig.WEB_SOCKET_CONFIG.logLevel());
26+
27+
WebSocketConsole.serverInstance = server;
28+
WebSocketConsole.webSocketConsoleServer = new WebSocketConsoleServer(
29+
WebSocketConsole.serverInstance,
30+
port
31+
);
32+
Logger.info("Starting WebSocket server");
33+
WebSocketConsole.webSocketConsoleServer.start();
34+
35+
var ctx = (LoggerContext)LogManager.getContext(false);
36+
var logger = ctx.getConfiguration().getLoggers().get("");
37+
var webSocketLogAppender = new LogAppender(WebSocketConsole.webSocketConsoleServer);
38+
webSocketLogAppender.start();
39+
logger.addAppender(webSocketLogAppender, logLevel, null);
40+
ctx.updateLoggers();
41+
});
42+
43+
ServerLifecycleEvents.SERVER_STOPPING.register(server -> {
44+
if (webSocketConsoleServer != null) {
45+
try {
46+
webSocketConsoleServer.stop();
47+
} catch (InterruptedException error) {
48+
throw new RuntimeException(error);
49+
}
50+
51+
Logger.info("Stopping WebSocket server");
52+
}
53+
});
54+
}
55+
}
56+
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package dev.loat.web_socket_console.config;
2+
3+
import dev.loat.web_socket_console.config.files.WebSocketConsoleConfig;
4+
5+
public class ModConfig {
6+
public static final WebSocketConsoleConfig WEB_SOCKET_CONFIG = WebSocketConsoleConfig.createAndLoad();
7+
8+
public void reload() {
9+
ModConfig.WEB_SOCKET_CONFIG.load();
10+
}
11+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package dev.loat.web_socket_console.config.files;
2+
3+
import blue.endless.jankson.Comment;
4+
import io.wispforest.owo.config.annotation.Config;
5+
import org.apache.logging.log4j.Level;
6+
7+
@Config(
8+
wrapperName = "WebSocketConsoleConfig",
9+
name = "web_socket_console/config"
10+
)
11+
public class WebSocketConsoleConfigFile {
12+
@Comment("The Port to use for the WebSocket server.")
13+
public int port = 8080;
14+
15+
@Comment("""
16+
17+
The LogLevel to use for the WebSocket server.
18+
19+
- "DEBUG"
20+
- "INFO"
21+
- "WARN"
22+
- "ERROR"
23+
""")
24+
public String logLevel = Level.DEBUG.name();
25+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package dev.loat.web_socket_console.console;
2+
3+
import dev.loat.web_socket_console.web_socket.LogMessage;
4+
import dev.loat.web_socket_console.web_socket.WebSocketConsoleServer;
5+
import org.apache.logging.log4j.core.LogEvent;
6+
import org.apache.logging.log4j.core.appender.AbstractAppender;
7+
import org.apache.logging.log4j.core.layout.PatternLayout;
8+
9+
public class LogAppender extends AbstractAppender {
10+
private final WebSocketConsoleServer webSocketServer;
11+
12+
public LogAppender(
13+
WebSocketConsoleServer webSocketServer
14+
) {
15+
super(
16+
"WebSocketLogAppender",
17+
null,
18+
PatternLayout.createDefaultLayout(),
19+
false,
20+
null
21+
);
22+
this.webSocketServer = webSocketServer;
23+
}
24+
25+
@Override
26+
public void append(LogEvent event) {
27+
this.webSocketServer.broadcastToClients(new LogMessage(event));
28+
}
29+
}
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
package dev.loat.web_socket_console.logging;
2+
3+
import net.fabricmc.api.ModInitializer;
4+
import org.slf4j.LoggerFactory;
5+
6+
/**
7+
* This class represents a logger for the console.
8+
*/
9+
public class Logger {
10+
private static org.slf4j.Logger INSTANCE;
11+
12+
/**
13+
* This static function is used to set the class for logging.
14+
*
15+
* @param classInstance The instance to use for logging
16+
*/
17+
public static void setLoggerClass(Class<? extends ModInitializer> classInstance) {
18+
Logger.INSTANCE = LoggerFactory.getLogger(classInstance);
19+
}
20+
21+
/**
22+
* This static function is used for logging a message at debug level.
23+
*
24+
* @param message The message to log
25+
*/
26+
public static void debug(String message) {
27+
Logger.INSTANCE.debug(message);
28+
}
29+
30+
/**
31+
* This static function is used for logging a message at debug level with templates.
32+
*
33+
* @param message The message with placeholders to log
34+
* @param values A list of values to replace the message placeholders
35+
*/
36+
public static void debug(
37+
String message,
38+
Object... values
39+
) {
40+
Logger.INSTANCE.debug(message, values);
41+
}
42+
43+
/**
44+
* This static function is used for logging a message at info level.
45+
*
46+
* @param message The message to log
47+
*/
48+
public static void info(String message) {
49+
Logger.INSTANCE.info(message);
50+
}
51+
52+
/**
53+
* This static function is used for logging a message at info level with templates.
54+
*
55+
* @param message The message with placeholders to log
56+
* @param values A list of values to replace the message placeholders
57+
*/
58+
public static void info(
59+
String message,
60+
Object... values
61+
) {
62+
Logger.INSTANCE.info(message, values);
63+
}
64+
65+
/**
66+
* This static function is used for logging a message at warning level.
67+
*
68+
* @param message The message to log
69+
*/
70+
public static void warning(String message) {
71+
Logger.INSTANCE.warn(message);
72+
}
73+
74+
/**
75+
* This static function is used for logging a message at warning level with templates.
76+
*
77+
* @param message The message with placeholders to log
78+
* @param values A list of values to replace the message placeholders
79+
*/
80+
public static void warning(
81+
String message,
82+
Object... values
83+
) {
84+
Logger.INSTANCE.warn(message, values);
85+
}
86+
87+
/**
88+
* This static function is used for logging a message at error level.
89+
*
90+
* @param message The message to log
91+
*/
92+
public static void error(String message) {
93+
Logger.INSTANCE.error(message);
94+
}
95+
96+
/**
97+
* This static function is used for logging a message at error level with templates.
98+
*
99+
* @param message The message with placeholders to log
100+
* @param values A list of values to replace the message placeholders
101+
*/
102+
public static void error(
103+
String message,
104+
Object... values
105+
) {
106+
Logger.INSTANCE.error(message, values);
107+
}
108+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package dev.loat.web_socket_console.web_socket;
2+
3+
import org.apache.logging.log4j.Level;
4+
import org.apache.logging.log4j.ThreadContext;
5+
import org.apache.logging.log4j.core.LogEvent;
6+
import org.apache.logging.log4j.message.Message;
7+
import org.json.JSONObject;
8+
9+
public class LogMessage {
10+
private final long timestamp;
11+
private final String threadName;
12+
private final Level logLevel;
13+
private final String className;
14+
private final Message message;
15+
private final long threadId;
16+
private final ThreadContext.ContextStack stackStraceSource;
17+
18+
public LogMessage(LogEvent event) {
19+
this.timestamp = event.getTimeMillis();
20+
this.threadName = event.getThreadName();
21+
this.threadId = event.getThreadId();
22+
this.logLevel = event.getLevel();
23+
this.className = event.getLoggerName();
24+
this.message = event.getMessage();
25+
this.stackStraceSource = event.getContextStack();
26+
}
27+
28+
public String toFormattedString() {
29+
JSONObject data = new JSONObject();
30+
Object simpleClassName = JSONObject.NULL;
31+
32+
try {
33+
simpleClassName = Class.forName(this.className).getSimpleName();
34+
} catch (ClassNotFoundException ignored) {}
35+
36+
data.put("timestamp", this.timestamp);
37+
data.put("threadName", this.threadName);
38+
data.put("threadId", this.threadId);
39+
data.put("logLevel", this.logLevel);
40+
data.put("className", this.className);
41+
data.put("simpleClassName", simpleClassName);
42+
data.put("message", this.message.getFormattedMessage());
43+
data.put("error", this.stackStraceSource);
44+
return data.toString();
45+
}
46+
}

0 commit comments

Comments
 (0)