class TerminalGameEngine::Network

Constants

PORT

Attributes

logger[R]

Public Class Methods

new(logger: Logger.new('/dev/null')) click to toggle source
# File lib/terminal_game_engine/network.rb, line 11
def initialize(logger: Logger.new('/dev/null'))
  @logger = logger
end

Public Instance Methods

hostname() click to toggle source
# File lib/terminal_game_engine/network.rb, line 48
def hostname
  @hostname ||= `hostname -s`.strip
end
open_socket() click to toggle source
# File lib/terminal_game_engine/network.rb, line 15
def open_socket
  @socket = UDPSocket.new
  @socket.bind '0.0.0.0', PORT
  @socket.setsockopt Socket::SOL_SOCKET, Socket::SO_REUSEADDR, true
  @socket.setsockopt Socket::SOL_SOCKET, Socket::SO_BROADCAST, true
rescue Errno::EADDRINUSE
  $stderr.puts "Game is already running."
  exit 1
end
receive_updates(&block) click to toggle source
# File lib/terminal_game_engine/network.rb, line 25
def receive_updates(&block)
  loop do
    begin
      data, addr = @socket.recvfrom_nonblock 8192
      data = YAML.load(data)
      block.call(data)
    rescue Psych::SyntaxError => error
      logger.error error
    end
  end
rescue Errno::EAGAIN
end
send_update(data) click to toggle source
# File lib/terminal_game_engine/network.rb, line 38
def send_update(data)
  data = data.merge(hostname: hostname)

  begin
    @socket.send data.to_yaml, 0, '255.255.255.255', PORT
  rescue Errno::EHOSTUNREACH, Errno::ENETUNREACH, Errno::EMSGSIZE, Errno::ENETDOWN => error
    logger.error error
  end
end