Browse Source

Add user state

tags/v0.1.0
Chris Smith 5 years ago
parent
commit
20fd88e14c

+ 2
- 0
src/main/kotlin/com/dmdirc/ktirc/IrcClient.kt View File

@@ -17,6 +17,7 @@ interface IrcClient {
17 17
 
18 18
     val serverState: ServerState
19 19
     val channelState: ChannelStateMap
20
+    val userState: UserState
20 21
 
21 22
     val caseMapping: CaseMapping
22 23
         get() = serverState.features[ServerFeature.ServerCaseMapping] ?: CaseMapping.Rfc
@@ -36,6 +37,7 @@ class IrcClientImpl(private val server: Server, private val profile: Profile) :
36 37
 
37 38
     override val serverState = ServerState(profile.initialNick)
38 39
     override val channelState = ChannelStateMap { caseMapping }
40
+    override val userState = UserState { caseMapping }
39 41
 
40 42
     override var eventHandler: EventHandler? = null
41 43
         set(value) {

+ 0
- 2
src/main/kotlin/com/dmdirc/ktirc/model/CapabilitiesState.kt View File

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

+ 1
- 0
src/main/kotlin/com/dmdirc/ktirc/model/Maps.kt View File

@@ -27,3 +27,4 @@ abstract class CaseInsensitiveMap<T>(private val caseMappingProvider: () -> Case
27 27
 
28 28
 class ChannelStateMap(caseMappingProvider: () -> CaseMapping) : CaseInsensitiveMap<ChannelState>(caseMappingProvider, ChannelState::name)
29 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 View File

@@ -7,7 +7,16 @@ data class User(
7 7
         var account: String? = null,
8 8
         var realName: String? = null,
9 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 21
 fun ByteArray.asUser(): User {
13 22
     val string = String(this)

+ 27
- 0
src/main/kotlin/com/dmdirc/ktirc/model/UserState.kt View File

@@ -0,0 +1,27 @@
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 View File

@@ -0,0 +1,39 @@
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 View File

@@ -125,4 +125,17 @@ internal class ChannelUserMapTest {
125 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 View File

@@ -0,0 +1,56 @@
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 View File

@@ -30,4 +30,27 @@ internal class UserTest {
30 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
 }

Loading…
Cancel
Save