Ver código fonte

Add user state

tags/v0.1.0
Chris Smith 5 anos atrás
pai
commit
20fd88e14c

+ 2
- 0
src/main/kotlin/com/dmdirc/ktirc/IrcClient.kt Ver arquivo

17
 
17
 
18
     val serverState: ServerState
18
     val serverState: ServerState
19
     val channelState: ChannelStateMap
19
     val channelState: ChannelStateMap
20
+    val userState: UserState
20
 
21
 
21
     val caseMapping: CaseMapping
22
     val caseMapping: CaseMapping
22
         get() = serverState.features[ServerFeature.ServerCaseMapping] ?: CaseMapping.Rfc
23
         get() = serverState.features[ServerFeature.ServerCaseMapping] ?: CaseMapping.Rfc
36
 
37
 
37
     override val serverState = ServerState(profile.initialNick)
38
     override val serverState = ServerState(profile.initialNick)
38
     override val channelState = ChannelStateMap { caseMapping }
39
     override val channelState = ChannelStateMap { caseMapping }
40
+    override val userState = UserState { caseMapping }
39
 
41
 
40
     override var eventHandler: EventHandler? = null
42
     override var eventHandler: EventHandler? = null
41
         set(value) {
43
         set(value) {

+ 0
- 2
src/main/kotlin/com/dmdirc/ktirc/model/CapabilitiesState.kt Ver arquivo

10
 }
10
 }
11
 
11
 
12
 enum class CapabilitiesNegotiationState {
12
 enum class CapabilitiesNegotiationState {
13
-
14
     AWAITING_LIST,
13
     AWAITING_LIST,
15
     AWAITING_ACK,
14
     AWAITING_ACK,
16
     FINISHED
15
     FINISHED
17
-
18
 }
16
 }
19
 
17
 
20
 @Suppress("unused")
18
 @Suppress("unused")

+ 1
- 0
src/main/kotlin/com/dmdirc/ktirc/model/Maps.kt Ver arquivo

27
 
27
 
28
 class ChannelStateMap(caseMappingProvider: () -> CaseMapping) : CaseInsensitiveMap<ChannelState>(caseMappingProvider, ChannelState::name)
28
 class ChannelStateMap(caseMappingProvider: () -> CaseMapping) : CaseInsensitiveMap<ChannelState>(caseMappingProvider, ChannelState::name)
29
 class ChannelUserMap(caseMappingProvider: () -> CaseMapping) : CaseInsensitiveMap<ChannelUser>(caseMappingProvider, ChannelUser::nickname)
29
 class ChannelUserMap(caseMappingProvider: () -> CaseMapping) : CaseInsensitiveMap<ChannelUser>(caseMappingProvider, ChannelUser::nickname)
30
+class UserMap(caseMappingProvider: () -> CaseMapping) : CaseInsensitiveMap<KnownUser>(caseMappingProvider, { it.details.nickname })

+ 10
- 1
src/main/kotlin/com/dmdirc/ktirc/model/User.kt Ver arquivo

7
         var account: String? = null,
7
         var account: String? = null,
8
         var realName: String? = null,
8
         var realName: String? = null,
9
         var awayMessage: String? = null
9
         var awayMessage: String? = null
10
-)
10
+) {
11
+    fun updateFrom(other: User) {
12
+        nickname = other.nickname
13
+        other.ident?.let { ident = it }
14
+        other.hostname?.let { hostname = it }
15
+        other.account?.let { account = it }
16
+        other.realName?.let { realName = it }
17
+        other.awayMessage?.let { awayMessage = it }
18
+    }
19
+}
11
 
20
 
12
 fun ByteArray.asUser(): User {
21
 fun ByteArray.asUser(): User {
13
     val string = String(this)
22
     val string = String(this)

+ 27
- 0
src/main/kotlin/com/dmdirc/ktirc/model/UserState.kt Ver arquivo

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

+ 39
- 0
src/test/kotlin/com/dmdirc/ktirc/model/KnownUserTest.kt Ver arquivo

1
+package com.dmdirc.ktirc.model
2
+
3
+import org.junit.jupiter.api.Assertions.*
4
+import org.junit.jupiter.api.Test
5
+
6
+internal class KnownUserTest {
7
+
8
+    @Test
9
+    fun `KnownUser can add channels`() {
10
+        val user = KnownUser(User("acidBurn"))
11
+        user += "#thegibson"
12
+        user += "#dumpsterdiving"
13
+
14
+        assertEquals(2, user.channels.size)
15
+        assertTrue("#thegibson" in user.channels)
16
+        assertTrue("#dumpsterdiving" in user.channels)
17
+    }
18
+
19
+    @Test
20
+    fun `KnownUser can remove channels`() {
21
+        val user = KnownUser(User("acidBurn"))
22
+        user.channels.addAll(listOf("#thegibson", "#dumpsterdiving"))
23
+        user -= "#thegibson"
24
+
25
+        assertEquals(1, user.channels.size)
26
+        assertFalse("#thegibson" in user.channels)
27
+        assertTrue("#dumpsterdiving" in user.channels)
28
+    }
29
+
30
+    @Test
31
+    fun `KnownUser indicates if a channel is known`() {
32
+        val user = KnownUser(User("acidBurn"))
33
+        user.channels.addAll(listOf("#thegibson"))
34
+
35
+        assertTrue("#thegibson" in user)
36
+        assertFalse("#dumpsterdiving" in user)
37
+    }
38
+
39
+}

+ 13
- 0
src/test/kotlin/com/dmdirc/ktirc/model/MapsTest.kt Ver arquivo

125
         assertFalse("zerocool" in channelUserMap)
125
         assertFalse("zerocool" in channelUserMap)
126
     }
126
     }
127
 
127
 
128
+}
129
+
130
+internal class UserMapTest {
131
+
132
+    @Test
133
+    fun `UserMap maps users on nickname`() {
134
+        val userMap = UserMap { CaseMapping.Rfc }
135
+        userMap += KnownUser(User("acidBurn"))
136
+        assertTrue("acidBurn" in userMap)
137
+        assertTrue("acidburn" in userMap)
138
+        assertFalse("zerocool" in userMap)
139
+    }
140
+
128
 }
141
 }

+ 56
- 0
src/test/kotlin/com/dmdirc/ktirc/model/UserStateTest.kt Ver arquivo

1
+package com.dmdirc.ktirc.model
2
+
3
+import com.dmdirc.ktirc.io.CaseMapping
4
+import org.junit.jupiter.api.Assertions.*
5
+import org.junit.jupiter.api.Test
6
+
7
+internal class UserStateTest {
8
+
9
+    private val userState = UserState { CaseMapping.Rfc }
10
+
11
+    @Test
12
+    fun `UserState adds and gets new users`() {
13
+        userState += User("acidBurn", "libby", "root.localhost")
14
+        val user = userState["acidburn"]
15
+        assertNotNull(user)
16
+        assertEquals("acidBurn", user?.details?.nickname)
17
+        assertEquals("libby", user?.details?.ident)
18
+        assertEquals("root.localhost", user?.details?.hostname)
19
+    }
20
+
21
+    @Test
22
+    fun `UserState removes users`() {
23
+        userState += User("acidBurn", "libby", "root.localhost")
24
+        userState -= User("ACIDBURN")
25
+        assertNull(userState["acidburn"])
26
+    }
27
+
28
+    @Test
29
+    fun `UserState updates existing user with same nickname`() {
30
+        userState += User("acidBurn", "libby", "root.localhost")
31
+        userState.update(User("acidBurn", realName = "Libby", awayMessage = "Hacking"))
32
+
33
+        val user = userState["acidburn"]!!
34
+        assertEquals("acidBurn", user.details.nickname)
35
+        assertEquals("libby", user.details.ident)
36
+        assertEquals("root.localhost", user.details.hostname)
37
+        assertEquals("Libby", user.details.realName)
38
+        assertEquals("Hacking", user.details.awayMessage)
39
+    }
40
+
41
+    @Test
42
+    fun `UserState updates existing user with new nickname`() {
43
+        userState += User("acidBurn", "libby", "root.localhost")
44
+        userState.update(User("acidBurn2", realName = "Libby", awayMessage = "Hacking"), "acidBurn")
45
+
46
+        val user = userState["acidburn2"]!!
47
+        assertEquals("acidBurn2", user.details.nickname)
48
+        assertEquals("libby", user.details.ident)
49
+        assertEquals("root.localhost", user.details.hostname)
50
+        assertEquals("Libby", user.details.realName)
51
+        assertEquals("Hacking", user.details.awayMessage)
52
+
53
+        assertNull(userState["acidBurn"])
54
+    }
55
+
56
+}

+ 23
- 0
src/test/kotlin/com/dmdirc/ktirc/model/UserTest.kt Ver arquivo

30
         assertEquals("root.localhost", user.hostname)
30
         assertEquals("root.localhost", user.hostname)
31
     }
31
     }
32
 
32
 
33
+    @Test
34
+    fun `User updates non-null fields from other instance`() {
35
+        val user1 = User("acidBurn", "libby", awayMessage = "Hacking the planet")
36
+        user1.updateFrom(User("acidBurn", null, "root.localhost", "acidBurn", "Libby"))
37
+
38
+        assertEquals("acidBurn", user1.nickname)
39
+        assertEquals("libby", user1.ident)
40
+        assertEquals("root.localhost", user1.hostname)
41
+        assertEquals("acidBurn", user1.account)
42
+        assertEquals("Libby", user1.realName)
43
+        assertEquals("Hacking the planet", user1.awayMessage)
44
+
45
+        val user2 = User("acidBurn", null, "root.localhost", "acidBurn", "Libby")
46
+        user2.updateFrom(User("acidBurn", "libby", awayMessage = "Hacking the planet"))
47
+
48
+        assertEquals("acidBurn", user2.nickname)
49
+        assertEquals("libby", user2.ident)
50
+        assertEquals("root.localhost", user2.hostname)
51
+        assertEquals("acidBurn", user2.account)
52
+        assertEquals("Libby", user2.realName)
53
+        assertEquals("Hacking the planet", user2.awayMessage)
54
+    }
55
+
33
 }
56
 }

Carregando…
Cancelar
Salvar