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

UserStateHandler.kt 1.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  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) {
  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. }
  13. private fun handleJoin(state: UserState, event: ChannelJoined) {
  14. state.addToChannel(event.user, event.channel)
  15. state.update(event.user)
  16. }
  17. private fun handlePart(client: IrcClient, event: ChannelParted) {
  18. if (client.isLocalUser(event.user)) {
  19. // Remove channel from all users
  20. client.userState.forEach { it.channels -= event.channel }
  21. client.userState.removeIf { it.channels.isEmpty() && !client.isLocalUser(it.details) }
  22. } else {
  23. client.userState[event.user]?.channels?.let {
  24. it -= event.channel
  25. if (it.isEmpty()) {
  26. client.userState -= event.user
  27. }
  28. }
  29. }
  30. }
  31. private fun handleNamesReceived(client: IrcClient, event: ChannelNamesReceived) {
  32. event.toModesAndUsers(client).forEach { (_, user) ->
  33. client.userState.addToChannel(user, event.channel)
  34. client.userState.update(user)
  35. }
  36. }
  37. private fun handleQuit(state: UserState, event: UserQuit) {
  38. state -= event.user
  39. }
  40. }