Make an attempt at supporting 1.8. Unfortunately, `IO::WaitReadable` is still holding us up on that. Spread the DSL config changes throughout the rest of the app and a connecting client now works as far as it did before I started messing with things. Need to work on real tests. Bacon or riot?
Get rid of bundler. It doesn't really serve a purpose for now. Going to try to work on this more, but I really need to refactor some stuff before I get started on new code. We'll see how it goes...
Fix iChat connecting via TLS. Use `_nonblock` socket methods. Use `IO::WaitReadable` instead of `Errno::EAGAIN`. Change `xid_find` to `find_xid`. Fix the `split_xid` regex.
Rework the 'listeners' definitions in the config file. Add Bundler Gemfile.
Move a lot of methods from client.rb to stream.rb and iq.rb. Add iq stanza processing. Add resource binding.
Move some database stuff to kintara.rb because Sequel is weird. Enable database creation/models. Schema seems good. Differentiate between stream and stanza errors. Add XMPP::Client#authorize for SASL PLAIN. Eventually add DIGEST-MD5. Change the unique ID generator to a SecureRandom UUID-esque thing.
Add stanza processing. This will slowly be filled out as I go. Add initial stream processing. Clients can connect and establish a stream. Add support for XMPP features. Add STARTTLS. Clients can successfully switch to TLS-encrypted streams. Check for dead clients AFTER the event loop.
Allow the same event to be posted more than once to the same queue. If this is done it can allow things like two "this socket is ready to be read from" events to be posted and result in two calls to read(), one of which will wind up blocking. This is bad. However, NOT allowing this results in worse things, like if a certain event-triggering data comes in more than once in a single read()/event loop it results it it only being processed once and will ignore the rest. This is unacceptable. Since the former can be corrected with good coding, and the latter cannot, then the former loses (thanks sycobuny).
Change etc/config.yml to use .key and .crt instead of .pem. Translate @config String keys to Symbols (sycobuny). Fix the potential threading problem in XMPP::Servers Fix XMPP::Client to properly die when the socket disconnects. Make XMPP::Client#socket always be in select() readfds.
Move XMPPServer to XMPP::Server. XMPP::Client now does basic read/write. Clients currently driven by XMPP::Server, not local events; I'm not totally sure which way I want it.
Add generic timers, specifically from my IRC client library. Add supercool event-driven stuff, specifically from rhuidean again. Add a basic I/O loop with select(). XMPPServers can accept connections now (mostly proof of concept). Fix logging so it works on --nofork. Turn on Ruby warnings on --debug. Switch the main class' methods to class methods. Whoops.
Removed logging from config. Going to controlled via command line options. Added an XMPPServer class. Each of these will run a listener for c2s or s2s. Added a mixin, "Loggable," which provides nice logging/debugging for any class. Set up instances of XMPPServer to be in their own thread. Not sure on this.
Fix PID writing so that it always writes instead of only when willfork = true. Add file encoding comments. Make a note about IDN encoding.