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.9KB

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