Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require "socket"
- require 'libs'
- class User
- attr_reader :socket
- attr_reader :username
- attr_reader :my_index
- @@number_users = 0
- def initialize( username, password, sock )
- @@number_users = 1
- @my_index = @@number_users
- @username = username
- @password = password
- @socket = sock
- end
- def find_socket( sock )
- if sock = @socket then
- return true
- else
- return false
- end
- end
- def username
- return @username
- end
- def find( sock )
- if socket( sock ) then
- return username
- else
- return "UnknownUser"
- end
- end
- end
- class ChatServer
- def initialize( port )
- @descriptors = Array::new
- @players = Array::new
- @serverSocket = TCPServer.new( "", port )
- @serverSocket.setsockopt( Socket::SOL_SOCKET, Socket::SO_REUSEADDR, 1 )
- printf("Server started on port %d\r\n", port)
- @descriptors.push( @serverSocket )
- #@players.push( {"username" => "", "password"=>""} )
- end # initialize
- def run
- while 1
- res = select( @descriptors, nil, nil, nil )
- if res != nil then
- # Iterate through the tagged read descriptors
- user="UnknownUser"
- for sock in res[0]
- #@players.each do |p|
- #index = 1
- #if p.socket(sock) then
- #user = p.username
- #end
- #end
- # 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("/system %s left %s:%s\r\n",
- user, sock.peeraddr[2], sock.peeraddr[1])
- broadcast_string( str, sock )
- sock.close
- @descriptors.delete(sock)
- else
- line = sock.gets()
- @players.each do |p|
- if p.socket = sock then
- user = p.username
- end
- end
- if line =~ /\/shutdown novapw4chatserver/ then
- self.stop
- break
- end
- if line =~ /\/print users/ then
- @players.each do |p|
- sock.write( p.username )
- sock.write( "\n" )
- end
- break
- end
- if line =~ /\/print res/ then
- sock.write( res[0] )
- sock.write( "\n" )
- break
- end
- if line =~ /\/print index/ then
- sock.write( index )
- sock.write( "\n" )
- break
- end
- if line =~ /\/[a-zA-Z]/ then
- process_command( line, sock )
- break
- else
- str = sprintf("/chat [%s|%s|%s]: %s",
- user, sock.peeraddr[2], sock.peeraddr[1], line)
- broadcast_string( str, sock )
- end
- end
- end
- end
- end
- end
- end
- private
- def process_command( str, cmd_sock)
- cmd_sock.write(str)
- 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
- def get_authentication( sock )
- username = ""
- password = ""
- sock.write("Login:\r\n")
- username = sock.gets.chomp
- #sock.write("#{username}\r\n")
- sock.write("Password:\r\n")
- password = sock.gets.chomp
- #sock.write("#{password}\r\n")
- pl = User.new( username , password, sock )
- @players.push( pl )
- return pl
- #str = sprintf("/system %s joined %s:%s\r\n",
- #username, sock.peeraddr[2], sock.peeraddr[1])
- #broadcast_string(str, sock)
- end
- def accept_new_connection
- newsock = @serverSocket.accept
- @descriptors.push( newsock )
- user = get_authentication( newsock )
- newsock.write("/chat welcome to the game!\r\n")
- str = sprintf("/system %s joined %s:%s\r\n", user.username,
- newsock.peeraddr[2], newsock.peeraddr[1])
- broadcast_string( str, newsock )
- end # accept_new_connection
- end #server
- server = ChatServer.new(1234).run
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement