96 lines
2.1 KiB
Ruby
96 lines
2.1 KiB
Ruby
require 'socket'
|
|
|
|
class GGSNetwork
|
|
|
|
SERVER = "Server"
|
|
CLIENT = "Game"
|
|
|
|
public
|
|
|
|
attr_accessor :delegate, :player_token
|
|
|
|
def initialize(delegate, table_token="")
|
|
@table_token = table_token
|
|
@delegate = delegate
|
|
@player_token = nil
|
|
end
|
|
|
|
def define(source_code)
|
|
write( makeMessage(SERVER, "define", source_code) )
|
|
end
|
|
|
|
def sendCommand(command, args="")
|
|
write( makeMessage(CLIENT, command, args) )
|
|
end
|
|
|
|
def connect(host='localhost', port=9000)
|
|
@socket = TCPSocket.new(host, port)
|
|
write( makeMessage(SERVER, "hello", @table_token) )
|
|
read
|
|
end
|
|
|
|
protected
|
|
|
|
def write(message)
|
|
#puts message
|
|
@socket.write(message)
|
|
end
|
|
|
|
def read
|
|
loop do
|
|
headers = {}
|
|
size = 0
|
|
args = ""
|
|
|
|
select([@socket], nil, nil)
|
|
|
|
while (line = @socket.gets) != "\n"
|
|
break if line.nil?
|
|
|
|
key, value = line.split(": ")
|
|
headers[key] = value.strip
|
|
end
|
|
|
|
if headers.has_key?("Content-Size")
|
|
args = @socket.read(headers["Content-Size"].to_i)
|
|
end
|
|
|
|
receivedCommand(headers, args)
|
|
end
|
|
end
|
|
|
|
def receivedCommand(headers, data)
|
|
if headers.has_key? "Client-Command"
|
|
command = headers["Client-Command"]
|
|
case command
|
|
when "hello"
|
|
parse_hello(data)
|
|
@delegate.ggsNetworkReady(self, @am_i_host)
|
|
when "defined"
|
|
@delegate.ggsNetworkDefined(self, true)
|
|
else
|
|
@delegate.ggsNetworkReceivedCommandWithArgs(self, command, data)
|
|
end
|
|
else
|
|
STDERR.print "ERR: " + [headers, data, @socket.inspect].inspect + "\n"
|
|
end
|
|
end
|
|
|
|
def makeMessage(serverOrGame, command, args)
|
|
message = ""
|
|
message += "Token: #{@player_token}\n" unless @player_token.nil?
|
|
message += "#{serverOrGame}-Command: #{command}\n" +
|
|
"Content-Length: #{args.length}\n\n"
|
|
|
|
message += args if args.length > 0
|
|
|
|
message
|
|
end
|
|
|
|
def parse_hello(message)
|
|
@player_token, shall_define, @table_token = message.split(",")
|
|
@am_i_host = shall_define == "true"
|
|
puts "Table-Token: " + @table_token
|
|
end
|
|
|
|
end
|