示例#1
0
文件: views.py 项目: flp/django-games
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,)))
示例#2
0
    def test_saves_retrieves_games(self):
        a_player = Player()
        a_player.save()

        first_game = Game()
        first_game.text = "a_score : a_player"
        first_game.player = a_player
        first_game.save()

        second_game = Game()
        second_game.text = "b_score : b_player"
        second_game.player = a_player
        second_game.save()

        saved_player = Player.objects.first()
        self.assertEqual(saved_player, a_player)

        saved_games = Game.objects.all()
        self.assertEqual(saved_games.count(), 2)

        first_saved_game = saved_games[0]
        second_saved_game = saved_games[1]
        self.assertEqual(first_saved_game.text, "a_score : a_player")
        self.assertEqual(second_saved_game.text, "b_score : b_player")
        self.assertEqual(first_saved_game.player, a_player)
        self.assertEqual(second_saved_game.player, a_player)
示例#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)})
示例#4
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)
示例#5
0
def new_player(request):
    if request.method == "POST":
        new_player_form = PlayerForm(request.POST)
        if new_player_form.is_valid():
            user = Player()
            user.name = new_player_form.cleaned_data.get('name')
            user.save()

            return HttpResponseRedirect('/games/')
    else:
        form = PlayerForm

    context = {'form': PlayerForm}

    return render(request, 'new_player.html', context=context)
示例#6
0
文件: views.py 项目: flp/django-games
def game_creator(request, game_id):
    """
    Respond with the game creator's player_id.
    """
    game = get_object_or_404(Game, pk=int(game_id))
    player_id = Player.get_player_id(game.creator.id)
    return HttpResponse(player_id)
示例#7
0
def get_or_create_player_id(session):
    player_id = session.get('player_id', None)
    if player_id is None:
        player = Player()
        player.save()
        player.player_id = Player.get_player_id(player.id)
        player_id = player.player_id
        player.save()

    session['player_id'] = player_id
    return player_id
示例#8
0
文件: views.py 项目: flp/django-games
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))
示例#9
0
    def connect(self, message, **kwargs):
        game_id = kwargs['game_id']
        game = Game.get_by_id(game_id)
        player_id = sessions.get_player_id(message.http_session)
        message.channel_session['player_id'] = player_id

        latest_gle = GameLogEntry.get_latest_gle_for_game(game)

        # Send the full game log to the everyone in the game.
        text = '%s joined the game' % player_id
        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)
        opponent = (Player.get_player_id(game.opponent.id) if
                    (game.opponent is not None) else '')

        player_joined_data = {
            'message_type': 'player_joined',
            'game_log': serialized_data,
            'opponent': opponent,
            'current_turn': Player.get_player_id(game.current_turn.id),
        }
        Group('game-%s' % game_id).send(
            {'text': json.dumps(player_joined_data)})

        # Send the full game data to the client who just connected.
        chat_entries = ChatEntry.get_chat_entries_for_game(game)
        board = json.loads(game.board) if game.board else ''
        extra_state = json.loads(game.extra_state) if game.extra_state else ''
        extra_state
        all_game_data = {
            'message_type': 'full_game',
            'board': board,
            'extra_state': extra_state,
            'opponent': opponent,
            'current_turn': Player.get_player_id(game.current_turn.id),
            'chat': ChatEntry.serialize_entries(chat_entries),
            'completed': Game.serialize_games([game])[0]['completed']
        }
        message.reply_channel.send({'text': json.dumps(all_game_data)})
示例#10
0
    def _create_players(self):
        print "Populating players"
        emails_fname = "games/management/commands/data/emails.txt"
        with open(emails_fname) as f:
            emails = f.read().splitlines()

        for email in emails:
            player = Player()
            player.paypal = email
            player.save()

            # The play has played n-sequences in different games
            n = random.randint(1,10)
            for i in range(n):
                sequence = self._create_sequence()
                player.sequences.add(sequence)
                # Add the player to the current sequence
                sequence.players.add(player)
                sequence.save()

            # Generate payments
            for i in range(random.randint(0, 5)):
                payment = self._create_payment()
                player.payments.add(payment)

            player.save()
        print "SUCCESS"
示例#11
0
    def post(self, request, **kwargs):
        game = self.get_object()
        body = request.body

        if not body.decode('UTF-8'):
            return Response(status=status.HTTP_400_BAD_REQUEST)

        body = json.loads(body)

        user_id = body.get("user_id")
        if not user_id:
            return Response("user_id field is needed", status=status.HTTP_400_BAD_REQUEST)

        player_name = body.get("player_name")
        if not player_name:
            return Response("player_name field is needed", status=status.HTTP_400_BAD_REQUEST)

        if len(player_name) > 20:
            return Response("Player name to long, the app should have handled this case, why are you getting this response?", status=status.HTTP_400_BAD_REQUEST)

        name_exists = game.players.filter(player_name=player_name)
        if name_exists:
            return Response("That name has been taken, try a different name", status=status.HTTP_400_BAD_REQUEST)

        if is_valid_uuid(user_id):
            user = get_object_or_404(User, id=user_id)
            new_player = Player(player_name=player_name, user=user)
        else:
            new_player = Player(player_name=player_name, user=None)
        new_player.save()
        game.players.add(new_player)
        game.save()
        return Response(PlayersSerializer(new_player).data, status=status.HTTP_201_CREATED)
示例#12
0
 def create_player(self) -> Player:
     return Player(**self.cleaned_data)