Skip to content
Torben Hørup edited this page Apr 14, 2020 · 11 revisions

Information about new features and bugfixes in each PircBotX release

2.3 - In Development

Want to upgrade early? Head over to DevVersion for information on how.

Note until release this section might be out of date. For the most recent changes see the repository commit log

TODO

2.2 - November 2018

  1. Feature: added to builder: nickservCustomMessage, nickservDelayJoinTime and userModeHideRealHost #292

  2. Feature: New config option socketConnectTimeout (#315)

  3. Feature: Added Background Colors (#316)

  4. Feature: Add field to check if user has a secure connection when performing a whois (#340)

  5. Feature: Pass more data to UnknownEvents so consumers have more option (#318)

  6. Feature: More dynamic way of handling delays (#345)

  7. Feature: WHOIS register if user is IRCop

  8. Bug fix: Correct order of HALFOP and OP User Levels (#307)

  9. Bug fix: Unescape IRCv3 Message tag values (#329)

  10. Bug fix: make sure WHO doesn't throw exception (#342)

  11. Bug fix: Generify getV3Tags (#319)

  12. Bug fix: Multiple quality improvements (#312)

  13. Bug fix: ActionEvent.respond() should not start infinite recursion loop ( 0eb2bde)

  14. Bug fix: Fix NPE in mode handling (#361 #362)

  15. Bug fix: Do not crash when parsing +L channel mode

  16. Bug fix: Consume +f channel mode options

2.1 - January 24, 2016

Many new features, API cleanup, and bugfixes. Includes better support for Twitch.tv

  1. FEATURE Issue #148: Split User class into User and UserHostmask classes 1. UserHostmask represents any potential hostmask or source of an event which replaces the many instances of Strings representing hostmasks 1. User represents an active user PircBotX is tracking 1. UserChannelDao now only contains actual users PircBotX discovers instead of everything that potentially had a name (eg "irc.yourserver.net" was considered a user since it sent messages) 1. All relevant events now have an additional immutable @NonNull getUserHostmask or getRecipientHostmask methods. 1. Issue #211: Also supports Extban prefixes, eg extban:nick or extban:nick!login@hostmask 1. CHANGE: Event.getUser() or getRecipient() is NOT guaranteed to be Non-Null since the user may not be tracked by UserChannelDao 1. CHANGE: UserChannelDao.getUser() and getChannel() now THROW a detailed exception if the user or channel does not exist. This is much better alternative to NullPointerExceptions which lack relevant detail. To check validity use UserChannelDao.containsUser() and .containsChannel() 1. CHANGE: UserChannelDao methods will not accept null parameters
  2. IMPROVEMENT Issue #212: <PircBotX> Generics Reform 1. All <B extends PircBotX> generic class parameters have been REMOVED from Events, Listeners, Configuration, ConfigurationBuilder, DCC FileTransfers, etc 1. Using an extended PircBotX class is still supported with the better "MyCustomBot bot = event.getBot();" or "event.<MyCustomBot>getBot().doStuff();" equivalents. This applies to any method that returns PircBotX 1. This was a rarely used feature with a huge cost in API code complexity. Casting internally works just as well and is significantly cleaner 1. BUGFIX: If you did not explicitly extend the <PircBotX> version of ListenerAdapter, events that returned collections, eg List<User> or Set<Channel>, only returned List<Object> or Set<Object> due to type erasure. Now with generics removed, collections are properly returned with their type
  3. IMPROVEMENT: Better Connecting/Reconnecting Handling 1. FEATURE Issue #157: Configuration.setServer(), .setServerHostmask(), and .setServerPort() have been removed in favor of addServer() and .getServers(), a list of hostnames and ports to try to connect to. For example, you could try irc.freenode.net:6667, irc.freenode.net:8000, card.freenode.net:6667 in case the port is blocked on the end-users firewall or the server is down. This also helps with smaller networks that might not have all servers on one global subdomain 1. FEATURE: New configuration option .setAutoReconnectDelay() and .setAutoReconnectAttempts() 1. FEATURE Issue #171 #207 ConnectAttemptFailedEvent: Dispatched when the whole attempt fails. Contains a map of exceptions encountered when connecting and the number of remaining attempts 1. A connection attempt means for each server hostname and port, look up the IP addresses and try to connect to each of them until exausted. If still not connected dispatch a ConnectAttemptFailedEvent and if autoReconnect is disabled, throw an IOException 1. If autoReconnect is enabled wait autoReconnectDelay ms and repeat the above process again. If still not connected after autoReconnectAttempts, then throw an IOException
  4. FEATURE Issue #213: Nickserv detection 1. New method PircBotX.isNickservIdentified() to check if identified with nickserv. 1. New methods .setNickservOnSuccess() and ConfigBuilder.setNickservNick() since nickserv implementations aren't standardized detecting exactly when what nickserv says when identified. However the defaults should work on most networks 1. Optionally delay joining channels until identified with new method ConfigBuilder.setNickservDelayJoin(). Useful if a channel requires you to be identified before getting operator status or the channel doesn't allow non-identified users to join
  5. ListenerManager upgrades 1. FEATURE: New interface ManagerExceptionHandler to handle exceptions generated by Listeners. Defaults to LogManagerExceptionHandler 1. IMPROVEMENT: ListenerManager is now an abstract class that handles incrementing the eventId and defaulting to LogManagerExceptionHandler which simply writes Exceptions to the log 1. IMPROVEMENT: ListenerManager.addListener() returns void since it should never fail to add a listener
  6. FEATURE: The following new methods were added: 1. Utils.parseCommand to easily parse messages as commands 1. OutputUser and OutputIRC .whois() and .whoisDetail() 1. IdentServer startBot(encoding, localInetAddress) and (encoding, localInetAddress, port) to configure IdentServer's bind address 1. OutputChannel.invite(string) and .invite(user) 1. WhoisEvent.isExists() to handle users that do not exist 1. Issue #155: ActionEvent, MessageEvent, and NoticeEvent .respondChannel() and .respondPrivateMessage() 1. Protected callback method MultiBotManager.executeBot() 1. Issue #280: New utility method MultiBotManager.stop(quitMessage) 1. Send/RecieveFileTransfer.getFileSize() 1. ConfigurationBuilder.replaceCoreHooksListener() to easily replace the built in CoreHooks implementation 1. Issue #214: WhoisEvent.getAwayMessage() 1. Issue #205: ActionEvent, MessageEvent, and NoticeEvent .channelSource() to support channel mode messages, eg "PRIVMSG +#channel :only voiced users will see this". The default supported prefixes can be changed with ConfigurationBuilder.setChannelModeMessagePrefixes() 1. Colors.ITALICS for italicized text 1. Issue #168: New maps Colors.LOOKUP_TABLE, Colors.FORMATTING_TABLE, Colors.COLORS_TABLE, and Colors.lookup() to lookup colors by String instead of compile-time field 1. Issue #232: Configuration.snapshotsEnabled to optionally disable creating snapshots 1. Issue #184: ServerInfo.getExtBanPrefix() and .getExtBanList() for EXTBAN in the servers 005 info 1. UserChannelDao.channelExists() and .userExists() have been deprecated in favor of the more standard .containsChannel() and .containsUser() matching the Java Collections API 1. IncomingFileTransferEvent.acceptAndTransfer() and OutputUser.dccFileAndTransfer() for accepting the request and transfering the file in one call 1. GenericMessageEvent.respondPrivateMessage() to PM the user directly. This interface is implemented in MessageEvent, ActionEvent, and NoticeEvent 1. All ConfigurationBuilder.add* methods have an additional overload that takes an Iterable, similar to Guava. This allows e.g. directly passing in a Collection of auto join channels instead of having to make a loop 1. PircBotX.send() as an alias for .sendIRC(), matching format of Channel.send() and User.send() 1. UserChannelDao.getUserBot() to get the user object that represents the bot itself 1. Channel.containsMode(char) helper util 1. UserLevel.getSymbol() for the 1 character symbol that represents a mode, eg @=op, +=voice, etc 1. Issue #253: WhoisEvent.exists() to handle 402 "No such user" errors 1. ServerInfo.getISupportValue() helper util 1. Issue #155: GenericMessageEvent.respondWith(fullLine) which is implemented by ActionEvent, MessageEvent, NoticeEvent, and PrivateMessageEvent 1. Internal method PircBotX.processNextLine() to help with testing 1. Issue #260: UserHostmask.getIdent() as an alias to getLogin() 1. Issue #248: Configuration.setOnJoinWhoEnabled() for servers that don't support the WHO command (twitch.tv) 1. Deprecated GenericSnapshotEvent.getDaoSnapshot() in favor of .getUserChannelDaoSnapshot(). This affects DisconnectEvent, PartEvent, and QuitEvent. 1. Deprecated SetChannelBanEvent.getHostmask() in favor of clearer .getBanHostmask() 1. BUGFIX Issue #273, #268: Configuration.setDccPublicAddress() to manually set the advertised DCC address 1. Issue #261: All getBot() methods in all classes return <B extends PircBotX> allowing the cleaner someObj.<MyCustomBot>getBot() casting syntax
  7. FEATURE: The following new Events and Classes were added: 1. OutputEvent: Dispatched for every line sent to the server 1. Issue #178 BanListEvent: List of banned users from "MODE #channel b" 1. ExceptionEvent: Dispatched if an exception is thrown during parsing 1. ListenerExceptionEvent: Dispatched if an exception is thrown from a listener 1. GenericChannelModeRecipientEvent: Generic interface for Channel Op, Voice, Half Op, Super Op, and Owner Events 1. GenericChannelUserOutput: Interface for action(String), message(String), and notice(String) for OutputUser and OutputChannel (thanks to amshaegar for the patch) 1. SequentialListenerManager: New experimental listener manager that provides all 3 types of running listeners (sequentially in the bot thread, sequentially in its own thread, or in a threadpool) under one consistent interface
  8. FEATURE: New configuration option configBuilder.setUserLevelPrefixes()
  9. FEATURE Issue #230: Due to some servers not supporting WHO (twitch.tv) NAMES support was re-added to PircBotX
  10. FEATURE: User.registeredAs and User.isVerified now support 307 and 330 with no name responses in WHOIS
  11. FEATURE: Javadocs have been added for significantly more methods
  12. FEATURE: Adjusted WaitForQueue.waitFor() method signatures to allow for more use cases to compile, allow use of GenericEvents
  13. FEATURE: Added PircBotX.getBotId() and connection string to slf4j MDC
  14. FEATURE: PircBotX implements Closable for special situations where the bot needs to be shut down immedately instead of gracefully with bot.send().quitServer()
  15. FEATURE Issue #225: Line autoSplit now will attempt to split at closest space
  16. FEATURE Pull Request #241: Added support for IRCv3 message tags (thanks keving91)
  17. FEATURE Pull Request #272: Added OSGi metadata (thanks mbooth101)
  18. FEATURE (internal): New test class PircTestRunner to fully test dispatched events
  19. IMPROVEMENT Issue #206: IPv6 DCC will now send full IPv6 addresses instead of a converted BigInteger. At least one other client sends the full IPv6 address and it makes significantly more sense
  20. IMPROVEMENT: Cleaned up stack traces so they are clearer and say what line caused the problem
  21. IMPROVMENET: Exceptions inside InputParser have the raw line causing the issue appended to the message to aid in debugging
  22. IMPROVEMENT Issue #200: Validate autoJoin channels in Configuration before they throw NPEs during connect
  23. IMPROVEMENT: Optimized creating User/ChannelSnapshots by not creating duplicate snapshots of Users and Channels
  24. IMPROVEMENT: More liberal use of nullchecks @lombok.NonNull and String isBlank() checks to prevent potential bugs
  25. IMPROVEMENT: PircBotX now compiles with -Xlint:all
  26. IMPROVEMENT: The bots own user object from PircBotX.getUserBot() now will be updated with correct login and hostname information once the server tells us what it is
  27. IMPROVEMENT: Configuration/ConfigurationBuilder.getListenerManager() returns the ListenerManager as a generic parameter, allowing easy inline casting
  28. IMPROVEMENT: Cleaned up IdentServer implementation and added tests
  29. IMPROVEMENT: Added more javadocs of events
  30. IMPROVEMENT: PircBotX.getName() defaults to configuration.getName() instead of an empty string before the server confirms our nick
  31. IMPROVEMENT: Snapshots now have git sha appended to VERSION
  32. CHANGE: Removed constructor UtilSSLSocketFactory(SSLSocketFactory) in favor of method disableDiffieHellman(SSLSocketFactory) since to trust all certificates the wrapped factory has to be changed. An exception will be thrown if .disableDiffieHellman(SSLSocketFactory) is combined with .trustAllCertificates()
  33. CHANGE: ConfigBuilder.setCapEnabled() is enabled by default
  34. CHANGE: Removed "a fork of PircBot" from the default CTCP VERSION response
  35. CHANGE: Events generate their ID with an internal counter instead of getting it from the listener manager, which is much simpler and matches other id's in other classes
  36. CHANGE: Removed server password from PircBotX.toString()
  37. BUGFIX: Fixed UserChannelDao Snapshots which lost all relationship information
  38. BUGFIX: Removed old channel parameters to methods in OutputChannel (thanks to albul for the report)
  39. BUGFIX: PircBotX cleans up its entry in IdentServer when disconnecting
  40. BUGFIX Issue #165: Fixed OutputChannel.setMode not adding spaces after channel name
  41. BUGFIX Issue #159: Fixed DCC file transfers always requiring a transfer token
  42. BUGFIX Issue #256: Fixed handleACK returning false even if supported in SASLCapHandler
  43. BUGFIX Issue #167: Configuration.buildForServer now uses correct parameters
  44. BUGFIX Issue #172: Empty AWAY messages no longer throw IndexOutofBoundsException
  45. BUGFIX: Closing an IdentServer no longer throws socket closed exceptions
  46. BUGFIX Issue #173: IdentServer now responds to requests with correct lines
  47. BUGFIX: IdentServer now sends NO-USER responses in the correct format
  48. BUGFIX: Fix ConcurrentModificationException in GenericListenerManager when listeners removed themselves
  49. BUGFIX: Improved handling of servers that don't support CAP LS (twitch.tv, others)
  50. BUGFIX: Fixed handling of malformed 004 info lines (thanks to Hitakashi for the report)
  51. BUGFIX: Fixed isVerified returning false when registeredAs was empty (thanks to giovannimoonen1 for the report)
  52. BUGFIX Issue #182: WHOIS responses are now case-insenstive
  53. BUGFIX: Fixed OutputChannel.invite(channel) reversing the order in the response
  54. BUGFIX Issue #198: NickAlreadyInUseEvent can be dispatched anywhere instead of just while connecting
  55. BUGFIX Issue #202: Fixed deadlock in ThreadedListenerManager during shutdown
  56. BUGFIX: Unused option IrcException.Reason.ReconnectBeforeConnect removed
  57. BUGFIX Issue #191: Failed WHOIS replies no longer throw a NullPointerException
  58. BUGFIX: Only add info to slf4j's MDC for Listeners when there's actually a bot
  59. BUGFIX Issue #204: Fixed WaitForQueue not returning null after timeout was exceeded
  60. BUGFIX Issue #196: Fixed NullPointerException on non-standard DCC RESUME requests
  61. BUGFIX Issue #209: Fixed user renaming bug causing internal DAO maps to fall out of sync
  62. BUGFIX: WhoisEvent.getChannels() will now return an empty list by default instead of null
  63. BUGFIX Issue #229: Fixed instances of parseInt being used for long values
  64. BUGFIX Issue #227: Fixed high number of "Channel mode is stale" warnings
  65. BUGFIX Issue #232: Channel and User Snapshots now copy UUID from existing object
  66. BUGFIX Issue #231: Get internal nick from server
  67. BUGFIX Issue #256: Use backwards compatible commons-codec method in SASLCapHandler as Android uses version 1.3
  68. BUGFIX Issue #257: Log if ServerInfo fails to parse ISUPPORT lines instead of throwing an Exception
  69. BUGFIX Issue #269: Fixed nick auto change running after connect
  70. BUGFIX Issue #268: Do not try to connect to an IPv6 client with an IPv4 address or vise-versa
  71. BUGFIX Issue #280: Send quits immediately instead of using message delay

2.0.1 - December 3rd, 2013

This is intended to be a pure bugfix and improvement release to stabilize 2.0.

  1. BUGFIX Issue #150: Correctly handle and parse 324 RPL_CHANNELMODEIS mode parameters
  2. BUGFIX Issue #151: Correctly handle cases where full name is missing from WHO replies (thanks to danny.vanheumen for the patch)
  3. BUGFIX Issue #154: Mark reconnectStopped volatile to prevent Hotspot from optimizing the check away
  4. BUGFIX: Some unknown lines were not sent to CAP handlers (thanks to cotay for the bug report)
  5. BUGFIX: WEBIRC parameters are now verified upon building the configuration
  6. BUGFIX: Removed lingering channel parameter on OutputChannel.unBan (thanks to zack8649 for the report)
  7. BUGFIX: Fixed multiple generics warnings
  8. IMPROVEMENT: All above BUGFIX's have unit tests
  9. IMPROVEMENT: Added toString() implementations to all CAP handlers
  10. IMPROVEMENT: Switched precedence of Op and Voice in UserLevel to be consistent with mode precedence (voice < op < halfop < superop < owner)
  11. IMPROVEMENT: Changed input and output SLF4J markers public

2.0 - October 29th, 2013

Please read Migration to 2.0 for explanations on why things changed and how it will affect your code. This changelog is only meant to detail what changes.

PircBotX turns 2.0! The goal is to change PircBotX's direction from "PircBot with some improvements" to "A better IRC Library." The major version bump is matched by major changes to make PircBotX more modular, pluggable, easier to use, and generally better.

Most of these changes are a result of finally splitting up the monstrous PircBotX god class. The API is now significantly cleaner and clearer on exactly what you can do and where you can do it

  1. Configuration - New class to manage the configuration of a bot 1. FEATURE: To build a Configuration, use Configuration.Builder. 1. FEATURE: Configuration.Builder can copy an existing Builder or Configuration . This allows you to have a template configuration with global settings that you copy to all the bots that you create 1. FEATURE: Auto-join channels with addAutoJoinChannel 1. FEATURE: Auto-identify to nickserv with setNickservPassword 1. FEATURE: Classes created by PircBotX are created with Configuration.BotFactory. This centralizes providing alternative implementations of various classes like User, DccHandler, InputParser, etc 1. IMPROVEMENT: WebIRC is now enabled or disabled with setWebIrcEnabled instead of being based on webIrcPassword 1. IMPROVEMENT: inetAddress renamed to localAddress for clarity 1. IMPROVEMENT: useShutdownHook renamed to shutdownHookEnabled in Configuration for clarity and JavaBean style 1. CHANGE: You must pass a completed Configuration to the PircBotX constructor 1. CHANGE: PircBotX.connect() is now the only connect method 1. CHANGE: setEncoding(String) removed to simplify API and for clarity
  2. Rewrote IdentServer as an better, standalone server 1. FEATURE: Now supports multiple bots from 1 instance 1. FEATURE: Significantly more validation and logging of lines added 1. CHANGE: As IdentServer is now standalone, you must manage starting and stopping the IdentServer with IdentServer.startServer() and IdentServer.stopServer()
  3. All original PircBotX.send* methods have been moved and renamed into Output specific classes: OutputIRC, OutputCAP, OutputUser, OutputChannel, etc. The goal is to narrow and simplify sending messages to the specific destination instead of showing every single possible option at once 1. FEATURE: New cleaner syntax for sending:
    1. channel.send().message("Hello!")
    2. user.send().action("Me too!")
    3. user.send().dccChat()
    4. bot.sendIRC().listChannels()
    5. bot.sendCAP().request("multi-prefix") 1. FEATURE: New methods in OutputChannel
    6. channel.send().who() - Ask for WHO list of channel
    7. channel.send().getMode() - Ask for channel mode 1. FEATURE: OutputCAP has significantly more methods than before to cover the entire CAP negotiation protocol 1. OutputRaw - Handles actual sending of a raw line to a server
    8. FEATURE: OutputThread and its outgoing queue has been replaced by a lock that blocks until the message is actually sent. This significantly improves Exception handling and wondering if the line you sent actually made it to the server
    9. FEATURE: rawLineNow now has an optional parameter resetDelay to reset the message delay of the next pending message. 1. CHANGE: The redundant(synchronized!) PircBotX.disconnect() method was removed. Users should use quitServer()
  4. UserChannelDao 1. Users who send invites are now in private map
  5. DCC completely overhauled 1. FEATURE: Added support for reverse/passive DCC 1. FEATURE: Added support for filenames that are sent in quotes 1. FEATURE: Now very configurable via Configuration
    1. dccFilenameQuotes - If filename has spaces and is enabled, send the filename in a request in quotes. If disabled, replace spaces with underscores (default: disabled)
    2. dccLocalAddress - Address to use to accept incoming dcc requests on. If null, defaults to localAddress. If that is still null, defaults to the localAddress the bot used to connect to the server
    3. dccAcceptTimeout - How long a user has to accept an dcc request. Defaults to socketTimeout
    4. dccResumeAcceptTimeout - How long a user has to accept a dcc resume. Defaults to dccAcceptTimeout
    5. dccTransferBufferSize - How big of a buffer to use when transferring a file
    6. dccPassiveRequest - Default option to use when sending DCC requests. Note that this still configurable on a per-request basis in the accept methods (see below) 1. IMPROVEMENT: Methods have been written to wait for an accept or throw an Exception instead of awkwardly dispatching an event with possible exceptions 1. File transfers
    7. IMPROVEMENT: DccFileTransfer replaced by SendFileTransfer and ReceiveFileTransfer which represent an active file transfer that has already been accepted by the receiving user
    8. IMPROVEMENT: IncommingFileTransferEvent now stores all information about the request in the event itself
    9. FEATURE: Easier way to accept a file transfer: transferEvent.accept(destinationFile) .
    10. FEATURE: Can now easily resume accepting a file with: transferEvent.acceptResume(destinationFile, startPosition) . This blocks until the user has acknowledged the resume and is ready for the file transfer
    11. FEATURE: Both accept methods above return a ReceiveFileTransfer that contains lots of status information about the current transfer. To actually start the transfer, use fileTransfer.transfer()
    12. FEATURE: Easier way to send a file: user.send().dccFile(file) . This blocks until the user accepts the file request and returns a SendFileTransfer or the dccAcceptTimeout is reached and throws a DccException 1. Chat
    13. IMPROVEMENT: DccChat replaced by SendChat and ReceiveChat which represent an active chat that has been accepted by the receiving user
    14. IMPROVEMENT: IncommingChatRequestEvent now stores all information about the request in the event itself
    15. FEATURE: Easier way to accept a chat request: chatEvent.accept()
    16. FEATURE: Since chat objects represent an active connection, there is no longer a risk of sending a message to an unaccepted Chat only to get Exceptions
    17. FEATURE: All lines sent or received in a chat are now logged
    18. FEATURE: Easier way to send a chat request: user.send().dccChat()
  6. FEATURE: Shutdown of a bot will now wait for all running Listeners in ListenerManager to finish executing
  7. FEATURE: A 324 mode response now generates a ModeEvent
  8. FEATURE: New method in TopicEvent: getOldTopic()
  9. FEATURE: ServerResponseEvent now only contains raw line from server and the parsed response
  10. FEATURE: ServerInfo MAXLIST is now parsed into a map
  11. FEATURE: STARTTLS support added with TLSCapHandler
  12. FEATURE: New method PircBotX.getBotId() to get the unique bot number, useful for managing bots
  13. FEATURE: New method sendRawLineNow(message, resetDelay). If there is a pending message with resetDelay it waits the full message delay again
  14. FEATURE: Classes PircBotX, Channel, User, and Event implement Comparable to allow easy sorting
  15. FEATURE: Can now easily determine a User's level in the channel with new UserLevel enum and User.getUserLevels()
  16. FEATURE: User and Channel plus the new UserChannelDao and UserChannelMap can create snapshots of themselves. These are passed to PartEvent, QuitEvent, and DisconnectEvent
  17. FEATURE: New generic classes GenericUserEvent, GenericChannelEvent, and GenericChannelUserEvent
  18. FEATURE: Issue #136 Added support for specifying realname
  19. FEATURE: Issue #140 New event NickAlreadyInUseEvent
  20. FEATURE: Exceptions encountered during disconnect are reported in DisconnectEvent
  21. FEATURE: Lookup of users and channels by name is now case-insensitive.
  22. FEATURE: Issue #143 New dedicated expandable mode handler system
  23. FEATURE: Store away messages in User with getUser()
  24. FEATURE: Added support for CAP away-notify
  25. FEATURE: Issue #145 Added callback method for DCC File transfers for users who want to customize output throttling
  26. IMPROVEMENT: Massive performance increases 1. Server line processing now significantly faster 1. ListenerAdapter no longer uses reflection to call event methods. Users who extended ListenerAdapter to add support for custom events need to make the same change
  27. IMPROVEMENT: Cleaned up PircBotX generics
  28. IMPROVEMENT: PircBotX now has dependencies to take advantage of modern libraries to reduce code, reduce bugs, increase integration, and increase usefulness 1. slf4j - Modern logging framework to replace odd log() method. Users can now easily integrate PircBotX into their own logging system. Helpful debugging statements were also added since were no longer afraid to clutter the main log.
    1. Note: As slf4j only provides an abstract logging api, you still need to provide an actual logging implementation. If you do not have one already, we recommend logback due to its native integration with slf4j 1. Apache Commons Lang - Extremely useful Java utility library to replace many redundant utility methods as well as access much more 1. Google Guava - Another useful utility library to provide features like better collections and easier method argument checking 1. Apache Commons Codec - Provides a tested and proven Base64 implementation. Technically this library is not needed if you do not use SASL CAP authentication
  29. IMPROVEMENT: PircBotX shutdown now is guarded from being called twice. This should further fix any weird shutdown issues
  30. IMPROVEMENT: InputThread has been replaced by InputParser. No longer extending Thread, all input parsing has been moved there.
  31. IMPROVEMENT: Event now implements GenericEvent
  32. IMPROVEMENT: sendRawLine methods now throw a RuntimeException if the bot is not connected instead of silently failing
  33. IMPROVEMENT: isConnected now reports the status of the socket instead of inputThread
  34. IMPROVEMENT: All "Unmodifiable" views of various collections (eg Users in a channel) have been replaced by "Immutable copies" using either ImmutableSortedSet (when applicable) or ImmutableSet
  35. IMPROVEMENT: Do not use BufferedOutputStream for output since all lines need to be sent immediately.
  36. IMPROVEMENT: The Event abstract class now has an additional constructor that can take a ListenerManager directly. This allows users to use the ListenerManager system for outside events that aren't tied to a bot (eg bot managers with a global ListenerManager) without throwing NullPointerExceptions.
  37. IMPROVEMENT: No methods are synchronized in the PircBotX class
  38. IMPROVEMENT: Implemented Comparable in several more classes 1. PircBotX sorts by botId 1. Channel sorts by name (case insensitive) 1. Event sorts by timestamp, then by id, then by bot id (if there is one)
  39. IMPROVEMENT: Most methods now verify parameters for non-null, not blank, etc to prevent strange exceptions and undesired behavior
  40. IMPROVEMENT: Event's getSource() methods have been replaced by standard getUser()
  41. CHANGE: OutputThread has been completely removed. All send* methods block until the message is sent instead of being added to a queue.
  42. CHANGE: HookUtils with its single method getAllEvents() was removed since it had almost no use cases and didn't take into account custom events.
  43. CHANGE: The waitFor method in PircBotX class was removed after being deprecated in 1.9 due to bad thread racing issues. As in 1.9, WaitForQueue should be used instead
  44. CHANGE: Added several methods to WaitForQueue to wait for a list of Events and to wait with a timeout
  45. CHANGE: The identify() method (now in OutputIRC) will now throw an Exception instead of creating a temporary listener if the bot is not connected to the server to limit complexity and possible bugs. Users are recommended to use setNickservPassword in the Configuration class for automatic handling.
  46. CHANGE: All handle methods in CapHandler's now take an ImmutableList instead of a List. This is to prevent accidental bugs from trying to change capabilities by modifying that list
  47. CHANGE: Removed TrustingSSLSocketFactory after being deprecated for a long time by UtilSSLSocketFactory
  48. CHANGE: Renamed GenericCTCPCommand to GenericCTCPEvent to conform to event naming convention
  49. CHANGE: SendRaw.rawLineSplit no longer accepts a null suffix
  50. CHANGE: Renamed User.uuid to userId for clarity and added a getter
  51. CHANGE: Removed Utils.getUser() (obsoleted by StringUtils.join) and Utils.getUser() (obsoleted by GenericUserEvent)
  52. CHANGE: Marked shutdown() protected since it is not meant to be called by others.
  53. CHANGE/BUGFIX: The done() method in CapHandler was replaced by all methods returning true or false if they have finished, because done() only works once. If the bot reconnects or there are multiple bots they would either ignore the cap handler or worse, deadlock and never finish reconnecting since most servers disconnect users who time out sending CAP END.
  54. BUGFIX: Connecting to all servers in DNS didn't actually work
  55. BUGFIX: SSLSockets couldn't be closed correctly due to relying on shutdownInput
  56. BUGFIX: NickAlreadyInUseException in connect() now won't close the socket
  57. BUGFIX: UserSnapshot.getChannelsOwnerIn() now actually returns channels the user is an owner in (used to be always empty)
  58. BUGFIX: UserSnapshot.generateSnapshot() now throws an UnsupportedOperationException since that doesn't make any sense and throws unhelpful exceptions anyway
  59. BUGFIX: Keep generics in tact with getDao() in User and Channel
  60. BUGFIX: User.compareTo() now compares in correct order (the current user, then the compared user)
  61. BUGFIX: Fixed potential Channel getMode() deadlock
  62. BUGFIX: Fixed potential race with the server in cycle()
  63. BUGFIX: Fixed NullPointerException when responding to NoticeEvents (and ActionEvents in 2.0-SNAPSHOT) sent as private messages. (Thanks to tilal6991 for discovering this)
  64. BUGFIX: Reversed Users's compareTo so that it sorts in correct order
  65. BUGFIX: Fixed race with the server in OutputChannel.cycle() by only parting the channel after the listener is added
  66. BUGFIX: Changed visibility of shutdown() to protected to prevent confusion (thanks to Stoever for discovering this)
  67. BUGFIX: Prevent shutdown from being called multiple times. Also fixed System.exit() deadlocking (thanks to Stoever for discovering this)

1.9 - April 7th, 2013

This version adds support for IRCv3 this Features section CAP Negotiation, allowing you to use Documentation or the many other CAP features.

Other changes include better support for proxies, a better WaitForQueue class, and several bugfixes.

  1. FEATURE: Proxy support added with a new socket factory ProxySocketFactory
  2. FEATURE: Deprecated PircBotX.waitFor() in favor of new WaitForQueue class due to racing conditions. Instead of hoping to readd the temporary PircBotX.waitFor() listener before the relevant event is dispatched, WaitForQueue stores queues all dispatched events from creation to close
  3. FEATURE: CAP Negotiation. See this Features section for more information 1. New interface CapHandler so other classes can process CAP responses 1. New class SASLCapHandler to support SASL authentication 1. New class EnableCapHandler to enable most other CAP capabilities 1. By default PircBotX will attempt to enable multi-prefix due to its usefulness
  4. FEATURE: New method ListenerAdapter.updateEventMethodMapping() so custom events in a subclass can be dispatched with ListenerAdapter
  5. ENHANCEMENT: Shutdown improvements 1. Shutdown hook will now run shutdown() regardless if disconnect() fails due to socket already being closed 1. Exceptions during closing the connection with the server should now only appear in extraordinary circumstances (IE internet going out) 1. Fixed bug where shutdown() might be run twice 1. PircBotX will now shutdown the bot if any exception occurs during connect() except for IrcException's and NickAlreadyInUseException's
  6. BUGFIX: Some IRC clients send filenames in quotes in DCC SEND, which broke anything relying on DccFileTransfer.getFilename(). These are now removed
  7. BUGFIX: Channel.getMode() always asked the server for the current mode, regardless if it had a known good mode locally
  8. BUGFIX: Issue #91: Reverted channel owner detection to ~ prefix
  9. BUGFIX: Issue #111: ListenerAdapter no long throws an NPE when dispatching a custom event
  10. ENHANCEMENT: Small code cleanup, marking several protected classes static and several fields that should never change final
  11. ENHANCEMENT: Javadoc updates
  12. ENHANCEMENT: Bumped all dependency and plugin versions in POM
  13. ENHANCEMENT: Switched to cleaner changelog format that obviously shows what new things have been added and old things that have changed

1.8 - January 11th, 2013

Lots of new features and bugfixes added. We also have a new developer, entityreborn! With a second developer expect many improvements to come in future versions.

Other changes:

  • There is now 2 24/7 bots in the #pircbotx channel on irc.freenode.net that show what Pircbotx can do: TheLQ-Jenkins, a bot that posts when builds are happening (This is the Jenkins IRC plugin that uses PircBotX as its IRC library) and TheLQ-Pircbotx, my own example bot
  • PircBotX is now being managed by a private Jenkins server
    • Snapshots should now be deployed a maximum of 10 minutes after a commit has been pushed into the repo. This should now be much more reliable than saying "I'll push out a snapshot tonight" and it maybe not happening
    • Its now built with JDK5 so any incompatibilities that might of snuck through because they are JDK6 or 7 only are now detected
  • The project lombok plugin now should run a lot less when building since its the plugin has been changed from hacky maven-exec-plugin to -lombok-maven-plugin and the attached phase has been changed to process-sources

Changelog:

  1. Issue #106: Fixed bug where internal nick wasn't always set correctly, mainly when using bouncers
  2. New class ReplayServer which can replay raw logs to a bot. Will be very useful for debugging
  3. Fixed bug where the temporary Listener created in PircBotX.identify() could prematurely delete itself if another bot using the same ListenerManager received a nickserv response
  4. Issue #99: Any ERROR line received causes the bot to shutdown immediately
  5. New method PircBotX.setWebIrcUsername(), used to always be cgiirc
  6. PircBotX.VERSION is now updated as part of the build process making it significantly more accurate
  7. Updated Thread naming for BackgroundListnerManager's pool
  8. Issue #96: Updated handling of ListenerManagers 1. Allow core pool threads to time out 1. New method ThreadedListenerManager.shutdown() for users that need to manually shutdown its internal Thread pool 1. ListenerManager is now lazy loaded so a ThreadedListenerManager isn't created by default when a custom ListenerManager is going to be used anyway
  9. Issue #97: New event SocketConnectEvent, allows for Listeners to run much earlier in the connect process
  10. Issue #95: Fixed bug where PartEvent wasn't dispatched when it was the bot that parted the channel
  11. MultiBotManager updates: 1. MultiBotManager.createBot() methods now return a BotBuilder to automatically do things like join channels. In future versions more builder methods will probably be added 1. Fixed bug where name set in constructor wasn't actually set in bots
  12. Issue #91: Fixed Channel.getOwners() to use the correct flag to determine if a user is an owner
  13. Issue #92 and Issue #94: User.isVerified() tried to use wrong information to guess if the user is verified. Unfortunately the only way to get this information is to query the user with WHOIS. isVerified() is now a utility method that does this, with warnings that it is expensive
  14. Issue #93: Added new method PircBotX.getUsers() to get all users the bot is aware of
  15. Issue #88: New method WhoisEvent.getRegisteredAs() for "Registered As" response (330) in WHOIS replies
  16. Issue #86: Exceptions encountered during reconnect are dispatched with the ReconnectEvent instead of just logged to console
  17. Fixed issue where noReconnect option in PircBotX.shutdown() was mis-interpreted
  18. Fixed issue where DisconnectEvent wasn't always dispatched
  19. Fixed regression where JVM wouldn't exit after quitting a server because OutputThread was still running
  20. Issue #87: New method sendMessage() in Channel and User classes (thanks the.md5encryption)
  21. Max line length is now a configurable option with PircBotX.setMaxLineLength(). Useful if sendRawLineSplit sends messages that still get truncated
  22. Made PircBotX.sendRawLineSplit() public instead of protected
  23. Fixed test that used InetAddress.getLoopbackAddress(), which is JDK7 only
  24. Issue #77: Finally implemented a large batch of 004 and 005 server info parsing for the ServerInfo class. Note that its still a work in progress as there are other options and optimizations that would be nice to implement
  25. Issue #79: On connect PircBotX now tries all the IP addresses in DNS, moving through the list if any IP address fails (Thanks jeffgemail and TTF!)
  26. Issue #78 and Issue #83: New event WhoisEvent. Makes whois lookups much easier
  27. Fixed PircBotX.cycle() so that the temporary Listener it creates doesn't prematurely self-destruct before it actually rejoin's the channel
  28. Issue #75: Better support for reconnecting * Reconnecting is now configurable with PircBotX.setAutoReconnect() * On Reconnect, re-joining all previous channels can be done automatically with PircBotX.setAutoReconnectChannels() * A ReconnectEvent is dispatched when a reconnect is attempted. Includes any exception encountered so that a Listener has more information to attempt a more successful reconnect
  29. Javadoc updates
  30. Bumped all dependency and plugin versions in POM

1.7 - May 23rd, 2012

After a long wait, PircBotX 1.7 has been released. The goal of this release was more bug fixing. Making a release took longer than expected though.

Note that activity is going down simply because PircBotX has plateaued due to stability. This does not mean that the project is stagnet or dead, it simply means there are no other changes needed

  1. Note that if you extend the PircBotX class, all the variables have the underscore prefix removed
  2. Various DCC updates * Properly close DccFileTransfer file streams * DccManager, DccFileTransfer, DccChat implement closeable interface, close() methods also updated to be more comprehensive * DccFileTransfer.getNumericalAddress() renamed to getAddress() * DccManager now actually tracks all open DccFileTransfer's and DccChat's * DccManager can now be fetched from PircBotX with getDccManager()
  3. Issue #71: Several updates to the shutdown code * Condensed all shutdown code into a single method: shutdown(). Also moved things around so normal shutdown is more stable * Exception handling in Input and Output threads now makes more sense * Fix a potential race condition
  4. Issue #72: Updated shutdown hook so that it can be removed (useShutdownHook()), can be checked if one is in use (hasShutdownHook), and now has a meaningful thread name to aid in debugging
  5. Issue #70: UtilSSLSocketFactory now can wrap a provided SSLSocketFactory. Really only useful for disableDiffieHellman();
  6. Issue #66: ListenerAdapter now no longer throws a ArrayIndexOutOfBoundsException when compiled with predecessors that add unexpected methods
  7. Issue #67: Added null checks to all send methods and several others. Attempting to pass null to these methods will result in a IllegalArgumentException
  8. Issue #69: Fixed spelling mistake in QuitEvent
  9. Input, Output, and ThreadedListenerManager threads now have meaningful names
  10. Changed default channel in PircBotXExample from #quackbot to #pircbotx
  11. Issue #52: Added support for WEBIRC
  12. Issue #53: When connecting check for significantly more codes to say the bot is actually connected for non-compliant servers that don't return a 004
  13. Issue #54: Added support for auto splitting long messages. Use PircBotX.setAutoSplitMessages()
  14. Issue #49: Can now bind the created socket to a specific IP with PircBotX.setInetAddress(), useful for multi-homed servers
  15. Minor Javadoc fixes
  16. Bumped all maven plugins and dependencies to their newest versions

1.6 - October 22nd, 2011

The goals of this release is for bug fixing, new features, and internal upgrades. This includes things like updating the DCC code that hasn't been touched since inherited from PircBot, adding DCC IPv6 support, removing all cases were exceptions were silently ignored causing headaches when debugging, event id's, various updates and new features on connecting and disconnecting, and many bug fixes and updates.

This release took longer than planned because due to some things going on recently IPv6 became a lot more difficult to test and I've had less and less time to work on the project

NOTE: Some large but important changes were made in this release, so be sure to read the changelog in detail.

  1. Issue #34: New class UtilSSLSocketFactory to replace TrustingSSLSocketFactory (which is now Deprecated but will be kept). Provides options for trusting all certificates and disabling Diffie Hellman due to JDK bug #6521495.
  2. Issue #35: ListenerManager wasn't passed correctly to bots in MultiBotManager, causing NullPointerExceptions (thanks to Vincent Behar for the patch)
  3. Overhauled how Charset/Encoding is handled: Now it is stored as a Charset object instead of a String. The PircBotX.setEncoding(String) method was kept but now there's PircBotX.setEncoding(Charset). PircBotX.getEncoding() now returns a Charset object as well. setEncoding methods now do NOT allow null values and getEncoding methods never return null. The default JVM encoding is whats used if setEncoding is never called
  4. The setEncoding methods were updated in MultiBotManager to match the Bot setEncoding methods
  5. MultiBotManager.getBots() now returns an Unmodifiable set since adding bots there doesn't make any sense
  6. Issue #37: New method MultiBotManager.disconnectAll() (thanks to Vincent Behar for the patch)
  7. Issue #38: Now can have MultiBotManager clone all the supported settings from a passed PircBotX object. Could be useful in some situations.
  8. Issue #39 - Fixed a few issues and allowed some previously prevented ways of reconnecting * reconnect() now actually works since values it was relying on are no longer reset when disconnecting from a server * The connect() methods can now be used instead of reconnect(). This for example allows a bot to have alternative servers and ports if the first one tried does not work. * Don't reuse the same OutputThread when reconnecting to a server which caused an IllegalThreadStateException * PircBotX.quitServer() (and PircBotX.disconnect() which relies on it) throws a RuntimeException when trying to disconnect from an already disconnected server
  9. New Listener TemporaryListener. Useful for situations where a Listener is needed only once
  10. Attempting to send any line when the bot isn't connected to the server will throw an Exception immediately then instead of waiting for the OutputThread to fail when processing the queue.
  11. Issue #31: Events now have individual ID's which you can get with Event.getId(). The ID is tied to the Listener Manager in use by the bots, so bots that share the same Listener Manager share the same list of ID's. This is configurable with listenerManager.setCurrentId().
  12. Issue #43: Fixed Motd where it would give Arrays as strings instead of the actual Motd lines.
  13. Issue #44: Updated Colors class to use StringBuilder instead of StringBuffer and made the class final since its a static utility class (thanks to aleksei for the patch)
  14. Overhauled all DCC classes and methods - Almost all of it was still the original PircBot code with the same inefficient and wrong ways of doing things. The public API is mostly the same but some methods behave differently * Issue #25: Experimental support for DCC IPv6 added. * IP address handling in general was overhauled to use InetAddresses instead of longs and byte arrays * In all Dcc classes, changed all package-private and private modifiers to protected, bringing in line with the rest of the project * New exception DccExcception for various error conditions in the Dcc classes * PircBotX.dccSendChatRequest() actually throws any exceptions it encounters instead of silently failing * DccManager
    • The IP address utility methods (PircBotX.longToIp() and PircBotX.ipToLong()) were moved here then heavily changed to DccManager.addressToInteger() and DccManager.integerToAddress(). Both deal with Strings and InetAddresses directly instead of longs and byte arrays.
    • Internally replaced inefficient Vector of pending DccFileTransfers to an ArrayList
    • Throws a DccExcception when a user tries to resume sending or receiving a file that doesn't exist * DccChat
    • accept() now throws an IOException if trying to accept a connection again instead of just failing silently * DccFileTransfer
    • Sending and receiving files no longer create new threads and execute all of their code in them. This was done because since Listeners are now multi-threaded, there isn't any risk of blocking the whole bot by receiving or sending a large file
    • receive() now throws a DccExcception when trying to receive a file twice instead of silently failing
    • The delay between sending packets now throws a DccExcception (wrapping an InterruptedException) instead of just ignoring it as interrupting a thread doesn't occur without a (usually important) reason.
    • If an exception is encountered when closing the file streams or sockets and there isn't already an exception, send it in the FileTransferFinishedEvent
    • When sending a file the filename is trimmed for extra characters (eg newline, space, null, etc) just in case
  15. Various Javadoc updates and lots of new tests

1.5 - July 29th, 2011

The goals of this release is more bug fixing and any new features.

  1. Issue #30: PrivateMessageEvent.respond() would send the message the user sent instead of the given response
  2. Fixed issue where in situations where when a message was missing from a line the event's message would be heavily malformed instead of empty
  3. New method PartEvent.getReason() for getting the reason a user parted (empty if there is none)
  4. Internally moved creating the InputThread and OutputThread to a seperate factory method. This allows you to extend and update the threads without having to resort to strange reflection. This also allowed a half-working test to be 100% reliable
  5. Minor Javadoc updates
  6. Several updates to PircBotXJMeter class

1.4 - July 22nd, 2011 (AKA 1.3 Beta 3)

The goal of this release is any last minute bug fixing and minimal feature changes.

Note that due to a mistake the minor version number was accidentally bumped to 1.4 instead of 1.3-Final. Because once something is put in the Maven Central Repository it can never be taken out, were stuck with a version of 1.4

  1. Removed the "perHook" option from ThreadedListenerManager. It goes against the threading model of PircBotX (on hook that blocks will block all hooks that execute after it). If absolutely necessary the same result can be simulated by passing Executors.newSingleThreadScheduledExecutor() to ThreadedListenerManager
  2. Fixed Issue #29 and other issues where password was sent incorrectly
  3. Removed buggy and misleading Utils.isBlank() method. Simple enough logic that a dedicated utility method isn't needed
  4. Any received WHO reply updates all information regardless if its already been updated
  5. Fixed issue where removing the channel key mode without specifying the key caused an ArrayOutOfBoundsException
  6. Deprecated VoiceEvent.isVoice() and replaced with hasVoice to fit naming convention. Will be removed in future versions
  7. Deprecated OwnerEvent.isFounder() and replaced with isOwner (lingering method from when Owner was Founder)
  8. Removed gathering any any information from a NAMES response. Now relies 100% on WHO response which gives much more reliable information.
  9. Removed PircBotX.sendRawLineViaQueue(). The Queue should always be used unless the message must be sent NOW. PircBotX.sendRawLine() now sends via queue and a new method PircBotX.sendRawLineNow() bypasses the queue. Also internally fixed calls that didn't use these methods and instead jumped straight to the OutputThread.
  10. Log an exception when trying to send a message when the bot isn't connected anymore.
  11. Updated ancient version number in PircBotX class

Lastly at no particular time (happened everywhere)

  1. Lots more tests added. This includes * Most of the events * All of the PircBotX.send* methods * Most connect methods * And other classes/methods
  2. Major test cleanup

1.3 Beta2 - June 21st, 2011

The goal of this release was more bug fixing, implementing feature requests, and cleaning up the API. As this beta period was quite long, the change log is large.

WARNING: If you are directly upgrading from Beta1 to Beta2 the API has significantly changed. If your bot suddenly won't compile, try other ways to accomplish what your wanting to do (Eg opping with the Channel object instead of the User object) or consult the change log.

  1. Fixed Issue #5 and Issue #4 where output thread wouldn't even start or throw an exception
  2. Fixed potential issues where various commands or messages would create Channels.
  3. Fixed issue where User and Channel's hashcode and equals implementation would mess up storage in ManyToManyMap which is backed by HashMaps and HashSets
  4. Removed duplicate concept of "Removing" from ManyToManyMap as there is already Delete methods
  5. Fixed issues of memory leaks with better cleanup of User to Channel ManyToManyMap
  6. Cleaned up, updated, and better documented PircBotXExample. Now highlights important features in PircBotX. More to come
  7. Fixed Issue #3 and others where Channels would be created from commands, messages, and other non-channel text.
  8. Fixed Issue #8 where Channel creation handling was wrong again
  9. Finished renaming event.getSource() methods to getUser() to follow naming convention. Only events that have a source and recipient still have a getSource() method
  10. Finished renaming event.getTarget() methods to getChannel() to follow naming convention.
  11. Changed InviteEvent to receive the string version of the user instead of a user object since the user might not be in one of our channels
  12. Fixed issue where user's hostmask and login wouldn't be set on JOIN
  13. New method channelExists(String)
  14. Fixed issue where users wouldn't be associated with the channel they just joined
  15. Fixed issue where possible exceptions could be thrown from a user leaving the channel or server
  16. Fixed Issue #9 where InviteEvent would provide very wrong information. Reported upstream as well
  17. Cleaned and overhauled channel mode parsing and getting channel mode. Now channel mode is mostly guaranteed to be accurate.
  18. Deprecated GenericListenerManager. With various internal functionality depending on a threaded bot and the simpleness of the listener manager it should not be used anymore.
  19. Can now get ops and users in channel with getOps() and getVoices()
  20. Removed PircBotX.channelExists(Channel chan) since it has a very small usage scenario
  21. Fixed Issue #10 where the person who set the voice or op would be labeled as the voice or op instead of the person that received it
  22. Fixed issue of disassociating the wrong user from the channel
  23. Added package level Javadocs to all packages
  24. Added feature request in Issue #14 where you can authenticate to Nickserv without having to do it in a ConnectEvent listener
  25. Massively overhauled all Event object Javadocs. This includes removing all references to the "PircBot abstract class", updating example code, and fixing links.
  26. Merged OpEvent and DeOpEvent, and VoiceEvent and DeVoice event into a single event: OpEvent and VoiceEvent. To see if the mode was given or taken call isOp() or isVoice()
  27. Fixed broken NAMES command parsing
  28. Added support for HalfOps, SuperOps, and Founders per feature request in Issue #11.
  29. Removed send methods that took Event as the first parameter. There was way too many assumptions going on there and most likely didn't work as expected as implemented
  30. New method PircBotX.sendCTCPCommand(Channel target, String command) to send a CTCP command to a channel
  31. Renamed getSource() to getUser() in DCC classes to follow naming convention.
  32. Renamed Utils.getSource() to getUser() to follow naming convention
  33. New method respond() in all event classes. Allows one to respond very easily to all events. Documentation and Wiki page to follow.
  34. Fixed Issue #15 and possibly other issues where no quit message or other message messed up processing and threw a StringIndexOutOfBoundsException
  35. New method getUserBot() to get the bots user object. Simply a shortcut to the uglier bot.getUser(bot.getNick())
  36. Internally map names to user objects for faster lookup (old method simply looped over all the users and compared names)
  37. Full support for alternative PircBotX subclasses in Event and Listener system. There was some support for PircBotX subclasses but not much and it never really worked. Now however all events and listeners have generic parameters that can make them work with other bots
  38. User and Channel classes now have package private constructors. This prevents others from creating useless Channel and User objects
  39. Support for Channel Founder dropped in favor of Channel Owner. Channel Founders just aren't on as many servers and are very difficult to separate from owners. This means that FounderEvent was removed while OwnerEvent was added
  40. New methods added to set and remove founder, superop, and halfop status: halfOp(), deHalfOp(), superOp(), deSuperOp(), owner(), and deOwner() - More info at Features#Support_for_Halffops,_Superops_and_Owners
  41. Removed useless utility method HookUtils.getListeners()
  42. Changed HookUtils.getEvents() to get events from ListenerAdapter instead of the (out of date) event list. Now 100% guaranteed to get all the events PircBotX supports
  43. Fixed bug where a person was still considered identified even if they had a tilde in their login.
  44. Fixed major bug where existing channel users weren't added to the list of users in the channel.
  45. New method Channel.getNormalUsers() to get all non-special users in the channel. This will return all users that aren't ops, have voice, superops, halops, or owners in the channel
  46. Fixed issue where bot thought that its nick was PircBotX (default name set)
  47. Added Hello World example to PircBotX example
  48. Updated MultiBotManager with a more useful getBots() method, working and updated listener manager support, and another overload of the connectAll method.
  49. ThreadListenerManager now by default runs all listeners in separate threads instead of each batch of listeners in a separate thread
  50. Fixed issue where getting an unknown key from ManyToManyMap caused an NPE. This caused havoc in some Channel methods
  51. When a User quits remove their references from internal HalfOp, SuperOp, and Owner lists in Channel
  52. Removed voice, deVoice, op, and deOp methods from User since they duplicate functionality. Using the user object's operator methods wasn't all that useful anyway since there wasn't methods for HalfOp, SuperOp, and Owner statuses. Instead of add those methods, all user channel status methods were removed
  53. Added new methods to Channel for user status (HalfOp, SuperOp, and Owner) management: Checking if a user has the status, giving a user the status, and removing a status from a user.
  54. Added new methods to User to get channels that the user has special status in: getChannelsOpIn(), getChannelsVoiceIn(), getChannelsOwnerIn(), getChannelsHalfOpIn(), getChannelsSuperOpIn()
  55. Support for extending User and Channel objects was added. This includes 1. The important custom ManyToManyMap that holds all user to channel mappings has moved from an anonymous field to a subclass in PircBotX called UserChannelMap. It has generics to allow subsituting subclassed User and Channel objects 1. Channel and User's constructors now have protected instead of package-private access, allowing subclassing. 1. To take advantage of this, override getUser() and getChannel() in the PircBotX class so that they create your custom User instead of the provided User.
  56. Added new overload for setMode that takes vararg parameters of modes per feature request in Issue #21. This makes mode setting cleaner (and faster) than basic string concatenation.
  57. Added new methods to set supported modes per feature requests in Issue #21 and Issue #26: setChannelLimit, removeChannelLimit(), setChannelKey(), removeChannelKey(), setInviteOnly(), removeInviteOnly(), setModerated(), removeModerated(), setNoExternalMessages(), removeNoExternalMessages(), setSecret(), removeSecret(), setTopicProtection(), removeTopicProtection(). See Javadoc for more information
  58. User.getChannels() returns a Set instead of a Collection just like most user and channel methods in PircBotX
  59. Per Issue #20 a new object was created called UserSnapshot that shows a user's status in a moment of time. This is used by QuitEvent which returns a UserSnapshot instead of a plain User in getUser(). Before this all methods about channels a User has been in would be blank.
  60. ListenerAdapter updated to support Generic event interfaces. This allows you to for example capture ALL user messages (channel message, channel action, channel notice, private message) in a single method. See Javadoc and the methods prefixed with onGeneric
  61. Generic event interfaces cleaned of old or unused interfaces, updated to support Generics like the rest of the event system, added new Generic event interfaces, updated again with the useful generic Event methods (getBot(), getTimestamp(), respond())
  62. ListenerAdapter will now through all caught exceptions instead of printing to the console in certain edge cases (wraps exceptions that are higher than Exception or that don't have a bot in a RuntimeException and throws that instead)
  63. Updated InputThread.isConnected() to report the actual connected status instead of always true. Fixed ugly SocketExceptions that would be generated in certain edge cases in Issue #24
  64. Return correct responses in Channel.getHalfOps, getOwners, and getSuperOps that caused havoc in Issue #23
  65. New method PircBotX.cycle() per Feature Request in Issue #22. Parts and Joins the given channel, useful for obtaining auto-privileges in Channels. A version that takes a channel key is also provided.
  66. Fixed ActionEvent's respond method to send a response to the User that sent the action if there is no channel instead of sending an invalid line to the server
  67. Updated partChannel(), ban(), and unBan()'s method signatures to take Channel objects instead of String channels.
  68. Moved project to the Sonatype and Maven Central repository. To accomplish this the project was moved in maven from the org group to the org.pircbotx group
  69. Added JMeter test class for load testing

And lastly at no particular point in time (happened everywhere)

  1. Tons of unit testing added. One of the primary goals of this beta was to write more unit tests in order to ensure stability. While there are still large gaps, most of the main functionality has unit tests with more on the way.
  2. Documentation added to various undocumented methods and classes. Existing documentation was also fixed and updated in multiple places.

1.3 Beta1 - March 3rd, 2011

  1. Renamed a few event methods from getSource() to getUser()
  2. ListenerManager.addListener() returns true if adding Listener was successful
  3. New method ListenerManager.listenerExists() for checking if a Listener exists
  4. New method PircBotX.isVerbose() for getting current verbose value
  5. New method PircBotX.isAutoNickChange() for seeing if automatic nick changing due to the name already being taken is turned on
  6. New class MultiBotManager for easily creating multiple bots
  7. Deploy maven site and Javadoc to http://site.pircbotx.googlecode.com/hg/index.html
  8. PircBotx.startIdentServer() returns the started Ident server in case something needs it
  9. New feature waitFor() - Can wait for an event inside of a listener. Example: Have a conversation with a user (sending a message, waiting for a response, responding to the response) in a single call.
  10. Moved ListenerManager's to org.pircbotx.hooks.managers
  11. New ListenerManager: ThreadedListenerManager. Executes hooks in separate threads from the Input Thread. Now the default ListenerManager
  12. Fixed bug in the initial WHO and MODE commands sent when a channel was joined which sent NULL instead of the channel name
  13. When the JVM shuts down, calls PircBotX.disconnect() and PircBotX.dispose() to properly shut down the bot
  14. Input log lines are now prefixed with <<< to signal that they are coming in
  15. New field in TopicEvent: date - Says when the topic was created
  16. Moved Maven project to org groupId vs PircBotX. All projects using the old groupId need to update - This should be the last major change to the maven location or version number
  17. Various Javadoc additions and updates
  18. MultiBotManager requires a name in constructor.
  19. PircBotX's logException and log methods now synchronize on the same object to prevent them from stepping on each other
  20. ThreadFactory has been removed as it has questionable usefulness. Any project wishing to mark the Input or Output thread just needs to see if the Thread is an instance of InputThread or OutputThread
  21. ListenerManager is now fully Generic allowing any ListenerManager and Listener use any PircBotX subclass they want
  22. Renamed the last fields that were prefixed with _. Projects who have extended core PircBotX classes need to update their code to new variable names
  23. Removed many old String based methods of sending messages, opping, voicing, etc since all require being in the channel. This is done simply to clean up the method list
  24. Can now send messages to a user in a channel easily with a sendMessage(Channel,User,Message) method. Sends to specified channel in format "User: message"

1.1 - 1.2

  1. Multiple rewrites and updates. Version tracking wasn't followed yet, so its difficult to come up with an exact changelist.

1.0 - First Release

Note: Early versions called this PircBotX-3.0. However later this was changed to 1.0. While its been changed in as many places as possible, there are certain places where it can't be changed.

  1. Finish rewrite with new event system, as well as various other changes