#!/usr/bin/env python3 import argparse import asyncio import contextlib import json import websockets import swiftstory.GameManager from swiftstory.Client import Client from swiftstory.Status import error game_manager = swiftstory.GameManager.GameManager() async def message_received_handler(client, message): try: json_msg = json.loads(message) except JSONDecodeError: res = error('badly formatted json') else: op = json_msg['op'] if op == 'join_game': try: game_name = json_msg['game_name'] except KeyError: res = error('field `game_name\' is required') else: lang = json_msg.get('lang') res = await client.join_game(game_name, lang) elif op == 'view_player_cards': res = client.view_player_cards() elif op == 'view_black_card': res = client.view_black_card() elif op == 'view_played_cards': res = client.view_played_cards() elif op == 'pick_black_card': res = await client.pick_black_card() elif op == 'designate_card': card_id = None try: card_id = int(json_msg['card_id']) except (KeyError, TypeError): pass finally: res = await client.designate_card(card_id) elif op == 'play_white_card': try: card_id = int(json_msg['card_id']) except KeyError: res = error('field `card_id\' is required') else: res = await client.play_white_card(card_id) elif op == 'collect_cards': res = await client.collect_cards() else: res = error('invalid command') await client.socket.send(res) async def swiftstory(websocket, path): client = Client(websocket, game_manager) with contextlib.suppress(websockets.exceptions.ConnectionClosed): async for message in client.socket: await message_received_handler(client, message) await client.disconnect() def main(): parser = argparse.ArgumentParser() parser.add_argument('--listen', type=str, default='0.0.0.0') parser.add_argument('--port', type=int, default=1236) args = vars(parser.parse_args()) start_server = websockets.serve(swiftstory, args['listen'], args['port']) asyncio.get_event_loop().run_until_complete(start_server) asyncio.get_event_loop().run_forever() if __name__ == '__main__': main()