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.6KB

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