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.

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