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.

Events.kt 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. package com.dmdirc.ktirc.events
  2. import com.dmdirc.ktirc.model.ConnectionError
  3. import com.dmdirc.ktirc.model.ServerFeatureMap
  4. import com.dmdirc.ktirc.model.User
  5. import com.dmdirc.ktirc.util.RemoveIn
  6. import java.time.LocalDateTime
  7. /**
  8. * Metadata associated with an event.
  9. *
  10. * @param time The best-guess time at which the event occurred.
  11. * @param batchId The ID of the batch this event is part of, if any.
  12. * @param messageId The unique ID of this message, if any.
  13. * @param label The label of the command that this event was sent in response to, if any.
  14. */
  15. data class EventMetadata(
  16. val time: LocalDateTime,
  17. val batchId: String? = null,
  18. val messageId: String? = null,
  19. val label: String? = null)
  20. /** Base class for all events. */
  21. sealed class IrcEvent(val metadata: EventMetadata) {
  22. /** The time at which the event occurred. */
  23. @Deprecated("Moved to metadata", replaceWith = ReplaceWith("metadata.time"))
  24. @RemoveIn("2.0.0")
  25. val time: LocalDateTime
  26. get() = metadata.time
  27. }
  28. /**
  29. * Base class for events that are targeted to a channel or user.
  30. */
  31. sealed class TargetedEvent(metadata: EventMetadata, val target: String) : IrcEvent(metadata) {
  32. /** The channel (or user!) this event was targeted at. */
  33. @Deprecated("Use target instead", replaceWith = ReplaceWith("target"))
  34. @RemoveIn("2.0.0")
  35. val channel: String
  36. get() = target
  37. }
  38. /**
  39. * Interface implemented by events that come from a particular user.
  40. */
  41. interface SourcedEvent {
  42. /** The user that caused the event. */
  43. val user: User
  44. }
  45. /** Raised when a connection to the server is being established. */
  46. class ServerConnecting(metadata: EventMetadata) : IrcEvent(metadata)
  47. /** Raised when the connection to the server has been established. The server will not be ready for use yet. */
  48. class ServerConnected(metadata: EventMetadata) : IrcEvent(metadata)
  49. /** Raised when the connection to the server has ended. */
  50. class ServerDisconnected(metadata: EventMetadata) : IrcEvent(metadata)
  51. /** Raised when an error occurred trying to connect. */
  52. class ServerConnectionError(metadata: EventMetadata, val error: ConnectionError, val details: String?) : IrcEvent(metadata)
  53. /** Raised when the server is ready for use. */
  54. class ServerReady(metadata: EventMetadata) : IrcEvent(metadata)
  55. /** Raised when the server initially welcomes us to the IRC network. */
  56. class ServerWelcome(metadata: EventMetadata, val server: String, val localNick: String) : IrcEvent(metadata)
  57. /** Raised when the features supported by the server have changed. This may occur numerous times. */
  58. class ServerFeaturesUpdated(metadata: EventMetadata, val serverFeatures: ServerFeatureMap) : IrcEvent(metadata)
  59. /** Raised whenever a PING is received from the server. */
  60. class PingReceived(metadata: EventMetadata, val nonce: ByteArray) : IrcEvent(metadata)
  61. /** Raised when a user joins a channel. */
  62. class ChannelJoined(metadata: EventMetadata, override val user: User, channel: String) : TargetedEvent(metadata, channel), SourcedEvent
  63. /** Raised when a user leaves a channel. */
  64. class ChannelParted(metadata: EventMetadata, override val user: User, channel: String, val reason: String = "") : TargetedEvent(metadata, channel), SourcedEvent
  65. /** Raised when a [victim] is kicked from a channel. */
  66. class ChannelUserKicked(metadata: EventMetadata, override val user: User, channel: String, val victim: String, val reason: String = "") : TargetedEvent(metadata, channel), SourcedEvent
  67. /** Raised when a user quits, and is in a channel. */
  68. class ChannelQuit(metadata: EventMetadata, override val user: User, channel: String, val reason: String = "") : TargetedEvent(metadata, channel), SourcedEvent
  69. /** Raised when a user changes nickname, and is in a channel. */
  70. class ChannelNickChanged(metadata: EventMetadata, override val user: User, channel: String, val newNick: String) : TargetedEvent(metadata, channel), SourcedEvent
  71. /** Raised when a batch of the channel's member list has been received. More batches may follow. */
  72. class ChannelNamesReceived(metadata: EventMetadata, channel: String, val names: List<String>) : TargetedEvent(metadata, channel)
  73. /** Raised when the entirety of the channel's member list has been received. */
  74. class ChannelNamesFinished(metadata: EventMetadata, channel: String) : TargetedEvent(metadata, channel)
  75. /** Raised when a channel topic is discovered (not changed). Usually followed by [ChannelTopicMetadataDiscovered] if the [topic] is non-null. */
  76. class ChannelTopicDiscovered(metadata: EventMetadata, channel: String, val topic: String?) : TargetedEvent(metadata, channel)
  77. /** Raised when a channel topic's metadata is discovered. */
  78. class ChannelTopicMetadataDiscovered(metadata: EventMetadata, channel: String, val user: User, val setTime: LocalDateTime) : TargetedEvent(metadata, channel)
  79. /**
  80. * Raised when a channel's topic is changed.
  81. *
  82. * If the topic has been unset (cleared), [topic] will be `null`
  83. */
  84. class ChannelTopicChanged(metadata: EventMetadata, override val user: User, channel: String, val topic: String?) : TargetedEvent(metadata, channel), SourcedEvent
  85. /** Raised when a message is received. */
  86. class MessageReceived(metadata: EventMetadata, override val user: User, target: String, val message: String) : TargetedEvent(metadata, target), SourcedEvent {
  87. /** The message ID of this message. */
  88. @Deprecated("Moved to metadata", replaceWith = ReplaceWith("metadata.messageId"))
  89. @RemoveIn("2.0.0")
  90. val messageId: String?
  91. get() = metadata.messageId
  92. }
  93. /**
  94. * Raised when a notice is received.
  95. *
  96. * The [user] may in fact be a server, or have a nickname of `*` while connecting.
  97. */
  98. class NoticeReceived(metadata: EventMetadata, override val user: User, target: String, val message: String) : TargetedEvent(metadata, target), SourcedEvent
  99. /** Raised when an action is received. */
  100. class ActionReceived(metadata: EventMetadata, override val user: User, target: String, val action: String) : TargetedEvent(metadata, target), SourcedEvent {
  101. /** The message ID of this action. */
  102. @Deprecated("Moved to metadata", replaceWith = ReplaceWith("metadata.messageId"))
  103. @RemoveIn("2.0.0")
  104. val messageId: String?
  105. get() = metadata.messageId
  106. }
  107. /** Raised when a CTCP is received. */
  108. class CtcpReceived(metadata: EventMetadata, override val user: User, target: String, val type: String, val content: String) : TargetedEvent(metadata, target), SourcedEvent
  109. /** Raised when a CTCP reply is received. */
  110. class CtcpReplyReceived(metadata: EventMetadata, override val user: User, target: String, val type: String, val content: String) : TargetedEvent(metadata, target), SourcedEvent
  111. /** Raised when a user quits. */
  112. class UserQuit(metadata: EventMetadata, override val user: User, val reason: String = "") : IrcEvent(metadata), SourcedEvent
  113. /** Raised when a user changes nickname. */
  114. class UserNickChanged(metadata: EventMetadata, override val user: User, val newNick: String) : IrcEvent(metadata), SourcedEvent
  115. /** Raised when a user changes hostname. */
  116. class UserHostChanged(metadata: EventMetadata, override val user: User, val newIdent: String, val newHost: String) : IrcEvent(metadata), SourcedEvent
  117. /**
  118. * Raised when a user's account changes (i.e., they auth'd or deauth'd with services).
  119. *
  120. * This event is only raised if the server supports the `account-notify` capability.
  121. */
  122. class UserAccountChanged(metadata: EventMetadata, override val user: User, val newAccount: String?) : IrcEvent(metadata), SourcedEvent
  123. /** Raised when available server capabilities are received. More batches may follow. */
  124. class ServerCapabilitiesReceived(metadata: EventMetadata, val capabilities: Map<String, String>) : IrcEvent(metadata)
  125. /** Raised when our requested capabilities are acknowledged. More batches may follow. */
  126. class ServerCapabilitiesAcknowledged(metadata: EventMetadata, val capabilities: Map<String, String>) : IrcEvent(metadata)
  127. /** Raised when the server has finished sending us capabilities. */
  128. class ServerCapabilitiesFinished(metadata: EventMetadata) : IrcEvent(metadata)
  129. /** Raised when a line of the Message Of the Day has been received. */
  130. class MotdLineReceived(metadata: EventMetadata, val line: String, val first: Boolean = false) : IrcEvent(metadata)
  131. /** Raised when a Message Of the Day has completed. */
  132. class MotdFinished(metadata: EventMetadata, val missing: Boolean = false) : IrcEvent(metadata)
  133. /**
  134. * Raised when a mode change occurs.
  135. *
  136. * If [discovered] is true then the event is in response to the server providing the full set of modes on the target,
  137. * and the given modes are thus exhaustive. Otherwise, the modes are a sequence of changes to apply to the existing
  138. * state.
  139. */
  140. class ModeChanged(metadata: EventMetadata, target: String, val modes: String, val arguments: Array<String>, val discovered: Boolean = false) : TargetedEvent(metadata, target)
  141. /** Raised when an AUTHENTICATION message is received. [argument] is `null` if the server sent an empty reply ("+") */
  142. class AuthenticationMessage(metadata: EventMetadata, val argument: String?) : IrcEvent(metadata)
  143. /** Raised when a SASL attempt finishes, successfully or otherwise. */
  144. class SaslFinished(metadata: EventMetadata, var success: Boolean) : IrcEvent(metadata)
  145. /** Raised when the server says our SASL mechanism isn't available, but gives us a list of others. */
  146. class SaslMechanismNotAvailableError(metadata: EventMetadata, var mechanisms: Collection<String>) : IrcEvent(metadata)
  147. /** Indicates a batch of messages has begun. */
  148. class BatchStarted(metadata: EventMetadata, val referenceId: String, val batchType: String, val params: Array<String>) : IrcEvent(metadata)
  149. /** Indicates a batch of messages has finished. */
  150. class BatchFinished(metadata: EventMetadata, val referenceId: String) : IrcEvent(metadata)
  151. /** A batch of events that should be handled together. */
  152. class BatchReceived(metadata: EventMetadata, val type: String, val params: Array<String>, val events: List<IrcEvent>) : IrcEvent(metadata)
  153. /**
  154. * Raised when attempting to set or change our nickname fails.
  155. *
  156. * If this happens before {ServerReady], the nickname must be changed for registration to continue.
  157. */
  158. class NicknameChangeFailed(metadata: EventMetadata, val cause: NicknameChangeError): IrcEvent(metadata) {
  159. /** Reasons a nick change may fail. */
  160. enum class NicknameChangeError {
  161. /** The nickname is not allowed by the server. */
  162. ErroneousNickname,
  163. /** The nickname is already in use. */
  164. AlreadyInUse,
  165. /** The nickname has collided with another somehow. */
  166. Collision,
  167. /** No nickname was provided. */
  168. NoNicknameGiven
  169. }
  170. }