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

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  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. internal operator fun minusAssign(nickname: String) { users -= nickname }
  15. /** Provides a read-only iterator of all users. */
  16. override operator fun iterator() = users.iterator().iterator()
  17. internal fun removeIf(predicate: (KnownUser) -> Boolean) = users.removeIf(predicate)
  18. internal fun update(user: User, oldNick: String = user.nickname) {
  19. users[oldNick]?.details?.updateFrom(user)
  20. }
  21. internal fun addToChannel(user: User, channel: String) {
  22. users[user.nickname]?.let {
  23. it += channel
  24. } ?: run {
  25. users += KnownUser(caseMappingProvider, user).apply { channels += channel }
  26. }
  27. }
  28. internal fun reset() {
  29. users.clear()
  30. }
  31. }
  32. /**
  33. * Describes a user we know about and the channels that caused them to be known.
  34. */
  35. class KnownUser(caseMappingProvider: () -> CaseMapping, val details: User) {
  36. /** The channels we have in common with the user. */
  37. val channels = CaseInsensitiveSet(caseMappingProvider)
  38. internal operator fun plusAssign(channel: String) { channels += channel }
  39. internal operator fun minusAssign(channel: String) { channels -= channel }
  40. /** Determines if the user is in the specified channel. */
  41. operator fun contains(channel: String) = channel in channels
  42. }