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

UserStateHandler.kt 2.6KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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 ChannelUserKicked -> handleKick(client, event)
  10. is ChannelNamesReceived -> handleNamesReceived(client, event)
  11. is UserAccountChanged -> handleAccountChanged(client, event)
  12. is UserQuit -> handleQuit(client.userState, event)
  13. }
  14. return emptyList()
  15. }
  16. private fun handleJoin(state: UserState, event: ChannelJoined) {
  17. state.addToChannel(event.user, event.channel)
  18. state.update(event.user)
  19. }
  20. private fun handlePart(client: IrcClient, event: ChannelParted) {
  21. if (client.isLocalUser(event.user)) {
  22. // Remove channel from all users
  23. client.userState.forEach { it.channels -= event.channel }
  24. client.userState.removeIf { it.channels.isEmpty() && !client.isLocalUser(it.details) }
  25. } else {
  26. client.userState[event.user]?.channels?.let {
  27. it -= event.channel
  28. if (it.isEmpty()) {
  29. client.userState -= event.user
  30. }
  31. }
  32. }
  33. }
  34. private fun handleKick(client: IrcClient, event: ChannelUserKicked) {
  35. if (client.isLocalUser(event.victim)) {
  36. // Remove channel from all users
  37. client.userState.forEach { it.channels -= event.channel }
  38. client.userState.removeIf { it.channels.isEmpty() && !client.isLocalUser(it.details) }
  39. } else {
  40. client.userState[event.victim]?.channels?.let {
  41. it -= event.channel
  42. if (it.isEmpty()) {
  43. client.userState -= event.victim
  44. }
  45. }
  46. }
  47. }
  48. private fun handleNamesReceived(client: IrcClient, event: ChannelNamesReceived) {
  49. event.toModesAndUsers(client).forEach { (_, user) ->
  50. client.userState.addToChannel(user, event.channel)
  51. client.userState.update(user)
  52. }
  53. }
  54. private fun handleAccountChanged(client: IrcClient, event: UserAccountChanged) {
  55. client.userState[event.user]?.details?.account = event.newAccount
  56. }
  57. private fun handleQuit(state: UserState, event: UserQuit) {
  58. state -= event.user
  59. }
  60. }