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.

MessageBuilder.kt 1.3KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. package com.dmdirc.ktirc.messages
  2. import com.dmdirc.ktirc.model.MessageTag
  3. internal class MessageBuilder {
  4. fun build(tags: Map<MessageTag, String>, command: String, arguments: Array<out String>) =
  5. // TODO: Check line length
  6. buildString {
  7. append(tags.toPrefix())
  8. append(command)
  9. append(arguments.toSuffix())
  10. }.toByteArray()
  11. private fun Map<MessageTag, String>.toPrefix() = when {
  12. isEmpty() -> ""
  13. // TODO: Check if the server actually understands tags here
  14. // TODO: Check maximum length of tags
  15. else ->
  16. map { "${it.key.name}=${it.value.escapeTagValue()}" }
  17. .joinToString(separator = ";", prefix = "@", postfix = " ")
  18. }
  19. private fun Array<out String>.toSuffix() = when (size) {
  20. 0 -> ""
  21. 1 -> this[0].asLastParam()
  22. else -> dropLast(1).joinToString(separator = " ", prefix = " ") + last().asLastParam()
  23. }
  24. private fun String.asLastParam() = when {
  25. contains(' ') || startsWith(':') -> " :$this"
  26. else -> " $this"
  27. }
  28. private fun String.escapeTagValue() = replace("\\", "\\\\")
  29. .replace("\n", "\\n")
  30. .replace("\r", "\\r")
  31. .replace(";", "\\:")
  32. .replace(" ", "\\s")
  33. }