diff --git a/games/Pong-bots/ggs-delegate.rb b/games/Pong-bots/ggs-delegate.rb new file mode 100644 index 0000000..be4cc47 --- /dev/null +++ b/games/Pong-bots/ggs-delegate.rb @@ -0,0 +1,15 @@ +module GGSDelegate + + def ggsNetworkReady(ggs_network, ready) + raise "ggsNetworkReady(ggs_network, ready) must be overridden" + end + + def ggsNetworkDefined(ggs_network, defined) + raise "ggsNetworkDefined(ggs_network, defined) must be overridden" + end + + def ggsNetworkReceivedCommandWithArgs(ggs_network, command, args) + raise "ggsNetworkReceivedCommandWithArgs(ggs_network, command, args) must be overridden" + end + +end \ No newline at end of file diff --git a/games/Pong-bots/ggs-network.rb b/games/Pong-bots/ggs-network.rb new file mode 100644 index 0000000..1a1e820 --- /dev/null +++ b/games/Pong-bots/ggs-network.rb @@ -0,0 +1,83 @@ +require 'socket' + +class GGSNetwork + + SERVER = "Server" + CLIENT = "Client" + + public + + attr_accessor :delegate + + def initialize(delegate, host='localhost', port=9000) + connect(host, port) + @delegate = delegate + end + + def define(source_code) + write( makeMessage(SERVER, "define", source_code) ) + end + + def sendCommand(command, args="") + write( makeMessage(CLIENT, command, args) ) + end + + protected + + def connect(host, port) + gs = TCPSocket.open(host, port) + @socket = gs.accept + Thread.start(@socket) { |s| read(s) } + end + + def write(message) + @socket.write(message) + end + + def read(s) + loop do + headers = {} + size = 0 + args = "" + + while (line = @socket.gets) != "\n" + key, value = line.split(": ") + headers[key] = value + end + + if headers.contains?("Content-Size") + headers["Content-Size"].to_i.times do + args << @socket.recv + end + end + + receivedCommand(headers, args) + end + end + + def receivedCommand(headers, data) + if headers.contains? "Client-Command" + command = headers["Client-Command"] + case command + when "hello" + @delegate.ggsNetworkReady(self, true) + when "defined" + @delegate.ggsNetworkDefined(self, true) + else + @delegate.ggsNetworkReceivedCommandWithArgs(self, command, data) + end + end + end + + def makeMessage(serverOrGame, command, args) + message =<