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

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

1
 package com.dmdirc.ktirc.events
1
 package com.dmdirc.ktirc.events
2
 
2
 
3
-import com.dmdirc.ktirc.model.Capability
4
 import com.dmdirc.ktirc.model.ConnectionError
3
 import com.dmdirc.ktirc.model.ConnectionError
5
 import com.dmdirc.ktirc.model.ServerFeatureMap
4
 import com.dmdirc.ktirc.model.ServerFeatureMap
6
 import com.dmdirc.ktirc.model.User
5
 import com.dmdirc.ktirc.model.User
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
 /** Raised when a connection to the server is being established. */
47
 /** Raised when a connection to the server is being established. */
36
 class ServerConnecting(metadata: EventMetadata) : IrcEvent(metadata)
48
 class ServerConnecting(metadata: EventMetadata) : IrcEvent(metadata)
37
 
49
 
57
 class PingReceived(metadata: EventMetadata, val nonce: ByteArray) : IrcEvent(metadata)
69
 class PingReceived(metadata: EventMetadata, val nonce: ByteArray) : IrcEvent(metadata)
58
 
70
 
59
 /** Raised when a user joins a channel. */
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
 /** Raised when a user leaves a channel. */
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
 /** Raised when a [victim] is kicked from a channel. */
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
 /** Raised when a user quits, and is in a channel. */
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
 /** Raised when a user changes nickname, and is in a channel. */
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
 /** Raised when a batch of the channel's member list has been received. More batches may follow. */
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
 /** Raised when the entirety of the channel's member list has been received. */
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
 /** Raised when a channel topic is discovered (not changed). Usually followed by [ChannelTopicMetadataDiscovered] if the [topic] is non-null. */
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
 /** Raised when a channel topic's metadata is discovered. */
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
  * Raised when a channel's topic is changed.
99
  * Raised when a channel's topic is changed.
88
  *
100
  *
89
  * If the topic has been unset (cleared), [topic] will be `null`
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
 /** Raised when a message is received. */
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
     /** The message ID of this message. */
108
     /** The message ID of this message. */
97
     @Deprecated("Moved to metadata", replaceWith = ReplaceWith("metadata.messageId"))
109
     @Deprecated("Moved to metadata", replaceWith = ReplaceWith("metadata.messageId"))
106
  *
118
  *
107
  * The [user] may in fact be a server, or have a nickname of `*` while connecting.
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
 /** Raised when an action is received. */
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
     /** The message ID of this action. */
126
     /** The message ID of this action. */
115
     @Deprecated("Moved to metadata", replaceWith = ReplaceWith("metadata.messageId"))
127
     @Deprecated("Moved to metadata", replaceWith = ReplaceWith("metadata.messageId"))
120
 }
132
 }
121
 
133
 
122
 /** Raised when a CTCP is received. */
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
 /** Raised when a CTCP reply is received. */
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
 /** Raised when a user quits. */
140
 /** Raised when a user quits. */
129
 class UserQuit(metadata: EventMetadata, val user: User, val reason: String = "") : IrcEvent(metadata)
141
 class UserQuit(metadata: EventMetadata, val user: User, val reason: String = "") : IrcEvent(metadata)
142
 class UserAccountChanged(metadata: EventMetadata, val user: User, val newAccount: String?) : IrcEvent(metadata)
154
 class UserAccountChanged(metadata: EventMetadata, val user: User, val newAccount: String?) : IrcEvent(metadata)
143
 
155
 
144
 /** Raised when available server capabilities are received. More batches may follow. */
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
 /** Raised when our requested capabilities are acknowledged. More batches may follow. */
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
 /** Raised when the server has finished sending us capabilities. */
162
 /** Raised when the server has finished sending us capabilities. */
151
 class ServerCapabilitiesFinished(metadata: EventMetadata) : IrcEvent(metadata)
163
 class ServerCapabilitiesFinished(metadata: EventMetadata) : IrcEvent(metadata)
163
  * and the given modes are thus exhaustive. Otherwise, the modes are a sequence of changes to apply to the existing
175
  * and the given modes are thus exhaustive. Otherwise, the modes are a sequence of changes to apply to the existing
164
  * state.
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
 /** Raised when an AUTHENTICATION message is received. [argument] is `null` if the server sent an empty reply ("+") */
180
 /** Raised when an AUTHENTICATION message is received. [argument] is `null` if the server sent an empty reply ("+") */
169
 class AuthenticationMessage(metadata: EventMetadata, val argument: String?) : IrcEvent(metadata)
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
 import com.dmdirc.ktirc.model.CapabilitiesNegotiationState
8
 import com.dmdirc.ktirc.model.CapabilitiesNegotiationState
9
 import com.dmdirc.ktirc.model.CapabilitiesState
9
 import com.dmdirc.ktirc.model.CapabilitiesState
10
 import com.dmdirc.ktirc.model.Capability
10
 import com.dmdirc.ktirc.model.Capability
11
+import com.dmdirc.ktirc.model.capabilities
11
 import com.dmdirc.ktirc.sasl.fromBase64
12
 import com.dmdirc.ktirc.sasl.fromBase64
12
 import com.dmdirc.ktirc.util.logger
13
 import com.dmdirc.ktirc.util.logger
13
 
14
 
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
         state.advertisedCapabilities.putAll(capabilities)
31
         state.advertisedCapabilities.putAll(capabilities)
31
     }
32
     }
32
 
33
 
39
                 client.sendCapabilityEnd()
40
                 client.sendCapabilityEnd()
40
             } else {
41
             } else {
41
                 negotiationState = CapabilitiesNegotiationState.AWAITING_ACK
42
                 negotiationState = CapabilitiesNegotiationState.AWAITING_ACK
42
-                advertisedCapabilities.keys.map { it.names[0] }.let {
43
+                advertisedCapabilities.keys.let {
43
                     log.info { "Requesting capabilities: ${it.toList()}" }
44
                     log.info { "Requesting capabilities: ${it.toList()}" }
44
                     client.sendCapabilityRequest(it)
45
                     client.sendCapabilityRequest(it)
45
                 }
46
                 }
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
         // TODO: Check if everything we wanted is enabled
52
         // TODO: Check if everything we wanted is enabled
52
         with(client.serverState.capabilities) {
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
             if (client.serverState.sasl.mechanisms.isNotEmpty()) {
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
                     if (startSaslAuth(client, if (serverCaps.isEmpty()) emptyList() else serverCaps.split(','))) {
64
                     if (startSaslAuth(client, if (serverCaps.isEmpty()) emptyList() else serverCaps.split(','))) {
59
                         return
65
                         return
60
                     }
66
                     }

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

30
 
30
 
31
     private fun handleJoin(client: IrcClient, event: ChannelJoined) {
31
     private fun handleJoin(client: IrcClient, event: ChannelJoined) {
32
         if (client.isLocalUser(event.user)) {
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
     private fun handlePart(client: IrcClient, event: ChannelParted) {
40
     private fun handlePart(client: IrcClient, event: ChannelParted) {
41
         if (client.isLocalUser(event.user)) {
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
         } else {
44
         } else {
45
-            client.channelState[event.channel]?.let {
45
+            client.channelState[event.target]?.let {
46
                 it.users -= event.user.nickname
46
                 it.users -= event.user.nickname
47
             }
47
             }
48
         }
48
         }
50
 
50
 
51
     private fun handleKick(client: IrcClient, event: ChannelUserKicked) {
51
     private fun handleKick(client: IrcClient, event: ChannelUserKicked) {
52
         if (client.isLocalUser(event.victim)) {
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
         } else {
55
         } else {
56
-            client.channelState[event.channel]?.let {
56
+            client.channelState[event.target]?.let {
57
                 it.users -= event.victim
57
                 it.users -= event.victim
58
             }
58
             }
59
         }
59
         }
60
     }
60
     }
61
 
61
 
62
     private fun handleNamesReceived(client: IrcClient, event: ChannelNamesReceived) {
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
         if (!channel.receivingUserList) {
65
         if (!channel.receivingUserList) {
66
             log.finer { "Started receiving names list for ${channel.name}" }
66
             log.finer { "Started receiving names list for ${channel.name}" }
74
     }
74
     }
75
 
75
 
76
     private fun handleNamesFinished(client: IrcClient, event: ChannelNamesFinished) {
76
     private fun handleNamesFinished(client: IrcClient, event: ChannelNamesFinished) {
77
-        client.channelState[event.channel]?.let {
77
+        client.channelState[event.target]?.let {
78
             it.receivingUserList = false
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
             if (client.behaviour.requestModesOnJoin && !it.modesDiscovered) {
80
             if (client.behaviour.requestModesOnJoin && !it.modesDiscovered) {
81
                 client.sendModeRequest(it.name)
81
                 client.sendModeRequest(it.name)
82
             }
82
             }
84
     }
84
     }
85
 
85
 
86
     private fun handleTopicDiscovered(client: IrcClient, event: ChannelTopicDiscovered) {
86
     private fun handleTopicDiscovered(client: IrcClient, event: ChannelTopicDiscovered) {
87
-        client.channelState[event.channel]?.let {
87
+        client.channelState[event.target]?.let {
88
             if (!it.topicDiscovered) {
88
             if (!it.topicDiscovered) {
89
                 it.topic = ChannelTopic(event.topic)
89
                 it.topic = ChannelTopic(event.topic)
90
                 if (event.topic == null) {
90
                 if (event.topic == null) {
95
     }
95
     }
96
 
96
 
97
     private fun handleTopicMetadata(client: IrcClient, event: ChannelTopicMetadataDiscovered) {
97
     private fun handleTopicMetadata(client: IrcClient, event: ChannelTopicMetadataDiscovered) {
98
-        client.channelState[event.channel]?.let {
98
+        client.channelState[event.target]?.let {
99
             if (!it.topicDiscovered) {
99
             if (!it.topicDiscovered) {
100
                 it.topic = ChannelTopic(it.topic.topic, event.user, event.setTime)
100
                 it.topic = ChannelTopic(it.topic.topic, event.user, event.setTime)
101
                 it.topicDiscovered = true
101
                 it.topicDiscovered = true
104
     }
104
     }
105
 
105
 
106
     private fun handleTopicChanged(client: IrcClient, event: ChannelTopicChanged) {
106
     private fun handleTopicChanged(client: IrcClient, event: ChannelTopicChanged) {
107
-        client.channelState[event.channel]?.let {
107
+        client.channelState[event.target]?.let {
108
             it.topic = ChannelTopic(event.topic, event.user, event.metadata.time)
108
             it.topic = ChannelTopic(event.topic, event.user, event.metadata.time)
109
         }
109
         }
110
     }
110
     }
158
     }
158
     }
159
 
159
 
160
     private fun handleQuit(client: IrcClient, event: ChannelQuit) {
160
     private fun handleQuit(client: IrcClient, event: ChannelQuit) {
161
-        client.channelState[event.channel]?.let {
161
+        client.channelState[event.target]?.let {
162
             it.users -= event.user.nickname
162
             it.users -= event.user.nickname
163
         }
163
         }
164
     }
164
     }
165
 
165
 
166
     private fun handleNickChanged(client: IrcClient, event: ChannelNickChanged) {
166
     private fun handleNickChanged(client: IrcClient, event: ChannelNickChanged) {
167
-        client.channelState[event.channel]?.let {
167
+        client.channelState[event.target]?.let {
168
             it.users[event.user.nickname]?.let { chanUser ->
168
             it.users[event.user.nickname]?.let { chanUser ->
169
                 chanUser.nickname = event.newNick
169
                 chanUser.nickname = event.newNick
170
             }
170
             }

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

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

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

41
             val index = cap.indexOf('=')
41
             val index = cap.indexOf('=')
42
             val name = if (index == -1) cap else cap.substring(0 until index)
42
             val name = if (index == -1) cap else cap.substring(0 until index)
43
             val value = if (index == -1) "" else cap.substring(index + 1)
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
     }.toMap()
46
     }.toMap()
47
 
47
 

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

10
 internal fun IrcClient.sendCapabilityEnd() = send("CAP", "END")
10
 internal fun IrcClient.sendCapabilityEnd() = send("CAP", "END")
11
 
11
 
12
 /** Sends a message requesting the specified caps are enabled. */
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
 /** Sends a request to join the given channel. */
15
 /** Sends a request to join the given channel. */
16
 fun IrcClient.sendJoin(channel: String) = send("JOIN", channel)
16
 fun IrcClient.sendJoin(channel: String) = send("JOIN", channel)

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

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

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

39
     @Test
39
     @Test
40
     fun `adds new capabilities to the state`() {
40
     fun `adds new capabilities to the state`() {
41
         handler.processEvent(ircClient, ServerCapabilitiesReceived(EventMetadata(TestConstants.time), hashMapOf(
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
         assertEquals(2, serverState.capabilities.advertisedCapabilities.size)
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
     @Test
51
     @Test
52
     fun `updates negotiation state when capabilities finished`() {
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
         handler.processEvent(ircClient, ServerCapabilitiesFinished(EventMetadata(TestConstants.time)))
55
         handler.processEvent(ircClient, ServerCapabilitiesFinished(EventMetadata(TestConstants.time)))
56
 
56
 
59
 
59
 
60
     @Test
60
     @Test
61
     fun `sends REQ when capabilities received`() {
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
         handler.processEvent(ircClient, ServerCapabilitiesFinished(EventMetadata(TestConstants.time)))
65
         handler.processEvent(ircClient, ServerCapabilitiesFinished(EventMetadata(TestConstants.time)))
66
 
66
 
84
     @Test
84
     @Test
85
     fun `sends END when capabilities acknowledged and no enabled mechanisms`() {
85
     fun `sends END when capabilities acknowledged and no enabled mechanisms`() {
86
         handler.processEvent(ircClient, ServerCapabilitiesAcknowledged(EventMetadata(TestConstants.time), hashMapOf(
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
         verify(ircClient).send("CAP", "END")
91
         verify(ircClient).send("CAP", "END")
95
     fun `sends END when capabilities acknowledged and no sasl state`() {
95
     fun `sends END when capabilities acknowledged and no sasl state`() {
96
         serverState.sasl.mechanisms.addAll(listOf(saslMech1, saslMech2, saslMech3))
96
         serverState.sasl.mechanisms.addAll(listOf(saslMech1, saslMech2, saslMech3))
97
         handler.processEvent(ircClient, ServerCapabilitiesAcknowledged(EventMetadata(TestConstants.time), hashMapOf(
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
         verify(ircClient).send("CAP", "END")
102
         verify(ircClient).send("CAP", "END")
105
     @Test
105
     @Test
106
     fun `sends END when capabilities acknowledged and no shared mechanism`() {
106
     fun `sends END when capabilities acknowledged and no shared mechanism`() {
107
         serverState.sasl.mechanisms.addAll(listOf(saslMech1, saslMech2, saslMech3))
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
         handler.processEvent(ircClient, ServerCapabilitiesAcknowledged(EventMetadata(TestConstants.time), hashMapOf(
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
         verify(ircClient).send("CAP", "END")
114
         verify(ircClient).send("CAP", "END")
117
     @Test
117
     @Test
118
     fun `sets current SASL mechanism when capabilities acknowledged with shared mechanism`() {
118
     fun `sets current SASL mechanism when capabilities acknowledged with shared mechanism`() {
119
         serverState.sasl.mechanisms.addAll(listOf(saslMech1, saslMech2, saslMech3))
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
         handler.processEvent(ircClient, ServerCapabilitiesAcknowledged(EventMetadata(TestConstants.time), hashMapOf(
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
         assertSame(saslMech1, serverState.sasl.currentMechanism)
126
         assertSame(saslMech1, serverState.sasl.currentMechanism)
129
     @Test
129
     @Test
130
     fun `sets current SASL mechanism when capabilities acknowledged with no declared mechanisms`() {
130
     fun `sets current SASL mechanism when capabilities acknowledged with no declared mechanisms`() {
131
         serverState.sasl.mechanisms.addAll(listOf(saslMech1, saslMech2, saslMech3))
131
         serverState.sasl.mechanisms.addAll(listOf(saslMech1, saslMech2, saslMech3))
132
-        serverState.capabilities.advertisedCapabilities[Capability.SaslAuthentication] = ""
132
+        serverState.capabilities.advertisedCapabilities[Capability.SaslAuthentication.names[0]] = ""
133
         handler.processEvent(ircClient, ServerCapabilitiesAcknowledged(EventMetadata(TestConstants.time), hashMapOf(
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
         assertSame(saslMech3, serverState.sasl.currentMechanism)
138
         assertSame(saslMech3, serverState.sasl.currentMechanism)
141
     @Test
141
     @Test
142
     fun `sends authenticate when capabilities acknowledged with shared mechanism`() {
142
     fun `sends authenticate when capabilities acknowledged with shared mechanism`() {
143
         serverState.sasl.mechanisms.addAll(listOf(saslMech1, saslMech2, saslMech3))
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
         handler.processEvent(ircClient, ServerCapabilitiesAcknowledged(EventMetadata(TestConstants.time), hashMapOf(
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
         verify(ircClient).send("AUTHENTICATE", "mech1")
150
         verify(ircClient).send("AUTHENTICATE", "mech1")
153
     @Test
153
     @Test
154
     fun `sends authenticate when capabilities acknowledged with no declared mechanisms`() {
154
     fun `sends authenticate when capabilities acknowledged with no declared mechanisms`() {
155
         serverState.sasl.mechanisms.addAll(listOf(saslMech1, saslMech2, saslMech3))
155
         serverState.sasl.mechanisms.addAll(listOf(saslMech1, saslMech2, saslMech3))
156
-        serverState.capabilities.advertisedCapabilities[Capability.SaslAuthentication] = ""
156
+        serverState.capabilities.advertisedCapabilities[Capability.SaslAuthentication.names[0]] = ""
157
         handler.processEvent(ircClient, ServerCapabilitiesAcknowledged(EventMetadata(TestConstants.time), hashMapOf(
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
         verify(ircClient).send("AUTHENTICATE", "mech3")
162
         verify(ircClient).send("AUTHENTICATE", "mech3")
165
     @Test
165
     @Test
166
     fun `updates negotiation state when capabilities acknowledged with shared mechanism`() {
166
     fun `updates negotiation state when capabilities acknowledged with shared mechanism`() {
167
         serverState.sasl.mechanisms.addAll(listOf(saslMech1, saslMech2, saslMech3))
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
         handler.processEvent(ircClient, ServerCapabilitiesAcknowledged(EventMetadata(TestConstants.time), hashMapOf(
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
         assertEquals(CapabilitiesNegotiationState.AUTHENTICATING, serverState.capabilities.negotiationState)
174
         assertEquals(CapabilitiesNegotiationState.AUTHENTICATING, serverState.capabilities.negotiationState)
177
     @Test
177
     @Test
178
     fun `updates negotiation state when capabilities acknowledged`() {
178
     fun `updates negotiation state when capabilities acknowledged`() {
179
         handler.processEvent(ircClient, ServerCapabilitiesAcknowledged(EventMetadata(TestConstants.time), hashMapOf(
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
         assertEquals(CapabilitiesNegotiationState.FINISHED, serverState.capabilities.negotiationState)
184
         assertEquals(CapabilitiesNegotiationState.FINISHED, serverState.capabilities.negotiationState)
187
     @Test
187
     @Test
188
     fun `stores enabled caps when capabilities acknowledged`() {
188
     fun `stores enabled caps when capabilities acknowledged`() {
189
         handler.processEvent(ircClient, ServerCapabilitiesAcknowledged(EventMetadata(TestConstants.time), hashMapOf(
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
         assertEquals(2, serverState.capabilities.enabledCapabilities.size)
194
         assertEquals(2, serverState.capabilities.enabledCapabilities.size)

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

55
                 Assertions.assertEquals(TestConstants.time, it.metadata.time)
55
                 Assertions.assertEquals(TestConstants.time, it.metadata.time)
56
                 Assertions.assertEquals("zerocool", it.user.nickname)
56
                 Assertions.assertEquals("zerocool", it.user.nickname)
57
                 Assertions.assertEquals("Hack the planet!", it.reason)
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
                 Assertions.assertEquals(TestConstants.time, it.metadata.time)
91
                 Assertions.assertEquals(TestConstants.time, it.metadata.time)
92
                 Assertions.assertEquals("zerocool", it.user.nickname)
92
                 Assertions.assertEquals("zerocool", it.user.nickname)
93
                 Assertions.assertEquals("zer0c00l", it.newNick)
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
 import com.dmdirc.ktirc.events.ServerCapabilitiesAcknowledged
3
 import com.dmdirc.ktirc.events.ServerCapabilitiesAcknowledged
4
 import com.dmdirc.ktirc.events.ServerCapabilitiesFinished
4
 import com.dmdirc.ktirc.events.ServerCapabilitiesFinished
5
 import com.dmdirc.ktirc.events.ServerCapabilitiesReceived
5
 import com.dmdirc.ktirc.events.ServerCapabilitiesReceived
6
-import com.dmdirc.ktirc.model.Capability
7
 import com.dmdirc.ktirc.model.IrcMessage
6
 import com.dmdirc.ktirc.model.IrcMessage
8
 import com.dmdirc.ktirc.params
7
 import com.dmdirc.ktirc.params
9
 import org.junit.jupiter.api.Assertions.assertEquals
8
 import org.junit.jupiter.api.Assertions.assertEquals
36
 
35
 
37
         val receivedEvent = events.filterIsInstance<ServerCapabilitiesReceived>()[0]
36
         val receivedEvent = events.filterIsInstance<ServerCapabilitiesReceived>()[0]
38
         assertEquals(2, receivedEvent.capabilities.size)
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
     @Test
42
     @Test
46
 
45
 
47
         val receivedEvent = events.filterIsInstance<ServerCapabilitiesReceived>()[0]
46
         val receivedEvent = events.filterIsInstance<ServerCapabilitiesReceived>()[0]
48
         assertEquals(2, receivedEvent.capabilities.size)
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
     @Test
52
     @Test
56
 
55
 
57
         val receivedEvent = events.filterIsInstance<ServerCapabilitiesReceived>()[0]
56
         val receivedEvent = events.filterIsInstance<ServerCapabilitiesReceived>()[0]
58
         assertEquals(1, receivedEvent.capabilities.size)
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
 
65
 
67
         val receivedEvent = events.filterIsInstance<ServerCapabilitiesReceived>()[0]
66
         val receivedEvent = events.filterIsInstance<ServerCapabilitiesReceived>()[0]
68
         assertEquals(2, receivedEvent.capabilities.size)
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
     @Test
72
     @Test
84
 
83
 
85
         val receivedEvent = events.filterIsInstance<ServerCapabilitiesAcknowledged>()[0]
84
         val receivedEvent = events.filterIsInstance<ServerCapabilitiesAcknowledged>()[0]
86
         assertEquals(2, receivedEvent.capabilities.size)
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
 
24
 
25
         assertEquals(TestConstants.time, events[0].metadata.time)
25
         assertEquals(TestConstants.time, events[0].metadata.time)
26
         assertEquals(User("acidburn", "libby", "root.localhost"), events[0].user)
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
     @Test
30
     @Test
42
 
42
 
43
         assertEquals(TestConstants.time, events[0].metadata.time)
43
         assertEquals(TestConstants.time, events[0].metadata.time)
44
         assertEquals(User("acidburn", "libby", "root.localhost", account = "acidBurn", realName = "Libby"), events[0].user)
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
     @Test
48
     @Test
53
 
53
 
54
         assertEquals(TestConstants.time, events[0].metadata.time)
54
         assertEquals(TestConstants.time, events[0].metadata.time)
55
         assertEquals(User("acidburn", "libby", "root.localhost", realName = "Libby"), events[0].user)
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
 
24
 
25
         assertEquals(TestConstants.time, events[0].metadata.time)
25
         assertEquals(TestConstants.time, events[0].metadata.time)
26
         assertEquals(User("acidburn", "libby", "root.localhost"), events[0].user)
26
         assertEquals(User("acidburn", "libby", "root.localhost"), events[0].user)
27
-        assertEquals("#crashandburn", events[0].channel)
27
+        assertEquals("#crashandburn", events[0].target)
28
         assertEquals("zeroCool", events[0].victim)
28
         assertEquals("zeroCool", events[0].victim)
29
         assertEquals("", events[0].reason)
29
         assertEquals("", events[0].reason)
30
     }
30
     }
37
 
37
 
38
         assertEquals(TestConstants.time, events[0].metadata.time)
38
         assertEquals(TestConstants.time, events[0].metadata.time)
39
         assertEquals(User("acidburn", "libby", "root.localhost"), events[0].user)
39
         assertEquals(User("acidburn", "libby", "root.localhost"), events[0].user)
40
-        assertEquals("#crashandburn", events[0].channel)
40
+        assertEquals("#crashandburn", events[0].target)
41
         assertEquals("zeroCool", events[0].victim)
41
         assertEquals("zeroCool", events[0].victim)
42
         assertEquals("Hack the planet!", events[0].reason)
42
         assertEquals("Hack the planet!", events[0].reason)
43
     }
43
     }

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

16
         val events = processor.process(IrcMessage(emptyMap(), ":the.gibson".toByteArray(), "366", params("AcidBurn", "#root", "End of /NAMES list")))
16
         val events = processor.process(IrcMessage(emptyMap(), ":the.gibson".toByteArray(), "366", params("AcidBurn", "#root", "End of /NAMES list")))
17
 
17
 
18
         assertEquals(1, events.size)
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
     @Test
22
     @Test
25
 
25
 
26
         assertEquals(1, events.size)
26
         assertEquals(1, events.size)
27
         val event = events[0] as ChannelNamesReceived
27
         val event = events[0] as ChannelNamesReceived
28
-        assertEquals("#root", event.channel)
28
+        assertEquals("#root", event.target)
29
         assertEquals(listOf("AcidBurn", "@ZeroCool", "+ThePlague"), event.names)
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
 
24
 
25
         assertEquals(TestConstants.time, events[0].metadata.time)
25
         assertEquals(TestConstants.time, events[0].metadata.time)
26
         assertEquals(User("acidburn", "libby", "root.localhost"), events[0].user)
26
         assertEquals(User("acidburn", "libby", "root.localhost"), events[0].user)
27
-        assertEquals("#crashandburn", events[0].channel)
27
+        assertEquals("#crashandburn", events[0].target)
28
         assertEquals("", events[0].reason)
28
         assertEquals("", events[0].reason)
29
     }
29
     }
30
 
30
 
36
 
36
 
37
         assertEquals(TestConstants.time, events[0].metadata.time)
37
         assertEquals(TestConstants.time, events[0].metadata.time)
38
         assertEquals(User("acidburn", "libby", "root.localhost"), events[0].user)
38
         assertEquals(User("acidburn", "libby", "root.localhost"), events[0].user)
39
-        assertEquals("#crashandburn", events[0].channel)
39
+        assertEquals("#crashandburn", events[0].target)
40
         assertEquals("Hack the planet!", events[0].reason)
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
 
30
 
31
         val event = events[0] as ChannelTopicDiscovered
31
         val event = events[0] as ChannelTopicDiscovered
32
         assertEquals(TestConstants.time, event.metadata.time)
32
         assertEquals(TestConstants.time, event.metadata.time)
33
-        assertEquals("#thegibson", event.channel)
33
+        assertEquals("#thegibson", event.target)
34
         assertEquals("Hack the planet!", event.topic)
34
         assertEquals("Hack the planet!", event.topic)
35
     }
35
     }
36
 
36
 
41
 
41
 
42
         val event = events[0] as ChannelTopicDiscovered
42
         val event = events[0] as ChannelTopicDiscovered
43
         assertEquals(TestConstants.time, event.metadata.time)
43
         assertEquals(TestConstants.time, event.metadata.time)
44
-        assertEquals("#thegibson", event.channel)
44
+        assertEquals("#thegibson", event.target)
45
         assertNull(event.topic)
45
         assertNull(event.topic)
46
     }
46
     }
47
 
47
 
52
 
52
 
53
         val event = events[0] as ChannelTopicMetadataDiscovered
53
         val event = events[0] as ChannelTopicMetadataDiscovered
54
         assertEquals(TestConstants.time, event.metadata.time)
54
         assertEquals(TestConstants.time, event.metadata.time)
55
-        assertEquals("#thegibson", event.channel)
55
+        assertEquals("#thegibson", event.target)
56
         assertEquals("zeroCool", event.user.nickname)
56
         assertEquals("zeroCool", event.user.nickname)
57
         assertEquals(TestConstants.otherTime, event.setTime)
57
         assertEquals(TestConstants.otherTime, event.setTime)
58
     }
58
     }
65
         val event = events[0] as ChannelTopicChanged
65
         val event = events[0] as ChannelTopicChanged
66
         assertEquals(TestConstants.time, event.metadata.time)
66
         assertEquals(TestConstants.time, event.metadata.time)
67
         assertEquals(User("acidBurn", "acidB", "the.gibson"), event.user)
67
         assertEquals(User("acidBurn", "acidB", "the.gibson"), event.user)
68
-        assertEquals("#thegibson", event.channel)
68
+        assertEquals("#thegibson", event.target)
69
         assertEquals("Hack the planet!", event.topic)
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
 
13
 
14
     @Test
14
     @Test
15
     fun `reset clears all state`() = with(CapabilitiesState()) {
15
     fun `reset clears all state`() = with(CapabilitiesState()) {
16
-        advertisedCapabilities[Capability.SaslAuthentication] = "foo"
16
+        advertisedCapabilities["sasl"] = "foo"
17
         enabledCapabilities[Capability.SaslAuthentication] = "foo"
17
         enabledCapabilities[Capability.SaslAuthentication] = "foo"
18
         negotiationState = CapabilitiesNegotiationState.FINISHED
18
         negotiationState = CapabilitiesNegotiationState.FINISHED
19
 
19
 

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

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

Loading…
Cancel
Save