+
+function onChannelJoin(event) {
+ var chan;
+
+ // Only deal with ourselves joining a channel
+ if (event.nick !== this.nick)
+ return;
+
+ // We should only ever get a JOIN command for a channel
+ // we're not already a member of.. but check we don't
+ // have this channel in case something went wrong somewhere
+ // at an earlier point
+ if (!this.irc_channels[event.channel]) {
+ chan = new IrcChannel(this, event.channel);
+ this.irc_channels[event.channel] = chan;
+ chan.irc_events.join.call(chan, event);
+ }
+}
+
+
+function onServerConnect(event) {
+ this.nick = event.nick;
+
+ // TODO: use `event.nick` instead of `'*'` when using an IrcUser per nick
+ this.irc_users[event.nick] = new IrcUser(this, '*');
+}
+
+
+function onUserPrivmsg(event) {
+ var user;
+
+ // Only deal with messages targetted to us
+ if (event.channel !== this.nick)
+ return;
+
+ if (!this.irc_users[event.nick]) {
+ user = new IrcUser(this, event.nick);
+ this.irc_users[event.nick] = user;
+ user.irc_events.privmsg.call(user, event);
+ }
+}
+
+
+function onUserParts(event) {
+ // Only deal with ourselves leaving a channel
+ if (event.nick !== this.nick)
+ return;
+
+ if (this.irc_channels[event.channel]) {
+ this.irc_channels[event.channel].dispose();
+ delete this.irc_channels[event.channel];
+ }
+}
+
+
+
+
+/**
+ * Handle the socket connect event, starting the IRCd registration
+ */
+var socketConnectHandler = function () {