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 2.4KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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 com.dmdirc.ktirc.util.logger
  8. import kotlin.reflect.KClass
  9. class ISupportProcessor(val serverState: ServerState) : MessageProcessor {
  10. private val log by logger()
  11. override val commands = arrayOf("005")
  12. override fun process(message: IrcMessage): List<IrcEvent> {
  13. // Ignore the first (nickname) and last ("are supported by this server") params
  14. for (i in 1 until message.params.size - 1) {
  15. parseParam(message.params[i])
  16. }
  17. return emptyList()
  18. }
  19. private fun parseParam(param: ByteArray) = when (param[0]) {
  20. '-'.toByte() -> resetFeature(param.sliceArray(1 until param.size))
  21. else -> when (val equals = param.indexOf('='.toByte())) {
  22. -1 -> enableFeatureWithDefault(param)
  23. else -> enableFeature(param.sliceArray(0 until equals), param.sliceArray(equals + 1 until param.size))
  24. }
  25. }
  26. private fun resetFeature(name: ByteArray) = name.asFeature()?.let {
  27. serverState.resetFeature(it)
  28. log.finer { "Reset feature ${it::class}" }
  29. }
  30. @Suppress("UNCHECKED_CAST")
  31. private fun enableFeature(name: ByteArray, value: ByteArray) {
  32. name.asFeature()?.let { feature ->
  33. serverState.setFeature(feature, value.cast(feature.type))
  34. log.finer { "Set feature ${feature::class} to ${String(value)}" }
  35. }
  36. }
  37. private fun enableFeatureWithDefault(name: ByteArray) {
  38. name.asFeature()?.let { feature ->
  39. when (feature.type) {
  40. Boolean::class -> serverState.setFeature(feature, true)
  41. else -> TODO("not implemented")
  42. }
  43. }
  44. }
  45. private fun ByteArray.asFeature() = serverFeatures[String(this)]
  46. ?: run {
  47. log.warning { "Unknown feature in 005: ${String(this)}" }
  48. null
  49. }
  50. private fun ByteArray.cast(to: KClass<out Any>): Any = when (to) {
  51. Int::class -> String(this).toInt()
  52. String::class -> String(this)
  53. CaseMapping::class -> CaseMapping.fromName(String(this))
  54. else -> TODO("not implemented")
  55. }
  56. }