diff options
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/dev/plutorocks/IrcClient.java | 78 |
1 files changed, 65 insertions, 13 deletions
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()) |
