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
 
2
 
3
  * Added support for SCRAM-SHA-1 and SCRAM-SHA-256 SASL mechanisms
3
  * Added support for SCRAM-SHA-1 and SCRAM-SHA-256 SASL mechanisms
4
  * Added MotdLineReceived event
4
  * Added MotdLineReceived event
5
+ * (Internal) Move event handlers into their own package
5
 
6
 
6
 v0.7.0
7
 v0.7.0
7
 
8
 

+ 4
- 4
build.gradle.kts View File

41
     implementation("io.ktor:ktor-network-tls:1.1.2")
41
     implementation("io.ktor:ktor-network-tls:1.1.2")
42
 
42
 
43
     testImplementation("com.nhaarman.mockitokotlin2:mockito-kotlin:2.1.0")
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
 java {
49
 java {
88
     }
88
     }
89
 
89
 
90
     withType<Wrapper> {
90
     withType<Wrapper> {
91
-        gradleVersion = "5.2"
91
+        gradleVersion = "5.2.1"
92
     }
92
     }
93
 
93
 
94
     withType<KotlinCompile> {
94
     withType<KotlinCompile> {

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

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

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

54
 /** Raised when the entirety of the channel's member list has been received. */
54
 /** Raised when the entirety of the channel's member list has been received. */
55
 class ChannelNamesFinished(time: LocalDateTime, val channel: String) : IrcEvent(time)
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
 /** Raised when a message is received. */
63
 /** Raised when a message is received. */
58
 class MessageReceived(time: LocalDateTime, val user: User, val target: String, val message: String, val messageId: String? = null) : IrcEvent(time)
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
-package com.dmdirc.ktirc.events
1
+package com.dmdirc.ktirc.handlers
2
 
2
 
3
 import com.dmdirc.ktirc.IrcClient
3
 import com.dmdirc.ktirc.IrcClient
4
+import com.dmdirc.ktirc.events.*
4
 import com.dmdirc.ktirc.messages.sendAuthenticationMessage
5
 import com.dmdirc.ktirc.messages.sendAuthenticationMessage
5
 import com.dmdirc.ktirc.messages.sendCapabilityEnd
6
 import com.dmdirc.ktirc.messages.sendCapabilityEnd
6
 import com.dmdirc.ktirc.messages.sendCapabilityRequest
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
-package com.dmdirc.ktirc.events
1
+package com.dmdirc.ktirc.handlers
2
 
2
 
3
 import com.dmdirc.ktirc.IrcClient
3
 import com.dmdirc.ktirc.IrcClient
4
+import com.dmdirc.ktirc.events.*
4
 import com.dmdirc.ktirc.model.ChannelState
5
 import com.dmdirc.ktirc.model.ChannelState
5
 import com.dmdirc.ktirc.model.ChannelUser
6
 import com.dmdirc.ktirc.model.ChannelUser
6
 import com.dmdirc.ktirc.util.logger
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
-package com.dmdirc.ktirc.events
1
+package com.dmdirc.ktirc.handlers
2
 
2
 
3
 import com.dmdirc.ktirc.IrcClient
3
 import com.dmdirc.ktirc.IrcClient
4
+import com.dmdirc.ktirc.events.IrcEvent
4
 
5
 
5
 @FunctionalInterface
6
 @FunctionalInterface
6
 internal interface EventHandler {
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
-package com.dmdirc.ktirc.events
1
+package com.dmdirc.ktirc.handlers
2
 
2
 
3
 import com.dmdirc.ktirc.IrcClient
3
 import com.dmdirc.ktirc.IrcClient
4
+import com.dmdirc.ktirc.events.IrcEvent
5
+import com.dmdirc.ktirc.events.PingReceived
4
 import com.dmdirc.ktirc.messages.sendPong
6
 import com.dmdirc.ktirc.messages.sendPong
5
 
7
 
6
 internal class PingHandler : EventHandler {
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
-package com.dmdirc.ktirc.events
1
+package com.dmdirc.ktirc.handlers
2
 
2
 
3
 import com.dmdirc.ktirc.IrcClient
3
 import com.dmdirc.ktirc.IrcClient
4
+import com.dmdirc.ktirc.events.*
4
 import com.dmdirc.ktirc.model.ServerState
5
 import com.dmdirc.ktirc.model.ServerState
5
 import com.dmdirc.ktirc.model.ServerStatus
6
 import com.dmdirc.ktirc.model.ServerStatus
6
 import java.time.LocalDateTime
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
-package com.dmdirc.ktirc.events
1
+package com.dmdirc.ktirc.handlers
2
 
2
 
3
 import com.dmdirc.ktirc.IrcClient
3
 import com.dmdirc.ktirc.IrcClient
4
+import com.dmdirc.ktirc.events.*
4
 import com.dmdirc.ktirc.model.UserState
5
 import com.dmdirc.ktirc.model.UserState
5
 
6
 
6
 internal class UserStateHandler : EventHandler {
7
 internal class UserStateHandler : EventHandler {
10
             is ChannelJoined -> handleJoin(client.userState, event)
11
             is ChannelJoined -> handleJoin(client.userState, event)
11
             is ChannelParted -> handlePart(client, event)
12
             is ChannelParted -> handlePart(client, event)
12
             is ChannelUserKicked -> handleKick(client, event)
13
             is ChannelUserKicked -> handleKick(client, event)
13
-            is ChannelNamesReceived  -> handleNamesReceived(client, event)
14
+            is ChannelNamesReceived -> handleNamesReceived(client, event)
14
             is UserAccountChanged -> handleAccountChanged(client, event)
15
             is UserAccountChanged -> handleAccountChanged(client, event)
15
             is UserNickChanged -> handleNickChanged(client, event)
16
             is UserNickChanged -> handleNickChanged(client, event)
16
             is UserQuit -> handleQuit(client.userState, event)
17
             is UserQuit -> handleQuit(client.userState, event)

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

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

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

32
         PartProcessor(),
32
         PartProcessor(),
33
         PingProcessor(),
33
         PingProcessor(),
34
         PrivmsgProcessor(),
34
         PrivmsgProcessor(),
35
+        TopicProcessor(),
35
         QuitProcessor(),
36
         QuitProcessor(),
36
         WelcomeProcessor()
37
         WelcomeProcessor()
37
 )
38
 )

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

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

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

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
-package com.dmdirc.ktirc.events
1
+package com.dmdirc.ktirc.handlers
2
 
2
 
3
 import com.dmdirc.ktirc.IrcClient
3
 import com.dmdirc.ktirc.IrcClient
4
 import com.dmdirc.ktirc.TestConstants
4
 import com.dmdirc.ktirc.TestConstants
5
+import com.dmdirc.ktirc.events.*
5
 import com.dmdirc.ktirc.model.CapabilitiesNegotiationState
6
 import com.dmdirc.ktirc.model.CapabilitiesNegotiationState
6
 import com.dmdirc.ktirc.model.Capability
7
 import com.dmdirc.ktirc.model.Capability
7
 import com.dmdirc.ktirc.model.ServerState
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
-package com.dmdirc.ktirc.events
1
+package com.dmdirc.ktirc.handlers
2
 
2
 
3
 import com.dmdirc.ktirc.IrcClient
3
 import com.dmdirc.ktirc.IrcClient
4
 import com.dmdirc.ktirc.TestConstants
4
 import com.dmdirc.ktirc.TestConstants
5
+import com.dmdirc.ktirc.events.*
5
 import com.dmdirc.ktirc.io.CaseMapping
6
 import com.dmdirc.ktirc.io.CaseMapping
6
 import com.dmdirc.ktirc.model.*
7
 import com.dmdirc.ktirc.model.*
7
 import com.nhaarman.mockitokotlin2.doReturn
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
-package com.dmdirc.ktirc.events
1
+package com.dmdirc.ktirc.handlers
2
 
2
 
3
 import com.dmdirc.ktirc.IrcClient
3
 import com.dmdirc.ktirc.IrcClient
4
 import com.dmdirc.ktirc.TestConstants
4
 import com.dmdirc.ktirc.TestConstants
5
+import com.dmdirc.ktirc.events.PingReceived
5
 import com.nhaarman.mockitokotlin2.mock
6
 import com.nhaarman.mockitokotlin2.mock
6
 import com.nhaarman.mockitokotlin2.verify
7
 import com.nhaarman.mockitokotlin2.verify
7
 import kotlinx.coroutines.runBlocking
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
-package com.dmdirc.ktirc.events
1
+package com.dmdirc.ktirc.handlers
2
 
2
 
3
 import com.dmdirc.ktirc.IrcClient
3
 import com.dmdirc.ktirc.IrcClient
4
 import com.dmdirc.ktirc.TestConstants
4
 import com.dmdirc.ktirc.TestConstants
5
+import com.dmdirc.ktirc.events.*
5
 import com.dmdirc.ktirc.model.*
6
 import com.dmdirc.ktirc.model.*
6
 import com.nhaarman.mockitokotlin2.doReturn
7
 import com.nhaarman.mockitokotlin2.doReturn
7
 import com.nhaarman.mockitokotlin2.mock
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
-package com.dmdirc.ktirc.events
1
+package com.dmdirc.ktirc.handlers
2
 
2
 
3
 import com.dmdirc.ktirc.IrcClient
3
 import com.dmdirc.ktirc.IrcClient
4
 import com.dmdirc.ktirc.TestConstants
4
 import com.dmdirc.ktirc.TestConstants
5
+import com.dmdirc.ktirc.events.*
5
 import com.dmdirc.ktirc.io.CaseMapping
6
 import com.dmdirc.ktirc.io.CaseMapping
6
 import com.dmdirc.ktirc.model.*
7
 import com.dmdirc.ktirc.model.*
7
 import com.nhaarman.mockitokotlin2.argForWhich
8
 import com.nhaarman.mockitokotlin2.argForWhich

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

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

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

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