def receive(self, content, **kwargs): """ Handle web socket message. Can be: 1) New, valid move received. Add game log entry and update clients. or 2) Chat message. """ game_id = kwargs['game_id'] print('game-%s content: %s' % (game_id, content)) game = Game.get_by_id(game_id) if content['message_type'] == 'new_move': # content contains keys 'move', 'board', and 'game_over', 'next_player' board_text = json.dumps(content['board']) game.board = board_text if 'extra_state' in content: game.extra_state = json.dumps(content['extra_state']) next_player = Player.get_by_id( Player.get_model_id(content['next_player'])) game.current_turn = next_player if content['game_over']: game.completed = now() game.save() text = content['move'] entry = GameLogEntry(game=game, text=text) entry.save() game_log = GameLogEntry.get_game_log_entries_for_game(game) serialized_data = GameLogEntry.serialize_entries(game_log) extra_state = json.loads( game.extra_state) if game.extra_state else '' data = { 'message_type': 'new_move', 'board': json.loads(game.board), 'extra_state': extra_state, 'move_text': content['move'], 'current_turn': Player.get_player_id(game.current_turn.id), 'game_log': serialized_data, 'completed': Game.serialize_games([game])[0]['completed'], } Group('game-%s' % game_id).send({'text': json.dumps(data)}) elif content['message_type'] == 'chat': player_id = content['player'] player = Player.get_by_id(Player.get_model_id(player_id)) new_chat_entry = ChatEntry(game=game, player=player, text=content['text']) new_chat_entry.save() chat_entries = ChatEntry.get_chat_entries_for_game(game) data = { 'message_type': 'new_chat', 'chat': ChatEntry.serialize_entries(chat_entries) } Group('game-%s' % game_id).send({'text': json.dumps(data)}) else: print('Unknown message_type for %s' % game_id)
def new_game(request): """ Creates a new game. player_id should already be stored inside cookie. """ private = (request.POST['isPrivate'] == 'on' if 'isPrivate' in request.POST else False) game_type = request.POST['gameType'] player_id = sessions.get_player_id(request.session) player = Player.get_by_id(Player.get_model_id(player_id)) game = Game(game_type=game_type, creator=player, private=private, current_turn=player) game.save() game_id = Game.get_game_id(game.id) game.game_id = game_id game.save() text = 'Game created' entry = GameLogEntry(game=game, text=text) entry.save() # Send a ws message to the lobby group Group('lobby').send({'text': json.dumps(Game.get_all_games_list())}) return HttpResponseRedirect(reverse('games:game', args=(game.id,)))
def connect(self, message, **kwargs): player_id = sessions.get_player_id(message.http_session) message.channel_session['player_id'] = player_id print('Player %s connected to lobby' % player_id) player = Player.get_by_id(Player.get_model_id(player_id)) data = Game.get_all_games_list() Group('lobby').send({'text': json.dumps(data)})
def game(request, game_id): """ Tries to send the user to a game. Cookie might not have player_id yet. """ bots = ['facebookexternal', 'whatsapp'] for bot in bots: if bot in request.META['HTTP_USER_AGENT'].lower(): return HttpResponse('Hello bot') game = get_object_or_404(Game, pk=int(game_id)) player_id = sessions.get_or_create_player_id(request.session) player = Player.get_by_id(Player.get_model_id(player_id)) if game.game_type == 'ttt': template = 'games/ttt.html' elif game.game_type == 'reversi': template = 'games/reversi.html' else: template = 'games/chess.html' if game.creator == player or game.opponent == player: print('Game creator or opponent is (re)joining game.') return render(request, template, {'player_id': player_id, 'game_id': game_id}) elif game.opponent is None: print('New player is joining game') game.opponent = player game.save() # Send a ws message to the lobby group Group('lobby').send({'text': json.dumps(Game.get_all_games_list())}) return render(request, template, {'player_id': player_id, 'game_id': game_id}) else: return HttpResponse('Sorry, player %s, but game %s is full' % (player_id, game_id))