Initial commit

This commit is contained in:
weishaupt
2026-09-01 12:32:15 -04:00
commit defdefdb28
33 changed files with 3540 additions and 0 deletions
+47
View File
@@ -0,0 +1,47 @@
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<String> // 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
}