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.

UserState.kt 1.9KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package com.dmdirc.ktirc.model
  2. import com.dmdirc.ktirc.io.CaseMapping
  3. /**
  4. * Keeps track of all known users that are in a common channel.
  5. */
  6. class UserState(private val caseMappingProvider: () -> CaseMapping): Iterable<KnownUser> {
  7. private val users = UserMap(caseMappingProvider)
  8. /** Gets the [KnownUser] with the given nickname. */
  9. operator fun get(nickname: String) = users[nickname]
  10. /** Gets the [KnownUser] for a given user. */
  11. operator fun get(user: User) = users[user.nickname]
  12. internal operator fun plusAssign(details: User) { users += KnownUser(caseMappingProvider, details) }
  13. internal operator fun minusAssign(details: User) { users -= details.nickname }
  14. /** Provides a read-only iterator of all users. */
  15. override operator fun iterator() = users.iterator().iterator()
  16. internal fun removeIf(predicate: (KnownUser) -> Boolean) = users.removeIf(predicate)
  17. internal fun update(user: User, oldNick: String = user.nickname) {
  18. users[oldNick]?.details?.updateFrom(user)
  19. }
  20. internal fun addToChannel(user: User, channel: String) {
  21. users[user.nickname]?.let {
  22. it += channel
  23. } ?: run {
  24. users += KnownUser(caseMappingProvider, user).apply { channels += channel }
  25. }
  26. }
  27. }
  28. /**
  29. * Describes a user we know about and the channels that caused them to be known.
  30. */
  31. class KnownUser(caseMappingProvider: () -> CaseMapping, val details: User) {
  32. /** The channels we have in common with the user. */
  33. val channels = CaseInsensitiveSet(caseMappingProvider)
  34. internal operator fun plusAssign(channel: String) { channels += channel }
  35. internal operator fun minusAssign(channel: String) { channels -= channel }
  36. /** Determines if the user is in the specified channel. */
  37. operator fun contains(channel: String) = channel in channels
  38. }