Skip to content
This repository was archived by the owner on Aug 18, 2020. It is now read-only.

Commit 4de98d7

Browse files
committed
Fix #89: Remove an inputs listeners from the connector when shutting down
1 parent ee0d583 commit 4de98d7

12 files changed

+103
-8
lines changed

src/main/scala/org/codeoverflow/chatoverflow/requirement/service/discord/DiscordChatConnector.scala

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,21 @@ class DiscordChatConnector(override val sourceIdentifier: String) extends Connec
4747
def addReactionDelEventListener(listener: MessageReactionRemoveEvent => Unit): Unit =
4848
discordChatListener.addReactionDelEventListener(listener)
4949

50+
def removeMessageReceivedListener(listener: MessageReceivedEvent => Unit): Unit =
51+
discordChatListener.removeMessageReceivedListener(listener)
52+
53+
def removeMessageUpdateListener(listener: MessageUpdateEvent => Unit): Unit =
54+
discordChatListener.removeMessageUpdateEventListener(listener)
55+
56+
def removeMessageDeleteListener(listener: MessageDeleteEvent => Unit): Unit =
57+
discordChatListener.removeMessageDeleteEventListener(listener)
58+
59+
def removeReactionAddEventListener(listener: MessageReactionAddEvent => Unit): Unit =
60+
discordChatListener.removeReactionAddEventListener(listener)
61+
62+
def removeReactionDelEventListener(listener: MessageReactionRemoveEvent => Unit): Unit =
63+
discordChatListener.removeReactionDelEventListener(listener)
64+
5065
/**
5166
* Connects to discord
5267
*/

src/main/scala/org/codeoverflow/chatoverflow/requirement/service/discord/DiscordChatListener.scala

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,16 @@ class DiscordChatListener extends EventListener {
3232

3333
def addReactionDelEventListener(listener: MessageReactionRemoveEvent => Unit): Unit = reactionDelEventListener += listener
3434

35+
def removeMessageReceivedListener(listener: MessageReceivedEvent => Unit): Unit = messageEventListener -= listener
36+
37+
def removeMessageUpdateEventListener(listener: MessageUpdateEvent => Unit): Unit = messageUpdateEventListener -= listener
38+
39+
def removeMessageDeleteEventListener(listener: MessageDeleteEvent => Unit): Unit = messageDeleteEventListener -= listener
40+
41+
def removeReactionAddEventListener(listener: MessageReactionAddEvent => Unit): Unit = reactionAddEventListener -= listener
42+
43+
def removeReactionDelEventListener(listener: MessageReactionRemoveEvent => Unit): Unit = reactionDelEventListener -= listener
44+
3545
override def onEvent(event: Event): Unit = {
3646
event match {
3747
case receivedEvent: MessageReceivedEvent => messageEventListener.foreach(listener => listener(receivedEvent))

src/main/scala/org/codeoverflow/chatoverflow/requirement/service/discord/impl/DiscordChatInputImpl.scala

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,14 @@ class DiscordChatInputImpl extends EventInputImpl[DiscordEvent, DiscordChatConne
8181
*
8282
* @return true if stopping was successful
8383
*/
84-
override def stop(): Boolean = true
84+
override def stop(): Boolean = {
85+
sourceConnector.get.removeMessageReceivedListener(onMessage)
86+
sourceConnector.get.removeMessageUpdateListener(onMessageUpdate)
87+
sourceConnector.get.removeMessageDeleteListener(onMessageDelete)
88+
sourceConnector.get.removeReactionAddEventListener(onReactionAdded)
89+
sourceConnector.get.removeReactionDelEventListener(onReactionRemoved)
90+
true
91+
}
8592

8693
/**
8794
* Listens for received messages, parses the data, adds them to the buffer and handles them over to the correct handler

src/main/scala/org/codeoverflow/chatoverflow/requirement/service/serial/SerialConnector.scala

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@ package org.codeoverflow.chatoverflow.requirement.service.serial
22

33
import java.io.{InputStream, PrintStream}
44

5-
import com.fazecast.jSerialComm.{SerialPort, SerialPortInvalidPortException}
5+
import com.fazecast.jSerialComm.{SerialPort, SerialPortEvent, SerialPortInvalidPortException}
66
import org.codeoverflow.chatoverflow.WithLogger
77
import org.codeoverflow.chatoverflow.connector.Connector
88

9+
import scala.collection.mutable
10+
911
/**
1012
* The serial connector allows to communicate with a device connected to the pcs serial port (like an Arduino)
1113
*
@@ -19,6 +21,7 @@ class SerialConnector(override val sourceIdentifier: String) extends Connector(s
1921
private var serialPort: Option[SerialPort] = None
2022
private var out: Option[PrintStream] = None
2123
private var in: Option[InputStream] = None
24+
private val inputListeners: mutable.Map[Array[Byte] => Unit, SerialPortEvent => Unit] = mutable.Map()
2225

2326
/**
2427
* @throws java.lang.IllegalStateException if the serial port is not available yet
@@ -49,11 +52,20 @@ class SerialConnector(override val sourceIdentifier: String) extends Connector(s
4952
@throws(classOf[IllegalStateException])
5053
def addInputListener(listener: Array[Byte] => Unit): Unit = {
5154
if (serialPort.isEmpty) throw new IllegalStateException("Serial port is not available yet")
52-
serialPortInputListener.addDataAvailableListener(_ => {
55+
val l: SerialPortEvent => Unit = _ => {
5356
val buffer = new Array[Byte](serialPort.get.bytesAvailable())
5457
serialPort.get.readBytes(buffer, buffer.length)
5558
listener(buffer)
56-
})
59+
}
60+
inputListeners += (listener -> l)
61+
serialPortInputListener.addDataAvailableListener(l)
62+
}
63+
64+
def removeInputListener(listener: Array[Byte] => Unit): Unit = {
65+
inputListeners remove listener match {
66+
case Some(l) => serialPortInputListener.removeDataAvailableListener(l)
67+
case _ => //listener not found, do nothing
68+
}
5769
}
5870

5971
/**
@@ -93,6 +105,7 @@ class SerialConnector(override val sourceIdentifier: String) extends Connector(s
93105
* Closes the connection with the port
94106
*/
95107
override def stop(): Boolean = {
108+
96109
serialPort.foreach(_.closePort())
97110
true
98111
}

src/main/scala/org/codeoverflow/chatoverflow/requirement/service/serial/SerialPortInputListener.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,6 @@ class SerialPortInputListener extends SerialPortDataListener {
1717
}
1818

1919
def addDataAvailableListener(listener: SerialPortEvent => Unit): Unit = listeners += listener
20+
21+
def removeDataAvailableListener(listener: SerialPortEvent => Unit): Unit = listeners += listener
2022
}

src/main/scala/org/codeoverflow/chatoverflow/requirement/service/serial/impl/SerialInputImpl.scala

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,21 @@ import org.codeoverflow.chatoverflow.requirement.service.serial.SerialConnector
1313
class SerialInputImpl extends EventInputImpl[SerialEvent, SerialConnector] with SerialInput with WithLogger {
1414

1515
override def start(): Boolean = {
16-
sourceConnector.get.addInputListener(bytes => call(new SerialDataAvailableEvent(bytes)))
16+
sourceConnector.get.addInputListener(onInput)
1717
true
1818
}
1919

20+
private def onInput(bytes: Array[Byte]): Unit = call(new SerialDataAvailableEvent(bytes))
21+
2022
override def getInputStream: InputStream = sourceConnector.get.getInputStream
2123

2224
/**
2325
* Stops the input, called before source connector will shutdown
2426
*
2527
* @return true if stopping was successful
2628
*/
27-
override def stop(): Boolean = true
29+
override def stop(): Boolean = {
30+
sourceConnector.get.removeInputListener(onInput)
31+
true
32+
}
2833
}

src/main/scala/org/codeoverflow/chatoverflow/requirement/service/tipeeestream/TipeeestreamConnector.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,12 @@ class TipeeestreamConnector(override val sourceIdentifier: String) extends Conne
8686

8787
def addFollowEventListener(listener: JSONObject => Unit): Unit = tipeeeStreamListener.addFollowEventListener(listener)
8888

89+
def removeSubscriptionEventListener(listener: JSONObject => Unit): Unit = tipeeeStreamListener.removeSubscriptionEventListener(listener)
90+
91+
def removeDonationEventListener(listener: JSONObject => Unit): Unit = tipeeeStreamListener.removeDonationEventListener(listener)
92+
93+
def removeFollowEventListener(listener: JSONObject => Unit): Unit = tipeeeStreamListener.removeFollowEventListener(listener)
94+
8995
override def stop(): Boolean = {
9096
socket.foreach(_.close())
9197
true

src/main/scala/org/codeoverflow/chatoverflow/requirement/service/tipeeestream/TipeeestreamListener.scala

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,18 @@ class TipeeestreamListener {
2323
followEventListeners += listener
2424
}
2525

26+
def removeSubscriptionEventListener(listener: JSONObject => Unit): Unit = {
27+
subscriptionEventListeners -= listener
28+
}
29+
30+
def removeDonationEventListener(listener: JSONObject => Unit): Unit = {
31+
donationEventListeners -= listener
32+
}
33+
34+
def removeFollowEventListener(listener: JSONObject => Unit): Unit = {
35+
followEventListeners -= listener
36+
}
37+
2638
def onSocketEvent(objects : Array[AnyRef]) : Unit = {
2739
val json: JSONObject = objects(0).asInstanceOf[JSONObject]
2840
val event: JSONObject = json.getJSONObject("event")

src/main/scala/org/codeoverflow/chatoverflow/requirement/service/tipeeestream/impl/TipeestreamEventInputImpl.scala

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,5 +83,10 @@ class TipeestreamEventInputImpl extends EventInputImpl[TipeeestreamEvent, Tipeee
8383
}
8484
}
8585

86-
override def stop(): Boolean = true
86+
override def stop(): Boolean = {
87+
sourceConnector.get.removeFollowEventListener(onFollow)
88+
sourceConnector.get.removeSubscriptionEventListener(onSubscription)
89+
sourceConnector.get.removeDonationEventListener(onDonation)
90+
true
91+
}
8792
}

src/main/scala/org/codeoverflow/chatoverflow/requirement/service/twitch/chat/TwitchChatConnector.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,14 @@ class TwitchChatConnector(override val sourceIdentifier: String) extends Connect
3131
twitchChatListener.addUnknownEventListener(listener)
3232
}
3333

34+
def removeMessageEventListener(listener: MessageEvent => Unit): Unit = {
35+
twitchChatListener.removeMessageEventListener(listener)
36+
}
37+
38+
def removeUnknownEventListener(listener: UnknownEvent => Unit): Unit = {
39+
twitchChatListener.removeUnknownEventListener(listener)
40+
}
41+
3442
def joinChannel(channel: String): Unit = {
3543
bot.send().joinChannel(channel)
3644
channels += channel

src/main/scala/org/codeoverflow/chatoverflow/requirement/service/twitch/chat/TwitchChatListener.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,12 @@ class TwitchChatListener extends ListenerAdapter {
2929
unknownEventListener += listener
3030
}
3131

32+
def removeMessageEventListener(listener: MessageEvent => Unit): Unit = {
33+
messageEventListener -= listener
34+
}
35+
36+
def removeUnknownEventListener(listener: UnknownEvent => Unit): Unit = {
37+
unknownEventListener -= listener
38+
}
39+
3240
}

src/main/scala/org/codeoverflow/chatoverflow/requirement/service/twitch/chat/impl/TwitchChatInputImpl.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,5 +104,9 @@ class TwitchChatInputImpl extends EventInputImpl[TwitchEvent, chat.TwitchChatCon
104104
*
105105
* @return true if stopping was successful
106106
*/
107-
override def stop(): Boolean = true
107+
override def stop(): Boolean = {
108+
sourceConnector.get.removeMessageEventListener(onMessage)
109+
sourceConnector.get.removeUnknownEventListener(onUnknown)
110+
true
111+
}
108112
}

0 commit comments

Comments
 (0)