12345678910111213141516171819202122232425262728293031323334353637383940 |
- package com.dmdirc.ktirc.messages.processors
-
- import com.dmdirc.ktirc.events.ActionReceived
- import com.dmdirc.ktirc.events.CtcpReceived
- import com.dmdirc.ktirc.events.IrcEvent
- import com.dmdirc.ktirc.events.MessageReceived
- import com.dmdirc.ktirc.messages.CTCP_BYTE
- import com.dmdirc.ktirc.model.IrcMessage
- import com.dmdirc.ktirc.model.User
- import com.dmdirc.ktirc.util.logger
-
- internal class PrivmsgProcessor : MessageProcessor {
-
- private val log by logger()
-
- override val commands = arrayOf("PRIVMSG")
-
- override fun process(message: IrcMessage) = when {
- message.sourceUser == null -> emptyList()
- message.params.size < 2 -> {
- log.warning { "Discarding PRIVMSG line with insufficient parameters: $message" }
- emptyList()
- }
- message.isCtcp() -> listOf(handleCtcp(message, message.sourceUser))
- else -> listOf(MessageReceived(message.metadata, message.sourceUser, String(message.params[0]), String(message.params[1])))
- }
-
- private fun handleCtcp(message: IrcMessage, user: User): IrcEvent {
- val content = String(message.params[1].sliceArray(1 until message.params[1].size - 1))
- val parts = content.split(' ', limit = 2)
- val body = if (parts.size == 2) parts[1] else ""
- return when (parts[0].toUpperCase()) {
- "ACTION" -> ActionReceived(message.metadata, user, String(message.params[0]), body)
- else -> CtcpReceived(message.metadata, user, String(message.params[0]), parts[0], body)
- }
- }
-
- private fun IrcMessage.isCtcp() = params[1].size > 2 && params[1][0] == CTCP_BYTE && params[1][params[1].size - 1] == CTCP_BYTE
-
- }
|