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 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package com.dmdirc.ktirc.events.handlers
  2. import com.dmdirc.ktirc.IrcClient
  3. import com.dmdirc.ktirc.events.*
  4. import com.dmdirc.ktirc.model.User
  5. import com.dmdirc.ktirc.model.UserState
  6. internal class UserStateHandler : EventHandler {
  7. override fun processEvent(client: IrcClient, event: IrcEvent) {
  8. when (event) {
  9. is ChannelJoined -> handleJoin(client.userState, event)
  10. is ChannelParted -> handlePart(client, event)
  11. is ChannelUserKicked -> handleKick(client, event)
  12. is ChannelNamesReceived -> handleNamesReceived(client, event)
  13. is UserAccountChanged -> handleAccountChanged(client, event)
  14. is UserNickChanged -> handleNickChanged(client, event)
  15. is UserHostChanged -> handleHostChanged(client, event)
  16. is UserQuit -> handleQuit(client.userState, event)
  17. is UserAway -> handleAway(client.userState, event)
  18. is ServerWelcome -> handleServerWelcome(client.localUser, event)
  19. }
  20. }
  21. private fun handleJoin(state: UserState, event: ChannelJoined) {
  22. state.addToChannel(event.user, event.target)
  23. state.update(event.user)
  24. }
  25. private fun handlePart(client: IrcClient, event: ChannelParted) {
  26. if (client.isLocalUser(event.user)) {
  27. // Remove channel from all users
  28. client.userState.forEach { it.channels -= event.target }
  29. client.userState.removeIf { it.channels.isEmpty() && !client.isLocalUser(it.details) }
  30. } else {
  31. client.userState[event.user]?.channels?.let {
  32. it -= event.target
  33. if (it.isEmpty()) {
  34. client.userState -= event.user
  35. }
  36. }
  37. }
  38. }
  39. private fun handleKick(client: IrcClient, event: ChannelUserKicked) {
  40. if (client.isLocalUser(event.victim)) {
  41. // Remove channel from all users
  42. client.userState.forEach { it.channels -= event.target }
  43. client.userState.removeIf { it.channels.isEmpty() && !client.isLocalUser(it.details) }
  44. } else {
  45. client.userState[event.victim]?.channels?.let {
  46. it -= event.target
  47. if (it.isEmpty()) {
  48. client.userState -= event.victim
  49. }
  50. }
  51. }
  52. }
  53. private fun handleNamesReceived(client: IrcClient, event: ChannelNamesReceived) {
  54. event.toModesAndUsers(client).forEach { (_, user) ->
  55. client.userState.addToChannel(user, event.target)
  56. client.userState.update(user)
  57. }
  58. }
  59. private fun handleAccountChanged(client: IrcClient, event: UserAccountChanged) {
  60. client.userState[event.user]?.details?.account = event.newAccount
  61. }
  62. private fun handleNickChanged(client: IrcClient, event: UserNickChanged) {
  63. client.userState[event.user]?.details?.nickname = event.newNick
  64. if (client.isLocalUser(event.user)) {
  65. client.serverState.localNickname = event.newNick
  66. }
  67. }
  68. private fun handleHostChanged(client: IrcClient, event: UserHostChanged) {
  69. client.userState[event.user]?.details?.let {
  70. it.ident = event.newIdent
  71. it.hostname = event.newHost
  72. }
  73. }
  74. private fun handleQuit(state: UserState, event: UserQuit) {
  75. state -= event.user
  76. }
  77. private fun handleAway(state: UserState, event: UserAway) {
  78. state[event.user]?.details?.let {
  79. when (event.message) {
  80. null -> it.awayMessage = null
  81. "" -> if (it.awayMessage == null) it.awayMessage = ""
  82. else -> it.awayMessage = event.message
  83. }
  84. }
  85. }
  86. private fun handleServerWelcome(localUser: User, event: ServerWelcome) {
  87. localUser.nickname = event.localNick
  88. }
  89. }