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

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