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

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. package com.dmdirc.ktirc.model
  2. import com.dmdirc.ktirc.io.CaseMapping
  3. class UserState(private val caseMappingProvider: () -> CaseMapping): Iterable<KnownUser> {
  4. private val users = UserMap(caseMappingProvider)
  5. operator fun get(nickname: String) = users[nickname]
  6. operator fun get(user: User) = users[user.nickname]
  7. operator fun plusAssign(details: User) { users += KnownUser(caseMappingProvider, details) }
  8. operator fun minusAssign(details: User) { users -= details.nickname }
  9. override operator fun iterator() = users.iterator()
  10. fun removeIf(predicate: (KnownUser) -> Boolean) = users.removeIf(predicate)
  11. fun update(user: User, oldNick: String = user.nickname) {
  12. users[oldNick]?.details?.updateFrom(user)
  13. }
  14. fun addToChannel(user: User, channel: String) {
  15. users[user.nickname]?.let {
  16. it += channel
  17. } ?: run {
  18. users += KnownUser(caseMappingProvider, user).apply { channels += channel }
  19. }
  20. }
  21. }
  22. class KnownUser(caseMappingProvider: () -> CaseMapping, val details: User) {
  23. val channels = CaseInsensitiveSet(caseMappingProvider)
  24. operator fun plusAssign(channel: String) { channels += channel }
  25. operator fun minusAssign(channel: String) { channels -= channel }
  26. operator fun contains(channel: String) = channel in channels
  27. }