You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

CapabilityProcessor.kt 1.7KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package com.dmdirc.ktirc.messages
  2. import com.dmdirc.ktirc.events.ServerCapabilitiesAcknowledged
  3. import com.dmdirc.ktirc.events.ServerCapabilitiesFinished
  4. import com.dmdirc.ktirc.events.ServerCapabilitiesReceived
  5. import com.dmdirc.ktirc.model.IrcMessage
  6. import com.dmdirc.ktirc.model.capabilities
  7. import com.dmdirc.ktirc.util.logger
  8. class CapabilityProcessor : MessageProcessor {
  9. private val log by logger()
  10. override val commands = arrayOf("CAP")
  11. override fun process(message: IrcMessage) = when (message.subCommand) {
  12. "LS" -> handleList(message.subCommandArguments)
  13. "ACK" -> listOf(ServerCapabilitiesAcknowledged(message.params.capabilities))
  14. else -> emptyList()
  15. }
  16. private fun handleList(lsParams: List<ByteArray>) = sequence {
  17. yield(ServerCapabilitiesReceived(lsParams.capabilities))
  18. if (lsParams.size < 2 || String(lsParams[0]) != "*") {
  19. yield(ServerCapabilitiesFinished)
  20. }
  21. }.toList()
  22. private val IrcMessage.subCommand
  23. get() = String(params[1])
  24. private val IrcMessage.subCommandArguments
  25. get() = params.slice(1 until params.size)
  26. private val List<ByteArray>.capabilities
  27. get() = String(last()).split(' ').toCapabilities()
  28. private fun List<String>.toCapabilities() = sequence {
  29. forEach { cap ->
  30. val index = cap.indexOf('=')
  31. val name = if (index == -1) cap else cap.substring(0 until index)
  32. val value = if (index == -1) "" else cap.substring(index + 1)
  33. capabilities[name]?.let { yield(Pair(it, value)) } ?: log.info { "Unknown capability: $name (value: $value)" }
  34. }
  35. }.toMap()
  36. }