Browse Source

Add TargetedEvent class, fix caps negotiation

After allowing multiple names we started ACKing only the preferred
name, even if the server hadn't advertised it.
tags/v0.10.0
Chris Smith 5 years ago
parent
commit
814e45aa27

+ 3
- 0
CHANGELOG View File

@@ -3,6 +3,7 @@ vNEXT (in development)
3 3
  * Batch start and end events are no longer included in BatchReceived events
4 4
  * Batches now expose complete metadata from their start event
5 5
  * Added support for labelled-replies capability and label message tags
6
+ * Added support for message-tags capability after it moved from draft
6 7
  * Added new methods for sending raw lines to the IRC server
7 8
    * send(tagMap(...), command, arguments) replaces send(line)
8 9
    * send(command, arguments) is available if no tags are to be sent
@@ -10,6 +11,8 @@ vNEXT (in development)
10 11
    * send(line) is deprecated and will be removed after v1.0.0
11 12
  * Add 'alwaysEchoMessages' behaviour that makes it easier to deal with servers
12 13
    that don't support the echo message capability
14
+ * Added TargetedEvent, a subclass of IrcEvent, for all events that are
15
+   targeted to a user or channel
13 16
  * (Internal) Added annotation to track removal of deprecated methods
14 17
 
15 18
 v0.9.0

+ 31
- 19
src/main/kotlin/com/dmdirc/ktirc/events/Events.kt View File

@@ -1,6 +1,5 @@
1 1
 package com.dmdirc.ktirc.events
2 2
 
3
-import com.dmdirc.ktirc.model.Capability
4 3
 import com.dmdirc.ktirc.model.ConnectionError
5 4
 import com.dmdirc.ktirc.model.ServerFeatureMap
6 5
 import com.dmdirc.ktirc.model.User
@@ -32,6 +31,19 @@ sealed class IrcEvent(val metadata: EventMetadata) {
32 31
 
33 32
 }
34 33
 
34
+/**
35
+ * Base class for events that are targeted to a channel or user.
36
+ */
37
+sealed class TargetedEvent(metadata: EventMetadata, val target: String) : IrcEvent(metadata) {
38
+
39
+    /** The channel (or user!) this event was targeted at. */
40
+    @Deprecated("Use target instead", replaceWith = ReplaceWith("target"))
41
+    @RemoveIn("2.0.0")
42
+    val channel: String
43
+        get() = target
44
+
45
+}
46
+
35 47
 /** Raised when a connection to the server is being established. */
36 48
 class ServerConnecting(metadata: EventMetadata) : IrcEvent(metadata)
37 49
 
@@ -57,41 +69,41 @@ class ServerFeaturesUpdated(metadata: EventMetadata, val serverFeatures: ServerF
57 69
 class PingReceived(metadata: EventMetadata, val nonce: ByteArray) : IrcEvent(metadata)
58 70
 
59 71
 /** Raised when a user joins a channel. */
60
-class ChannelJoined(metadata: EventMetadata, val user: User, val channel: String) : IrcEvent(metadata)
72
+class ChannelJoined(metadata: EventMetadata, val user: User, channel: String) : TargetedEvent(metadata, channel)
61 73
 
62 74
 /** Raised when a user leaves a channel. */
63
-class ChannelParted(metadata: EventMetadata, val user: User, val channel: String, val reason: String = "") : IrcEvent(metadata)
75
+class ChannelParted(metadata: EventMetadata, val user: User, channel: String, val reason: String = "") : TargetedEvent(metadata, channel)
64 76
 
65 77
 /** Raised when a [victim] is kicked from a channel. */
66
-class ChannelUserKicked(metadata: EventMetadata, val user: User, val channel: String, val victim: String, val reason: String = "") : IrcEvent(metadata)
78
+class ChannelUserKicked(metadata: EventMetadata, val user: User, channel: String, val victim: String, val reason: String = "") : TargetedEvent(metadata, channel)
67 79
 
68 80
 /** Raised when a user quits, and is in a channel. */
69
-class ChannelQuit(metadata: EventMetadata, val user: User, val channel: String, val reason: String = "") : IrcEvent(metadata)
81
+class ChannelQuit(metadata: EventMetadata, val user: User, channel: String, val reason: String = "") : TargetedEvent(metadata, channel)
70 82
 
71 83
 /** Raised when a user changes nickname, and is in a channel. */
72
-class ChannelNickChanged(metadata: EventMetadata, val user: User, val channel: String, val newNick: String) : IrcEvent(metadata)
84
+class ChannelNickChanged(metadata: EventMetadata, val user: User, channel: String, val newNick: String) : TargetedEvent(metadata, channel)
73 85
 
74 86
 /** Raised when a batch of the channel's member list has been received. More batches may follow. */
75
-class ChannelNamesReceived(metadata: EventMetadata, val channel: String, val names: List<String>) : IrcEvent(metadata)
87
+class ChannelNamesReceived(metadata: EventMetadata, channel: String, val names: List<String>) : TargetedEvent(metadata, channel)
76 88
 
77 89
 /** Raised when the entirety of the channel's member list has been received. */
78
-class ChannelNamesFinished(metadata: EventMetadata, val channel: String) : IrcEvent(metadata)
90
+class ChannelNamesFinished(metadata: EventMetadata, channel: String) : TargetedEvent(metadata, channel)
79 91
 
80 92
 /** Raised when a channel topic is discovered (not changed). Usually followed by [ChannelTopicMetadataDiscovered] if the [topic] is non-null. */
81
-class ChannelTopicDiscovered(metadata: EventMetadata, val channel: String, val topic: String?) : IrcEvent(metadata)
93
+class ChannelTopicDiscovered(metadata: EventMetadata, channel: String, val topic: String?) : TargetedEvent(metadata, channel)
82 94
 
83 95
 /** Raised when a channel topic's metadata is discovered. */
84
-class ChannelTopicMetadataDiscovered(metadata: EventMetadata, val channel: String, val user: User, val setTime: LocalDateTime) : IrcEvent(metadata)
96
+class ChannelTopicMetadataDiscovered(metadata: EventMetadata, channel: String, val user: User, val setTime: LocalDateTime) : TargetedEvent(metadata, channel)
85 97
 
86 98
 /**
87 99
  * Raised when a channel's topic is changed.
88 100
  *
89 101
  * If the topic has been unset (cleared), [topic] will be `null`
90 102
  */
91
-class ChannelTopicChanged(metadata: EventMetadata, val user: User, val channel: String, val topic: String?) : IrcEvent(metadata)
103
+class ChannelTopicChanged(metadata: EventMetadata, val user: User, channel: String, val topic: String?) : TargetedEvent(metadata, channel)
92 104
 
93 105
 /** Raised when a message is received. */
94
-class MessageReceived(metadata: EventMetadata, val user: User, val target: String, val message: String) : IrcEvent(metadata) {
106
+class MessageReceived(metadata: EventMetadata, val user: User, target: String, val message: String) : TargetedEvent(metadata, target) {
95 107
 
96 108
     /** The message ID of this message. */
97 109
     @Deprecated("Moved to metadata", replaceWith = ReplaceWith("metadata.messageId"))
@@ -106,10 +118,10 @@ class MessageReceived(metadata: EventMetadata, val user: User, val target: Strin
106 118
  *
107 119
  * The [user] may in fact be a server, or have a nickname of `*` while connecting.
108 120
  */
109
-class NoticeReceived(metadata: EventMetadata, val user: User, val target: String, val message: String) : IrcEvent(metadata)
121
+class NoticeReceived(metadata: EventMetadata, val user: User, target: String, val message: String) : TargetedEvent(metadata, target)
110 122
 
111 123
 /** Raised when an action is received. */
112
-class ActionReceived(metadata: EventMetadata, val user: User, val target: String, val action: String) : IrcEvent(metadata) {
124
+class ActionReceived(metadata: EventMetadata, val user: User, target: String, val action: String) : TargetedEvent(metadata, target) {
113 125
 
114 126
     /** The message ID of this action. */
115 127
     @Deprecated("Moved to metadata", replaceWith = ReplaceWith("metadata.messageId"))
@@ -120,10 +132,10 @@ class ActionReceived(metadata: EventMetadata, val user: User, val target: String
120 132
 }
121 133
 
122 134
 /** Raised when a CTCP is received. */
123
-class CtcpReceived(metadata: EventMetadata, val user: User, val target: String, val type: String, val content: String) : IrcEvent(metadata)
135
+class CtcpReceived(metadata: EventMetadata, val user: User, target: String, val type: String, val content: String) : TargetedEvent(metadata, target)
124 136
 
125 137
 /** Raised when a CTCP reply is received. */
126
-class CtcpReplyReceived(metadata: EventMetadata, val user: User, val target: String, val type: String, val content: String) : IrcEvent(metadata)
138
+class CtcpReplyReceived(metadata: EventMetadata, val user: User, target: String, val type: String, val content: String) : TargetedEvent(metadata, target)
127 139
 
128 140
 /** Raised when a user quits. */
129 141
 class UserQuit(metadata: EventMetadata, val user: User, val reason: String = "") : IrcEvent(metadata)
@@ -142,10 +154,10 @@ class UserHostChanged(metadata: EventMetadata, val user: User, val newIdent: Str
142 154
 class UserAccountChanged(metadata: EventMetadata, val user: User, val newAccount: String?) : IrcEvent(metadata)
143 155
 
144 156
 /** Raised when available server capabilities are received. More batches may follow. */
145
-class ServerCapabilitiesReceived(metadata: EventMetadata, val capabilities: Map<Capability, String>) : IrcEvent(metadata)
157
+class ServerCapabilitiesReceived(metadata: EventMetadata, val capabilities: Map<String, String>) : IrcEvent(metadata)
146 158
 
147 159
 /** Raised when our requested capabilities are acknowledged. More batches may follow. */
148
-class ServerCapabilitiesAcknowledged(metadata: EventMetadata, val capabilities: Map<Capability, String>) : IrcEvent(metadata)
160
+class ServerCapabilitiesAcknowledged(metadata: EventMetadata, val capabilities: Map<String, String>) : IrcEvent(metadata)
149 161
 
150 162
 /** Raised when the server has finished sending us capabilities. */
151 163
 class ServerCapabilitiesFinished(metadata: EventMetadata) : IrcEvent(metadata)
@@ -163,7 +175,7 @@ class MotdFinished(metadata: EventMetadata, val missing: Boolean = false) : IrcE
163 175
  * and the given modes are thus exhaustive. Otherwise, the modes are a sequence of changes to apply to the existing
164 176
  * state.
165 177
  */
166
-class ModeChanged(metadata: EventMetadata, val target: String, val modes: String, val arguments: Array<String>, val discovered: Boolean = false) : IrcEvent(metadata)
178
+class ModeChanged(metadata: EventMetadata, target: String, val modes: String, val arguments: Array<String>, val discovered: Boolean = false) : TargetedEvent(metadata, target)
167 179
 
168 180
 /** Raised when an AUTHENTICATION message is received. [argument] is `null` if the server sent an empty reply ("+") */
169 181
 class AuthenticationMessage(metadata: EventMetadata, val argument: String?) : IrcEvent(metadata)

+ 12
- 6
src/main/kotlin/com/dmdirc/ktirc/events/handlers/CapabilitiesHandler.kt View File

@@ -8,6 +8,7 @@ import com.dmdirc.ktirc.messages.sendCapabilityRequest
8 8
 import com.dmdirc.ktirc.model.CapabilitiesNegotiationState
9 9
 import com.dmdirc.ktirc.model.CapabilitiesState
10 10
 import com.dmdirc.ktirc.model.Capability
11
+import com.dmdirc.ktirc.model.capabilities
11 12
 import com.dmdirc.ktirc.sasl.fromBase64
12 13
 import com.dmdirc.ktirc.util.logger
13 14
 
@@ -26,7 +27,7 @@ internal class CapabilitiesHandler : EventHandler {
26 27
         }
27 28
     }
28 29
 
29
-    private fun handleCapabilitiesReceived(state: CapabilitiesState, capabilities: Map<Capability, String>) {
30
+    private fun handleCapabilitiesReceived(state: CapabilitiesState, capabilities: Map<String, String>) {
30 31
         state.advertisedCapabilities.putAll(capabilities)
31 32
     }
32 33
 
@@ -39,7 +40,7 @@ internal class CapabilitiesHandler : EventHandler {
39 40
                 client.sendCapabilityEnd()
40 41
             } else {
41 42
                 negotiationState = CapabilitiesNegotiationState.AWAITING_ACK
42
-                advertisedCapabilities.keys.map { it.names[0] }.let {
43
+                advertisedCapabilities.keys.let {
43 44
                     log.info { "Requesting capabilities: ${it.toList()}" }
44 45
                     client.sendCapabilityRequest(it)
45 46
                 }
@@ -47,14 +48,19 @@ internal class CapabilitiesHandler : EventHandler {
47 48
         }
48 49
     }
49 50
 
50
-    private fun handleCapabilitiesAcknowledged(client: IrcClient, capabilities: Map<Capability, String>) {
51
+    private fun handleCapabilitiesAcknowledged(client: IrcClient, ackedCapabilities: Map<String, String>) {
51 52
         // TODO: Check if everything we wanted is enabled
52 53
         with(client.serverState.capabilities) {
53
-            log.info { "Acknowledged capabilities: ${capabilities.keys.map { it::class.simpleName }.toList()}" }
54
-            enabledCapabilities.putAll(capabilities)
54
+            log.info { "Acknowledged capabilities: ${ackedCapabilities.keys.toList()}" }
55
+            ackedCapabilities.forEach { n, v ->
56
+                capabilities[n]?.let {
57
+                    enabledCapabilities[it] = v
58
+                }
59
+            }
55 60
 
56 61
             if (client.serverState.sasl.mechanisms.isNotEmpty()) {
57
-                advertisedCapabilities[Capability.SaslAuthentication]?.let { serverCaps ->
62
+                // TODO: Icky. What if SASL had multiple names?
63
+                advertisedCapabilities[Capability.SaslAuthentication.names[0]]?.let { serverCaps ->
58 64
                     if (startSaslAuth(client, if (serverCaps.isEmpty()) emptyList() else serverCaps.split(','))) {
59 65
                         return
60 66
                     }

+ 17
- 17
src/main/kotlin/com/dmdirc/ktirc/events/handlers/ChannelStateHandler.kt View File

@@ -30,19 +30,19 @@ internal class ChannelStateHandler : EventHandler {
30 30
 
31 31
     private fun handleJoin(client: IrcClient, event: ChannelJoined) {
32 32
         if (client.isLocalUser(event.user)) {
33
-            log.info { "Joined new channel: ${event.channel}" }
34
-            client.channelState += ChannelState(event.channel) { client.caseMapping }
33
+            log.info { "Joined new channel: ${event.target}" }
34
+            client.channelState += ChannelState(event.target) { client.caseMapping }
35 35
         }
36 36
 
37
-        client.channelState[event.channel]?.let { it.users += ChannelUser(event.user.nickname) }
37
+        client.channelState[event.target]?.let { it.users += ChannelUser(event.user.nickname) }
38 38
     }
39 39
 
40 40
     private fun handlePart(client: IrcClient, event: ChannelParted) {
41 41
         if (client.isLocalUser(event.user)) {
42
-            log.info { "Left channel: ${event.channel}" }
43
-            client.channelState -= event.channel
42
+            log.info { "Left channel: ${event.target}" }
43
+            client.channelState -= event.target
44 44
         } else {
45
-            client.channelState[event.channel]?.let {
45
+            client.channelState[event.target]?.let {
46 46
                 it.users -= event.user.nickname
47 47
             }
48 48
         }
@@ -50,17 +50,17 @@ internal class ChannelStateHandler : EventHandler {
50 50
 
51 51
     private fun handleKick(client: IrcClient, event: ChannelUserKicked) {
52 52
         if (client.isLocalUser(event.victim)) {
53
-            log.info { "Kicked from channel: ${event.channel}" }
54
-            client.channelState -= event.channel
53
+            log.info { "Kicked from channel: ${event.target}" }
54
+            client.channelState -= event.target
55 55
         } else {
56
-            client.channelState[event.channel]?.let {
56
+            client.channelState[event.target]?.let {
57 57
                 it.users -= event.victim
58 58
             }
59 59
         }
60 60
     }
61 61
 
62 62
     private fun handleNamesReceived(client: IrcClient, event: ChannelNamesReceived) {
63
-        val channel = client.channelState[event.channel] ?: return
63
+        val channel = client.channelState[event.target] ?: return
64 64
 
65 65
         if (!channel.receivingUserList) {
66 66
             log.finer { "Started receiving names list for ${channel.name}" }
@@ -74,9 +74,9 @@ internal class ChannelStateHandler : EventHandler {
74 74
     }
75 75
 
76 76
     private fun handleNamesFinished(client: IrcClient, event: ChannelNamesFinished) {
77
-        client.channelState[event.channel]?.let {
77
+        client.channelState[event.target]?.let {
78 78
             it.receivingUserList = false
79
-            log.finest { "Finished receiving names in ${event.channel}. Users: ${it.users.toList()}" }
79
+            log.finest { "Finished receiving names in ${event.target}. Users: ${it.users.toList()}" }
80 80
             if (client.behaviour.requestModesOnJoin && !it.modesDiscovered) {
81 81
                 client.sendModeRequest(it.name)
82 82
             }
@@ -84,7 +84,7 @@ internal class ChannelStateHandler : EventHandler {
84 84
     }
85 85
 
86 86
     private fun handleTopicDiscovered(client: IrcClient, event: ChannelTopicDiscovered) {
87
-        client.channelState[event.channel]?.let {
87
+        client.channelState[event.target]?.let {
88 88
             if (!it.topicDiscovered) {
89 89
                 it.topic = ChannelTopic(event.topic)
90 90
                 if (event.topic == null) {
@@ -95,7 +95,7 @@ internal class ChannelStateHandler : EventHandler {
95 95
     }
96 96
 
97 97
     private fun handleTopicMetadata(client: IrcClient, event: ChannelTopicMetadataDiscovered) {
98
-        client.channelState[event.channel]?.let {
98
+        client.channelState[event.target]?.let {
99 99
             if (!it.topicDiscovered) {
100 100
                 it.topic = ChannelTopic(it.topic.topic, event.user, event.setTime)
101 101
                 it.topicDiscovered = true
@@ -104,7 +104,7 @@ internal class ChannelStateHandler : EventHandler {
104 104
     }
105 105
 
106 106
     private fun handleTopicChanged(client: IrcClient, event: ChannelTopicChanged) {
107
-        client.channelState[event.channel]?.let {
107
+        client.channelState[event.target]?.let {
108 108
             it.topic = ChannelTopic(event.topic, event.user, event.metadata.time)
109 109
         }
110 110
     }
@@ -158,13 +158,13 @@ internal class ChannelStateHandler : EventHandler {
158 158
     }
159 159
 
160 160
     private fun handleQuit(client: IrcClient, event: ChannelQuit) {
161
-        client.channelState[event.channel]?.let {
161
+        client.channelState[event.target]?.let {
162 162
             it.users -= event.user.nickname
163 163
         }
164 164
     }
165 165
 
166 166
     private fun handleNickChanged(client: IrcClient, event: ChannelNickChanged) {
167
-        client.channelState[event.channel]?.let {
167
+        client.channelState[event.target]?.let {
168 168
             it.users[event.user.nickname]?.let { chanUser ->
169 169
                 chanUser.nickname = event.newNick
170 170
             }

+ 6
- 6
src/main/kotlin/com/dmdirc/ktirc/events/handlers/UserStateHandler.kt View File

@@ -20,18 +20,18 @@ internal class UserStateHandler : EventHandler {
20 20
     }
21 21
 
22 22
     private fun handleJoin(state: UserState, event: ChannelJoined) {
23
-        state.addToChannel(event.user, event.channel)
23
+        state.addToChannel(event.user, event.target)
24 24
         state.update(event.user)
25 25
     }
26 26
 
27 27
     private fun handlePart(client: IrcClient, event: ChannelParted) {
28 28
         if (client.isLocalUser(event.user)) {
29 29
             // Remove channel from all users
30
-            client.userState.forEach { it.channels -= event.channel }
30
+            client.userState.forEach { it.channels -= event.target }
31 31
             client.userState.removeIf { it.channels.isEmpty() && !client.isLocalUser(it.details) }
32 32
         } else {
33 33
             client.userState[event.user]?.channels?.let {
34
-                it -= event.channel
34
+                it -= event.target
35 35
                 if (it.isEmpty()) {
36 36
                     client.userState -= event.user
37 37
                 }
@@ -42,11 +42,11 @@ internal class UserStateHandler : EventHandler {
42 42
     private fun handleKick(client: IrcClient, event: ChannelUserKicked) {
43 43
         if (client.isLocalUser(event.victim)) {
44 44
             // Remove channel from all users
45
-            client.userState.forEach { it.channels -= event.channel }
45
+            client.userState.forEach { it.channels -= event.target }
46 46
             client.userState.removeIf { it.channels.isEmpty() && !client.isLocalUser(it.details) }
47 47
         } else {
48 48
             client.userState[event.victim]?.channels?.let {
49
-                it -= event.channel
49
+                it -= event.target
50 50
                 if (it.isEmpty()) {
51 51
                     client.userState -= event.victim
52 52
                 }
@@ -56,7 +56,7 @@ internal class UserStateHandler : EventHandler {
56 56
 
57 57
     private fun handleNamesReceived(client: IrcClient, event: ChannelNamesReceived) {
58 58
         event.toModesAndUsers(client).forEach { (_, user) ->
59
-            client.userState.addToChannel(user, event.channel)
59
+            client.userState.addToChannel(user, event.target)
60 60
             client.userState.update(user)
61 61
         }
62 62
     }

+ 1
- 1
src/main/kotlin/com/dmdirc/ktirc/messages/CapabilityProcessor.kt View File

@@ -41,7 +41,7 @@ internal class CapabilityProcessor : MessageProcessor {
41 41
             val index = cap.indexOf('=')
42 42
             val name = if (index == -1) cap else cap.substring(0 until index)
43 43
             val value = if (index == -1) "" else cap.substring(index + 1)
44
-            capabilities[name]?.let { yield(it to value) } ?: log.info { "Unknown capability: $name (value: $value)" }
44
+            capabilities[name]?.let { yield(name to value) } ?: log.info { "Unknown capability: $name (value: $value)" }
45 45
         }
46 46
     }.toMap()
47 47
 

+ 1
- 1
src/main/kotlin/com/dmdirc/ktirc/messages/MessageBuilders.kt View File

@@ -10,7 +10,7 @@ internal fun IrcClient.sendCapabilityList() = send("CAP", "LS", "302")
10 10
 internal fun IrcClient.sendCapabilityEnd() = send("CAP", "END")
11 11
 
12 12
 /** Sends a message requesting the specified caps are enabled. */
13
-internal fun IrcClient.sendCapabilityRequest(capabilities: List<String>) = send("CAP", "REQ", capabilities.joinToString(" "))
13
+internal fun IrcClient.sendCapabilityRequest(capabilities: Collection<String>) = send("CAP", "REQ", capabilities.joinToString(" "))
14 14
 
15 15
 /** Sends a request to join the given channel. */
16 16
 fun IrcClient.sendJoin(channel: String) = send("JOIN", channel)

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

@@ -11,7 +11,7 @@ class CapabilitiesState {
11 11
 
12 12
     // TODO: These should only be mutable internally
13 13
     /** The capabilities that were advertised by the server. */
14
-    val advertisedCapabilities = HashMap<Capability, String>()
14
+    val advertisedCapabilities = HashMap<String, String>()
15 15
     /** The capabilities that we have agreed to enable. */
16 16
     val enabledCapabilities = HashMap<Capability, String>()
17 17
 

+ 33
- 33
src/test/kotlin/com/dmdirc/ktirc/events/handlers/CapabilitiesHandlerTest.kt View File

@@ -39,18 +39,18 @@ internal class CapabilitiesHandlerTest {
39 39
     @Test
40 40
     fun `adds new capabilities to the state`() {
41 41
         handler.processEvent(ircClient, ServerCapabilitiesReceived(EventMetadata(TestConstants.time), hashMapOf(
42
-                Capability.EchoMessages to "",
43
-                Capability.HostsInNamesReply to "123"
42
+                Capability.EchoMessages.names[0] to "",
43
+                Capability.HostsInNamesReply.names[0] to "123"
44 44
         )))
45 45
 
46 46
         assertEquals(2, serverState.capabilities.advertisedCapabilities.size)
47
-        assertEquals("", serverState.capabilities.advertisedCapabilities[Capability.EchoMessages])
48
-        assertEquals("123", serverState.capabilities.advertisedCapabilities[Capability.HostsInNamesReply])
47
+        assertEquals("", serverState.capabilities.advertisedCapabilities[Capability.EchoMessages.names[0]])
48
+        assertEquals("123", serverState.capabilities.advertisedCapabilities[Capability.HostsInNamesReply.names[0]])
49 49
     }
50 50
 
51 51
     @Test
52 52
     fun `updates negotiation state when capabilities finished`() {
53
-        serverState.capabilities.advertisedCapabilities[Capability.EchoMessages] = ""
53
+        serverState.capabilities.advertisedCapabilities[Capability.EchoMessages.names[0]] = ""
54 54
 
55 55
         handler.processEvent(ircClient, ServerCapabilitiesFinished(EventMetadata(TestConstants.time)))
56 56
 
@@ -59,8 +59,8 @@ internal class CapabilitiesHandlerTest {
59 59
 
60 60
     @Test
61 61
     fun `sends REQ when capabilities received`() {
62
-        serverState.capabilities.advertisedCapabilities[Capability.EchoMessages] = ""
63
-        serverState.capabilities.advertisedCapabilities[Capability.AccountChangeMessages] = ""
62
+        serverState.capabilities.advertisedCapabilities[Capability.EchoMessages.names[0]] = ""
63
+        serverState.capabilities.advertisedCapabilities[Capability.AccountChangeMessages.names[0]] = ""
64 64
 
65 65
         handler.processEvent(ircClient, ServerCapabilitiesFinished(EventMetadata(TestConstants.time)))
66 66
 
@@ -84,8 +84,8 @@ internal class CapabilitiesHandlerTest {
84 84
     @Test
85 85
     fun `sends END when capabilities acknowledged and no enabled mechanisms`() {
86 86
         handler.processEvent(ircClient, ServerCapabilitiesAcknowledged(EventMetadata(TestConstants.time), hashMapOf(
87
-                Capability.EchoMessages to "",
88
-                Capability.HostsInNamesReply to ""
87
+                Capability.EchoMessages.names[0] to "",
88
+                Capability.HostsInNamesReply.names[0] to ""
89 89
         )))
90 90
 
91 91
         verify(ircClient).send("CAP", "END")
@@ -95,8 +95,8 @@ internal class CapabilitiesHandlerTest {
95 95
     fun `sends END when capabilities acknowledged and no sasl state`() {
96 96
         serverState.sasl.mechanisms.addAll(listOf(saslMech1, saslMech2, saslMech3))
97 97
         handler.processEvent(ircClient, ServerCapabilitiesAcknowledged(EventMetadata(TestConstants.time), hashMapOf(
98
-                Capability.EchoMessages to "",
99
-                Capability.HostsInNamesReply to ""
98
+                Capability.EchoMessages.names[0] to "",
99
+                Capability.HostsInNamesReply.names[0] to ""
100 100
         )))
101 101
 
102 102
         verify(ircClient).send("CAP", "END")
@@ -105,10 +105,10 @@ internal class CapabilitiesHandlerTest {
105 105
     @Test
106 106
     fun `sends END when capabilities acknowledged and no shared mechanism`() {
107 107
         serverState.sasl.mechanisms.addAll(listOf(saslMech1, saslMech2, saslMech3))
108
-        serverState.capabilities.advertisedCapabilities[Capability.SaslAuthentication] = "fake1,fake2"
108
+        serverState.capabilities.advertisedCapabilities[Capability.SaslAuthentication.names[0]] = "fake1,fake2"
109 109
         handler.processEvent(ircClient, ServerCapabilitiesAcknowledged(EventMetadata(TestConstants.time), hashMapOf(
110
-                Capability.SaslAuthentication to "",
111
-                Capability.HostsInNamesReply to ""
110
+                Capability.SaslAuthentication.names[0] to "",
111
+                Capability.HostsInNamesReply.names[0] to ""
112 112
         )))
113 113
 
114 114
         verify(ircClient).send("CAP", "END")
@@ -117,10 +117,10 @@ internal class CapabilitiesHandlerTest {
117 117
     @Test
118 118
     fun `sets current SASL mechanism when capabilities acknowledged with shared mechanism`() {
119 119
         serverState.sasl.mechanisms.addAll(listOf(saslMech1, saslMech2, saslMech3))
120
-        serverState.capabilities.advertisedCapabilities[Capability.SaslAuthentication] = "mech1,fake2"
120
+        serverState.capabilities.advertisedCapabilities[Capability.SaslAuthentication.names[0]] = "mech1,fake2"
121 121
         handler.processEvent(ircClient, ServerCapabilitiesAcknowledged(EventMetadata(TestConstants.time), hashMapOf(
122
-                Capability.SaslAuthentication to "",
123
-                Capability.HostsInNamesReply to ""
122
+                Capability.SaslAuthentication.names[0] to "",
123
+                Capability.HostsInNamesReply.names[0] to ""
124 124
         )))
125 125
 
126 126
         assertSame(saslMech1, serverState.sasl.currentMechanism)
@@ -129,10 +129,10 @@ internal class CapabilitiesHandlerTest {
129 129
     @Test
130 130
     fun `sets current SASL mechanism when capabilities acknowledged with no declared mechanisms`() {
131 131
         serverState.sasl.mechanisms.addAll(listOf(saslMech1, saslMech2, saslMech3))
132
-        serverState.capabilities.advertisedCapabilities[Capability.SaslAuthentication] = ""
132
+        serverState.capabilities.advertisedCapabilities[Capability.SaslAuthentication.names[0]] = ""
133 133
         handler.processEvent(ircClient, ServerCapabilitiesAcknowledged(EventMetadata(TestConstants.time), hashMapOf(
134
-                Capability.SaslAuthentication to "",
135
-                Capability.HostsInNamesReply to ""
134
+                Capability.SaslAuthentication.names[0] to "",
135
+                Capability.HostsInNamesReply.names[0] to ""
136 136
         )))
137 137
 
138 138
         assertSame(saslMech3, serverState.sasl.currentMechanism)
@@ -141,10 +141,10 @@ internal class CapabilitiesHandlerTest {
141 141
     @Test
142 142
     fun `sends authenticate when capabilities acknowledged with shared mechanism`() {
143 143
         serverState.sasl.mechanisms.addAll(listOf(saslMech1, saslMech2, saslMech3))
144
-        serverState.capabilities.advertisedCapabilities[Capability.SaslAuthentication] = "mech1,fake2"
144
+        serverState.capabilities.advertisedCapabilities[Capability.SaslAuthentication.names[0]] = "mech1,fake2"
145 145
         handler.processEvent(ircClient, ServerCapabilitiesAcknowledged(EventMetadata(TestConstants.time), hashMapOf(
146
-                Capability.SaslAuthentication to "",
147
-                Capability.HostsInNamesReply to ""
146
+                Capability.SaslAuthentication.names[0] to "",
147
+                Capability.HostsInNamesReply.names[0] to ""
148 148
         )))
149 149
 
150 150
         verify(ircClient).send("AUTHENTICATE", "mech1")
@@ -153,10 +153,10 @@ internal class CapabilitiesHandlerTest {
153 153
     @Test
154 154
     fun `sends authenticate when capabilities acknowledged with no declared mechanisms`() {
155 155
         serverState.sasl.mechanisms.addAll(listOf(saslMech1, saslMech2, saslMech3))
156
-        serverState.capabilities.advertisedCapabilities[Capability.SaslAuthentication] = ""
156
+        serverState.capabilities.advertisedCapabilities[Capability.SaslAuthentication.names[0]] = ""
157 157
         handler.processEvent(ircClient, ServerCapabilitiesAcknowledged(EventMetadata(TestConstants.time), hashMapOf(
158
-                Capability.SaslAuthentication to "",
159
-                Capability.HostsInNamesReply to ""
158
+                Capability.SaslAuthentication.names[0] to "",
159
+                Capability.HostsInNamesReply.names[0] to ""
160 160
         )))
161 161
 
162 162
         verify(ircClient).send("AUTHENTICATE", "mech3")
@@ -165,10 +165,10 @@ internal class CapabilitiesHandlerTest {
165 165
     @Test
166 166
     fun `updates negotiation state when capabilities acknowledged with shared mechanism`() {
167 167
         serverState.sasl.mechanisms.addAll(listOf(saslMech1, saslMech2, saslMech3))
168
-        serverState.capabilities.advertisedCapabilities[Capability.SaslAuthentication] = "mech1,fake2"
168
+        serverState.capabilities.advertisedCapabilities[Capability.SaslAuthentication.names[0]] = "mech1,fake2"
169 169
         handler.processEvent(ircClient, ServerCapabilitiesAcknowledged(EventMetadata(TestConstants.time), hashMapOf(
170
-                Capability.SaslAuthentication to "",
171
-                Capability.HostsInNamesReply to ""
170
+                Capability.SaslAuthentication.names[0] to "",
171
+                Capability.HostsInNamesReply.names[0] to ""
172 172
         )))
173 173
 
174 174
         assertEquals(CapabilitiesNegotiationState.AUTHENTICATING, serverState.capabilities.negotiationState)
@@ -177,8 +177,8 @@ internal class CapabilitiesHandlerTest {
177 177
     @Test
178 178
     fun `updates negotiation state when capabilities acknowledged`() {
179 179
         handler.processEvent(ircClient, ServerCapabilitiesAcknowledged(EventMetadata(TestConstants.time), hashMapOf(
180
-                Capability.EchoMessages to "",
181
-                Capability.HostsInNamesReply to "123"
180
+                Capability.EchoMessages.names[0] to "",
181
+                Capability.HostsInNamesReply.names[0] to "123"
182 182
         )))
183 183
 
184 184
         assertEquals(CapabilitiesNegotiationState.FINISHED, serverState.capabilities.negotiationState)
@@ -187,8 +187,8 @@ internal class CapabilitiesHandlerTest {
187 187
     @Test
188 188
     fun `stores enabled caps when capabilities acknowledged`() {
189 189
         handler.processEvent(ircClient, ServerCapabilitiesAcknowledged(EventMetadata(TestConstants.time), hashMapOf(
190
-                Capability.EchoMessages to "",
191
-                Capability.HostsInNamesReply to "123"
190
+                Capability.EchoMessages.names[0] to "",
191
+                Capability.HostsInNamesReply.names[0] to "123"
192 192
         )))
193 193
 
194 194
         assertEquals(2, serverState.capabilities.enabledCapabilities.size)

+ 2
- 2
src/test/kotlin/com/dmdirc/ktirc/events/mutators/ChannelFanOutMutatorTest.kt View File

@@ -55,7 +55,7 @@ internal class ChannelFanOutMutatorTest {
55 55
                 Assertions.assertEquals(TestConstants.time, it.metadata.time)
56 56
                 Assertions.assertEquals("zerocool", it.user.nickname)
57 57
                 Assertions.assertEquals("Hack the planet!", it.reason)
58
-                names.add(it.channel)
58
+                names.add(it.target)
59 59
             }
60 60
         }
61 61
 
@@ -91,7 +91,7 @@ internal class ChannelFanOutMutatorTest {
91 91
                 Assertions.assertEquals(TestConstants.time, it.metadata.time)
92 92
                 Assertions.assertEquals("zerocool", it.user.nickname)
93 93
                 Assertions.assertEquals("zer0c00l", it.newNick)
94
-                names.add(it.channel)
94
+                names.add(it.target)
95 95
             }
96 96
         }
97 97
 

+ 9
- 10
src/test/kotlin/com/dmdirc/ktirc/messages/CapabilityProcessorTest.kt View File

@@ -3,7 +3,6 @@ package com.dmdirc.ktirc.messages
3 3
 import com.dmdirc.ktirc.events.ServerCapabilitiesAcknowledged
4 4
 import com.dmdirc.ktirc.events.ServerCapabilitiesFinished
5 5
 import com.dmdirc.ktirc.events.ServerCapabilitiesReceived
6
-import com.dmdirc.ktirc.model.Capability
7 6
 import com.dmdirc.ktirc.model.IrcMessage
8 7
 import com.dmdirc.ktirc.params
9 8
 import org.junit.jupiter.api.Assertions.assertEquals
@@ -36,8 +35,8 @@ internal class CapabilityProcessorTest {
36 35
 
37 36
         val receivedEvent = events.filterIsInstance<ServerCapabilitiesReceived>()[0]
38 37
         assertEquals(2, receivedEvent.capabilities.size)
39
-        assertTrue(Capability.HostChangeMessages in receivedEvent.capabilities)
40
-        assertTrue(Capability.AccountAndRealNameInJoinMessages in receivedEvent.capabilities)
38
+        assertTrue("chghost" in receivedEvent.capabilities)
39
+        assertTrue("extended-join" in receivedEvent.capabilities)
41 40
     }
42 41
 
43 42
     @Test
@@ -46,8 +45,8 @@ internal class CapabilityProcessorTest {
46 45
 
47 46
         val receivedEvent = events.filterIsInstance<ServerCapabilitiesReceived>()[0]
48 47
         assertEquals(2, receivedEvent.capabilities.size)
49
-        assertEquals("test123", receivedEvent.capabilities[Capability.HostChangeMessages])
50
-        assertEquals("abc=def", receivedEvent.capabilities[Capability.AccountAndRealNameInJoinMessages])
48
+        assertEquals("test123", receivedEvent.capabilities["chghost"])
49
+        assertEquals("abc=def", receivedEvent.capabilities["extended-join"])
51 50
     }
52 51
 
53 52
     @Test
@@ -56,7 +55,7 @@ internal class CapabilityProcessorTest {
56 55
 
57 56
         val receivedEvent = events.filterIsInstance<ServerCapabilitiesReceived>()[0]
58 57
         assertEquals(1, receivedEvent.capabilities.size)
59
-        assertEquals("456", receivedEvent.capabilities[Capability.HostChangeMessages])
58
+        assertEquals("456", receivedEvent.capabilities["chghost"])
60 59
     }
61 60
 
62 61
 
@@ -66,8 +65,8 @@ internal class CapabilityProcessorTest {
66 65
 
67 66
         val receivedEvent = events.filterIsInstance<ServerCapabilitiesReceived>()[0]
68 67
         assertEquals(2, receivedEvent.capabilities.size)
69
-        assertTrue(Capability.HostChangeMessages in receivedEvent.capabilities)
70
-        assertTrue(Capability.AccountAndRealNameInJoinMessages in receivedEvent.capabilities)
68
+        assertTrue("chghost" in receivedEvent.capabilities)
69
+        assertTrue("extended-join" in receivedEvent.capabilities)
71 70
     }
72 71
 
73 72
     @Test
@@ -84,8 +83,8 @@ internal class CapabilityProcessorTest {
84 83
 
85 84
         val receivedEvent = events.filterIsInstance<ServerCapabilitiesAcknowledged>()[0]
86 85
         assertEquals(2, receivedEvent.capabilities.size)
87
-        assertEquals("test123", receivedEvent.capabilities[Capability.HostChangeMessages])
88
-        assertEquals("abc=def", receivedEvent.capabilities[Capability.AccountAndRealNameInJoinMessages])
86
+        assertEquals("test123", receivedEvent.capabilities["chghost"])
87
+        assertEquals("abc=def", receivedEvent.capabilities["extended-join"])
89 88
     }
90 89
 
91 90
 }

+ 3
- 3
src/test/kotlin/com/dmdirc/ktirc/messages/JoinProcessorTest.kt View File

@@ -24,7 +24,7 @@ internal class JoinProcessorTest {
24 24
 
25 25
         assertEquals(TestConstants.time, events[0].metadata.time)
26 26
         assertEquals(User("acidburn", "libby", "root.localhost"), events[0].user)
27
-        assertEquals("#crashandburn", events[0].channel)
27
+        assertEquals("#crashandburn", events[0].target)
28 28
     }
29 29
 
30 30
     @Test
@@ -42,7 +42,7 @@ internal class JoinProcessorTest {
42 42
 
43 43
         assertEquals(TestConstants.time, events[0].metadata.time)
44 44
         assertEquals(User("acidburn", "libby", "root.localhost", account = "acidBurn", realName = "Libby"), events[0].user)
45
-        assertEquals("#crashandburn", events[0].channel)
45
+        assertEquals("#crashandburn", events[0].target)
46 46
     }
47 47
 
48 48
     @Test
@@ -53,7 +53,7 @@ internal class JoinProcessorTest {
53 53
 
54 54
         assertEquals(TestConstants.time, events[0].metadata.time)
55 55
         assertEquals(User("acidburn", "libby", "root.localhost", realName = "Libby"), events[0].user)
56
-        assertEquals("#crashandburn", events[0].channel)
56
+        assertEquals("#crashandburn", events[0].target)
57 57
     }
58 58
 
59 59
 }

+ 2
- 2
src/test/kotlin/com/dmdirc/ktirc/messages/KickProcessorTest.kt View File

@@ -24,7 +24,7 @@ internal class KickProcessorTest {
24 24
 
25 25
         assertEquals(TestConstants.time, events[0].metadata.time)
26 26
         assertEquals(User("acidburn", "libby", "root.localhost"), events[0].user)
27
-        assertEquals("#crashandburn", events[0].channel)
27
+        assertEquals("#crashandburn", events[0].target)
28 28
         assertEquals("zeroCool", events[0].victim)
29 29
         assertEquals("", events[0].reason)
30 30
     }
@@ -37,7 +37,7 @@ internal class KickProcessorTest {
37 37
 
38 38
         assertEquals(TestConstants.time, events[0].metadata.time)
39 39
         assertEquals(User("acidburn", "libby", "root.localhost"), events[0].user)
40
-        assertEquals("#crashandburn", events[0].channel)
40
+        assertEquals("#crashandburn", events[0].target)
41 41
         assertEquals("zeroCool", events[0].victim)
42 42
         assertEquals("Hack the planet!", events[0].reason)
43 43
     }

+ 2
- 2
src/test/kotlin/com/dmdirc/ktirc/messages/NamesProcessorTest.kt View File

@@ -16,7 +16,7 @@ internal class NamesProcessorTest {
16 16
         val events = processor.process(IrcMessage(emptyMap(), ":the.gibson".toByteArray(), "366", params("AcidBurn", "#root", "End of /NAMES list")))
17 17
 
18 18
         assertEquals(1, events.size)
19
-        assertEquals("#root", (events[0] as ChannelNamesFinished).channel)
19
+        assertEquals("#root", (events[0] as ChannelNamesFinished).target)
20 20
     }
21 21
 
22 22
     @Test
@@ -25,7 +25,7 @@ internal class NamesProcessorTest {
25 25
 
26 26
         assertEquals(1, events.size)
27 27
         val event = events[0] as ChannelNamesReceived
28
-        assertEquals("#root", event.channel)
28
+        assertEquals("#root", event.target)
29 29
         assertEquals(listOf("AcidBurn", "@ZeroCool", "+ThePlague"), event.names)
30 30
     }
31 31
 

+ 2
- 2
src/test/kotlin/com/dmdirc/ktirc/messages/PartProcessorTest.kt View File

@@ -24,7 +24,7 @@ internal class PartProcessorTest {
24 24
 
25 25
         assertEquals(TestConstants.time, events[0].metadata.time)
26 26
         assertEquals(User("acidburn", "libby", "root.localhost"), events[0].user)
27
-        assertEquals("#crashandburn", events[0].channel)
27
+        assertEquals("#crashandburn", events[0].target)
28 28
         assertEquals("", events[0].reason)
29 29
     }
30 30
 
@@ -36,7 +36,7 @@ internal class PartProcessorTest {
36 36
 
37 37
         assertEquals(TestConstants.time, events[0].metadata.time)
38 38
         assertEquals(User("acidburn", "libby", "root.localhost"), events[0].user)
39
-        assertEquals("#crashandburn", events[0].channel)
39
+        assertEquals("#crashandburn", events[0].target)
40 40
         assertEquals("Hack the planet!", events[0].reason)
41 41
     }
42 42
 

+ 4
- 4
src/test/kotlin/com/dmdirc/ktirc/messages/TopicProcessorTest.kt View File

@@ -30,7 +30,7 @@ internal class TopicProcessorTest {
30 30
 
31 31
         val event = events[0] as ChannelTopicDiscovered
32 32
         assertEquals(TestConstants.time, event.metadata.time)
33
-        assertEquals("#thegibson", event.channel)
33
+        assertEquals("#thegibson", event.target)
34 34
         assertEquals("Hack the planet!", event.topic)
35 35
     }
36 36
 
@@ -41,7 +41,7 @@ internal class TopicProcessorTest {
41 41
 
42 42
         val event = events[0] as ChannelTopicDiscovered
43 43
         assertEquals(TestConstants.time, event.metadata.time)
44
-        assertEquals("#thegibson", event.channel)
44
+        assertEquals("#thegibson", event.target)
45 45
         assertNull(event.topic)
46 46
     }
47 47
 
@@ -52,7 +52,7 @@ internal class TopicProcessorTest {
52 52
 
53 53
         val event = events[0] as ChannelTopicMetadataDiscovered
54 54
         assertEquals(TestConstants.time, event.metadata.time)
55
-        assertEquals("#thegibson", event.channel)
55
+        assertEquals("#thegibson", event.target)
56 56
         assertEquals("zeroCool", event.user.nickname)
57 57
         assertEquals(TestConstants.otherTime, event.setTime)
58 58
     }
@@ -65,7 +65,7 @@ internal class TopicProcessorTest {
65 65
         val event = events[0] as ChannelTopicChanged
66 66
         assertEquals(TestConstants.time, event.metadata.time)
67 67
         assertEquals(User("acidBurn", "acidB", "the.gibson"), event.user)
68
-        assertEquals("#thegibson", event.channel)
68
+        assertEquals("#thegibson", event.target)
69 69
         assertEquals("Hack the planet!", event.topic)
70 70
     }
71 71
 

+ 1
- 1
src/test/kotlin/com/dmdirc/ktirc/model/CapabilitiesStateTest.kt View File

@@ -13,7 +13,7 @@ internal class CapabilitiesStateTest {
13 13
 
14 14
     @Test
15 15
     fun `reset clears all state`() = with(CapabilitiesState()) {
16
-        advertisedCapabilities[Capability.SaslAuthentication] = "foo"
16
+        advertisedCapabilities["sasl"] = "foo"
17 17
         enabledCapabilities[Capability.SaslAuthentication] = "foo"
18 18
         negotiationState = CapabilitiesNegotiationState.FINISHED
19 19
 

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

@@ -67,7 +67,7 @@ internal class ServerStateTest {
67 67
         localNickname = "acidBurn3"
68 68
         serverName = "root.the.gibson"
69 69
         features[ServerFeature.Network] = "gibson"
70
-        capabilities.advertisedCapabilities[Capability.SaslAuthentication] = "sure"
70
+        capabilities.advertisedCapabilities["sasl"] = "sure"
71 71
         sasl.saslBuffer = "in progress"
72 72
         batches["batch"] = Batch("type", emptyList(), EventMetadata(TestConstants.time))
73 73
         labelCounter.set(100)

Loading…
Cancel
Save