added initial pong bots

This commit is contained in:
Jeena Paradies 2011-04-12 17:50:34 +02:00
parent 865c963ad6
commit 9c8d04114c
3 changed files with 127 additions and 0 deletions

View file

@ -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

View file

@ -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 =<<MESSAGE
Token: #{@game_t oken}
#{serverOrGame}-Command: #{command}
Content-Length: #{args.length}
#{args}
MESSAGE
message
end
end

View file

@ -0,0 +1,29 @@
#!/usr/bin/env ruby -wKU
require 'ggs-network.rb'
require 'ggs-delegate.rb'
class PongBot
include GGSDelegate
def initialize
@ggs_network = GGSNetwork.new(self)
end
def ggsNetworkReady(ggs_network, ready)
@ggs_network.sendCommand("ready")
end
def ggsNetworkDefined(ggs_network, defined)
# do nothing
end
def ggsNetworkReceivedCommandWithArgs(ggs_network, command, args)
end
end
if __FILE__ == $0
PongBot.new
end