From 1d9925c287b318ec21343e2682b51ab6a36ae8db Mon Sep 17 00:00:00 2001 From: Diego Roversi Date: Sun, 8 Sep 2019 18:12:27 +0200 Subject: initial commit from cvs 1.6.2 --- common/javaserver.py | 157 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 common/javaserver.py (limited to 'common/javaserver.py') diff --git a/common/javaserver.py b/common/javaserver.py new file mode 100644 index 0000000..15a586b --- /dev/null +++ b/common/javaserver.py @@ -0,0 +1,157 @@ +import sys, os +from cStringIO import StringIO +import httpserver + +PLAYERNAMES = ['Bub', 'Bob', 'Boob', 'Beb', + 'Biob', 'Bab', 'Bib', + 'Baub', 'Beab', 'Biab'] +LOCALDIR = os.path.abspath(os.path.dirname(__file__)) +DATADIR = os.path.join(LOCALDIR, os.pardir, 'http2', 'data') + +EMPTY_PAGE = ''' +No server is running +

No server is running at the moment.

+ + +''' + +INDEX_PAGE = ''' +%(title)s +

%(title)s

+ + + %(names1)s + +
+

Player Names & Teams

+ + +''' + +NAME_LINE1 = '' +NAME_SEP1 = '\n' +NAME_LINE2 = '%s=%s' +NAME_SEP2 = '&' + +def playernames(options): + NUM_PLAYERS = len(PLAYERNAMES) + result = {} + anyname = None + for id in range(NUM_PLAYERS): + keyid = 'player%d' % id + if keyid in options: + value = options[keyid][0] + anyname = anyname or value + teamid = 'team%d' % id + if teamid in options: + team = options[teamid][0] + if len(team) == 1: + value = '%s (%s)' % (value, team) + result[keyid] = value + if 'c' in options: + for id in range(NUM_PLAYERS): + keyid = 'player%d' % id + try: + del result[keyid] + except KeyError: + pass + if 'f' in options: + for id in range(NUM_PLAYERS): + keyid = 'player%d' % id + if not result.get(keyid): + result[keyid] = anyname or PLAYERNAMES[id] + else: + anyname = result[keyid] + return result + +def indexloader(**options): + if 'cheat' in options: + for opt in options.pop('cheat'): + __cheat(opt) + import gamesrv + if gamesrv.game is None: + indexdata = EMPTY_PAGE + else: + names = playernames(options).items() + indexdata = INDEX_PAGE % { + 'title': gamesrv.game.FnDesc, + 'width': gamesrv.game.width, + 'height': gamesrv.game.height, + 'gameport': gamesrv.game.address[1], + 'names1': NAME_SEP1.join([NAME_LINE1 % kv for kv in names]), + 'names2': NAME_SEP2.join([NAME_LINE2 % kv for kv in names]), + } + return StringIO(indexdata), 'text/html' + +def nameloader(**options): + if 's' in options: + return indexloader(**options) + locals = { + 'options': playernames(options), + } + return httpserver.load(os.path.join(DATADIR, 'name.html'), + 'text/html', locals=locals) + + +wave_cache = {} + +def wav2au(data): + # Very limited! Assumes a standard 8-bit mono .wav as input + import audioop, struct + freq, = struct.unpack("4siiiii8s', + '.snd', # header + struct.calcsize('>4siiiii8s'), # header size + len(data), # data size + 1, # encoding + 8000, # sample rate + 1, # channels + 'magic.au') + data + return data + +def sampleloader(code=[], **options): + import gamesrv + try: + data = wave_cache[code[0]] + except KeyError: + for key, snd in gamesrv.samples.items(): + if str(getattr(snd, 'code', '')) == code[0]: + data = wave_cache[code[0]] = wav2au(snd.read()) + break + else: + raise KeyError, code[0] + return StringIO(data), 'audio/wav' + + +def setup(): + dir = os.path.abspath(os.path.join(os.path.dirname(__file__), + os.pardir, + 'java')) + if not os.path.isdir(dir): + return + + # register all '.class' files + for name in os.listdir(dir): + if name.endswith('.class'): + httpserver.register(name, httpserver.fileloader(os.path.join(dir, name))) + + # register a '', an 'index.html', and a 'name.html' file + httpserver.register('', indexloader) + httpserver.register('index.html', indexloader) + httpserver.register('name.html', nameloader) + + # 'name.html' has a few images, list the .png files in DATADIR + for fn in os.listdir(DATADIR): + fn = fn.lower() + if fn.endswith('.png'): + httpserver.register(fn, httpserver.fileloader( + os.path.join(DATADIR, fn))) + + # register the sample loader + httpserver.register('sample.wav', sampleloader) + +setup() -- cgit v1.2.3