ソースを参照

Add channel mode enum, method to get mode

Groundwork for #5
tags/v0.5.0
Chris Smith 5年前
コミット
e51b1c6459

+ 29
- 0
src/main/kotlin/com/dmdirc/ktirc/model/ChannelState.kt ファイルの表示

24
  * Describes a user in a channel, and their modes.
24
  * Describes a user in a channel, and their modes.
25
  */
25
  */
26
 data class ChannelUser(var nickname: String, var modes: String = "")
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 ファイルの表示

1
 package com.dmdirc.ktirc.model
1
 package com.dmdirc.ktirc.model
2
 
2
 
3
 import com.dmdirc.ktirc.io.CaseMapping
3
 import com.dmdirc.ktirc.io.CaseMapping
4
+import com.dmdirc.ktirc.util.logger
4
 import kotlin.reflect.KClass
5
 import kotlin.reflect.KClass
5
 
6
 
6
 /**
7
 /**
8
  */
9
  */
9
 class ServerState internal constructor(initialNickname: String, initialServerName: String) {
10
 class ServerState internal constructor(initialNickname: String, initialServerName: String) {
10
 
11
 
12
+    private val log by logger()
13
+
11
     /** Whether we've received the 'Welcome to IRC' (001) message. */
14
     /** Whether we've received the 'Welcome to IRC' (001) message. */
12
     internal var receivedWelcome = false
15
     internal var receivedWelcome = false
13
 
16
 
41
     /** The capabilities we have negotiated with the server (from IRCv3). */
44
     /** The capabilities we have negotiated with the server (from IRCv3). */
42
     val capabilities = CapabilitiesState()
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 ファイルの表示

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 ファイルの表示

23
         assertEquals(ServerStatus.Disconnected, serverState.status)
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
 internal class ModePrefixMappingTest {
51
 internal class ModePrefixMappingTest {

読み込み中…
キャンセル
保存