選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

CapabilitiesHandler.kt 2.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package com.dmdirc.ktirc.events
  2. import com.dmdirc.ktirc.IrcClient
  3. import com.dmdirc.ktirc.messages.sendCapabilityEnd
  4. import com.dmdirc.ktirc.messages.sendCapabilityRequest
  5. import com.dmdirc.ktirc.model.CapabilitiesNegotiationState
  6. import com.dmdirc.ktirc.model.CapabilitiesState
  7. import com.dmdirc.ktirc.model.Capability
  8. import com.dmdirc.ktirc.util.logger
  9. internal class CapabilitiesHandler : EventHandler {
  10. private val log by logger()
  11. override fun processEvent(client: IrcClient, event: IrcEvent) {
  12. when (event) {
  13. is ServerCapabilitiesReceived -> handleCapabilitiesReceived(client.serverState.capabilities, event.capabilities)
  14. is ServerCapabilitiesFinished -> handleCapabilitiesFinished(client)
  15. is ServerCapabilitiesAcknowledged -> handleCapabilitiesAcknowledged(client, event.capabilities)
  16. }
  17. }
  18. private fun handleCapabilitiesReceived(state: CapabilitiesState, capabilities: Map<Capability, String>) {
  19. state.advertisedCapabilities.putAll(capabilities)
  20. }
  21. private fun handleCapabilitiesFinished(client: IrcClient) {
  22. // TODO: We probably need to split the outgoing REQ lines if there are lots of caps
  23. // TODO: For caps with values we'll need to decide which value to use/whether to enable them/etc
  24. with (client.serverState.capabilities) {
  25. if (advertisedCapabilities.keys.isEmpty()) {
  26. negotiationState = CapabilitiesNegotiationState.FINISHED
  27. client.sendCapabilityEnd()
  28. } else {
  29. negotiationState = CapabilitiesNegotiationState.AWAITING_ACK
  30. advertisedCapabilities.keys.map { it.name }.let {
  31. log.info { "Requesting capabilities: ${it.toList()}" }
  32. client.sendCapabilityRequest(it)
  33. }
  34. }
  35. }
  36. }
  37. private fun handleCapabilitiesAcknowledged(client: IrcClient, capabilities: Map<Capability, String>) {
  38. // TODO: Check if everything we wanted is enabled
  39. with (client.serverState.capabilities) {
  40. log.info { "Acknowledged capabilities: ${capabilities.keys.map { it.name }.toList()}" }
  41. negotiationState = CapabilitiesNegotiationState.FINISHED
  42. enabledCapabilities.putAll(capabilities)
  43. client.sendCapabilityEnd()
  44. }
  45. }
  46. }