Advertisement
Guest User

Untitled

a guest
Jul 31st, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.90 KB | None | 0 0
  1. require "socket"
  2. require 'libs'
  3. class User
  4. attr_reader :socket
  5. attr_reader :username
  6. attr_reader :my_index
  7. @@number_users = 0
  8. def initialize( username, password, sock )
  9. @@number_users = 1
  10. @my_index = @@number_users
  11. @username = username
  12. @password = password
  13. @socket = sock
  14. end
  15. def find_socket( sock )
  16. if sock = @socket then
  17. return true
  18. else
  19. return false
  20. end
  21. end
  22. def username
  23. return @username
  24. end
  25. def find( sock )
  26. if socket( sock ) then
  27. return username
  28. else
  29. return "UnknownUser"
  30. end
  31. end
  32.  
  33.  
  34. end
  35. class ChatServer
  36. def initialize( port )
  37. @descriptors = Array::new
  38. @players = Array::new
  39. @serverSocket = TCPServer.new( "", port )
  40. @serverSocket.setsockopt( Socket::SOL_SOCKET, Socket::SO_REUSEADDR, 1 )
  41. printf("Server started on port %d\r\n", port)
  42. @descriptors.push( @serverSocket )
  43. #@players.push( {"username" => "", "password"=>""} )
  44. end # initialize
  45.  
  46. def run
  47. while 1
  48. res = select( @descriptors, nil, nil, nil )
  49. if res != nil then
  50. # Iterate through the tagged read descriptors
  51.  
  52. user="UnknownUser"
  53. for sock in res[0]
  54.  
  55. #@players.each do |p|
  56. #index = 1
  57. #if p.socket(sock) then
  58. #user = p.username
  59. #end
  60. #end
  61.  
  62.  
  63. # Received a connect to the server (listening) socket
  64. if sock == @serverSocket then
  65. accept_new_connection
  66. else
  67. # Received something on a client socket
  68.  
  69. if sock.eof? then
  70.  
  71. str = sprintf("/system %s left %s:%s\r\n",
  72. user, sock.peeraddr[2], sock.peeraddr[1])
  73. broadcast_string( str, sock )
  74. sock.close
  75. @descriptors.delete(sock)
  76. else
  77.  
  78.  
  79. line = sock.gets()
  80.  
  81. @players.each do |p|
  82. if p.socket = sock then
  83. user = p.username
  84. end
  85. end
  86.  
  87. if line =~ /\/shutdown novapw4chatserver/ then
  88. self.stop
  89. break
  90. end
  91. if line =~ /\/print users/ then
  92. @players.each do |p|
  93. sock.write( p.username )
  94. sock.write( "\n" )
  95. end
  96. break
  97. end
  98. if line =~ /\/print res/ then
  99. sock.write( res[0] )
  100. sock.write( "\n" )
  101. break
  102. end
  103. if line =~ /\/print index/ then
  104. sock.write( index )
  105. sock.write( "\n" )
  106. break
  107. end
  108. if line =~ /\/[a-zA-Z]/ then
  109. process_command( line, sock )
  110. break
  111. else
  112. str = sprintf("/chat [%s|%s|%s]: %s",
  113. user, sock.peeraddr[2], sock.peeraddr[1], line)
  114. broadcast_string( str, sock )
  115. end
  116. end
  117. end
  118. end
  119. end
  120. end
  121. end
  122.  
  123. private
  124. def process_command( str, cmd_sock)
  125. cmd_sock.write(str)
  126. end
  127.  
  128. private
  129. def broadcast_string( str, omit_sock )
  130. @descriptors.each do |clisock|
  131. if clisock != @serverSocket && clisock != omit_sock
  132. clisock.write(str)
  133. end
  134. end
  135. print(str)
  136. end
  137.  
  138. def get_authentication( sock )
  139.  
  140. username = ""
  141. password = ""
  142. sock.write("Login:\r\n")
  143. username = sock.gets.chomp
  144. #sock.write("#{username}\r\n")
  145. sock.write("Password:\r\n")
  146. password = sock.gets.chomp
  147. #sock.write("#{password}\r\n")
  148. pl = User.new( username , password, sock )
  149. @players.push( pl )
  150. return pl
  151. #str = sprintf("/system %s joined %s:%s\r\n",
  152. #username, sock.peeraddr[2], sock.peeraddr[1])
  153. #broadcast_string(str, sock)
  154. end
  155.  
  156. def accept_new_connection
  157. newsock = @serverSocket.accept
  158. @descriptors.push( newsock )
  159. user = get_authentication( newsock )
  160. newsock.write("/chat welcome to the game!\r\n")
  161. str = sprintf("/system %s joined %s:%s\r\n", user.username,
  162. newsock.peeraddr[2], newsock.peeraddr[1])
  163. broadcast_string( str, newsock )
  164. end # accept_new_connection
  165.  
  166.  
  167. end #server
  168.  
  169. server = ChatServer.new(1234).run
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement