package irc /** A minimally-parsed raw IRC protocol line. */ data class ParsedLine( val prefix: String?, // e.g. "nick!user@host" or a server name val command: String, // e.g. "PRIVMSG", "JOIN", "376", etc. val params: List // trailing param (after ':') is params.last() if present ) fun parseIrcLine(line: String): ParsedLine? { if (line.isBlank()) return null var rest = line var prefix: String? = null if (rest.startsWith(":")) { val spaceIdx = rest.indexOf(' ') if (spaceIdx == -1) return null prefix = rest.substring(1, spaceIdx) rest = rest.substring(spaceIdx + 1) } val trailingSplit = rest.indexOf(" :") val paramsStr: String val trailing: String? if (trailingSplit != -1) { paramsStr = rest.substring(0, trailingSplit) trailing = rest.substring(trailingSplit + 2) } else { paramsStr = rest trailing = null } val parts = paramsStr.split(" ").filter { it.isNotEmpty() } if (parts.isEmpty()) return null val command = parts[0].uppercase() val params = parts.drop(1).toMutableList() if (trailing != null) params.add(trailing) return ParsedLine(prefix, command, params) } /** Extracts just the nick portion from an IRC prefix like "nick!user@host". */ fun nickFromPrefix(prefix: String?): String? { if (prefix == null) return null val bangIdx = prefix.indexOf('!') return if (bangIdx != -1) prefix.substring(0, bangIdx) else prefix }