#!/usr/bin/python
import SocketServer, threading, socket, BaseHTTPServer, json
# serverip = socket.gethostbyname(socket.gethostname())
serverip = '127.0.0.1'
# serverip = '192.168.0.20'
#serverip = '192.168.0.18'
###################################
servers_url = serverip + ':8000' # Fixed entry point to service discovery
services_url = serverip + ':8001' # Load balancer
auth_url = serverip + ':8002' # Authentication service, provides short lived tokens
configs_url = serverip + ':8003' # A/B testing for game tuning
profiles_url = serverip + ':8004' # Savegame saves and loads
assets_url = serverip + ':8005' # Dynamic game assets
leaders_url = serverip + ':8006' # Leaderboard system
###################################
servers = {
'services' : services_url
}
###################################
services = {
'authentication': auth_url,
'configs': configs_url,
'profiles': profiles_url,
'assets': assets_url,
'leaderboards': leaders_url
}
###################################
# TODO: Look at oauth2 python library for possible implementation
access_token = {
'credential': '123344',
'token': '1234567890'
}
###################################
config = {
'settingX': 'true',
'settingY': '640'
}
###################################
profile = {
'coin': '100',
'gold': '100',
'wood': '100',
'stone': '100'
}
###################################
asset = {
'version': '1',
'data': '1234567890'
}
###################################
leaderboard = [
{ 'entry': '1', 'name': 'John1', 'score': '123344' },
{ 'entry': '2', 'name': 'John2', 'score': '12334' },
{ 'entry': '3', 'name': 'John3', 'score': '1234' },
{ 'entry': '4', 'name': 'John4', 'score': '124' },
{ 'entry': '5', 'name': 'John5', 'score': '12' },
{ 'entry': '6', 'name': 'John6', 'score': '1' }
]
###################################
servers_json = json.dumps(servers)
services_json = json.dumps(services)
access_token_json = json.dumps(access_token)
config_json = json.dumps(config)
profile_json = json.dumps(profile)
asset_json = json.dumps(asset)
leaderboard_json = json.dumps(leaderboard)
###################################
class GenericRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
def ServeFileContent(self,filename):
f = open(filename, 'r')
if f:
data = f.read()
self.send_response(200)
self.send_header('Access-Control-Allow-Origin', '*')
self.send_header('Content-Type', 'octet/stream')
self.send_header('Content-Length', len(data))
self.end_headers()
self.wfile.write(data)
f.close()
else:
BadRequest(self)
return
def ServeJsonContent(self,json):
self.send_response(200)
self.send_header('Content-Type', 'application/json')
self.end_headers()
self.wfile.write(json)
return
def BadRequest(self):
self.send_response(400, 'Bad Request: wrong path')
self.send_header('Content-Type', 'application/json')
self.end_headers()
return
###################################
class ServersRequestHandler(GenericRequestHandler):
def do_GET(self):
if self.path == '/servers':
self.ServeJsonContent(servers_json)
else:
self.BadRequest()
return
###################################
class ServicesRequestHandler(GenericRequestHandler):
def do_GET(self):
if self.path == '/services':
self.ServeJsonContent(services_json)
else:
self.BadRequest()
return
###################################
class AuthenticationRequestHandler(GenericRequestHandler):
def do_GET(self):
if self.path == '/authenticate':
self.ServeJsonContent(access_token_json)
else:
self.BadRequest()
return
###################################
class ConfigRequestHandler(GenericRequestHandler):
def do_GET(self):
if self.path == '/config':
self.ServeJsonContent(config_json)
else:
self.BadRequest()
return
###################################
class ProfileRequestHandler(GenericRequestHandler):
def do_GET(self):
if self.path == '/profile':
self.ServeJsonContent(profile_json)
else:
self.BadRequest()
return
###################################
class AssetRequestHandler(GenericRequestHandler):
def do_GET(self):
if self.path == '/asset':
self.ServeJsonContent(asset_json)
elif self.path.startswith("/asset/"):
self.ServeFileContent('../Data/' + self.path[7:])
else:
self.BadRequest()
return
###################################
class LeaderboardRequestHandler(GenericRequestHandler):
def do_GET(self):
if self.path == '/leaderboard':
self.ServeJsonContent(leaderboard_json)
else:
self.BadRequest()
return
###################################
class ThreadingHTTPServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer):
pass
###################################
def serve_on_port(server_url, handler):
url_parts = server_url.split(':')
server = ThreadingHTTPServer((url_parts[0], int(url_parts[1])), handler)
server.serve_forever()
###################################
threading.Thread(target=serve_on_port, args=[servers_url, ServersRequestHandler]).start()
threading.Thread(target=serve_on_port, args=[services_url, ServicesRequestHandler]).start()
threading.Thread(target=serve_on_port, args=[auth_url, AuthenticationRequestHandler]).start()
threading.Thread(target=serve_on_port, args=[configs_url, ConfigRequestHandler]).start()
threading.Thread(target=serve_on_port, args=[profiles_url, ProfileRequestHandler]).start()
threading.Thread(target=serve_on_port, args=[assets_url, AssetRequestHandler]).start()
threading.Thread(target=serve_on_port, args=[leaders_url, LeaderboardRequestHandler]).start()