Browse Source

Add channel mode enum, method to get mode

Groundwork for #5
tags/v0.5.0
Chris Smith 5 years ago
parent
commit
e51b1c6459

+ 29
- 0
src/main/kotlin/com/dmdirc/ktirc/model/ChannelState.kt View File

@@ -24,3 +24,32 @@ class ChannelState(val name: String, caseMappingProvider: () -> CaseMapping) {
24 24
  * Describes a user in a channel, and their modes.
25 25
  */
26 26
 data class ChannelUser(var nickname: String, var modes: String = "")
27
+
28
+/**
29
+ * The types of supported channel modes, and what parameters they require.
30
+ *
31
+ * These must be sorted according to the order they are sent in the CHANMODES server feature.
32
+ */
33
+enum class ChannelModeType {
34
+    /** The mode adds or removes an entry for a list. It must have a param to add or remove. */
35
+    List,
36
+    /** The mode has a parameter that must be present to set it or unset it. */
37
+    SetUnsetParameter,
38
+    /** The mode has a parameter that must be present to set it, but is unset without one. */
39
+    SetParameter,
40
+    /** The mode does not take parameters in any case. */
41
+    NoParameter;
42
+
43
+    /**
44
+     * Whether this mode requires a parameter to be set or not.
45
+     */
46
+    val needsParameterToSet: Boolean
47
+        get() = this != NoParameter
48
+
49
+    /**
50
+     * Whether this mode requires a parameter to be unset or not.
51
+     */
52
+    val needsParameterToUnset: Boolean
53
+        get() = this != NoParameter && this != SetParameter
54
+
55
+}

+ 19
- 0
src/main/kotlin/com/dmdirc/ktirc/model/ServerState.kt View File

@@ -1,6 +1,7 @@
1 1
 package com.dmdirc.ktirc.model
2 2
 
3 3
 import com.dmdirc.ktirc.io.CaseMapping
4
+import com.dmdirc.ktirc.util.logger
4 5
 import kotlin.reflect.KClass
5 6
 
6 7
 /**
@@ -8,6 +9,8 @@ import kotlin.reflect.KClass
8 9
  */
9 10
 class ServerState internal constructor(initialNickname: String, initialServerName: String) {
10 11
 
12
+    private val log by logger()
13
+
11 14
     /** Whether we've received the 'Welcome to IRC' (001) message. */
12 15
     internal var receivedWelcome = false
13 16
 
@@ -41,6 +44,22 @@ class ServerState internal constructor(initialNickname: String, initialServerNam
41 44
     /** The capabilities we have negotiated with the server (from IRCv3). */
42 45
     val capabilities = CapabilitiesState()
43 46
 
47
+    /**
48
+     * Determines what type of channel mode the given character is, based on the server features.
49
+     *
50
+     * If the mode isn't found, or the server hasn't provided modes, it is presumed to be [ChannelModeType.NoParameter].
51
+     */
52
+    fun channelModeType(mode: Char): ChannelModeType {
53
+        features[ServerFeature.ChannelModes]?.forEachIndexed { index, modes ->
54
+            if (mode in modes) {
55
+                return ChannelModeType.values()[index]
56
+            }
57
+        }
58
+
59
+        log.warning { "Unknown channel mode $mode, assuming it's boolean" }
60
+        return ChannelModeType.NoParameter
61
+    }
62
+
44 63
 }
45 64
 
46 65
 /**

+ 25
- 0
src/test/kotlin/com/dmdirc/ktirc/model/ChannelStateTest.kt View File

@@ -0,0 +1,25 @@
1
+package com.dmdirc.ktirc.model
2
+
3
+import org.junit.jupiter.api.Assertions.assertFalse
4
+import org.junit.jupiter.api.Assertions.assertTrue
5
+import org.junit.jupiter.api.Test
6
+
7
+internal class ChannelStateTest {
8
+
9
+    @Test
10
+    fun `ChannelModeType identifies which modes need parameters to set`() {
11
+        assertTrue(ChannelModeType.List.needsParameterToSet)
12
+        assertTrue(ChannelModeType.SetUnsetParameter.needsParameterToSet)
13
+        assertTrue(ChannelModeType.SetParameter.needsParameterToSet)
14
+        assertFalse(ChannelModeType.NoParameter.needsParameterToSet)
15
+    }
16
+
17
+    @Test
18
+    fun `ChannelModeType identifies which modes need parameters to unset`() {
19
+        assertTrue(ChannelModeType.List.needsParameterToUnset)
20
+        assertTrue(ChannelModeType.SetUnsetParameter.needsParameterToUnset)
21
+        assertFalse(ChannelModeType.SetParameter.needsParameterToUnset)
22
+        assertFalse(ChannelModeType.NoParameter.needsParameterToUnset)
23
+    }
24
+
25
+}

+ 23
- 0
src/test/kotlin/com/dmdirc/ktirc/model/ServerStateTest.kt View File

@@ -23,6 +23,29 @@ internal class ServerStateTest {
23 23
         assertEquals(ServerStatus.Disconnected, serverState.status)
24 24
     }
25 25
 
26
+    @Test
27
+    fun `returns mode type for known channel mode`() {
28
+        val serverState = ServerState("acidBurn", "")
29
+        serverState.features[ServerFeature.ChannelModes] = arrayOf("ab", "cd", "ef", "gh")
30
+        assertEquals(ChannelModeType.List, serverState.channelModeType('a'))
31
+        assertEquals(ChannelModeType.SetUnsetParameter, serverState.channelModeType('d'))
32
+        assertEquals(ChannelModeType.SetParameter, serverState.channelModeType('e'))
33
+        assertEquals(ChannelModeType.NoParameter, serverState.channelModeType('g'))
34
+    }
35
+
36
+    @Test
37
+    fun `returns NoParameter for unknown channel mode`() {
38
+        val serverState = ServerState("acidBurn", "")
39
+        serverState.features[ServerFeature.ChannelModes] = arrayOf("ab", "cd", "ef", "gh")
40
+        assertEquals(ChannelModeType.NoParameter, serverState.channelModeType('z'))
41
+    }
42
+
43
+    @Test
44
+    fun `returns NoParameter for channel modes if feature doesn't exist`() {
45
+        val serverState = ServerState("acidBurn", "")
46
+        assertEquals(ChannelModeType.NoParameter, serverState.channelModeType('b'))
47
+    }
48
+
26 49
 }
27 50
 
28 51
 internal class ModePrefixMappingTest {

Loading…
Cancel
Save