IRC Client Library 5.0.0 released!

Version 5.0.0 of the Kitteh IRC Client Library has been released!

It's time for the next major release!

Client builder rework

The Client builder has had a lot of methods renamed and shifted into subclasses to allow for a clearer flow of information. You'll want to take a look at the javadocs, but it is mostly straightforward. Below is an example of updated simple building code:

Client client = Client.builder().nick("Kitteh").server().host("").then().buildAndConnect();

Authentication refactor

The authentication classes saw a light rearrange. If you use NickServ authentication you'll need to make some changes in your code. Check the javadocs for more information. These changes will allow for easier future improvements.

Improved DNS resolution

Improved DNS handling is planned for a future release and the breaking change necessary has been made in 5.0.0 to ensure this can happen before the next major release. Some InetSocketAddress API has been replaced with a resolution-free HostWithPort class.

Proxy support

You can now connect over a SOCKS proxy! See the proxy() section of the builder to set that up.

Separation of listeners

KICL's default listeners (used to power the library) have been split up into lots of little listeners that largely accomplish one goal each. This way, it is easier to swap out a single listener if you wish to modify how KICL processes a message. You can modify this even in the builder, preventing construction, should you wish. Check out DefaultListeners for the list of listeners registered. KICL's Twitch code takes advantage of the listener separation to unregister the listener for one of the earliest messages a server sends on connection, because Twitch's IRC servers send a different message.

Twitch changes

Now you can simply call one method to apply Twitch support to your Client. TwitchSupport.addSupport() will add the Twitch-specific listener mentioned above, add a second Twitch listener for a variety of Twitch-related events, register the capabilities and message tags, and disables querying for channel information that Twitch doesn't support. Call the method before you connect the Client, and you're all set!

In addition, support for the Twitch whisper event has been added.


  • The JSR305 annotations have been replaced with the Checker Framework. Your IDE should seamlessly handle this.
  • Start of Java Platform Module System support with an automatic name in the manifest.
    • org.kitteh.irc.client.library
  • WebIRC support now matches IRCv3 spec and sends the command before capability requesting.
    • Also took advantage of the Client builder rework to rename "user" to "gateway" to match the spec.
  • The final STS capability is now supported. Draft support remains as well.
  • Updated to Netty 4.1.31.


I wish to thank the following contributors for their work on this release:

  • kashike
    • Client builder rework
    • Authentication refactor
    • JPMS support
    • JSR305 to Checker Framework transition
    • Bootstrap fix after proxy support was added
  • Carsten (MoriTanosuke)
    • Addition of SOCKS proxy support
  • Tim Hagemann (kumpelblase2)
    • Twitch whisper support
  • Jos Ahrens (Zarthus)
    • Updating the pom to use https links to this site
  • Adam Williams (lol768)
    • STS final spec testing

IRC Client Library 4.0.3 released!

Version 4.0.3 of the Kitteh IRC Client Library has been released!

This release fixes a bug that caused colons at the start of a message to be inappropriately removed.

IRC Client Library 4.0.2 released!

Version 4.0.2 of the Kitteh IRC Client Library has been released!

This release fixes a bug introduced in 4.0.0 that untracked channels when any user parted them.

IRC Client Library 4.0.1 released!

Version 4.0.1 of the Kitteh IRC Client Library has been released!

This release fixes a bug in 4.0.0 that prevented reconnection from happening.

IRC Client Library 4.0.0 released!

Version 4.0.0 of the Kitteh IRC Client Library has been released!

This is a substantial update in a few ways, which will be broken down in various ways below. You really should read the first part of the connectivity rework. Unless you like your client no longer functioning, that is!

Connectivity rework

  • Client builder's build() method no longer automatically connects.
    • Client#connect() starts a connection.
    • Client.Builder#buildAndConnect() available to retain older functionality.
  • Removed Client.Builder#afterBuildConsumer() as it is no longer necessary.
  • ClientConnectedEvent renamed to ClientNegotiationCompleteEvent:
    • This is a more accurate name for what it tells.
  • ClientConnectionEndedEvent covers connections... ending.
    • If not user-initiated shutdown, can modify if a reconnect will be attempted and after what delay the attempt will be made.
    • Sub classes:
    • ClientConnectionClosedEvent for connection closing.
    • ClientConnectionFailedEvent for connection not even succeeding during attempted connection.
  • ClientConnectionEstablishedEvent for when the connection is established and the first messages are about to be sent.
  • Helper ConnectionEvent for all connection-related events.

Un-hiding the implementation

Most of the implementation is now customizable via replacement of individual parts. There are still a few pieces, like connectivity, that will not be swappable until 4.1.0 at the earliest but at this point you should be able to replace any individual part accessible from the builder without interrupting function of any other part.

The following API interfaces have a sub interface that should be implemented by any implementation and allows for management of things that shouldn't be exposed in the main API: CapabilityManager, Client, and ServerInfo.


Many things were renamed for hopefully consistent naming.

  • Any instance in class or method of CTCP renamed to Ctcp.
    • Examples: PrivateCtcpQueryEvent, #sendCtcpMessage().
  • Any instance in class or method of STS renamed to Sts.
    • Examples: StsStorageManager, #getStsMachine().
  • Any instance in class or method of WHOX renamed to WhoX
  • Any instance in class or method of MOTD renamed to Motd.
  • SaslECDSANIST256PChallenge renamed to SaslEcdsaNist256PChallenge.
  • Many Client.Builder methods were renamed:
    • Listeners reordered, such as listenInput() to inputListener().
    • Suppliers renamed, such as eventManagerSupplier() to eventManager().


  • Toggling sending of WHO/MODE on channel join is changed:
    • Now accessible via ActorProvider#setQueryChannelInformation(boolean).
    • TwitchListener calls this automatically, as Twitch does not support WHO.
  • Changed TLS/SSL builder methods from File to Path.
    • secureKeyCertChain(Path) and secureKey(Path).
  • ChannelKickEvent now supports being kicked by a Server.
    • UnexpectedChannelLeaveViaKickEvent thus does as well.
    • Removed deprecated (and now unnecessary) classes:
    • ChannelKickByServerEvent
    • UnexpectedChannelLeaveViaKickByServerEvent
  • Added convenience method MessageReceiver#getLowerCaseMessagingName().
  • Broke a few constructors that took Optional, instead pushing creation of Optional to getters.
  • Potentially improved connection cleanup handling.
  • Updated to latest (4.1.19) Netty.