Code: Select all
# Open Games Server for stratagus
# Copyrighted by Francois Beerten 2003-2004
# Licenced under the GPL version 2. (http://www.gnu.org/copyleft/gpl.html)
# This software is provided without any waranty, use at your own risks.
import socket
import SocketServer
import string
# TODO
# - Multi thread protection of shared data OR asynccore system
# - create a list of compatible games when enumerating games to join
# - real parsing to detect message boundaries (socket.recv is not always one whole message)
# - security
HOST = '' # Symbolic name meaning the local host
PORT = 7775 # Arbitrary non-privileged port
class Game:
def __init__(self):
self.params = ['IP', '6660', 'FakeName', 'No Map', 'Players', 'Free']
self.headers = ["<stratagus>","player", "game", "0.0"]
def SetParams(self, params):
self.params=params
def ChangeParams(self, params):
i=2
for param in params:
self.params[i]=param
i=i+1
def GetParams(self):
return self.params
games = [Game()]
def MakeParamsString(params):
str=""
for p in params:
str = str + p + "\n"
return str
class MetaGameHandler(SocketServer.BaseRequestHandler):
def setup(self):
self.createdGame=None
def AddGame(self, params,headers):
global games
self.createdGame=Game()
# ip address is the source of the connection
params[0] = self.client_address[0]
self.createdGame.SetParams(params[:-1])
self.createdGame.headers = headers
games.append(self.createdGame)
# self.request.send("OK\r\n") Not read in actual version of strat, dont send or it fills tcp queue and strat cant handle it
def StartGame(self, params, headers):
global games
self.request.send("OK\r\n")
def AbandonGame(self, params, headers):
global games
games.remove(self.createdGame)
self.createdGame=None
self.request.send("OK\r\n\r\n")
def CreateStringAction(self, str):
def StringAction(params, headers):
self.request.send(str)
return StringAction
def NumberOfGames(self, params, headers):
global games
self.compatibleGames=[]
for g in games:
if(g.headers[2:3] == headers[2:3]):
self.compatibleGames.append(g)
ngames=len(self.compatibleGames)
print "games:" , ngames
reply = "%d\r\n%d\r\n%d\r\n1\r\n"%(ngames+1,ngames+1,ngames+1)
print reply
self.request.send(reply)
def GameNumber(self, params, headers):
gamenbr=int(params[0])-1
game=self.compatibleGames[gamenbr]
reply = ("OK\r\n" +
MakeParamsString(game.headers[1:]) + "toto\r\n" +
MakeParamsString(game.params))
print reply
self.request.send(reply)
def ChangeGame(self, params, headers):
self.createdGame.ChangeParams(params[0:3])
# self.request.send("OK\r\n") Again not good for strat
def handle(self):
actions = {"Login": self.CreateStringAction("OK\r\n"),
"NumberOfGames": self.NumberOfGames,
"Logout":self.CreateStringAction("OK\n"),
"AddGame":self.AddGame,
"ChangeGame": self.ChangeGame,
"AbandonGame":self.AbandonGame,
"GameNumber":self.GameNumber,
"StartGame":self.StartGame}
while 1:
dataReceived = self.request.recv(1024)
if not dataReceived:
break
dataReceived = dataReceived.split('\n')
dataReceived = map(string.strip,dataReceived)
print dataReceived
command = dataReceived[4]
headers = dataReceived[:3]
params = dataReceived[5:]
actions[command](params, headers)
print "-\n"
def finish(self):
print "Connection closed"
metaserver = SocketServer.ThreadingTCPServer((HOST,PORT), MetaGameHandler)
metaserver.serve_forever()