1
1
package org .codeoverflow .chatoverflow .requirement .service .discord .impl
2
2
3
- import java .awt .Color
4
3
import java .util
5
4
import java .util .Calendar
6
5
import java .util .function .{BiConsumer , Consumer }
7
6
8
- import net .dv8tion .jda .api .entities .{ ChannelType , Message , MessageType , PrivateChannel , TextChannel }
7
+ import net .dv8tion .jda .api .entities ._
9
8
import net .dv8tion .jda .api .events .message .{MessageDeleteEvent , MessageReceivedEvent , MessageUpdateEvent }
10
9
import org .codeoverflow .chatoverflow .WithLogger
11
10
import org .codeoverflow .chatoverflow .api .io .dto .chat .discord .{DiscordChannel , DiscordChatCustomEmoticon , DiscordChatMessage , DiscordChatMessageAuthor }
12
11
import org .codeoverflow .chatoverflow .api .io .input .chat .DiscordChatInput
13
12
import org .codeoverflow .chatoverflow .registry .Impl
14
- import org .codeoverflow .chatoverflow .requirement .Connection
13
+ import org .codeoverflow .chatoverflow .requirement .InputImpl
15
14
import org .codeoverflow .chatoverflow .requirement .service .discord .DiscordChatConnector
16
15
17
16
import scala .collection .JavaConverters ._
@@ -21,9 +20,9 @@ import scala.collection.mutable.ListBuffer
21
20
* This is the implementation of the discord chat input, using the discord connector.
22
21
*/
23
22
@ 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 {
25
24
26
- private var channelId = getSourceIdentifier
25
+ private var channelId : Option [ String ] = None
27
26
private val messages : ListBuffer [DiscordChatMessage ] = ListBuffer [DiscordChatMessage ]()
28
27
private val privateMessages : ListBuffer [DiscordChatMessage ] = ListBuffer [DiscordChatMessage ]()
29
28
private val messageHandler = ListBuffer [Consumer [DiscordChatMessage ]]()
@@ -33,19 +32,11 @@ class DiscordChatInputImpl extends Connection[DiscordChatConnector] with Discord
33
32
private val privateMessageEditHandler = ListBuffer [BiConsumer [DiscordChatMessage , DiscordChatMessage ]]()
34
33
private val privateMessageDeleteHandler = ListBuffer [Consumer [DiscordChatMessage ]]()
35
34
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
49
40
}
50
41
51
42
/**
@@ -55,15 +46,17 @@ class DiscordChatInputImpl extends Connection[DiscordChatConnector] with Discord
55
46
*/
56
47
private def onMessage (event : MessageReceivedEvent ): Unit = {
57
48
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
+ }
67
60
}
68
61
}
69
62
}
@@ -102,20 +95,22 @@ class DiscordChatInputImpl extends Connection[DiscordChatConnector] with Discord
102
95
* @param event a event with an deleted message
103
96
*/
104
97
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
+ }
119
114
}
120
115
}
121
116
@@ -130,32 +125,35 @@ class DiscordChatInputImpl extends Connection[DiscordChatConnector] with Discord
130
125
131
126
privateMessages.filter(_.getTimestamp > currentTime - lastMilliseconds).toList.asJava
132
127
}
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
+ }
134
132
135
133
override def registerPrivateMessageHandler (handler : Consumer [DiscordChatMessage ]): Unit = privateMessageHandler += handler
136
134
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
+ }
138
139
139
140
override def registerPrivateMessageEditHandler (handler : BiConsumer [DiscordChatMessage , DiscordChatMessage ]): Unit = privateMessageEditHandler += handler
140
141
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
+ }
142
146
143
147
override def registerPrivateMessageDeleteHandler (handler : Consumer [DiscordChatMessage ]): Unit = privateMessageDeleteHandler += handler
144
148
145
149
override def setChannel (channelId : String ): Unit = {
146
150
sourceConnector.get.getTextChannel(channelId) match {
147
- case Some (_) => this .channelId = channelId
151
+ case Some (_) => this .channelId = Some ( channelId.trim)
148
152
case None => throw new IllegalArgumentException (" Channel with that id doesn't exist" )
149
153
}
150
154
}
151
155
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
159
157
160
158
override def getMessage (messageId : String ): DiscordChatMessage =
161
159
messages.find(_.getId == messageId).getOrElse(privateMessages.find(_.getId == messageId).orNull)
0 commit comments