require “bundler/gem_tasks”

# import “../lib/tasks/start_server.rake”.

# spec = Gem::Specification.find_by_name 'start_server' # load “#{spec.gem_dir}/tasks/start_server.rake”

# task :default => [:start_server]

# task :start_server do # ruby “lanchat.rb” # end

require “rubygems” require “bundler/setup”

task “start_server” do

require "lanchat/version"

require “socket” module Lanchat

class ChatServer

 def initialize( port )
   @descriptors = Array::new
   @serverSocket = TCPServer.new( "", port )
   @serverSocket.setsockopt( Socket::SOL_SOCKET, Socket::SO_REUSEADDR, 1 )
   printf("Chatserver started on port %d\n", port)
   @descriptors.push( @serverSocket )
 end # initialize

 def run
   while 1
      res = select( @descriptors, nil, nil, nil )
      if res != nil then
      # Iterate through the tagged read descriptors
        for sock in res[0]
        # Received a connect to the server (listening) socket
           if sock == @serverSocket then
             accept_new_connection
          else
             # Received something on a client socket
          if sock.eof? then
              str = sprintf("Client left %s:%s\n",
              sock.peeraddr[2], sock.peeraddr[1])
              broadcast_string( str, sock )
              sock.close
              @descriptors.delete(sock)
           else
               str = sprintf("[%s|%s]: %s",
               sock.peeraddr[2], sock.peeraddr[1], sock.gets())
               broadcast_string( str, sock )
           end
        end
     end
  end
end

end

private
 def broadcast_string( str, omit_sock )
      @descriptors.each do |clisock|
        if clisock != @serverSocket && clisock != omit_sock
           clisock.write(str)
        end
      end
      print(str)
end # broadcast_string

def accept_new_connection
      newsock = @serverSocket.accept
      @descriptors.push( newsock )
      newsock.write("You're connected to the Ruby chatserver\n")
      str = sprintf("Client joined %s:%s\n",
      newsock.peeraddr[2], newsock.peeraddr[1])
      broadcast_string( str, newsock )

end # accept_new_connection

end server myChatServer = ChatServer.new(2000) myChatServer.run end end