Class: Glowstone::Server

Inherits:
Object
  • Object
show all
Defined in:
lib/glowstone/server.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(host = "localhost", options = {}) ⇒ Server

Returns a new instance of Server.



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/glowstone/server.rb', line 12

def initialize(host="localhost", options={})
  
  # backwards compatibility for old style invocation
  if options.is_a?(Numeric)
    options = {:port => options.to_i}
  end

  # set server name
  @name = options[:name] ? options[:name].to_s : host

  # if the host is a srv record, get its info
  begin
    resource = Resolv::DNS.new.getresource("_minecraft._tcp.#{host}", Resolv::DNS::Resource::IN::SRV)
    @host = resource.target.to_s
    @port = resource.port.to_i
  rescue
    @host = host
    @port = options[:port] ? options[:port].to_i : DEFAULT_PORT
  end

  # set request timeout
  @timeout = options[:timeout] ? options[:timeout].to_i : DEFAULT_SOCKET_TIMEOUT

  # create a reusable UDP socket
  @socket = UDPSocket.new
  @socket.connect(@host, @port)
  refresh
end

Instance Attribute Details

#gamemode ⇒ Object (readonly)

Returns the value of attribute gamemode.



10
11
12
# File 'lib/glowstone/server.rb', line 10

def gamemode
  @gamemode
end

#host ⇒ Object (readonly)

Returns the value of attribute host.



8
9
10
# File 'lib/glowstone/server.rb', line 8

def host
  @host
end

#map_name ⇒ Object (readonly)

Returns the value of attribute map_name.



10
11
12
# File 'lib/glowstone/server.rb', line 10

def map_name
  @map_name
end

#max_players ⇒ Object (readonly)

Returns the value of attribute max_players.



10
11
12
# File 'lib/glowstone/server.rb', line 10

def max_players
  @max_players
end

#motd ⇒ Object (readonly)

Returns the value of attribute motd.



10
11
12
# File 'lib/glowstone/server.rb', line 10

def motd
  @motd
end

#name ⇒ Object

Returns the value of attribute name.



9
10
11
# File 'lib/glowstone/server.rb', line 9

def name
  @name
end

#num_players ⇒ Object (readonly)

Returns the value of attribute num_players.



10
11
12
# File 'lib/glowstone/server.rb', line 10

def num_players
  @num_players
end

#players ⇒ Object (readonly)

Returns the value of attribute players.



10
11
12
# File 'lib/glowstone/server.rb', line 10

def players
  @players
end

#plugins ⇒ Object (readonly)

Returns the value of attribute plugins.



10
11
12
# File 'lib/glowstone/server.rb', line 10

def plugins
  @plugins
end

#port ⇒ Object (readonly)

Returns the value of attribute port.



8
9
10
# File 'lib/glowstone/server.rb', line 8

def port
  @port
end

#timeout ⇒ Object

Returns the value of attribute timeout.



9
10
11
# File 'lib/glowstone/server.rb', line 9

def timeout
  @timeout
end

#version ⇒ Object (readonly)

Returns the value of attribute version.



10
11
12
# File 'lib/glowstone/server.rb', line 10

def version
  @version
end

Instance Method Details

#refresh ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/glowstone/server.rb', line 41

def refresh
  response = perform_request(MAGIC_BYTES + REQUEST_BYTE[:query] + CLIENT_ID + get_session_id + CLIENT_ID)
  status = StatusPacket.read response

  # there's some kind of weird bug with BinData wherein its native
  # datatypes don't play well with rails, so i'm converting them all here
  @motd = status.motd.to_s
  @gamemode = status.gametype.to_s
  @version = status.version.to_s

  @plugins = (status.plugins.empty?) ? nil : status.plugins.to_s.gsub!(/^(craft)?bukkit[^:]*:\s*/i, "").split(/;\s*/)
  @map_name = status.map_name.to_s
  @num_players = status.num_players.to_i
  @max_players = status.max_players.to_i

  player_array = status.players.to_ary
  player_array.each_with_index do |player, index|
    player_array[index] = player.to_s
  end
  @players = player_array

  self
end

#to_hash ⇒ Object



65
66
67
68
69
70
71
72
73
# File 'lib/glowstone/server.rb', line 65

def to_hash
  vars_to_skip = ["@timeout", "@socket"]

  hash = Hash.new
  instance_variables.each do |var|
    hash[var.to_s.delete("@").to_sym] = instance_variable_get(var) unless vars_to_skip.include?(var.to_s)
  end
  hash
end