diff --git a/src/main/scala/org/codeoverflow/chatoverflow/service/twitch/impl/TwitchChatInputImpl.scala b/src/main/scala/org/codeoverflow/chatoverflow/service/twitch/impl/TwitchChatInputImpl.scala index a9ba513e..e7db748c 100644 --- a/src/main/scala/org/codeoverflow/chatoverflow/service/twitch/impl/TwitchChatInputImpl.scala +++ b/src/main/scala/org/codeoverflow/chatoverflow/service/twitch/impl/TwitchChatInputImpl.scala @@ -3,7 +3,7 @@ package org.codeoverflow.chatoverflow.service.twitch.impl import java.util.Calendar import java.util.function.Consumer -import org.codeoverflow.chatoverflow.api.io.input.chat.{ChatMessage, TwitchChatInput} +import org.codeoverflow.chatoverflow.api.io.input.chat._ import org.codeoverflow.chatoverflow.service.Connection import org.codeoverflow.chatoverflow.service.twitch.TwitchConnector import org.pircbotx.hooks.events.{MessageEvent, UnknownEvent} @@ -16,12 +16,14 @@ import scala.collection.mutable.ListBuffer */ class TwitchChatInputImpl extends Connection[TwitchConnector] with TwitchChatInput { - private val messages: ListBuffer[ChatMessage] = ListBuffer[ChatMessage]() - private val privateMessages: ListBuffer[ChatMessage] = ListBuffer[ChatMessage]() + private val messages: ListBuffer[TwitchChatMessage] = ListBuffer[TwitchChatMessage]() + private val privateMessages: ListBuffer[TwitchChatMessage] = ListBuffer[TwitchChatMessage]() private val whisperRegex = """^:([^!]+?)!.*?:(.*)$""".r + private val wholeEmoticonRegex = """(\d+):([\d,-]+)""".r + private val emoticonRegex = """(\d+)-(\d+)""".r - private val messageHandler = ListBuffer[Consumer[ChatMessage]]() - private val privateMessageHandler = ListBuffer[Consumer[ChatMessage]]() + private val messageHandler = ListBuffer[Consumer[TwitchChatMessage]]() + private val privateMessageHandler = ListBuffer[Consumer[TwitchChatMessage]]() override def init(): Unit = { @@ -32,9 +34,25 @@ class TwitchChatInputImpl extends Connection[TwitchConnector] with TwitchChatInp } private def onMessage(event: MessageEvent): Unit = { + val message = event.getMessage val color = if (event.getV3Tags.get("color").contains("#")) event.getV3Tags.get("color") else "" - val isSub = if (event.getV3Tags.get("subscriber") == "1") true else false - val msg: ChatMessage = new ChatMessage(event.getMessage, event.getUser.getNick, event.getTimestamp, isSub, color) + val subscriber = event.getV3Tags.get("subscriber") == "1" + val moderator = event.getV3Tags.get("mod") == "1" + val broadcaster = event.getV3Tags.get("badges").contains("broadcaster/1") + val premium = event.getV3Tags.get("badges").contains("premium/1") + val author = new TwitchChatMessageAuthor(event.getUser.getNick, broadcaster, moderator, subscriber, premium) + val channel = new Channel(event.getChannelSource) + val emoticons = new java.util.ArrayList[ChatEmoticon]() + wholeEmoticonRegex.findAllMatchIn(event.getV3Tags.get("emotes")).foreach(matchedElement => { + val id = matchedElement.group(1) + emoticonRegex.findAllMatchIn(matchedElement.group(2)).foreach(matchedElement => { + val index = matchedElement.group(1).toInt + val regex = message.substring(index, matchedElement.group(2).toInt + 1) + val emoticon = new TwitchChatEmoticon(regex, id, index) + emoticons.add(emoticon) + }) + }) + val msg = new TwitchChatMessage(author, message, event.getTimestamp, channel, emoticons, color) messageHandler.foreach(consumer => consumer.accept(msg)) messages += msg @@ -47,7 +65,7 @@ class TwitchChatInputImpl extends Connection[TwitchConnector] with TwitchChatInp val name = matchedElement.get.group(1) val message = matchedElement.get.group(2) val timestamp = event.getTimestamp - val msg: ChatMessage = new ChatMessage(message, name, timestamp) + val msg = new TwitchChatMessage(new TwitchChatMessageAuthor(name), message, timestamp, null) privateMessageHandler.foreach(consumer => consumer.accept(msg)) privateMessages += msg @@ -55,22 +73,22 @@ class TwitchChatInputImpl extends Connection[TwitchConnector] with TwitchChatInp } override def - getLastMessages(lastMilliseconds: Long): java.util.List[ChatMessage] = { + getLastMessages(lastMilliseconds: Long): java.util.List[TwitchChatMessage] = { val currentTime = Calendar.getInstance.getTimeInMillis messages.filter(_.getTimestamp > currentTime - lastMilliseconds).toList.asJava } - override def getLastPrivateMessages(lastMilliseconds: Long): java.util.List[ChatMessage] = { + override def getLastPrivateMessages(lastMilliseconds: Long): java.util.List[TwitchChatMessage] = { val currentTime = Calendar.getInstance.getTimeInMillis privateMessages.filter(_.getTimestamp > currentTime - lastMilliseconds).toList.asJava } - override def registerMessageHandler(handler: Consumer[ChatMessage]): Unit = messageHandler += handler + override def registerMessageHandler(handler: Consumer[TwitchChatMessage]): Unit = messageHandler += handler - override def registerPrivateMessageHandler(handler: Consumer[ChatMessage]): Unit = privateMessageHandler += handler + override def registerPrivateMessageHandler(handler: Consumer[TwitchChatMessage]): Unit = privateMessageHandler += handler override def setChannel(channel: String): Unit = sourceConnector.setChannel(channel) }