def register() -> FlaskResponse: try: register_req = RegisterRequest.from_request(request) except (TypeError, ValueError) as e: return error(f'Failed to parse register request: {e}', status=400) if not register_req.address: return error('No client address provided', status=400) if not register_req.player_id: return error('No player ID provided', status=400) if not register_req.nick and register_req.player_id not in game.players: return error('No nickname provided', status=400) if is_invalid_nick(register_req.nick, register_req.player_id): return error(f'Nickname {register_req.nick} is already in use', status=400) if len(register_req.nick) > MAX_NICK_LENGTH: return error( f'Maximum nickname length is {MAX_NICK_LENGTH} characters', status=400) # ping the client to make sure it's up resp = requests.get(f'http://{register_req.address}/id') if resp.ok and resp.text == register_req.player_id: game.register_player(register_req) print( f'Added player {register_req.player_id} ({register_req.address})') return no_content() print( f'Failed to add player {register_req.player_id} ({register_req.address})' ) return error('Failed to connect to client')
def notify(self): try: event = Event.from_request(request) except (TypeError, ValueError) as e: return error(f'Failed to parse event: {e}') try: self.event_handler.handle(event) except Exception: print('Caught exception handling event') print('Event:', str(event)) traceback.print_exc() return no_content()
def change_nick() -> FlaskResponse: player_id = get_player_id() if player_id not in game.players or not game.players[player_id].is_active: return error('Cannot change nickname for an inactive player', status=400) new_nick = request.get_data(as_text=True).strip() if not new_nick: return error('No nickname provided', status=400) if is_invalid_nick(new_nick, player_id): return error(f'Nickname {new_nick} is already in use', status=400) if len(new_nick) > MAX_NICK_LENGTH: return error( f'Maximum nickname length is {MAX_NICK_LENGTH} characters', status=400) if new_nick != game.players[player_id].nick: game.change_nick(new_nick) return no_content()
def root(): return no_content()
def start_game() -> FlaskResponse: try: game.start() except RuntimeError as e: return error(str(e)) return no_content()
def goodbye() -> FlaskResponse: player_id = get_player_id() game.remove_player(player_id) print(f'Removed player {player_id}') return no_content()
def chat() -> FlaskResponse: game.post_chat_message(request.get_data(as_text=True)) return no_content()