Browse Source

Simplify how event handlers are exposed

tags/v0.2.0
Chris Smith 5 years ago
parent
commit
122483b371

+ 1
- 0
CHANGELOG View File

@@ -1,4 +1,5 @@
1 1
 v0.2.0 [in development]
2 2
 
3 3
   * Added support for connecting over TLS
4
+  * Simplified how event handlers are registered
4 5
   * (Internal) Upgraded to Gradle 5.1.1

+ 24
- 26
src/main/kotlin/com/dmdirc/ktirc/IrcClient.kt View File

@@ -19,11 +19,11 @@ interface IrcClient {
19 19
     val channelState: ChannelStateMap
20 20
     val userState: UserState
21 21
 
22
+    fun onEvent(handler: (IrcEvent) -> Unit)
23
+
22 24
     val caseMapping: CaseMapping
23 25
         get() = serverState.features[ServerFeature.ServerCaseMapping] ?: CaseMapping.Rfc
24 26
 
25
-    var eventHandler: EventHandler?
26
-
27 27
     fun isLocalUser(user: User): Boolean = caseMapping.areEquivalent(user.nickname, serverState.localNickname)
28 28
 
29 29
 }
@@ -39,18 +39,12 @@ class IrcClientImpl(private val server: Server, private val profile: Profile) :
39 39
     override val channelState = ChannelStateMap { caseMapping }
40 40
     override val userState = UserState { caseMapping }
41 41
 
42
-    override var eventHandler: EventHandler? = null
43
-        set(value) {
44
-            field?.let { messageHandler.handlers.remove(it) }
45
-            field = value
46
-            field?.let { messageHandler.handlers.add(it) }
47
-        }
48
-
49 42
     private val messageHandler = MessageHandler(messageProcessors.toList(), eventHandlers.toMutableList())
50 43
 
51 44
     private val parser = MessageParser()
52 45
     private var socket: LineBufferedSocket? = null
53 46
 
47
+    // TODO: It would be cleaner if this didn't suspend but returned immediately
54 48
     override suspend fun send(message: String) {
55 49
         socket?.sendLine(message)
56 50
     }
@@ -77,28 +71,32 @@ class IrcClientImpl(private val server: Server, private val profile: Profile) :
77 71
         socket?.disconnect()
78 72
     }
79 73
 
80
-    companion object {
81
-        @JvmStatic
82
-        fun main(args: Array<String>) {
83
-            val rootLogger = LogManager.getLogManager().getLogger("")
84
-            rootLogger.level = Level.FINEST
85
-            for (h in rootLogger.handlers) {
86
-                h.level = Level.FINEST
74
+    override fun onEvent(handler: (IrcEvent) -> Unit) {
75
+        messageHandler.handlers.add(object : EventHandler {
76
+            override suspend fun processEvent(client: IrcClient, event: IrcEvent) {
77
+                handler(event)
87 78
             }
79
+        })
80
+    }
81
+}
82
+
83
+fun main() {
84
+    val rootLogger = LogManager.getLogManager().getLogger("")
85
+    rootLogger.level = Level.FINEST
86
+    for (h in rootLogger.handlers) {
87
+        h.level = Level.FINEST
88
+    }
88 89
 
90
+    runBlocking {
91
+        val client = IrcClientImpl(Server("testnet.inspircd.org", 6667), Profile("KtIrc", "Kotlin!", "kotlin"))
92
+        client.onEvent { event ->
89 93
             runBlocking {
90
-                val client = IrcClientImpl(Server("testnet.inspircd.org", 6667), Profile("KtIrc", "Kotlin!", "kotlin"))
91
-                client.eventHandler = object : EventHandler {
92
-                    override suspend fun processEvent(client: IrcClient, event: IrcEvent) {
93
-                        when (event) {
94
-                            is ServerWelcome -> client.send(joinMessage("#ktirc"))
95
-                            is MessageReceived -> if (event.message == "!test") client.send(privmsgMessage(event.target, "Test successful!"))
96
-                        }
97
-                    }
94
+                when (event) {
95
+                    is ServerWelcome -> client.send(joinMessage("#ktirc"))
96
+                    is MessageReceived -> if (event.message == "!test") client.send(privmsgMessage(event.target, "Test successful!"))
98 97
                 }
99
-                client.connect()
100 98
             }
101 99
         }
100
+        client.connect()
102 101
     }
103
-
104 102
 }

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

@@ -2,6 +2,7 @@ package com.dmdirc.ktirc.events
2 2
 
3 3
 import com.dmdirc.ktirc.IrcClient
4 4
 
5
+@FunctionalInterface
5 6
 interface EventHandler {
6 7
 
7 8
     suspend fun processEvent(client: IrcClient, event: IrcEvent)

+ 4
- 42
src/test/kotlin/com/dmdirc/ktirc/IrcClientTest.kt View File

@@ -1,6 +1,6 @@
1 1
 package com.dmdirc.ktirc
2 2
 
3
-import com.dmdirc.ktirc.events.EventHandler
3
+import com.dmdirc.ktirc.events.IrcEvent
4 4
 import com.dmdirc.ktirc.events.ServerWelcome
5 5
 import com.dmdirc.ktirc.io.CaseMapping
6 6
 import com.dmdirc.ktirc.io.LineBufferedSocket
@@ -35,7 +35,7 @@ internal class IrcClientImplTest {
35 35
         on { invoke(eq(HOST), eq(PORT), any()) } doReturn mockSocket
36 36
     }
37 37
 
38
-    private val mockEventHandler = mock<EventHandler>()
38
+    private val mockEventHandler = mock<(IrcEvent) -> Unit>()
39 39
 
40 40
     @BeforeEach
41 41
     fun setUp() {
@@ -124,7 +124,7 @@ internal class IrcClientImplTest {
124 124
         runBlocking {
125 125
             val client = IrcClientImpl(Server(HOST, PORT, password = PASSWORD), Profile(NICK, REAL_NAME, USER_NAME))
126 126
             client.socketFactory = mockSocketFactory
127
-            client.eventHandler = mockEventHandler
127
+            client.onEvent(mockEventHandler)
128 128
 
129 129
             launch {
130 130
                 readLineChannel.send(":the.gibson 001 acidBurn :Welcome to the IRC!".toByteArray())
@@ -133,45 +133,7 @@ internal class IrcClientImplTest {
133 133
 
134 134
             client.connect()
135 135
 
136
-            verify(mockEventHandler).processEvent(same(client), isA<ServerWelcome>())
137
-        }
138
-    }
139
-
140
-    @Test
141
-    fun `IrcClientImpl removes old event handlers when new one is added`() {
142
-        runBlocking {
143
-            val client = IrcClientImpl(Server(HOST, PORT, password = PASSWORD), Profile(NICK, REAL_NAME, USER_NAME))
144
-            client.socketFactory = mockSocketFactory
145
-            client.eventHandler = mockEventHandler
146
-            client.eventHandler = mock()
147
-
148
-            launch {
149
-                readLineChannel.send(":the.gibson 001 acidBurn :Welcome to the IRC!".toByteArray())
150
-                readLineChannel.close()
151
-            }
152
-
153
-            client.connect()
154
-
155
-            verify(mockEventHandler, never()).processEvent(client, ServerWelcome(TestConstants.time, "acidBurn"))
156
-        }
157
-    }
158
-
159
-    @Test
160
-    fun `IrcClientImpl removes old event handlers when it is set to null`() {
161
-        runBlocking {
162
-            val client = IrcClientImpl(Server(HOST, PORT, password = PASSWORD), Profile(NICK, REAL_NAME, USER_NAME))
163
-            client.socketFactory = mockSocketFactory
164
-            client.eventHandler = mockEventHandler
165
-            client.eventHandler = null
166
-
167
-            launch {
168
-                readLineChannel.send(":the.gibson 001 acidBurn :Welcome to the IRC!".toByteArray())
169
-                readLineChannel.close()
170
-            }
171
-
172
-            client.connect()
173
-
174
-            verify(mockEventHandler, never()).processEvent(client, ServerWelcome(TestConstants.time, "acidBurn"))
136
+            verify(mockEventHandler).invoke(isA<ServerWelcome>())
175 137
         }
176 138
     }
177 139
 

Loading…
Cancel
Save