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

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