summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gradle.properties2
-rw-r--r--src/main/java/dev/plutorocks/IrcClient.java78
2 files changed, 66 insertions, 14 deletions
diff --git a/gradle.properties b/gradle.properties
index f8a0ff5..182eb72 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -13,7 +13,7 @@ loader_version=0.18.4
loom_version=1.15-SNAPSHOT
# Mod Properties
-mod_version=R1.0
+mod_version=R1.2
maven_group=dev.plutorocks
archives_base_name=minecraftirc
diff --git a/src/main/java/dev/plutorocks/IrcClient.java b/src/main/java/dev/plutorocks/IrcClient.java
index f3abd40..a7b8c7f 100644
--- a/src/main/java/dev/plutorocks/IrcClient.java
+++ b/src/main/java/dev/plutorocks/IrcClient.java
@@ -18,6 +18,7 @@ public class IrcClient {
private volatile boolean running = false;
private volatile boolean connected = false;
+ private volatile boolean registered = false;
private Socket socket;
private BufferedWriter writer;
@@ -35,6 +36,7 @@ public class IrcClient {
public void connect() {
if (running) return;
running = true;
+ MinecraftIRC.LOGGER.info("[IRC] Connecting to {}:{} as {} in {}", host, port, nick, channel);
Thread thread = new Thread(this::runLoop, "MinecraftIRC-Thread");
thread.setDaemon(true);
@@ -47,15 +49,20 @@ public class IrcClient {
public void disconnect() {
running = false;
+ MinecraftIRC.LOGGER.info("[IRC] Disconnect requested");
try {
if (socket != null && !socket.isClosed()) {
socket.close();
}
- } catch (IOException ignored) {}
+ } catch (IOException e) {
+ MinecraftIRC.LOGGER.warn("[IRC] Error closing socket", e);
+ }
connected = false;
}
private void runLoop() {
+ MinecraftIRC.LOGGER.info("[IRC] runLoop started");
+ registered = false;
try (Socket sock = new Socket(host, port);
BufferedReader reader = new BufferedReader(
new InputStreamReader(sock.getInputStream(), StandardCharsets.UTF_8));
@@ -66,31 +73,30 @@ public class IrcClient {
this.writer = writer;
this.connected = true;
+ MinecraftIRC.LOGGER.info("[IRC] Connected TCP to {}:{}", host, port);
+
sendRaw("NICK " + nick);
sendRaw("USER " + nick + " 0 * :" + nick);
- sendRaw("JOIN " + channel);
-
- sendClientChat(
- Text.literal("[IRC] ").formatted(Formatting.AQUA)
- .append(Text.literal("Connected to " + host + " " + channel + " as " + nick)
- .formatted(Formatting.GRAY))
- );
-
String line;
while (running && (line = reader.readLine()) != null) {
+ MinecraftIRC.LOGGER.info("[IRC RAW] {}", line);
handleLine(line);
}
if (running) {
+ MinecraftIRC.LOGGER.info("[IRC] Server closed connection while running");
sendClientChat(
Text.literal("[IRC] ").formatted(Formatting.AQUA)
.append(Text.literal("Disconnected from server. Use /irc connect to reconnect.")
.formatted(Formatting.GRAY))
);
+ } else {
+ MinecraftIRC.LOGGER.info("[IRC] runLoop exiting normally (running == false)");
}
} catch (IOException e) {
+ MinecraftIRC.LOGGER.warn("[IRC] IOException in runLoop", e);
sendClientChat(
Text.literal("[IRC] ").formatted(Formatting.AQUA)
.append(Text.literal("Connection error: " + e.getMessage()
@@ -100,18 +106,56 @@ public class IrcClient {
} finally {
connected = false;
running = false;
+ registered = false;
+ this.writer = null;
+ this.socket = null;
+ MinecraftIRC.LOGGER.info("[IRC] runLoop finished (connected=false, running=false)");
}
}
private void handleLine(String line) {
- // respond to server PINGs
+ if (line.startsWith("ERROR")) {
+ sendClientChat(
+ Text.literal("[IRC] ").formatted(Formatting.AQUA)
+ .append(Text.literal("Server ERROR: " + line)
+ .formatted(Formatting.GRAY))
+ );
+ return;
+ }
+
+ if (line.startsWith(":")) {
+ String[] parts = line.split(" ");
+ if (parts.length >= 2) {
+ String code = parts[1];
+ if ("001".equals(code)) {
+ registered = true;
+ MinecraftIRC.LOGGER.info("[IRC] Registration complete (001), joining {}", channel);
+ sendRaw("JOIN " + channel);
+ sendClientChat(
+ Text.literal("[IRC] ").formatted(Formatting.AQUA)
+ .append(Text.literal("Connected to " + host + " " + channel + " as " + nick)
+ .formatted(Formatting.GRAY))
+ );
+ return;
+ }
+ if ("433".equals(code)) {
+ sendClientChat(
+ Text.literal("[IRC] ").formatted(Formatting.AQUA)
+ .append(Text.literal("Nick " + nick + " is already in use on this server.")
+ .formatted(Formatting.GRAY))
+ );
+ MinecraftIRC.LOGGER.warn("[IRC] Nick {} already in use (433)", nick);
+ return;
+ }
+ }
+ }
+
if (line.startsWith("PING")) {
String payload = line.length() > 5 ? line.substring(5) : "";
sendRaw("PONG " + payload);
return;
}
- // only care about PRIVMSG
if (!line.contains(" PRIVMSG ")) {
return;
}
@@ -163,7 +207,10 @@ public class IrcClient {
* sends a message to the configured channel
*/
public void sendChannelMessage(String message) {
- if (!connected) return;
+ if (!connected) {
+ MinecraftIRC.LOGGER.info("[IRC] Ignoring sendChannelMessage while not connected: {}", message);
+ return;
+ }
sendRaw("PRIVMSG " + channel + " :" + message);
}
@@ -171,12 +218,17 @@ public class IrcClient {
* low-level raw IRC send
*/
private synchronized void sendRaw(String line) {
- if (writer == null) return;
+ if (writer == null) {
+ MinecraftIRC.LOGGER.info("[IRC] sendRaw called but writer is null: {}", line);
+ return;
+ }
try {
+ MinecraftIRC.LOGGER.debug("[IRC SEND] {}", line);
writer.write(line);
writer.write("\r\n");
writer.flush();
} catch (IOException e) {
+ MinecraftIRC.LOGGER.warn("[IRC] IOException in sendRaw", e);
sendClientChat(
Text.literal("[IRC] ").formatted(Formatting.AQUA)
.append(Text.literal("Send error: " + e.getMessage())