11package org .codeoverflow .chatoverflow .requirement .service .discord .impl
22
3- import java .awt .Color
43import java .util
54import java .util .Calendar
65import java .util .function .{BiConsumer , Consumer }
76
8- import net .dv8tion .jda .api .entities .{ ChannelType , Message , MessageType , PrivateChannel , TextChannel }
7+ import net .dv8tion .jda .api .entities ._
98import net .dv8tion .jda .api .events .message .{MessageDeleteEvent , MessageReceivedEvent , MessageUpdateEvent }
109import org .codeoverflow .chatoverflow .WithLogger
1110import org .codeoverflow .chatoverflow .api .io .dto .chat .discord .{DiscordChannel , DiscordChatCustomEmoticon , DiscordChatMessage , DiscordChatMessageAuthor }
1211import org .codeoverflow .chatoverflow .api .io .input .chat .DiscordChatInput
1312import org .codeoverflow .chatoverflow .registry .Impl
14- import org .codeoverflow .chatoverflow .requirement .Connection
13+ import org .codeoverflow .chatoverflow .requirement .InputImpl
1514import org .codeoverflow .chatoverflow .requirement .service .discord .DiscordChatConnector
1615
1716import scala .collection .JavaConverters ._
@@ -21,9 +20,9 @@ import scala.collection.mutable.ListBuffer
2120 * This is the implementation of the discord chat input, using the discord connector.
2221 */
2322@ Impl (impl = classOf [DiscordChatInput ], connector = classOf [DiscordChatConnector ])
24- class DiscordChatInputImpl extends Connection [DiscordChatConnector ] with DiscordChatInput with WithLogger {
23+ class DiscordChatInputImpl extends InputImpl [DiscordChatConnector ] with DiscordChatInput with WithLogger {
2524
26- private var channelId = getSourceIdentifier
25+ private var channelId : Option [ String ] = None
2726 private val messages : ListBuffer [DiscordChatMessage ] = ListBuffer [DiscordChatMessage ]()
2827 private val privateMessages : ListBuffer [DiscordChatMessage ] = ListBuffer [DiscordChatMessage ]()
2928 private val messageHandler = ListBuffer [Consumer [DiscordChatMessage ]]()
@@ -33,19 +32,11 @@ class DiscordChatInputImpl extends Connection[DiscordChatConnector] with Discord
3332 private val privateMessageEditHandler = ListBuffer [BiConsumer [DiscordChatMessage , DiscordChatMessage ]]()
3433 private val privateMessageDeleteHandler = ListBuffer [Consumer [DiscordChatMessage ]]()
3534
36- override def init (): Boolean = {
37- if (sourceConnector.isDefined) {
38- if (sourceConnector.get.isRunning || sourceConnector.get.init()) {
39- setChannel(getSourceIdentifier)
40- sourceConnector.get.addMessageReceivedListener(onMessage)
41- sourceConnector.get.addMessageUpdateListener(onMessageUpdate)
42- sourceConnector.get.addMessageDeleteListener(onMessageDelete)
43- true
44- } else false
45- } else {
46- logger warn " Source connector not set."
47- false
48- }
35+ override def start (): Boolean = {
36+ sourceConnector.get.addMessageReceivedListener(onMessage)
37+ sourceConnector.get.addMessageUpdateListener(onMessageUpdate)
38+ sourceConnector.get.addMessageDeleteListener(onMessageDelete)
39+ true
4940 }
5041
5142 /**
@@ -55,15 +46,17 @@ class DiscordChatInputImpl extends Connection[DiscordChatConnector] with Discord
5546 */
5647 private def onMessage (event : MessageReceivedEvent ): Unit = {
5748 if (event.getMessage.getType == MessageType .DEFAULT ) {
58- val message = DiscordChatInputImpl .parse(event.getMessage)
59- event.getChannelType match {
60- case ChannelType .TEXT if event.getTextChannel.getId == channelId =>
61- messageHandler.foreach(_.accept(message))
62- messages += message
63- case ChannelType .PRIVATE =>
64- privateMessageHandler.foreach(_.accept(message))
65- privateMessages += message
66- case _ => // Unknown channel, do nothing
49+ if (channelId.isDefined) {
50+ val message = DiscordChatInputImpl .parse(event.getMessage)
51+ event.getChannelType match {
52+ case ChannelType .TEXT if event.getTextChannel.getId == channelId.get =>
53+ messageHandler.foreach(_.accept(message))
54+ messages += message
55+ case ChannelType .PRIVATE =>
56+ privateMessageHandler.foreach(_.accept(message))
57+ privateMessages += message
58+ case _ => // Unknown channel, do nothing
59+ }
6760 }
6861 }
6962 }
@@ -102,20 +95,22 @@ class DiscordChatInputImpl extends Connection[DiscordChatConnector] with Discord
10295 * @param event a event with an deleted message
10396 */
10497 private def onMessageDelete (event : MessageDeleteEvent ): Unit = {
105- val id = event.getMessageId
106- event.getChannelType match {
107- case ChannelType .TEXT if event.getTextChannel.getId == channelId =>
108- val i = messages.indexWhere(_.getId == id)
109- if (i != - 1 ) {
110- val oldMessage = messages.remove(i)
111- messageDeleteHandler.foreach(_.accept(oldMessage))
112- }
113- case ChannelType .PRIVATE =>
114- val i = privateMessages.indexWhere(_.getId == id)
115- if (i != - 1 ) {
116- val oldMessage = privateMessages.remove(i)
117- privateMessageDeleteHandler.foreach(_.accept(oldMessage))
118- }
98+ if (channelId.isDefined) {
99+ val id = event.getMessageId
100+ event.getChannelType match {
101+ case ChannelType .TEXT if event.getTextChannel.getId == channelId.get =>
102+ val i = messages.indexWhere(_.getId == id)
103+ if (i != - 1 ) {
104+ val oldMessage = messages.remove(i)
105+ messageDeleteHandler.foreach(_.accept(oldMessage))
106+ }
107+ case ChannelType .PRIVATE =>
108+ val i = privateMessages.indexWhere(_.getId == id)
109+ if (i != - 1 ) {
110+ val oldMessage = privateMessages.remove(i)
111+ privateMessageDeleteHandler.foreach(_.accept(oldMessage))
112+ }
113+ }
119114 }
120115 }
121116
@@ -130,32 +125,35 @@ class DiscordChatInputImpl extends Connection[DiscordChatConnector] with Discord
130125
131126 privateMessages.filter(_.getTimestamp > currentTime - lastMilliseconds).toList.asJava
132127 }
133- override def registerMessageHandler (handler : Consumer [DiscordChatMessage ]): Unit = messageHandler += handler
128+ override def registerMessageHandler (handler : Consumer [DiscordChatMessage ]): Unit = {
129+ if (channelId.isEmpty) throw new IllegalStateException (" first set the channel for this input" )
130+ messageHandler += handler
131+ }
134132
135133 override def registerPrivateMessageHandler (handler : Consumer [DiscordChatMessage ]): Unit = privateMessageHandler += handler
136134
137- override def registerMessageEditHandler (handler : BiConsumer [DiscordChatMessage , DiscordChatMessage ]): Unit = messageEditHandler += handler
135+ override def registerMessageEditHandler (handler : BiConsumer [DiscordChatMessage , DiscordChatMessage ]): Unit = {
136+ if (channelId.isEmpty) throw new IllegalStateException (" first set the channel for this input" )
137+ messageEditHandler += handler
138+ }
138139
139140 override def registerPrivateMessageEditHandler (handler : BiConsumer [DiscordChatMessage , DiscordChatMessage ]): Unit = privateMessageEditHandler += handler
140141
141- override def registerMessageDeleteHandler (handler : Consumer [DiscordChatMessage ]): Unit = messageDeleteHandler += handler
142+ override def registerMessageDeleteHandler (handler : Consumer [DiscordChatMessage ]): Unit = {
143+ if (channelId.isEmpty) throw new IllegalStateException (" first set the channel for this input" )
144+ messageDeleteHandler += handler
145+ }
142146
143147 override def registerPrivateMessageDeleteHandler (handler : Consumer [DiscordChatMessage ]): Unit = privateMessageDeleteHandler += handler
144148
145149 override def setChannel (channelId : String ): Unit = {
146150 sourceConnector.get.getTextChannel(channelId) match {
147- case Some (_) => this .channelId = channelId
151+ case Some (_) => this .channelId = Some ( channelId.trim)
148152 case None => throw new IllegalArgumentException (" Channel with that id doesn't exist" )
149153 }
150154 }
151155
152- override def getChannelId : String = channelId
153-
154- override def serialize (): String = getSourceIdentifier
155-
156- override def deserialize (value : String ): Unit = {
157- setSourceConnector(value)
158- }
156+ override def getChannelId : String = channelId.get
159157
160158 override def getMessage (messageId : String ): DiscordChatMessage =
161159 messages.find(_.getId == messageId).getOrElse(privateMessages.find(_.getId == messageId).orNull)
0 commit comments