Browse Source

Add support for CHGHOST

tags/v0.9.0
Chris Smith 5 years ago
parent
commit
e4b9ec0be3

+ 1
- 0
CHANGELOG View File

@@ -12,6 +12,7 @@ vNEXT (in development)
12 12
  * Added support for batches
13 13
    * All events in a batch are buffered until the batch is finished
14 14
    * The events are then published together in a single `BatchReceived` event
15
+ * Added support for CHGHOST messages
15 16
  * (Internal) Introduced event mutators
16 17
    * Event mutators are now responsible for handling changing events in response to state
17 18
      e.g. ChannelFanOutMutator creates Channel* events for global quits/nick changes/etc

+ 3
- 0
src/main/kotlin/com/dmdirc/ktirc/events/Events.kt View File

@@ -122,6 +122,9 @@ class UserQuit(metadata: EventMetadata, val user: User, val reason: String = "")
122 122
 /** Raised when a user changes nickname. */
123 123
 class UserNickChanged(metadata: EventMetadata, val user: User, val newNick: String) : IrcEvent(metadata)
124 124
 
125
+/** Raised when a user changes hostname. */
126
+class UserHostChanged(metadata: EventMetadata, val user: User, val newIdent: String, val newHost: String) : IrcEvent(metadata)
127
+
125 128
 /**
126 129
  * Raised when a user's account changes (i.e., they auth'd or deauth'd with services).
127 130
  *

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

@@ -14,6 +14,7 @@ internal class UserStateHandler : EventHandler {
14 14
             is ChannelNamesReceived -> handleNamesReceived(client, event)
15 15
             is UserAccountChanged -> handleAccountChanged(client, event)
16 16
             is UserNickChanged -> handleNickChanged(client, event)
17
+            is UserHostChanged -> handleHostChanged(client, event)
17 18
             is UserQuit -> handleQuit(client.userState, event)
18 19
         }
19 20
     }
@@ -71,6 +72,13 @@ internal class UserStateHandler : EventHandler {
71 72
         }
72 73
     }
73 74
 
75
+    private fun handleHostChanged(client: IrcClient, event: UserHostChanged) {
76
+        client.userState[event.user]?.details?.let {
77
+            it.ident = event.newIdent
78
+            it.hostname = event.newHost
79
+        }
80
+    }
81
+
74 82
     private fun handleQuit(state: UserState, event: UserQuit) {
75 83
         state -= event.user
76 84
     }

+ 14
- 0
src/main/kotlin/com/dmdirc/ktirc/messages/ChangeHostProcessor.kt View File

@@ -0,0 +1,14 @@
1
+package com.dmdirc.ktirc.messages
2
+
3
+import com.dmdirc.ktirc.events.UserHostChanged
4
+import com.dmdirc.ktirc.model.IrcMessage
5
+
6
+internal class ChangeHostProcessor : MessageProcessor {
7
+
8
+    override fun process(message: IrcMessage) = message.sourceUser?.let {
9
+        listOf(UserHostChanged(message.metadata, it, String(message.params[0]), String(message.params[1])))
10
+    } ?: emptyList()
11
+
12
+    override val commands = arrayOf("CHGHOST")
13
+
14
+}

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

@@ -22,6 +22,7 @@ internal val messageProcessors = listOf(
22 22
         AuthenticationProcessor(),
23 23
         BatchProcessor(),
24 24
         CapabilityProcessor(),
25
+        ChangeHostProcessor(),
25 26
         ISupportProcessor(),
26 27
         JoinProcessor(),
27 28
         KickProcessor(),

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

@@ -230,4 +230,16 @@ internal class UserStateHandlerTest {
230 230
         assertNull(userState["AcidBurn"])
231 231
         assertEquals("acid~", userState["acid~"]?.details?.nickname)
232 232
     }
233
+
234
+    @Test
235
+    fun `updates details for remote host changes`() {
236
+        val user = User("acidBurn", "libby", "root.localhost")
237
+        userState += User("AcidBurn")
238
+
239
+        handler.processEvent(ircClient, UserHostChanged(EventMetadata(TestConstants.time), user, "burn", "root.gibson"))
240
+
241
+        assertEquals("burn", userState["acidBurn"]?.details?.ident)
242
+        assertEquals("root.gibson", userState["acidBurn"]?.details?.hostname)
243
+    }
244
+
233 245
 }

+ 29
- 0
src/test/kotlin/com/dmdirc/ktirc/messages/ChangeHostProcessorTest.kt View File

@@ -0,0 +1,29 @@
1
+package com.dmdirc.ktirc.messages
2
+
3
+import com.dmdirc.ktirc.model.IrcMessage
4
+import com.dmdirc.ktirc.model.User
5
+import com.dmdirc.ktirc.params
6
+import org.junit.jupiter.api.Assertions.assertEquals
7
+import org.junit.jupiter.api.Assertions.assertTrue
8
+import org.junit.jupiter.api.Test
9
+
10
+internal class ChangeHostProcessorTest {
11
+
12
+    private val processor = ChangeHostProcessor()
13
+
14
+    @Test
15
+    fun `does nothing if no prefix is supplied`() {
16
+        val events = processor.process(IrcMessage(emptyMap(), null, "CHGHOST", emptyList()))
17
+        assertTrue(events.isEmpty())
18
+    }
19
+
20
+    @Test
21
+    fun `raises event when chghost is received`() {
22
+        val events = processor.process(IrcMessage(emptyMap(), "acidBurn".toByteArray(), "CHGHOST", params("libby", "root.gibson")))
23
+        assertEquals(1, events.size)
24
+        assertEquals(User("acidBurn"), events[0].user)
25
+        assertEquals("libby", events[0].newIdent)
26
+        assertEquals("root.gibson", events[0].newHost)
27
+    }
28
+
29
+}

Loading…
Cancel
Save