Browse Source

Add ChannelMembershipAdjustment interface

tags/v0.11.0
Chris Smith 5 years ago
parent
commit
bb009434be

+ 2
- 0
CHANGELOG View File

2
 
2
 
3
  * Added SourcedEvent interface for events that have a user source attached
3
  * Added SourcedEvent interface for events that have a user source attached
4
  * Added ChannelJoinFailed event
4
  * Added ChannelJoinFailed event
5
+ * Added ChannelMembershipAdjustment interface for events that concern
6
+   users joining/leaving channels
5
 
7
 
6
 v0.10.3
8
 v0.10.3
7
 
9
 

+ 49
- 7
src/main/kotlin/com/dmdirc/ktirc/events/Events.kt View File

55
 
55
 
56
 }
56
 }
57
 
57
 
58
+/**
59
+ * Interface implemented by events that describe a change to a channel's membership.
60
+ */
61
+interface ChannelMembershipAdjustment {
62
+    /** The nickname of a user that has joined the channel. */
63
+    val addedUser: String?
64
+    /** The nickname of a user who has left the channel. */
65
+    val removedUser: String?
66
+    /** The nicknames of all users in the channel, to replace any existing values. */
67
+    val replacedUsers: Array<String>?
68
+}
69
+
58
 /**
70
 /**
59
  * Interface implemented by events that come from a particular user.
71
  * Interface implemented by events that come from a particular user.
60
  */
72
  */
93
 class PingReceived(metadata: EventMetadata, val nonce: ByteArray) : IrcEvent(metadata)
105
 class PingReceived(metadata: EventMetadata, val nonce: ByteArray) : IrcEvent(metadata)
94
 
106
 
95
 /** Raised when a user joins a channel. */
107
 /** Raised when a user joins a channel. */
96
-class ChannelJoined(metadata: EventMetadata, override val user: User, channel: String) : TargetedEvent(metadata, channel), SourcedEvent
108
+class ChannelJoined(metadata: EventMetadata, override val user: User, channel: String)
109
+    : TargetedEvent(metadata, channel), SourcedEvent, ChannelMembershipAdjustment {
110
+    override val addedUser = user.nickname
111
+    override val removedUser: String? = null
112
+    override val replacedUsers: Array<String>? = null
113
+}
97
 
114
 
98
 /** Raised when an attempt to join a channel fails. */
115
 /** Raised when an attempt to join a channel fails. */
99
 class ChannelJoinFailed(metadata: EventMetadata, channel: String, val reason: JoinError) : TargetedEvent(metadata, channel) {
116
 class ChannelJoinFailed(metadata: EventMetadata, channel: String, val reason: JoinError) : TargetedEvent(metadata, channel) {
129
 }
146
 }
130
 
147
 
131
 /** Raised when a user leaves a channel. */
148
 /** Raised when a user leaves a channel. */
132
-class ChannelParted(metadata: EventMetadata, override val user: User, channel: String, val reason: String = "") : TargetedEvent(metadata, channel), SourcedEvent
149
+class ChannelParted(metadata: EventMetadata, override val user: User, channel: String, val reason: String = "")
150
+    : TargetedEvent(metadata, channel), SourcedEvent, ChannelMembershipAdjustment {
151
+    override val addedUser: String? = null
152
+    override val removedUser = user.nickname
153
+    override val replacedUsers: Array<String>? = null
154
+}
133
 
155
 
134
 /** Raised when a [victim] is kicked from a channel. */
156
 /** Raised when a [victim] is kicked from a channel. */
135
-class ChannelUserKicked(metadata: EventMetadata, override val user: User, channel: String, val victim: String, val reason: String = "") : TargetedEvent(metadata, channel), SourcedEvent
157
+class ChannelUserKicked(metadata: EventMetadata, override val user: User, channel: String, val victim: String, val reason: String = "")
158
+    : TargetedEvent(metadata, channel), SourcedEvent, ChannelMembershipAdjustment {
159
+    override val addedUser: String? = null
160
+    override val removedUser = victim
161
+    override val replacedUsers: Array<String>? = null
162
+}
136
 
163
 
137
 /** Raised when a user quits, and is in a channel. */
164
 /** Raised when a user quits, and is in a channel. */
138
-class ChannelQuit(metadata: EventMetadata, override val user: User, channel: String, val reason: String = "") : TargetedEvent(metadata, channel), SourcedEvent
165
+class ChannelQuit(metadata: EventMetadata, override val user: User, channel: String, val reason: String = "")
166
+    : TargetedEvent(metadata, channel), SourcedEvent, ChannelMembershipAdjustment {
167
+    override val addedUser: String? = null
168
+    override val removedUser = user.nickname
169
+    override val replacedUsers: Array<String>? = null
170
+}
139
 
171
 
140
 /** Raised when a user changes nickname, and is in a channel. */
172
 /** Raised when a user changes nickname, and is in a channel. */
141
-class ChannelNickChanged(metadata: EventMetadata, override val user: User, channel: String, val newNick: String) : TargetedEvent(metadata, channel), SourcedEvent
173
+class ChannelNickChanged(metadata: EventMetadata, override val user: User, channel: String, val newNick: String)
174
+    : TargetedEvent(metadata, channel), SourcedEvent, ChannelMembershipAdjustment {
175
+    override val addedUser = newNick
176
+    override val removedUser = user.nickname
177
+    override val replacedUsers: Array<String>? = null
178
+}
142
 
179
 
143
 /** Raised when a batch of the channel's member list has been received. More batches may follow. */
180
 /** Raised when a batch of the channel's member list has been received. More batches may follow. */
144
 class ChannelNamesReceived(metadata: EventMetadata, channel: String, val names: List<String>) : TargetedEvent(metadata, channel)
181
 class ChannelNamesReceived(metadata: EventMetadata, channel: String, val names: List<String>) : TargetedEvent(metadata, channel)
145
 
182
 
146
 /** Raised when the entirety of the channel's member list has been received. */
183
 /** Raised when the entirety of the channel's member list has been received. */
147
-class ChannelNamesFinished(metadata: EventMetadata, channel: String) : TargetedEvent(metadata, channel)
184
+class ChannelNamesFinished(metadata: EventMetadata, channel: String) : TargetedEvent(metadata, channel), ChannelMembershipAdjustment {
185
+    override val addedUser: String? = null
186
+    override val removedUser: String? = null
187
+    override var replacedUsers: Array<String>? = null
188
+        internal set
189
+}
148
 
190
 
149
 /** Raised when a channel topic is discovered (not changed). Usually followed by [ChannelTopicMetadataDiscovered] if the [topic] is non-null. */
191
 /** Raised when a channel topic is discovered (not changed). Usually followed by [ChannelTopicMetadataDiscovered] if the [topic] is non-null. */
150
 class ChannelTopicDiscovered(metadata: EventMetadata, channel: String, val topic: String?) : TargetedEvent(metadata, channel)
192
 class ChannelTopicDiscovered(metadata: EventMetadata, channel: String, val topic: String?) : TargetedEvent(metadata, channel)
257
  *
299
  *
258
  * If this happens before {ServerReady], the nickname must be changed for registration to continue.
300
  * If this happens before {ServerReady], the nickname must be changed for registration to continue.
259
  */
301
  */
260
-class NicknameChangeFailed(metadata: EventMetadata, val cause: NicknameChangeError): IrcEvent(metadata) {
302
+class NicknameChangeFailed(metadata: EventMetadata, val cause: NicknameChangeError) : IrcEvent(metadata) {
261
     /** Reasons a nick change may fail. */
303
     /** Reasons a nick change may fail. */
262
     enum class NicknameChangeError {
304
     enum class NicknameChangeError {
263
         /** The nickname is not allowed by the server. */
305
         /** The nickname is not allowed by the server. */

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

77
         client.channelState[event.target]?.let {
77
         client.channelState[event.target]?.let {
78
             it.receivingUserList = false
78
             it.receivingUserList = false
79
             log.finest { "Finished receiving names in ${event.target}. Users: ${it.users.toList()}" }
79
             log.finest { "Finished receiving names in ${event.target}. Users: ${it.users.toList()}" }
80
+            event.replacedUsers = it.users.map(ChannelUser::nickname).toTypedArray()
80
             if (client.behaviour.requestModesOnJoin && !it.modesDiscovered) {
81
             if (client.behaviour.requestModesOnJoin && !it.modesDiscovered) {
81
                 client.sendModeRequest(it.name)
82
                 client.sendModeRequest(it.name)
82
             }
83
             }

+ 51
- 0
src/test/kotlin/com/dmdirc/ktirc/events/EventsTest.kt View File

1
+package com.dmdirc.ktirc.events
2
+
3
+import com.dmdirc.ktirc.TestConstants
4
+import com.dmdirc.ktirc.model.User
5
+import org.junit.jupiter.api.Assertions.assertEquals
6
+import org.junit.jupiter.api.Assertions.assertNull
7
+import org.junit.jupiter.api.Test
8
+
9
+internal class EventsTest {
10
+
11
+    @Test
12
+    fun `channel joined event implements membership changed correctly`() {
13
+        val event = ChannelJoined(EventMetadata(TestConstants.time), User("acidBurn"), "#thegibson")
14
+        assertEquals("acidBurn", event.addedUser)
15
+        assertNull(event.removedUser)
16
+        assertNull(event.replacedUsers)
17
+    }
18
+
19
+    @Test
20
+    fun `channel parted event implements membership changed correctly`() {
21
+        val event = ChannelParted(EventMetadata(TestConstants.time), User("acidBurn"), "#thegibson")
22
+        assertNull(event.addedUser)
23
+        assertEquals("acidBurn", event.removedUser)
24
+        assertNull(event.replacedUsers)
25
+    }
26
+
27
+    @Test
28
+    fun `channel kicked event implements membership changed correctly`() {
29
+        val event = ChannelUserKicked(EventMetadata(TestConstants.time), User("acidBurn"), "#thegibson", "zeroCool")
30
+        assertNull(event.addedUser)
31
+        assertEquals("zeroCool", event.removedUser)
32
+        assertNull(event.replacedUsers)
33
+    }
34
+
35
+    @Test
36
+    fun `channel quit event implements membership changed correctly`() {
37
+        val event = ChannelQuit(EventMetadata(TestConstants.time), User("acidBurn"), "#thegibson")
38
+        assertNull(event.addedUser)
39
+        assertEquals("acidBurn", event.removedUser)
40
+        assertNull(event.replacedUsers)
41
+    }
42
+
43
+    @Test
44
+    fun `channel nick change implements membership changed correctly`() {
45
+        val event = ChannelNickChanged(EventMetadata(TestConstants.time), User("zeroCool"), "#thegibson", "crashOverride")
46
+        assertEquals("crashOverride", event.addedUser)
47
+        assertEquals("zeroCool", event.removedUser)
48
+        assertNull(event.replacedUsers)
49
+    }
50
+
51
+}

+ 13
- 0
src/test/kotlin/com/dmdirc/ktirc/events/handlers/ChannelStateHandlerTest.kt View File

101
         assertNotNull(channel.users["thePlague"])
101
         assertNotNull(channel.users["thePlague"])
102
     }
102
     }
103
 
103
 
104
+    @Test
105
+    fun `updates replacedUsers property of names finished event`() {
106
+        val channel = ChannelState("#thegibson") { CaseMapping.Rfc }
107
+        fakeChannelState += channel
108
+
109
+        val event = ChannelNamesFinished(EventMetadata(TestConstants.time), "#thegibson")
110
+        handler.processEvent(ircClient, ChannelNamesReceived(EventMetadata(TestConstants.time), "#thegibson", listOf("zeroCool")))
111
+        handler.processEvent(ircClient, event)
112
+
113
+        assertEquals(1, event.replacedUsers?.size)
114
+        assertEquals("zeroCool", event.replacedUsers?.get(0))
115
+    }
116
+
104
     @Test
117
     @Test
105
     fun `adds users with mode prefixes`() {
118
     fun `adds users with mode prefixes`() {
106
         val channel = ChannelState("#thegibson") { CaseMapping.Rfc }
119
         val channel = ChannelState("#thegibson") { CaseMapping.Rfc }

Loading…
Cancel
Save