Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

ISupportProcessor.kt 1.8KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package com.dmdirc.ktirc.messages
  2. import com.dmdirc.ktirc.events.IrcEvent
  3. import com.dmdirc.ktirc.io.CaseMapping
  4. import com.dmdirc.ktirc.io.IrcMessage
  5. import com.dmdirc.ktirc.state.ServerState
  6. import com.dmdirc.ktirc.state.serverFeatures
  7. import kotlin.reflect.KClass
  8. class ISupportProcessor(val serverState: ServerState) : MessageProcessor {
  9. override val commands = arrayOf("005")
  10. override fun process(message: IrcMessage): List<IrcEvent> {
  11. // Ignore the first (nickname) and last ("are supported by this server") params
  12. for (i in 1 until message.params.size - 1) {
  13. parseParam(message.params[i])
  14. }
  15. return emptyList()
  16. }
  17. private fun parseParam(param: ByteArray) = when (param[0]) {
  18. '-'.toByte() -> resetFeature(param.sliceArray(1 until param.size))
  19. else -> when (val equals = param.indexOf('='.toByte())) {
  20. -1 -> enableFeatureWithDefault(param)
  21. else -> enableFeature(param.sliceArray(0 until equals), param.sliceArray(equals + 1 until param.size))
  22. }
  23. }
  24. private fun resetFeature(name: ByteArray) = name.asFeature()?.let { serverState.resetFeature(it) }
  25. @Suppress("UNCHECKED_CAST")
  26. private fun enableFeature(name: ByteArray, value: ByteArray) {
  27. name.asFeature()?.let { feature ->
  28. serverState.setFeature(feature, value.cast(feature.type))
  29. }
  30. }
  31. private fun enableFeatureWithDefault(name: ByteArray) {
  32. TODO("not implemented")
  33. }
  34. private fun ByteArray.asFeature() = serverFeatures[String(this)]
  35. private fun ByteArray.cast(to: KClass<out Any>): Any = when (to) {
  36. Int::class -> String(this).toInt()
  37. String::class -> String(this)
  38. CaseMapping::class -> CaseMapping.fromName(String(this))
  39. else -> TODO("not implemented")
  40. }
  41. }