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.

TopicProcessor.kt 1.9KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. package com.dmdirc.ktirc.messages.processors
  2. import com.dmdirc.ktirc.events.ChannelTopicChanged
  3. import com.dmdirc.ktirc.events.ChannelTopicDiscovered
  4. import com.dmdirc.ktirc.events.ChannelTopicMetadataDiscovered
  5. import com.dmdirc.ktirc.messages.RPL_NOTOPIC
  6. import com.dmdirc.ktirc.messages.RPL_TOPIC
  7. import com.dmdirc.ktirc.messages.RPL_TOPICWHOTIME
  8. import com.dmdirc.ktirc.model.IrcMessage
  9. import com.dmdirc.ktirc.model.asUser
  10. import com.dmdirc.ktirc.util.currentTimeZoneProvider
  11. import com.dmdirc.ktirc.util.logger
  12. import java.time.Instant
  13. import java.time.LocalDateTime
  14. internal class TopicProcessor : MessageProcessor {
  15. private val log by logger()
  16. override val commands = arrayOf(RPL_TOPIC, RPL_TOPICWHOTIME, RPL_NOTOPIC, "TOPIC")
  17. override fun process(message: IrcMessage) = sequence {
  18. when (message.command) {
  19. RPL_TOPIC -> yield(ChannelTopicDiscovered(message.metadata, message.channel, String(message.params[2])))
  20. RPL_NOTOPIC -> yield(ChannelTopicDiscovered(message.metadata, message.channel, null))
  21. RPL_TOPICWHOTIME -> yield(ChannelTopicMetadataDiscovered(
  22. message.metadata, message.channel, message.params[2].asUser(), message.topicSetTime))
  23. "TOPIC" -> message.sourceUser?.let {
  24. if (message.params.size >= 2) {
  25. yield(ChannelTopicChanged(message.metadata, it, String(message.params[0]), String(message.params[1])))
  26. } else {
  27. log.warning { "Discarding TOPIC line with insufficient parameters: $message" }
  28. }
  29. }
  30. }
  31. }.toList()
  32. private val IrcMessage.channel
  33. get() = String(params[1])
  34. private val IrcMessage.topicSetTime
  35. get() = LocalDateTime.ofInstant(Instant.ofEpochSecond(String(params[3]).toLong()), currentTimeZoneProvider())
  36. }