Browse Source

Add some topic events (no state yet)

Move handlers to their own packages
Update JUnit
tags/v0.8.0
Chris Smith 5 years ago
parent
commit
5033040325

+ 1
- 0
CHANGELOG View File

@@ -2,6 +2,7 @@ vNEXT (in development)
2 2
 
3 3
  * Added support for SCRAM-SHA-1 and SCRAM-SHA-256 SASL mechanisms
4 4
  * Added MotdLineReceived event
5
+ * (Internal) Move event handlers into their own package
5 6
 
6 7
 v0.7.0
7 8
 

+ 4
- 4
build.gradle.kts View File

@@ -41,9 +41,9 @@ dependencies {
41 41
     implementation("io.ktor:ktor-network-tls:1.1.2")
42 42
 
43 43
     testImplementation("com.nhaarman.mockitokotlin2:mockito-kotlin:2.1.0")
44
-    testImplementation("org.junit.jupiter:junit-jupiter-api:5.3.2")
45
-    testImplementation("org.junit.jupiter:junit-jupiter-params:5.3.2")
46
-    testRuntime("org.junit.jupiter:junit-jupiter-engine:5.3.2")
44
+    testImplementation("org.junit.jupiter:junit-jupiter-api:5.4.0")
45
+    testImplementation("org.junit.jupiter:junit-jupiter-params:5.4.0")
46
+    testRuntime("org.junit.jupiter:junit-jupiter-engine:5.4.0")
47 47
 }
48 48
 
49 49
 java {
@@ -88,7 +88,7 @@ tasks {
88 88
     }
89 89
 
90 90
     withType<Wrapper> {
91
-        gradleVersion = "5.2"
91
+        gradleVersion = "5.2.1"
92 92
     }
93 93
 
94 94
     withType<KotlinCompile> {

+ 2
- 0
src/main/kotlin/com/dmdirc/ktirc/IrcClientImpl.kt View File

@@ -1,6 +1,8 @@
1 1
 package com.dmdirc.ktirc
2 2
 
3 3
 import com.dmdirc.ktirc.events.*
4
+import com.dmdirc.ktirc.handlers.EventHandler
5
+import com.dmdirc.ktirc.handlers.eventHandlers
4 6
 import com.dmdirc.ktirc.io.KtorLineBufferedSocket
5 7
 import com.dmdirc.ktirc.io.LineBufferedSocket
6 8
 import com.dmdirc.ktirc.io.MessageHandler

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

@@ -54,6 +54,12 @@ class ChannelNamesReceived(time: LocalDateTime, val channel: String, val names:
54 54
 /** Raised when the entirety of the channel's member list has been received. */
55 55
 class ChannelNamesFinished(time: LocalDateTime, val channel: String) : IrcEvent(time)
56 56
 
57
+/** Raised when a channel topic is discovered (not changed). Usually followed by [ChannelTopicMetadataDiscovered]. */
58
+class ChannelTopicDiscovered(time: LocalDateTime, val channel: String, val topic: String) : IrcEvent(time)
59
+
60
+/** Raised when a channel topic's metadata is discovered. */
61
+class ChannelTopicMetadataDiscovered(time: LocalDateTime, val channel: String, val user: User, val setTime: LocalDateTime) : IrcEvent(time)
62
+
57 63
 /** Raised when a message is received. */
58 64
 class MessageReceived(time: LocalDateTime, val user: User, val target: String, val message: String, val messageId: String? = null) : IrcEvent(time)
59 65
 

src/main/kotlin/com/dmdirc/ktirc/events/CapabilitiesHandler.kt → src/main/kotlin/com/dmdirc/ktirc/handlers/CapabilitiesHandler.kt View File

@@ -1,6 +1,7 @@
1
-package com.dmdirc.ktirc.events
1
+package com.dmdirc.ktirc.handlers
2 2
 
3 3
 import com.dmdirc.ktirc.IrcClient
4
+import com.dmdirc.ktirc.events.*
4 5
 import com.dmdirc.ktirc.messages.sendAuthenticationMessage
5 6
 import com.dmdirc.ktirc.messages.sendCapabilityEnd
6 7
 import com.dmdirc.ktirc.messages.sendCapabilityRequest

src/main/kotlin/com/dmdirc/ktirc/events/ChannelStateHandler.kt → src/main/kotlin/com/dmdirc/ktirc/handlers/ChannelStateHandler.kt View File

@@ -1,6 +1,7 @@
1
-package com.dmdirc.ktirc.events
1
+package com.dmdirc.ktirc.handlers
2 2
 
3 3
 import com.dmdirc.ktirc.IrcClient
4
+import com.dmdirc.ktirc.events.*
4 5
 import com.dmdirc.ktirc.model.ChannelState
5 6
 import com.dmdirc.ktirc.model.ChannelUser
6 7
 import com.dmdirc.ktirc.util.logger

src/main/kotlin/com/dmdirc/ktirc/events/EventHandler.kt → src/main/kotlin/com/dmdirc/ktirc/handlers/EventHandler.kt View File

@@ -1,6 +1,7 @@
1
-package com.dmdirc.ktirc.events
1
+package com.dmdirc.ktirc.handlers
2 2
 
3 3
 import com.dmdirc.ktirc.IrcClient
4
+import com.dmdirc.ktirc.events.IrcEvent
4 5
 
5 6
 @FunctionalInterface
6 7
 internal interface EventHandler {

src/main/kotlin/com/dmdirc/ktirc/events/PingHandler.kt → src/main/kotlin/com/dmdirc/ktirc/handlers/PingHandler.kt View File

@@ -1,6 +1,8 @@
1
-package com.dmdirc.ktirc.events
1
+package com.dmdirc.ktirc.handlers
2 2
 
3 3
 import com.dmdirc.ktirc.IrcClient
4
+import com.dmdirc.ktirc.events.IrcEvent
5
+import com.dmdirc.ktirc.events.PingReceived
4 6
 import com.dmdirc.ktirc.messages.sendPong
5 7
 
6 8
 internal class PingHandler : EventHandler {

src/main/kotlin/com/dmdirc/ktirc/events/ServerStateHandler.kt → src/main/kotlin/com/dmdirc/ktirc/handlers/ServerStateHandler.kt View File

@@ -1,6 +1,7 @@
1
-package com.dmdirc.ktirc.events
1
+package com.dmdirc.ktirc.handlers
2 2
 
3 3
 import com.dmdirc.ktirc.IrcClient
4
+import com.dmdirc.ktirc.events.*
4 5
 import com.dmdirc.ktirc.model.ServerState
5 6
 import com.dmdirc.ktirc.model.ServerStatus
6 7
 import java.time.LocalDateTime

src/main/kotlin/com/dmdirc/ktirc/events/UserStateHandler.kt → src/main/kotlin/com/dmdirc/ktirc/handlers/UserStateHandler.kt View File

@@ -1,6 +1,7 @@
1
-package com.dmdirc.ktirc.events
1
+package com.dmdirc.ktirc.handlers
2 2
 
3 3
 import com.dmdirc.ktirc.IrcClient
4
+import com.dmdirc.ktirc.events.*
4 5
 import com.dmdirc.ktirc.model.UserState
5 6
 
6 7
 internal class UserStateHandler : EventHandler {
@@ -10,7 +11,7 @@ internal class UserStateHandler : EventHandler {
10 11
             is ChannelJoined -> handleJoin(client.userState, event)
11 12
             is ChannelParted -> handlePart(client, event)
12 13
             is ChannelUserKicked -> handleKick(client, event)
13
-            is ChannelNamesReceived  -> handleNamesReceived(client, event)
14
+            is ChannelNamesReceived -> handleNamesReceived(client, event)
14 15
             is UserAccountChanged -> handleAccountChanged(client, event)
15 16
             is UserNickChanged -> handleNickChanged(client, event)
16 17
             is UserQuit -> handleQuit(client.userState, event)

+ 1
- 1
src/main/kotlin/com/dmdirc/ktirc/io/MessageHandler.kt View File

@@ -1,7 +1,7 @@
1 1
 package com.dmdirc.ktirc.io
2 2
 
3 3
 import com.dmdirc.ktirc.IrcClient
4
-import com.dmdirc.ktirc.events.EventHandler
4
+import com.dmdirc.ktirc.handlers.EventHandler
5 5
 import com.dmdirc.ktirc.events.IrcEvent
6 6
 import com.dmdirc.ktirc.messages.MessageProcessor
7 7
 import com.dmdirc.ktirc.model.IrcMessage

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

@@ -32,6 +32,7 @@ internal val messageProcessors = setOf(
32 32
         PartProcessor(),
33 33
         PingProcessor(),
34 34
         PrivmsgProcessor(),
35
+        TopicProcessor(),
35 36
         QuitProcessor(),
36 37
         WelcomeProcessor()
37 38
 )

+ 2
- 0
src/main/kotlin/com/dmdirc/ktirc/messages/NumericConstants.kt View File

@@ -8,6 +8,8 @@ internal const val RPL_ISUPPORT = "005"
8 8
 internal const val RPL_UMODEIS = "221"
9 9
 
10 10
 internal const val RPL_CHANNELMODEIS = "324"
11
+internal const val RPL_TOPIC = "332"
12
+internal const val RPL_TOPICWHOTIME = "333"
11 13
 internal const val RPL_MOTD = "372"
12 14
 internal const val RPL_MOTDSTART = "375"
13 15
 internal const val RPL_ENDOFMOTD = "376"

+ 29
- 0
src/main/kotlin/com/dmdirc/ktirc/messages/TopicProcessor.kt View File

@@ -0,0 +1,29 @@
1
+package com.dmdirc.ktirc.messages
2
+
3
+import com.dmdirc.ktirc.events.ChannelTopicDiscovered
4
+import com.dmdirc.ktirc.events.ChannelTopicMetadataDiscovered
5
+import com.dmdirc.ktirc.model.IrcMessage
6
+import com.dmdirc.ktirc.model.asUser
7
+import com.dmdirc.ktirc.util.currentTimeZoneProvider
8
+import java.time.Instant
9
+import java.time.LocalDateTime
10
+
11
+internal class TopicProcessor : MessageProcessor {
12
+
13
+    override val commands = arrayOf(RPL_TOPIC, RPL_TOPICWHOTIME)
14
+
15
+    override fun process(message: IrcMessage) = sequence {
16
+        when (message.command) {
17
+            RPL_TOPIC -> yield(ChannelTopicDiscovered(message.time, message.channel, String(message.params[2])))
18
+            RPL_TOPICWHOTIME -> yield(ChannelTopicMetadataDiscovered(
19
+                    message.time, message.channel, message.params[2].asUser(), message.topicSetTime))
20
+        }
21
+    }.toList()
22
+
23
+    private val IrcMessage.channel
24
+        get() = String(params[1])
25
+
26
+    private val IrcMessage.topicSetTime
27
+        get() = LocalDateTime.ofInstant(Instant.ofEpochSecond(String(params[3]).toLong()), currentTimeZoneProvider())
28
+
29
+}

src/test/kotlin/com/dmdirc/ktirc/events/CapabilitiesHandlerTest.kt → src/test/kotlin/com/dmdirc/ktirc/handlers/CapabilitiesHandlerTest.kt View File

@@ -1,7 +1,8 @@
1
-package com.dmdirc.ktirc.events
1
+package com.dmdirc.ktirc.handlers
2 2
 
3 3
 import com.dmdirc.ktirc.IrcClient
4 4
 import com.dmdirc.ktirc.TestConstants
5
+import com.dmdirc.ktirc.events.*
5 6
 import com.dmdirc.ktirc.model.CapabilitiesNegotiationState
6 7
 import com.dmdirc.ktirc.model.Capability
7 8
 import com.dmdirc.ktirc.model.ServerState

src/test/kotlin/com/dmdirc/ktirc/events/ChannelStateHandlerTest.kt → src/test/kotlin/com/dmdirc/ktirc/handlers/ChannelStateHandlerTest.kt View File

@@ -1,7 +1,8 @@
1
-package com.dmdirc.ktirc.events
1
+package com.dmdirc.ktirc.handlers
2 2
 
3 3
 import com.dmdirc.ktirc.IrcClient
4 4
 import com.dmdirc.ktirc.TestConstants
5
+import com.dmdirc.ktirc.events.*
5 6
 import com.dmdirc.ktirc.io.CaseMapping
6 7
 import com.dmdirc.ktirc.model.*
7 8
 import com.nhaarman.mockitokotlin2.doReturn

src/test/kotlin/com/dmdirc/ktirc/events/PingHandlerTest.kt → src/test/kotlin/com/dmdirc/ktirc/handlers/PingHandlerTest.kt View File

@@ -1,7 +1,8 @@
1
-package com.dmdirc.ktirc.events
1
+package com.dmdirc.ktirc.handlers
2 2
 
3 3
 import com.dmdirc.ktirc.IrcClient
4 4
 import com.dmdirc.ktirc.TestConstants
5
+import com.dmdirc.ktirc.events.PingReceived
5 6
 import com.nhaarman.mockitokotlin2.mock
6 7
 import com.nhaarman.mockitokotlin2.verify
7 8
 import kotlinx.coroutines.runBlocking

src/test/kotlin/com/dmdirc/ktirc/events/ServerStateHandlerTest.kt → src/test/kotlin/com/dmdirc/ktirc/handlers/ServerStateHandlerTest.kt View File

@@ -1,7 +1,8 @@
1
-package com.dmdirc.ktirc.events
1
+package com.dmdirc.ktirc.handlers
2 2
 
3 3
 import com.dmdirc.ktirc.IrcClient
4 4
 import com.dmdirc.ktirc.TestConstants
5
+import com.dmdirc.ktirc.events.*
5 6
 import com.dmdirc.ktirc.model.*
6 7
 import com.nhaarman.mockitokotlin2.doReturn
7 8
 import com.nhaarman.mockitokotlin2.mock

src/test/kotlin/com/dmdirc/ktirc/events/UserStateHandlerTest.kt → src/test/kotlin/com/dmdirc/ktirc/handlers/UserStateHandlerTest.kt View File

@@ -1,7 +1,8 @@
1
-package com.dmdirc.ktirc.events
1
+package com.dmdirc.ktirc.handlers
2 2
 
3 3
 import com.dmdirc.ktirc.IrcClient
4 4
 import com.dmdirc.ktirc.TestConstants
5
+import com.dmdirc.ktirc.events.*
5 6
 import com.dmdirc.ktirc.io.CaseMapping
6 7
 import com.dmdirc.ktirc.model.*
7 8
 import com.nhaarman.mockitokotlin2.argForWhich

+ 1
- 1
src/test/kotlin/com/dmdirc/ktirc/io/MessageHandlerTest.kt View File

@@ -2,7 +2,7 @@ package com.dmdirc.ktirc.io
2 2
 
3 3
 import com.dmdirc.ktirc.IrcClient
4 4
 import com.dmdirc.ktirc.TestConstants
5
-import com.dmdirc.ktirc.events.EventHandler
5
+import com.dmdirc.ktirc.handlers.EventHandler
6 6
 import com.dmdirc.ktirc.events.ServerConnected
7 7
 import com.dmdirc.ktirc.events.ServerReady
8 8
 import com.dmdirc.ktirc.events.ServerWelcome

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

@@ -0,0 +1,49 @@
1
+package com.dmdirc.ktirc.messages
2
+
3
+import com.dmdirc.ktirc.TestConstants
4
+import com.dmdirc.ktirc.events.ChannelTopicDiscovered
5
+import com.dmdirc.ktirc.events.ChannelTopicMetadataDiscovered
6
+import com.dmdirc.ktirc.model.IrcMessage
7
+import com.dmdirc.ktirc.params
8
+import com.dmdirc.ktirc.util.currentTimeProvider
9
+import com.dmdirc.ktirc.util.currentTimeZoneProvider
10
+import org.junit.jupiter.api.Assertions.assertEquals
11
+import org.junit.jupiter.api.BeforeEach
12
+import org.junit.jupiter.api.Test
13
+import java.time.ZoneId
14
+
15
+internal class TopicProcessorTest {
16
+
17
+    private val processor = TopicProcessor()
18
+
19
+    @BeforeEach
20
+    fun setUp() {
21
+        currentTimeProvider = { TestConstants.time }
22
+    }
23
+
24
+    @Test
25
+    fun `raises ChannelTopicDiscovered event when topic is supplied`() {
26
+        val events = processor.process(IrcMessage(emptyMap(), null, "332", params("acidBurn", "#thegibson", "Hack the planet!")))
27
+        assertEquals(1, events.size)
28
+
29
+        val event = events[0] as ChannelTopicDiscovered
30
+        assertEquals(TestConstants.time, event.time)
31
+        assertEquals("#thegibson", event.channel)
32
+        assertEquals("Hack the planet!", event.topic)
33
+    }
34
+
35
+    @Test
36
+    fun `raises ChannelTopicMetadataDiscovered event when topic is supplied`() {
37
+        val events = processor.process(IrcMessage(emptyMap(), null, "333", params("acidBurn", "#thegibson", "zeroCool", unixtime(currentTimeZoneProvider()))))
38
+        assertEquals(1, events.size)
39
+
40
+        val event = events[0] as ChannelTopicMetadataDiscovered
41
+        assertEquals(TestConstants.time, event.time)
42
+        assertEquals("#thegibson", event.channel)
43
+        assertEquals("zeroCool", event.user.nickname)
44
+        assertEquals(TestConstants.time, event.setTime)
45
+    }
46
+
47
+    private fun unixtime(zoneId: ZoneId) = TestConstants.time.toEpochSecond(zoneId.rules.getOffset(TestConstants.time)).toString()
48
+
49
+}

Loading…
Cancel
Save