Преглед на файлове

Add ChannelMembershipAdjustment interface

tags/v0.11.0
Chris Smith преди 5 години
родител
ревизия
bb009434be

+ 2
- 0
CHANGELOG Целия файл

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

+ 49
- 7
src/main/kotlin/com/dmdirc/ktirc/events/Events.kt Целия файл

@@ -55,6 +55,18 @@ sealed class TargetedEvent(metadata: EventMetadata, val target: String) : IrcEve
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 71
  * Interface implemented by events that come from a particular user.
60 72
  */
@@ -93,7 +105,12 @@ class ServerFeaturesUpdated(metadata: EventMetadata, val serverFeatures: ServerF
93 105
 class PingReceived(metadata: EventMetadata, val nonce: ByteArray) : IrcEvent(metadata)
94 106
 
95 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 115
 /** Raised when an attempt to join a channel fails. */
99 116
 class ChannelJoinFailed(metadata: EventMetadata, channel: String, val reason: JoinError) : TargetedEvent(metadata, channel) {
@@ -129,22 +146,47 @@ class ChannelJoinFailed(metadata: EventMetadata, channel: String, val reason: Jo
129 146
 }
130 147
 
131 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 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 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 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 180
 /** Raised when a batch of the channel's member list has been received. More batches may follow. */
144 181
 class ChannelNamesReceived(metadata: EventMetadata, channel: String, val names: List<String>) : TargetedEvent(metadata, channel)
145 182
 
146 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 191
 /** Raised when a channel topic is discovered (not changed). Usually followed by [ChannelTopicMetadataDiscovered] if the [topic] is non-null. */
150 192
 class ChannelTopicDiscovered(metadata: EventMetadata, channel: String, val topic: String?) : TargetedEvent(metadata, channel)
@@ -257,7 +299,7 @@ class BatchReceived(metadata: EventMetadata, val type: String, val params: Array
257 299
  *
258 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 303
     /** Reasons a nick change may fail. */
262 304
     enum class NicknameChangeError {
263 305
         /** The nickname is not allowed by the server. */

+ 1
- 0
src/main/kotlin/com/dmdirc/ktirc/events/handlers/ChannelStateHandler.kt Целия файл

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

+ 51
- 0
src/test/kotlin/com/dmdirc/ktirc/events/EventsTest.kt Целия файл

@@ -0,0 +1,51 @@
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 Целия файл

@@ -101,6 +101,19 @@ internal class ChannelStateHandlerTest {
101 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 117
     @Test
105 118
     fun `adds users with mode prefixes`() {
106 119
         val channel = ChannelState("#thegibson") { CaseMapping.Rfc }

Loading…
Отказ
Запис