def join
      if room.locked?
        client.numeric_reply :err_inviteonlychan, "Cannot join #{channel} (locked)"
        return false

      elsif room.full?
        client.numeric_reply :err_channelisfull, "Cannot join #{channel} (full)"
        return false

      else
        update_users do
          # join channel
          client.user_reply :join, ":#{channel}"

          # current topic
          client.numeric_reply :rpl_topic, channel, ':' + (room.topic || "")

          # List the current users, which must always include myself
          # (race condition, server may not realize the user has joined yet)
          nicks = users.values.map { |u| u.nick }
          nicks.unshift client.nick unless nicks.include? client.nick

          nicks.each_slice(10) do |list|
            client.numeric_reply :rpl_namereply, "=", channel, ":#{list.join ' '}"
          end
          client.numeric_reply :rpl_endofnames, channel, "End of /NAMES list."

          # begin streaming the channel events (joins room implicitly)
          stream_campfire_to_channel
        end
      end

      true
    end
def join
      if room.locked?
        client.numeric_reply :err_inviteonlychan, "Cannot join #{channel} (locked)"
        return false

      elsif room.full?
        client.numeric_reply :err_channelisfull, "Cannot join #{channel} (full)"
        return false

      else
        update_users do
          # join channel
          client.user_reply :join, ":#{channel}"

          # current topic
          client.numeric_reply :rpl_topic, channel, ':' + (room.topic || "")

          # List the current users, which must always include myself
          # (race condition, server may not realize the user has joined yet)
          nicks = users.values.map { |u| u.nick }
          nicks.unshift client.nick unless nicks.include? client.nick

          nicks.each_slice(10) do |list|
            client.numeric_reply :rpl_namereply, "=", channel, ":#{list.join ' '}"
          end
          client.numeric_reply :rpl_endofnames, channel, "End of /NAMES list."

          # begin streaming the channel events (joins room implicitly)
          stream_campfire_to_channel
        end
      end

      true
    end
Public: create a new campfire channel

 channel - name of the channel we're joining
 client  - the EM::Connection representing the irc client
 room    - the campfire room we're joining
 Public: Joins a campfire room and sends the necessary topic
 and name list messages back to the IRC client.

 Returns true if the join was successful,
   false if the room was full or locked.