Advertisement
marlosgama

Untitled

Aug 11th, 2019
241
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 2.39 KB | None | 0 0
  1. #==============================================================================
  2. # ** Network
  3. #------------------------------------------------------------------------------
  4. #  Esta classe lida com a rede.
  5. #------------------------------------------------------------------------------
  6. #  Autor: Valentine
  7. #==============================================================================
  8.  
  9. class Network
  10.  
  11.   include Send_Data, Handle_Data
  12.  
  13.   attr_reader   :motd, :actors, :vip_time
  14.  
  15.   def initialize
  16.     @group = Constants::GROUP_STANDARD
  17.     @in_game = false
  18.     @vip_time = nil
  19.     @socket = nil
  20.     @message = nil
  21.     @m_size = 0
  22.     @player_id = -1
  23.     @motd = ''
  24.     @actors = {}
  25.   end
  26.  
  27.   def connect
  28.     @socket = SocketLib.new(Configs::HOST, Configs::PORT)
  29.   end
  30.  
  31.   def disconnect
  32.     return unless connected?
  33.     @socket.close
  34.     @socket = nil
  35.   end
  36.  
  37.   def connected?
  38.     @socket
  39.   end
  40.  
  41.   def connection_lost?(status)
  42.     status == -1
  43.   end
  44.  
  45.   def standard_group?
  46.     @group == Constants::GROUP_STANDARD
  47.   end
  48.  
  49.   def vip?
  50.     @vip_time > Time.now
  51.   end
  52.  
  53.   def server_online?
  54.     retry_count = 0
  55.     successful = false
  56.     while !successful && retry_count < 2
  57.       begin
  58.         connect
  59.         successful = true
  60.       rescue
  61.         retry_count += 1
  62.       end
  63.     end
  64.     successful
  65.   end
  66.  
  67.   def update
  68.     # Se a conexão não foi fechada e há dados para ler
  69.     until !@socket || @socket.eof?
  70.       if @message
  71.         receive_message_gradually
  72.       else
  73.         receive_full_message
  74.       end
  75.     end
  76.   end
  77.  
  78.   def receive_full_message
  79.     b_size = @socket.recv_non_block(2)
  80.     if connection_lost?(b_size) || b_size.size < 2
  81.       $alert_msg ||= Vocab::ConnectionFailed
  82.       DataManager.back_login
  83.       return
  84.     end
  85.     size = b_size.unpack('s')[0]
  86.     message = @socket.recv_non_block(size)
  87.     if message.size - 4 == size
  88.       handle_messages(message)
  89.     else
  90.       @message = message
  91.       @m_size = size
  92.     end
  93.   end
  94.  
  95.   def receive_message_gradually
  96.     message = @socket.recv_non_block(@m_size - @message.size)
  97.     @message << message
  98.     if @message.size - 4 == @m_size
  99.       msgbox('Por favor, tire print deste erro e reporte-o à staff.\nErro: o pacote não chegou inteiro inicialmente, mas o problema já foi resolvido!')
  100.       handle_messages(@message)
  101.       @message = nil
  102.     end
  103.   end
  104.  
  105. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement