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.5KB

12345678910111213141516171819202122232425262728293031323334353637
  1. package com.dmdirc.ktirc.messages
  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.model.IrcMessage
  7. import com.dmdirc.ktirc.model.MessageTag
  8. import com.dmdirc.ktirc.model.User
  9. internal class PrivmsgProcessor : MessageProcessor {
  10. override val commands = arrayOf("PRIVMSG")
  11. override fun process(message: IrcMessage) = message.sourceUser?.let { user ->
  12. listOf(when {
  13. message.isCtcp() -> handleCtcp(message, user)
  14. else -> MessageReceived(message.time, user, String(message.params[0]), String(message.params[1]), message.messageId)
  15. })
  16. } ?: emptyList()
  17. private fun handleCtcp(message: IrcMessage, user: User): IrcEvent {
  18. val content = String(message.params[1]).substring(1 until message.params[1].size - 1)
  19. val parts = content.split(' ', limit=2)
  20. val body = if (parts.size == 2) parts[1] else ""
  21. return when (parts[0].toUpperCase()) {
  22. "ACTION" -> ActionReceived(message.time, user, String(message.params[0]), body, message.messageId)
  23. else -> CtcpReceived(message.time, user, String(message.params[0]), parts[0], body)
  24. }
  25. }
  26. private fun IrcMessage.isCtcp() = params[1].size > 2 && params[1][0] == CTCP_BYTE && params[1][params[1].size - 1] == CTCP_BYTE
  27. private val IrcMessage.messageId
  28. get() = tags[MessageTag.MessageId]
  29. }