Example #1
0
    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)
Example #2
0
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,)))
Example #3
0
 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)})
Example #4
0
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))