Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

CapabilitiesHandler.kt 2.4KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  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): List<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. return emptyList()
  18. }
  19. private fun handleCapabilitiesReceived(state: CapabilitiesState, capabilities: Map<Capability, String>) {
  20. state.advertisedCapabilities.putAll(capabilities)
  21. }
  22. private fun handleCapabilitiesFinished(client: IrcClient) {
  23. // TODO: We probably need to split the outgoing REQ lines if there are lots of caps
  24. // TODO: For caps with values we'll need to decide which value to use/whether to enable them/etc
  25. with (client.serverState.capabilities) {
  26. if (advertisedCapabilities.keys.isEmpty()) {
  27. negotiationState = CapabilitiesNegotiationState.FINISHED
  28. client.sendCapabilityEnd()
  29. } else {
  30. negotiationState = CapabilitiesNegotiationState.AWAITING_ACK
  31. advertisedCapabilities.keys.map { it.name }.let {
  32. log.info { "Requesting capabilities: ${it.toList()}" }
  33. client.sendCapabilityRequest(it)
  34. }
  35. }
  36. }
  37. }
  38. private fun handleCapabilitiesAcknowledged(client: IrcClient, capabilities: Map<Capability, String>) {
  39. // TODO: Check if everything we wanted is enabled
  40. with (client.serverState.capabilities) {
  41. log.info { "Acknowledged capabilities: ${capabilities.keys.map { it.name }.toList()}" }
  42. negotiationState = CapabilitiesNegotiationState.FINISHED
  43. enabledCapabilities.putAll(capabilities)
  44. client.sendCapabilityEnd()
  45. }
  46. }
  47. }