48 lines
1.5 KiB
Kotlin
48 lines
1.5 KiB
Kotlin
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
|
|
}
|