= Changelog

== Next version (in development)

* Away support:
** Added sendAway() method
** Added UserAway event and fanned-out ChannelAway
** Away message is now updated in the UserState
* Added IrcClient.localUser property, returning the local User
* Deprecated ServerState.localNickname in favour of localUser.
* (Internal) improved the way byte buffers are used to
  reduce array copying and clean up code
* (Internal) Converted README, LICENCE and CHANGELOG to Asciidoc.

== v1.0.1

* Fixed issue with very long packets not fitting in buffers
  after TLS decryption.
* Improved error message when IrcClient.connect() is called
  while already connected
* Made IrcClient.disconnect() block until the disconnect has
  been processed. This will be a very short period of time,
  and allows callers to immediately call connect() again
  afterwards if they wish
* Fixed various issues with disconnecting TLS connections
  not behaving correctly

== v1.0.0

* Replaced Ktor dependency with custom socket handling, which fixes
  fatal issue when connecting to servers over TLS that request a
  client certificate.
* Added NicknameChangeRequired event for the case when a nickname is
  not allowed during connection and *MUST* be changed
* BREAKING: Added 'PreferIPv6' behaviour config, defaulting to true.
  With this configuration KtIrc will try to use IPv6 if the server
  publishes AAAA records.
* BREAKING: Default port is now 6697, TLS is enabled by default

== v0.11.0

* Added SourcedEvent interface for events that have a user source attached
* Added ChannelJoinFailed event
* Added ChannelMembershipAdjustment interface for events that concern
  users joining/leaving channels
* Added missing user parameter to ModeChangedEvent

== v0.10.3

* Fix issue parsing CTCPs when the content contained multi-byte chars
* Fixed multiple issues when receiving malformed input from the server:
  * Invalid server-time tags are now ignored and the current time used
  * PRIVMSGs, NOTICEs and TOPICs with no target/message are now ignored
  * CAPs with invalid or missing arguments are now ignored
  * Better handling for duplicate JOIN messages
  * Ignored messages are now logged more consistently

== v0.10.2

* Fix handling of multiple long lines sometimes dropping part of the line
* Support lines with 8191 bytes of tags, as allowed by the message-tags spec
* Fix a few more instances of occasional ConcurrentModificationExceptions

== v0.10.1

* Added NickChangeFailed event for when nicknames are in use, banned, etc
* Added sendPart method
* Fix occasional ConcurrentModificationException when adding state
* (Internal) Moved message processors into their own package
* (Internal) Added ExperimentalIrcClient interface for features not yet ready for release

== v0.10.0

* Batch start and end events are no longer included in BatchReceived events
* Batches now expose complete metadata from their start event
* Added support for labelled-replies capability and label message tags
* Added support for message-tags capability after it moved from draft
* Added new methods for sending raw lines to the IRC server
** send(tagMap(...), command, arguments) replaces send(line)
** send(command, arguments) is available if no tags are to be sent
** the line is built automatically (with spaces/' :' added appropriately)
** send(line) is deprecated and will be removed after v1.0.0
* Add 'alwaysEchoMessages' behaviour that makes it easier to deal with servers
  that don't support the echo message capability
* Added TargetedEvent, a subclass of IrcEvent, for all events that are
  targeted to a user or channel
* (Internal) Added annotation to track removal of deprecated methods
* (Internal) Migrate unit tests to use Mockk instead of Mockito

== v0.9.0

* Improve DSL for creating an IrcClient to allow parameters to be passed to server and profile
  e.g. IrcClient { server("irc.example.com", 6667) }
* Add behaviour options
** requestModesOnJoin - automatically sends a MODE request when joining a channel
* Events now have a `metadata` property instead of a `time` (and time is available in metadata)
** IrcEvent.time is now deprecated but will remain until after v1.0.0.
** Metadata now contains the message ID, if any.
** ActionReceived.messageId and MessageReceived.messageId are now deprecated, to be removed after v1.0.0.
** Metadata now contains the event's batch ID, if any.
* Added support for batches
** All events in a batch are buffered until the batch is finished
** The events are then published together in a single `BatchReceived` event
* Added support for CHGHOST messages
* (Internal) Improve performance when the MessageHandler is finding a processor for a message
* (Internal) Introduced event mutators
** Event mutators are now responsible for handling changing events in response to state
    e.g. ChannelFanOutMutator creates Channel* events for global quits/nick changes/etc
** Event handlers now just handle events, and don't return anything

== v0.8.0

* Added support for SCRAM-SHA-1 and SCRAM-SHA-256 SASL mechanisms
* Added MotdLineReceived event
* Added topic events and state
* Add utility method IrcClient.isChannel(String) to identify if a target is a channel or not
* (Internal) Move event handlers into their own package

== v0.7.0

* Fixed experimental API warnings when using IrcClient
* BREAKING: IrcClients are now constructed using a DSL
** Users of the library no longer need to care about the implementing class
** Facilitates adding more options in the future without breaking existing implementations
* SASL improvements
** The enabled mechanisms can now be configured (in the SASL DSL)
** Added support for EXTERNAL mechanism, disabled by default
** Now attempts to renegotiate if the server doesn't recognise the SASL mechanism that was tried
* Added UserNickChanged and corresponding ChannelNickChanged events
* Added ServerConnectionError, raised when connecting to the server fails
* (Internal) Minor version updates for Gradle, Kotlin and JUnit

== v0.6.0

* Changed USER command to not send the server name, per modern standards
* Added support for SASL authentication (with PLAIN mechanism)
* Removed some unused test code
* Fixed handling of user mode changes on channels (op/deop/etc)
* Message extensions:
** Added support for IRCv3 message tags v3.3
** Exposed message IDs in MessageReceived and ActionReceived events
** When sending a message you can now indicate what it is in reply to
** Added sendTagMessage() to send message tags without any content
** The reply() utility automatically marks messages as a reply
** Added react() utility to send a reaction client tag
* State is now reset when the client is disconnected, so you can immediately reconnect
* (Internal) improved how coroutines and channels are used in LineBufferedSocket

== v0.5.0

* Server state:
** Added ServerConnecting and ServerDisconnected events
** Server status now starts as Disconnected rather than Connecting
** Improved error message when features are of an unexpected type
* Channel modes:
** CHANMODES feature is now stored as an array, not a single comma-separated string
** Added ChanModeType enum, and method in ServerState to get the type of a mode
** Added ModeChanged event, for user and channel mode changes and discovery
** Added modes and modesDiscovered to ChannelState
* Other new events:
** Added MotdFinished event
** Added UserAccountChanged event
** Added ChannelUserKicked event
** Added NoticeReceived event
** Added CtcpReplyReceived event
* Improved some documentation

== v0.4.0

* Added CtcpReceived and ActionReceived events
* Added sendCtcp and sendAction message builders
* Fix issue with messages being sent out of order, which sometimes caused problems connecting to passworded servers
* Added 'network' server feature
* Added serverName field to ServerState

== v0.3.1

* Added more documentation to public methods/classes
* Fixed exception when sending multiple lines at once (e.g. when connecting!)

== v0.3.0

* Simplified how messages are constructed.
** Instead of: client.send(joinMessage("#channel"))
** Now use: client.sendJoin("#channel")
* Added reply utility to easily send replies to message events
* Server state improvements:
** Added status field to ServerState
** ServerConnected event is emitted as soon as the socket is connected
** ServerReady event is emitted after logging in, negotiating, etc
* Added extra debugging to show what type of events are being dispatched
* Added ChannelQuit event, raised for each channel a user is in when they quit
* (Internal) Event handlers can now return more events to emit

== v0.2.1

* Added documentation and reduced visibility of some internal methods/classes
* (Internal) Enabled Travis, Codacy and Coveralls

== v0.2.0

* Added support for connecting over TLS
* BREAKING: Simplified how event handlers are registered
* BREAKING: Improved use of coroutines so users don't have to worry about them
* (Internal) Upgraded to Gradle 5.1.1

== v0.1.0

* Initial release
