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.

UserStateHandler.kt 1.7KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package com.dmdirc.ktirc.events
  2. import com.dmdirc.ktirc.IrcClient
  3. import com.dmdirc.ktirc.model.UserState
  4. internal class UserStateHandler : EventHandler {
  5. override fun processEvent(client: IrcClient, event: IrcEvent): List<IrcEvent> {
  6. when (event) {
  7. is ChannelJoined -> handleJoin(client.userState, event)
  8. is ChannelParted -> handlePart(client, event)
  9. is ChannelNamesReceived -> handleNamesReceived(client, event)
  10. is UserQuit -> handleQuit(client.userState, event)
  11. }
  12. return emptyList()
  13. }
  14. private fun handleJoin(state: UserState, event: ChannelJoined) {
  15. state.addToChannel(event.user, event.channel)
  16. state.update(event.user)
  17. }
  18. private fun handlePart(client: IrcClient, event: ChannelParted) {
  19. if (client.isLocalUser(event.user)) {
  20. // Remove channel from all users
  21. client.userState.forEach { it.channels -= event.channel }
  22. client.userState.removeIf { it.channels.isEmpty() && !client.isLocalUser(it.details) }
  23. } else {
  24. client.userState[event.user]?.channels?.let {
  25. it -= event.channel
  26. if (it.isEmpty()) {
  27. client.userState -= event.user
  28. }
  29. }
  30. }
  31. }
  32. private fun handleNamesReceived(client: IrcClient, event: ChannelNamesReceived) {
  33. event.toModesAndUsers(client).forEach { (_, user) ->
  34. client.userState.addToChannel(user, event.channel)
  35. client.userState.update(user)
  36. }
  37. }
  38. private fun handleQuit(state: UserState, event: UserQuit) {
  39. state -= event.user
  40. }
  41. }