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

12345678910111213141516171819202122232425262728293031323334
  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. 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.metadata, user, String(message.params[0]), String(message.params[1]))
  15. })
  16. } ?: emptyList()
  17. private fun handleCtcp(message: IrcMessage, user: User): IrcEvent {
  18. val content = String(message.params[1].sliceArray(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.metadata, user, String(message.params[0]), body)
  23. else -> CtcpReceived(message.metadata, 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. }