You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

PrivmsgProcessor.kt 1.7KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. package com.dmdirc.ktirc.messages.processors
  2. import com.dmdirc.ktirc.events.ActionReceived
  3. import com.dmdirc.ktirc.events.CtcpReceived
  4. import com.dmdirc.ktirc.events.IrcEvent
  5. import com.dmdirc.ktirc.events.MessageReceived
  6. import com.dmdirc.ktirc.messages.CTCP_BYTE
  7. import com.dmdirc.ktirc.model.IrcMessage
  8. import com.dmdirc.ktirc.model.User
  9. import com.dmdirc.ktirc.util.logger
  10. internal class PrivmsgProcessor : MessageProcessor {
  11. private val log by logger()
  12. override val commands = arrayOf("PRIVMSG")
  13. override fun process(message: IrcMessage) = when {
  14. message.sourceUser == null -> emptyList()
  15. message.params.size < 2 -> {
  16. log.warning { "Discarding PRIVMSG line with insufficient parameters: $message" }
  17. emptyList()
  18. }
  19. message.isCtcp() -> listOf(handleCtcp(message, message.sourceUser))
  20. else -> listOf(MessageReceived(message.metadata, message.sourceUser, String(message.params[0]), String(message.params[1])))
  21. }
  22. private fun handleCtcp(message: IrcMessage, user: User): IrcEvent {
  23. val content = String(message.params[1].sliceArray(1 until message.params[1].size - 1))
  24. val parts = content.split(' ', limit = 2)
  25. val body = if (parts.size == 2) parts[1] else ""
  26. return when (parts[0].toUpperCase()) {
  27. "ACTION" -> ActionReceived(message.metadata, user, String(message.params[0]), body)
  28. else -> CtcpReceived(message.metadata, user, String(message.params[0]), parts[0], body)
  29. }
  30. }
  31. private fun IrcMessage.isCtcp() = params[1].size > 2 && params[1][0] == CTCP_BYTE && params[1][params[1].size - 1] == CTCP_BYTE
  32. }