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.

JoinProcessor.kt 2.5KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package com.dmdirc.ktirc.messages.processors
  2. import com.dmdirc.ktirc.events.ChannelJoinFailed
  3. import com.dmdirc.ktirc.events.ChannelJoined
  4. import com.dmdirc.ktirc.messages.*
  5. import com.dmdirc.ktirc.model.IrcMessage
  6. import com.dmdirc.ktirc.model.User
  7. internal class JoinProcessor : MessageProcessor {
  8. override val commands = arrayOf(
  9. "JOIN",
  10. ERR_TOOMANYCHANNELS,
  11. ERR_NOHIDING,
  12. ERR_CHANNELISFULL,
  13. ERR_INVITEONLYCHAN,
  14. ERR_BANNEDFROMCHAN,
  15. ERR_BADCHANNELKEY,
  16. ERR_NEEDREGGEDNICK,
  17. ERR_BADCHANNAME,
  18. ERR_THROTTLE,
  19. ERR_SECUREONLYCHAN,
  20. ERR_TOOMANYJOINS,
  21. ERR_ADMINONLY,
  22. ERR_OPERONLY)
  23. override fun process(message: IrcMessage) = when {
  24. message.command == "JOIN" ->
  25. message.sourceUser?.let { user ->
  26. user.addExtendedJoinFields(message.params)
  27. listOf(ChannelJoined(message.metadata, user, String(message.params[0])))
  28. } ?: emptyList()
  29. message.params.size >= 2 ->
  30. listOf(ChannelJoinFailed(message.metadata, String(message.params[1]), message.command.toReason()))
  31. else ->
  32. emptyList()
  33. }
  34. private fun User.addExtendedJoinFields(params: List<ByteArray>) {
  35. if (params.size == 3) {
  36. String(params[1]).let { account = if (it == "*") null else it }
  37. realName = String(params[2])
  38. }
  39. }
  40. private fun String.toReason() = when (this) {
  41. ERR_TOOMANYCHANNELS -> ChannelJoinFailed.JoinError.TooManyChannels
  42. ERR_NOHIDING -> ChannelJoinFailed.JoinError.NoHiding
  43. ERR_CHANNELISFULL -> ChannelJoinFailed.JoinError.ChannelFull
  44. ERR_INVITEONLYCHAN -> ChannelJoinFailed.JoinError.NeedInvite
  45. ERR_BANNEDFROMCHAN -> ChannelJoinFailed.JoinError.Banned
  46. ERR_BADCHANNELKEY -> ChannelJoinFailed.JoinError.NeedKey
  47. ERR_NEEDREGGEDNICK -> ChannelJoinFailed.JoinError.NeedRegisteredNick
  48. ERR_BADCHANNAME -> ChannelJoinFailed.JoinError.BadChannelName
  49. ERR_THROTTLE -> ChannelJoinFailed.JoinError.Throttled
  50. ERR_SECUREONLYCHAN -> ChannelJoinFailed.JoinError.NeedTls
  51. ERR_TOOMANYJOINS -> ChannelJoinFailed.JoinError.Throttled
  52. ERR_ADMINONLY -> ChannelJoinFailed.JoinError.NeedAdmin
  53. ERR_OPERONLY -> ChannelJoinFailed.JoinError.NeedOper
  54. else -> ChannelJoinFailed.JoinError.Unknown
  55. }
  56. }