* Moved all server commands to the Commands module. * Removed auto join functionality until I'm really convinced it should be here. * Only use config hash for argument entry, but not for actual config storage.
* Cosmetic changes. * Added Server class to encapsulate reading and writing to the socket. * Write now accepts optional expected reply numbers and a block which it yields with each reply message. * All specs pass.
* Read a channel topic upon request. * Cosmetic changes. * Do not handle errors generically. This needs to be better thought out. * Username and Realname default to the nick. * Refactored the main loop. * Added ability to auto-join channels.
* Added 'ready' and 'error' events. * Encapsulated socket method once more (what was I thinking?) * Rudimentary error handling.
* Changed the user argument to be nick for almost all events. * Added events: topic changed, bot kicked, user kicked.
* Handle basic messages and private messages. * Changed a few event arguments to be more explicit. * Tweaked event detection order--moved most frequent up. * Added more tasks.
* Moved specs to their proper modules. * Added the default event. * Added the PING event. * Moved dispatch to the Events module. * Moved write to the Commands module.
* Created an Events module to document all the events that the bot can handle. * Created a Commands module to document all the commands that the bot is able to perform * Daemon should now be subclassed in order to be used.
* Removed the connect event. It will be handled inside the loop. * Refactored specs: now they test only one thing per spec.
* Made close() private. * Removed autojoin capability. This is not something the framework should decide, at least, not the way it was implemented. * Moved authentication to its own method. * Added a default event, for commands that we don't know how to handle. * Renamed init_socket to connect. It sounds better. * Added a connect event, which is run after authentication.